CSDN博客

img yako

arx程序说明(二)

发表于2004/10/12 20:03:00  1736人阅读

分类: Research

第二章        

信息管理的类主要用于问题空间中的各种对象,在分析问题的空间中,主要有点类,直线类、圆弧类,以及描述建筑物的门窗类、房间类,公寓类等,各种类主要由属性和成员函数进行描述。下面分别进行介绍。

1、点类CmyPoint

点类用来描述AutoCAD中的点,主要用于记录线条的起点和终点,也用于在图形拓扑结构中的节点。下面是点类的定义

class CmyPoint

{

public:

       CMyPoint();//构造函数

       BOOL operator==(CMyPoint &aPoint); //运算符重载,用于判断两个点的坐标是否相等

       CMyPoint *midPoint(CMyPoint *p); //计算当点和另一个点之间的中点

       CMyPoint *nextPoint;//点链表指针

       virtual ~CMyPoint();//析构函数

public:

       double x,y,z;//点的坐标

       CMyPoint(double thex,double they,double thez):x(thex),y(they),z(thez) //构造函数

       {

              nextPoint=NULL;

       }

       double DisToPoint(CMyPoint &aPoint)计算当前点与另一点的距离

       double directAngleTo(CMyPoint &p)计算当前点到另一点的方向角

       BOOL aboutEqual(CMyPoint &p); //判断一个电是否在另一个点的附近,用于对图形归整

       bool samePoint(CMyPoint &p); //判断两个点是否是同一点

}

2、直线类

直线类用于描述AutoCAD中的直线,并且在我们的分析还用中心线描述墙体,墙上的门洞也用直线进行描述。下面是直线类的定义:

class CLine 

{

public:

       //属性

       //the start and the direction angle and it's length definate a line

       CMyPoint *theS,*theE;//直线的起始点和终结点

       double dAngle,dLength;//直线的方向角和长度,角度单位为弧度,长度单位为毫米

       AcDbObjectId lineID;//直线的CADID

       int wins;//该直线段上的直线段—也就是该直线上的门窗线条数目

       CLine *winLine[MAXWIN];//门窗线条数组MAXWIN为门窗线条的最大数目设置为15

       double thickness;

       //成员函数

       CLine();//构造函数

       CLine(CMyPoint *s,CMyPoint *e); //构造函数

       CLine(AcGePoint3d &start,AcGePoint3d &end,AcDbObjectId aId); //构造函数,以AutoCAD中的点类进行定义该直线

       void exchangeEnds();//交互直线的两个端点,改变直线的方向。

       CMyPoint *getEnd();//返回直线的终点

       BOOL onIt(CLine &aLine);判断另一条直线是否在该直线上,用于初次扫描图形的时候判断是否另一条直线是重复绘制的多余对象,也用于再次对图形扫描的时候判断另一直线是否是该直线表达的墙体上的门洞线条,从而进行门洞记录。

       int OnItExtend(CLine &aLine);判断另一直线是否在该直线的延长线上,只要用于应用极小完整性进行墙体信息恢复的时候判断两直线是否组成一个完整的墙体。

       BOOL parallelTo(CLine &aLine); 判断两条直线是否平行

       //deal with the seg_overlapped

       BOOL pointOnIt(CMyPoint *point);判断一个点是否在该直线上

       BOOL segLapped(CLine *aLine);判断两直线是否部分重合,主要用于初次对图形扫描的时候判断是否出现绘制的错误,从而把两条直线结合为一条直线。

       void combine(CLine *aLine);把两条直线结合为一条直线

       void setStart(CMyPoint *point);改变直线的起始点

       void setEnd(CMyPoint *point);改变直线的终点

       bool sameLine(CLine *pL);//该函数已废弃,由于程序进行了多次修改,部分函数已废弃,后面只表明已废弃。

       double distToPara(CLine *aLine);计算两平行线之间的距离

       bool extendLine(CLine *aLine,int type,double thick);以某种方式对两条直线进行延长和分割处理,主要用于对表达墙体的中心线进行分割和延长,用满足极小完整性的直线来描述墙体。

       void exchangeWin(int i,int j);已废弃

       BOOL sameWall(CLine *pl,double thick);判断两条直线是否是表达一面墙体的内外线条

       CLine * makeMid(CLine *pl);生成两平行线的中心线

       void sortWin();已废弃

       CMyPoint *halfThickPoint(int endpoint,int flag,int thick);已废弃

       CLine *leftADis(int flag,double thick);已废弃

       int crossTo(CLine *pLine,double thickness,CMyPoint **ppP);计算当前直线和另一直线的交点,返回相交的类型,并把焦点记录在ppP

