#ifndef _AREA_MODEL_H #define _AREA_MODEL_H //建筑面积统计数据定义,参考: //<<房产测量规范GBT17986-2000>> //<<建筑工程建筑面积计算规范GB-T50353-2005>> //<<住宅设计规范>> //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class TBAList; class TBAFloor; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //面积基类 //模型要求:1,同一类型面积对象的位置不能有重叠;2,同类型面积对象的编号不能相同 class TUTIL_IMPEXP TBArea { protected: XPoly2D m_polyOutline;//几何区域 double m_fFactArea;//区域实际面积(裁减洞口后的) add by fxj CString m_sName; //名称,或户型编号,不区分大小写 CString m_sCode; //编号 double m_fAreaFactor;//保存初始面积计算系数(常见如0、1、0.5)和最终面积系数 bool m_bCliped;//add by fxj是否被进行过剪裁 public: TBArea(AcDbObjectId id=AcDbObjectId::kNull);//支持房间对象 virtual ~TBArea(){}//ok const TCHAR* GetName()const{return m_sName;}//ok const TCHAR* GetCode()const{return m_sCode;}//ok XPoly2D GetOutline()const{return m_polyOutline;}//ok double GetAreaFactor()const{return m_fAreaFactor;}//ok void SetAreaFactor(double af){m_fAreaFactor=af;}//ok virtual void ClipBy(TBAList& lstOutline,DList& lstHole);// 还不支持对建筑轮廓的剪裁 virtual double GetGeomBuildArea()//ok,几何区域建筑面积 { //modified by fxj if(m_bCliped) return m_fFactArea*GetAreaFactor(); else return GetOutline().Area()*GetAreaFactor(); } virtual double GetStatisticsBuildArea(){return GetGeomBuildArea();}//ok,最终统计用建筑面积 bool operator >(const TBArea&a)const; bool operator <(const TBArea&a)const{return a>(*this);}//ok bool operator ==(const TBArea& a)const; bool operator !=(const TBArea& a)const{return !((*this)==a);}//ok }; //多个建筑面积 class TUTIL_IMPEXP TBAList:public PDList { public: double GetGeomArea();//几何面积 double GetGeomBuildArea();//几何区域建筑面积 double GetStatisticsBuildArea();//最终统计用建筑面积 void ShareArea(double area);//对TBAHouse列表分摊面积 }; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //建筑轮廓(作用1,计算默认公摊建筑面积;作用2,裁剪套内面积) //模型要求:不包括阳台和轮廓外独立的共用面积。 class TUTIL_IMPEXP TBAOutline:public TBArea { public: double m_fHoleGeomArea;//轮廓内洞口几何面积 double m_fDefinedValidGeomArea;//轮廓内已定义非洞口几何面积(套内几何面积和共用几何面积) public: TBAOutline(AcDbObjectId id); void AddDefinedValidGeomArea(double a){m_fDefinedValidGeomArea+=a;}//ok void ClipBy(DList& lstHole); double GetDefaultShareArea()const;//默认公摊建筑面积,使用本对象的面积系数 }; //////////////////////////////////////////////////////////////////////////////////////// //洞口(用于裁剪套内面积和共摊面积) class TUTIL_IMPEXP TBAHole:public TBArea { public: TBAHole(AcDbObjectId id); }; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //阳台建筑面积 //模型要求:必须与所属套的外墙相接,否则视为共用阳台 class TUTIL_IMPEXP TBABalcony:public TBArea { public: TBABalcony(AcDbObjectId id); }; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //房间使用建筑面积 //模型要求:必须在相应套内面积区域内 class TUTIL_IMPEXP TBASpace:public TBArea { public: TBASpace(AcDbObjectId id); virtual void ClipBy(TBAList& lstOutline,DList& lstHole); }; //////////////////////////////////////////////////////////////////////////////////////// //公摊建筑面积(要裁剪洞口) //模型要求:不能与套内面积位置重叠 class TUTIL_IMPEXP TBAShare:public TBArea { public: enum ShareType{kShareInFloor,kShareInBuilding,kShareInHouses,kShareAll}; protected: ShareType m_nType; //公摊类型 CString m_sShareHouseCode;//公摊的套(户),只ShareInHouse时有效 public: TBAShare(AcDbObjectId id=AcDbObjectId::kNull); virtual void ClipBy(TBAList& lstOutline,DList& lstHole); ShareType GetType()const{return m_nType;}//ok void SetType(ShareType type){m_nType=type;}//ok }; //公摊建筑面积,直接指定面积数据 class TUTIL_IMPEXP TBAShareEx:public TBAShare { protected: double m_fArea;//最终的公摊建筑面积数据 public: TBAShareEx(double area):m_fArea(area){}//ok virtual double GetGeomBuildArea(){return m_fArea;}//ok }; ///////////////////////////////////////////////////////////////////////////////////////////// //套内建筑面积(要被建筑轮廓和洞口裁剪) //模型要求,不能与公摊面积重叠 //注意:基类TBArea的m_sCode作为户号,m_sName作为户型编号! class TUTIL_IMPEXP TBAHouse:public TBArea { protected: double m_fSharedArea;//分摊所得建筑面积 TBAList m_lstBalcony; //套内阳台建筑面积 bool m_bHouseUp; //是否是跃层上部,(还未使用) TBAHouse *m_pHouseUp; //所拥有的跃层上部,引用(还未使用) TBAFloor *m_pFloor; //所在标准层 public: TBAList m_lstSpace; //套内使用建筑面积(存放TBASpace对象) // Zyu add on 101119,支持名称分类 static CStringArray m_arHallString; // 厅字符串数组 static CStringArray m_arRoomString; // 室字符串数组 static CStringArray m_arToiletString; // 卫字符串数组 public: //ssSpace[in/out]返回套外房间,ssBalcony[in/out]返回套外阳台,pFloor为所在层不能为NULL TBAHouse(AcDbObjectId idHouse,PickSet&ssSpace,PickSet &ssBalcony,TBAFloor *pFloor); void AddSharedArea(double a){m_fSharedArea+=a;}//ok virtual void ClipBy(TBAList& lstOutline,DList& lstHole); void SetHouseUp(TBAHouse* pHouse){m_pHouseUp=pHouse;pHouse->m_bHouseUp=true;}//ok TBAHouse* GetHouseUp()const{return m_pHouseUp;}//ok bool IsHouseUp(){return m_bHouseUp;}//ok add by fxj CString GetHouseType()const;//取户型 double GetSpaceArea(); //套内建面积 double GetWallArea(); //套内墙体面积 double GetBalconyArea();//套内阳台面积 double GetSharedArea(); //分摊面积 double GetBuildArea(); //套内建筑面积(不包括阳台、不包括分摊面积的建筑面积) virtual double GetStatisticsBuildArea();//单户建筑面积 double GetStatisticsBuildAreaEx(); //套型建筑面积 double GetBalconyAreaEx(); //套型阳台面积 // Zyu add on 100906,套内建筑面积(包括阳台、不包括分摊面积的建筑面积) double GetBuildAreaEx() { return GetGeomBuildArea() + GetBalconyArea(); } bool IsSimilarHouse(TBAHouse& house);//ok }; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //标准层建筑面积 class TUTIL_IMPEXP TBAFloor:public TBArea { protected: TBAList m_lstOutline; //有效建筑面积区域 TBAList m_lstHole; //洞口 TBAList m_lstShare; //公摊面积 double m_fKFactor; //标准层使用面积系数,用于计算套型建筑面积 public: TProjectFloor *m_pFloorDef; //楼层定义 TBAList m_lstHouse; //分户(套)(存放TBAHouse对象) public: TBAFloor(TProjectFloor *pFD=NULL); long GetLayerNum()const;//取重复层数 void Append(PickSet &ssSpace); //由选择集构造 void Share(TBAShare::ShareType type);//本层按类型分摊 double GetKFactor()const{return m_fKFactor;}//ok double GetHouseArea(); //套内建筑面积(不包括阳台和分摊面积) double GetHouseSpaceArea(); //套内使用建筑面积 double GetHouseBalconyArea(); //套内阳台建筑面积 double GetShareArea(TBAShare::ShareType type);//按类型取公摊建筑面积 virtual double GetGeomBuildArea();//标准层建筑面积 // Zyu add on 100910,建筑面积区域的数量,用于判断是否存在建筑面积对象 long GetOutlineNum() const { return m_lstOutline.GetLength(); } }; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //总建筑面积 class TUTIL_IMPEXP TBABuilding:public TBAList//所有标准层 { public: void Share();//公摊 // Zyu add on 100906,全楼公摊 void ShareInBuilding(); // Zyu add on 100906,按层公摊 void ShareInFloor(); void FindHouseUp();//跃层处理 double GetHouseSpaceArea(); //套内使用面积 double GetHouseArea(); //套内建筑面积(不包括阳台和分摊面积) double GetHouseBalconyArea();//套内阳台建筑面积 double GetShareArea(); //所有分摊面积 double GetStatisticsBuildArea();//建筑总面积 }; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #endif