233 lines
9.1 KiB
C++
233 lines
9.1 KiB
C++
#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<XPoly2D>& 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<TBArea>
|
|
{
|
|
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<XPoly2D>& 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<XPoly2D>& 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<XPoly2D>& 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<XPoly2D>& 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 |