       CMyPoint *outCrossTo(CLine *aLine,double dis);计算当前直线和另一直线是否延长一段距离相交,返回交点

       bool throughPoint(CMyPoint *p);判断直线是否通过另一点

       double antiClockTo(CLine *pL);计算当前直线和另一直线的逆时针旋转有向角度

       bool selfSymmetry(double value ,int type);已废弃

       bool symmetryTo(double value ,CLine &aLine,int type);已废弃

       virtual ~CLine();析够函数

};

3、直线链表类CLineSet

主要用于对直线进行链表式组织。在这个类中补充了直线的状态,用于描述代表墙体的直线是否是完整。在该类的定义中原来单独应用节点可见边有向排序的一些成员函数由于采用了一种综合方法,这些成员函数已经被废弃。下面是它的定义描述。

class CLineSet 

{

public:

       CLine *theLine;//直线指针

       CLineSet *pNext;//直线链表指针

       CLineSet *pUp;//直线链表指针,指向上一结点

       bool selected;//构造房间时候是否已选择标志

       bool arc;//if the lineset is convered from arc it is true else false

       CLineSet();构造函数

       CLineSet(CLine *aLine);构造函数

       CLineSet(myArc *aArc);构造函数,该函数以一条圆弧对象为参数,把圆弧转换成用两个端点表示的直线进行描述,主要用于描述图形的拓扑结构。

       void AddLine(CLine *aLine);在链表中添加直线

       void AddLine(myArc *aArc);在链表中添加圆弧

       void AddTailLine(CLine *aLine);在链表的末尾添加直线

       void delLine(int i);删除链表中的第I个对象

       int findLine(CLine *aLine,BOOL(*pFun)(CLine &a));已废弃

       void freeSet();释放直线链表

       void CLineSet::RoomLined(CLine *pL,CLineSet **pLineSet);已废弃

       Room * findRoom(CLineSet *pS);已废弃

       int lineThrough(CLineSet *pS);//get the line throuth the given line's start

       bool can_dele_point(CMyPoint *p);//已废弃

       void delLineThoughPoint(CMyPoint *p); //已废弃

       virtual ~CLineSet();析够函数

       double areaToPoint(CMyPoint *p);计算由该直线和另一个点确定的三角形面积

       bool normalCorner(CLineSet *pS);//判断两条直线之间的夹角是否是通常的直角,主要用于在对房间地面进行分块的时候判断地面是否能划分成规则的矩形。

       //seg the triangle

       bool Crossto(CLineSet *pS);判断两直线是否存在交点

       Bt_block *trianlgeToBlock(double &area);对当前直线和它的下一条直线之间的三角形进行分块

       int OnsymmetryExtend(CLineSet &lineSet,double x,double y,int type);//已废弃

       int verticalTo(CLineSet *pS,double wallthick);//判断两条直线是否垂直

       int verticalType;//属性,用于标识墙体线条完整性

       bool pointOnExtend( CMyPoint *p);判断点是否在直线的延长线上

       void exchangeEnds();交换两端点

       bool equalLine(CLineSet *aLine)判断是否是同一直线

};

4、圆弧类myArc

圆弧类用于描述AutoCAD中的圆弧对象

class myArc 

{

public:

       double startA,endA;//圆弧的起始角度和终止角度

       double radio;//the radio of the arc圆弧半径

       CMyPoint *centre;圆弧中心点

       AcDbObjectId arcId;//cad arc id圆弧对象AutoCAD表示号码

       myArc *winArc[MAXWIN];圆弧上的门洞数组

       int wins;门洞数,用于记录数组的大小

       bool trueArc;//the falg if the arc is a true arc

       myArc();构造函数

//     myArc(AcGePoint3d &cen,double s,double e,double r,AcDbObjectId id);构造函数

       myArc(AcGePoint3d &cen,double sAngle,double eAngle,double radius,AcDbObjectId theId);构造函数

       bool sameCentre(myArc *aArc);//判断两圆弧是否同心

       bool parellelTo(myArc *aArc);//判断两圆弧是否平行

       CLine *singleLined();//转换成用圆弧两个端点描述的直线

       CLineSet *multiLined();//已废弃

       bool onIt(myArc *pArc);//判断另一圆弧是否在该圆弧上

       bool sameCircle(myArc *pArc);//判断是否为同一圆弧

       myArc* middleArc(myArc *pArc);//生成两圆弧的中心圆弧

       bool segLapped(myArc *pArc);//判断两圆弧是否部分重合

       void combineLapped(myArc *pArc);//把两圆弧合并成一条圆弧

       int wallSegged(myArc *pArc,double thickness);//判断是否有墙体中心线和该圆弧在中间部分相交

