Files
envi-code/SourceCode/Code2026/tg_shs/inc/TArch/AreaModel.h
T

233 lines
9.1 KiB
C++
Raw Normal View History

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