Files
envi-code/SourceCode/Code2026/tg_shs/inc/TArch/AreaModel.h
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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