       bool crossToLine(CLine *pL);//if a line cross a arc,判断是否有直线和圆弧相交

       CMyPoint *crossLinePoint(CLine *pL,double thickness);//计算圆弧和直线的交点

       virtual ~myArc();析够函数

};

5、圆弧链表类myArcSet 

给类用于记录和组织圆弧对象。

class myArcSet 

{

public:

       myArc *theArc;//圆弧对象,节点的数据

       myArcSet *pNextArc;链表指针

       myArcSet();构造函数

       myArcSet(myArc *pArc);构造函数

       void addArc(myArc *pArc);在链表中添加圆弧对象

       void addTailArc(myArc *pArc);在链表的末尾添加圆弧对象

       virtual ~myArcSet();析够函数

       void sort();//对于同心的圆弧链表,按照逆时针方向排列圆弧对象

};

6、墙体类

class Wall 

{

public:

       double area;//墙体面积,单位平方米

       CLine *baseLine;//墙体基线

       winOrDoor *pWins;//门窗链表

       double height;//墙体高度

       bool haveCover;已废弃

       bool outer;//内外墙体标志 1—外墙,0—为内墙

       Wall *nextW;//墙体链表指针

       Room *nextTo;//相邻空间指针

       CString material;//墙体材料或者说Layer属性名字

       Wall();构造函数

       Wall(CLineSet * base,double h);构造函数

       virtual ~Wall();析够函数

};

7、房间类

class Room 

{

public:

       CLineSet *bases;//房间的墙体基线

       Room *nextR;//下一个空间

       double height;//房间空间高度

       double dArea;//房间平面面积

       Wall *pWall;//墙体链表//开始的指针为头指针,没有明确的数据

       //wall上有门窗链表

       CString roomtype;//房间的类型,如卧室……

       CString name;房间命名

       zone *pZone;房间的zone类型

       BOOL AreaConditioned;已废弃

       Bt_block *pBlock;地面的分开表

       bool baseanticlockwise;判断围合房间的地板线条是否是逆时针方向旋转

       Room();构造函数

       void AddBaseLine(CLine *pLine,bool arc);在地面添加围合线

       void AddRoom(Room *pR);//add a room增加空间

       bool baseClosed();//判断地板线条是否闭合

       Room(CLineSet *base,double h):bases(base),height(h)构造函数

       void set_block();//对地面进行分块

       void make_whole_room();设置该房间链表中的所有房间墙体属性,比如说房间之间是否有相邻墙体。使得一面墙体只属于一个房间

       void SetRoomHeight(int aHeight);整天设置房间的高度,这在用户界面中输入了建筑层高之后调用,对所有的房间设置高度

       virtual ~Room();析够函数

       double getbaseArea();计算房间的地面面积

       Room*  FindSameRoom(Room *pRoom);在房间链表中搜索,查看是否有跟指定的房间相同的房间

       CMyPoint *SSon;//钟琴添加,在程序中钟琴添加了一些属性,后面简单的注明钟琴添加

       CMyPoint *ESon; //钟琴添加

       CMyPoint *TreeRootPoint; //钟琴添加

       CTreePointSet *RoomPointSet; //钟琴添加

8、套间类

该来用于描述一个套间,表达套间的数据有该套间有哪些房间,以及套间使用和装备情况等。

class Apartment 

{

public:

       Room *pRoom[MAX_APART_AMOUNT];//room pointer

       int rooms;//套间中的房间总数量

       CString apartType;//套间类型

       CString control;套间控制

       CString air;已废弃

       CString equipment;套间装备

       CString heat_resource;热源

       CString cooling_schedule;制冷时间

       CString heating_schedule;采暖时间

       float cooling_eir;制冷因子

       float heating_eir;采暖因子

       Apartment();构造函数

       virtual ~Apartment();析够函数

};

9、块类

该类用于描述,房间地面的分块情况,对于不规则的地板,用多个矩形块对地面进行逼近描述。

class Bt_block 

{

public:

       double width,height,area;块的宽度、高度和面积

       double angle;块的角度

       Bt_block *nextb;链表指针

       CMyPoint *bPoint;//块的基点

       Bt_block();构造函数

       Bt_block(double ang,double wd,double he,CMyPoint *point)构造函数

       virtual ~Bt_block();析够函数

};

10typedef struct zonetype

{

       CString heattempsch;

       CString cooltempsch;

       CString designheatt;

       CString designcoolt;

       CString zonectrl;

}zone;

本结构体应钟琴要求添加,用于设置套间的一个zone类型,具体每个属性代表什么意思不得而知。

阅读全文
0 0

相关文章推荐

img
取 消
img