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

372 lines
12 KiB
C++

#ifndef __DBSPACE_H
#define __DBSPACE_H
#include "SpaceData.h"
class XDcStream;
class TDbText;
#define SF_MASK 0x01 //屏蔽
#define SF_HIGHLIGHT 0x02 //加亮
#define SF_GROUND3D 0x04 //封三维地面
//TArch7
#define SF_SHOWOUTLINE 0x08 //始终显示边界
#define SF_BALCONY 0x10 //阳台房间
#define SF_HVAC 0x20 //采暖空调房间,节能特性
//#define SF_ROOF 0x100,6.5节能属性,7.0 obsolete
//TArch8
#define SF_HALF_AREA 0x40 //建筑面积取一半
#define SF_HATCH 0x80 //面积填充
// 房间面积对象
class TARCH_EXP TDbSpace: public TDbEntity, public TSpaceData
{
DECLARE_TENTBASE();
private:
const static Adesk::UInt8 g_nVersion;
protected:
Adesk::UInt8 m_nSpaceFlag;
// TArch6 data
AcDbHardPointerId m_idTextStyle;
double m_nTextHeight;
double m_nRotation; //文字转角
double m_nFloorThick; //地板厚度
public:
DList<AcDbObjectId> m_lstWallEnclosure;
//TArch7 data
//节能数据
double m_dbTempSum;//夏季室内设计温度
double m_dbTempWin;//冬季室内设计温度
double m_nUnitNo; //空调系统单元号
double m_dbColdLoad;//冷负荷
double m_dbHeatLoad;//热负荷
XString m_strDownFloorCons;//地板(地面)构造类型
XString m_strUpFloorCons;//天花板(屋顶)构造类型
//TArch8
Adesk::UInt32 m_nNewFlag;
enum AreaType{kUseArea=0, //房间面积
kHouseArea=1, //套内面积
kTotalArea=2, //建筑轮廓面积
kHoleArea=3, //洞口面积
kShareArea=4, //公摊面积
kBalconyArea=5,//套内阳台面积
kOther=-1 };//其它面积
AreaType m_nType;//面积类型
XString m_sHatchStyle;//填充样式
Adesk::UInt16 m_nHatchColor;//填充色
AcDbHardPointerId m_idHatchLayer;//填充图层
double m_dHatchScale; // 填充比例,sg add 081124
double m_dHatchAngle; // 填充角度,sg add 081124
DList<AcDbSoftPointerId> m_lstBalconyArea;//附属的套内阳台面积,面积计算用
DList<AcDbSoftPointerId> m_lstBalcony;//套内阳台
Adesk::UInt8 m_bMText; // sg add 081211,房间名称是否使用两行
// 8.0中,采用两行单行文字,实现需求
XString m_sSndName; // sg add 081215,第二行房间名称
bool m_bIsStretch; // sg add 120215,标记夹点操作是否是拉伸操作
public:
TDbSpace();
~TDbSpace();
virtual BOOL IsValid() const;
virtual bool IsModelEntity() const{return true;}
virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag);
virtual Acad::ErrorStatus SetPathPoly(const XPoly2D &polyPath,const AcGeVector3d&normal);
virtual Acad::ErrorStatus GetPathPoly(XPoly2D &polyPath,AcGeVector3d&normal) const;
ACRX_DECLARE_MEMBERS(TDbSpace);
// Overriden function from AcDbEntity
virtual Acad::ErrorStatus subGetClassID(CLSID* pClsid) const;
virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler*);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler*);
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const;
virtual Acad::ErrorStatus subGetOsnapPoints(
AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& ptPick,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const;
virtual Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent,
AcDb::Intersect intType,
AcGePoint3dArray& points,
INT_PTR thisGsMarker,
INT_PTR otherGsMarker) const;
virtual Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent,
AcDb::Intersect intType,
const AcGePlane& projPlane,
AcGePoint3dArray& points,
INT_PTR thisGsMarker,
INT_PTR otherGsMarker) const;
virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray& gripPoints,
AcDbIntArray& osnapModes,
AcDbIntArray& geomIds) const;
virtual Acad::ErrorStatus subGetStretchPoints(AcGePoint3dArray & stretchPoints) const;
virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform);
virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset);
virtual Acad::ErrorStatus subMoveStretchPointsAt(const AcDbIntArray& indices,
const AcGeVector3d& offset);
// drived from TDbEntity
virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const;
virtual Acad::ErrorStatus ExplodeOrDraw3d(XExplodeDraw &dc) const;
virtual void GetTips(DList<TObjInfoUnit> &) const; //取动态属性显示数据
virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const;
virtual const TCHAR *GetDefaultLayer() const;
virtual int ConvertText(TConvertTextPtr ptr, void *pData=NULL);
// 返回发现的位置,同时posStart往前移动(以便继续找下一个使用),
virtual TTextPosition FindSubText(const TCHAR *sSubText, TTextPosition &posStart, TTextRange *pRange=NULL) const;
// 返回下一次查找的开始位置
virtual TTextPosition ReplaceSubText(const TTextPosition &posRep, const TCHAR *sRepText, TTextRange *pRange=NULL);
virtual long GetSubTextNum()const{return 2;}//ok
virtual void SetSubText(long i,CString sText);
virtual Acad::ErrorStatus DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet,
BOOL *bErase); // sg add 081224
// sg add 111116,支持导出XML
virtual CString GetXml(const AcGeMatrix3d& mat) const;
// sg add 120214,支持夹点ctrl功能切换
virtual int GetCtrlToggleIndex()const { return 9; }
#if ADS>15
virtual void CreateGrip();
virtual Acad::ErrorStatus EntityToDim(long iGrip,long iDim,const AcDbEntity*pEnt);
virtual Acad::ErrorStatus DimToEntity(long iGrip,long iDim,double newValue,const AcGeVector3d& offset);
#endif
void InitSetLocation(const XPoint &ptLoc); //初始设置房间(编号)的位置
Acad::ErrorStatus UpdateFrom(const XAecSpaceCell &src, BOOL bExtSpace);
void CreateWipeOut(AcDbVoidPtrArray &entSet) const;
// 访问属性的方法见基类TSpaceData, 修改前需要assertWriteEnabled();
BOOL GetText(Adesk::UInt32 cookies, TDbText &text) const;
BOOL IsMask() const;
BOOL IsHighlight() const;
BOOL IsShowOutline()const;
BOOL Has3D() const {return ((m_nSpaceFlag&SF_GROUND3D)!=0);}
BOOL IsBalcony()const{return (m_nSpaceFlag&SF_BALCONY)!=0;}//ok
BOOL IsHalfArea()const{return (m_nSpaceFlag&SF_HALF_AREA)!=0;}//ok
BOOL HasHatch()const{return (m_nSpaceFlag&SF_HATCH)!=0;}
const TCHAR* GetHatchStyle()const{return m_sHatchStyle;}//ok
double GetRotation() const
{
return m_nRotation;
}
AcDbObjectId GetTextStyleId() const
{
return m_idTextStyle;
}
double GetTextHeight(BOOL bAsPaperUnit=TRUE) const
{
double val=m_nTextHeight;
if(!bAsPaperUnit)
val *= GetPScale();
return val;
}
double GetFloorThick() const
{
return m_nFloorThick;
}
AreaType GetType()const{return m_nType;}//ok
void SetType(AreaType type)
{
assertWriteEnabled();
m_nType=type;
}
void SetMask(BOOL bTrue);
void SetHas3D(BOOL bTrue)
{
assertWriteEnabled();
if(bTrue) m_nSpaceFlag|=SF_GROUND3D;
else m_nSpaceFlag &= ~SF_GROUND3D;
}
void SetBalcony(BOOL bTrue)
{
assertWriteEnabled();
if(bTrue) m_nSpaceFlag|=SF_BALCONY;
else m_nSpaceFlag &= ~SF_BALCONY;
}
void SetHalfArea(BOOL bTrue)
{
assertWriteEnabled();
if(bTrue) m_nSpaceFlag|=SF_HALF_AREA;
else m_nSpaceFlag &= ~SF_HALF_AREA;
}
void SetHasHatch(BOOL bTrue)
{
assertWriteEnabled();
if(bTrue) m_nSpaceFlag|=SF_HATCH;
else m_nSpaceFlag &= ~SF_HATCH;
}
void SetHatchStyle(const TCHAR* sStyle)
{
assertWriteEnabled();
m_sHatchStyle=sStyle;
}
Adesk::UInt16 GetHatchColor()const{return m_nHatchColor;}
AcDbObjectId GetHatchLayer()const{return m_idHatchLayer;}
double GetHatchScale()const{return m_dHatchScale;}
double GetHatchAngle()const{return m_dHatchAngle;}
void SetHatchColor(Adesk::UInt16 color)
{
assertWriteEnabled();
m_nHatchColor=color;
}
void SetHatchLayer(AcDbObjectId idLay)
{
assertWriteEnabled();
m_idHatchLayer=idLay;
}
void SetHatchScale(double dScale)
{
assertWriteEnabled();
m_dHatchScale=dScale;
}
void SetHatchAngle(double dAngle)
{
assertWriteEnabled();
m_dHatchAngle=dAngle;
}
void SetHighlight(BOOL bTrue);
void SetShowOutline(BOOL bTrue);
void SetRotation(double nRot)
{
assertWriteEnabled();
m_nRotation=nRot;
}
void SetTextHeight(double val, BOOL bAsPaperUnit=TRUE)
{
assertWriteEnabled();
m_nTextHeight=val;
if(!bAsPaperUnit)
m_nTextHeight /= GetPScale();
}
void SetTextStyleId(AcDbObjectId id)
{
assertWriteEnabled();
m_idTextStyle = id;
}
void SetFloorThick(double nThick)
{
assertWriteEnabled();
m_nFloorThick=nThick;
}
void SetElevation(double nElev)
{
assertWriteEnabled();
m_ptLocation.z=nElev;
}
BOOL IsMText() const // sg add 081211,设置“房间名称”是否使用两行文字
{
return m_bMText;
}
void SetMText(BOOL bTrue)
{
assertWriteEnabled();
m_bMText = bTrue;
}
CString GetSndName() const { // sg add 081215,第二行名称
return (const TCHAR *)m_sSndName;
}
void SetSndName(const TCHAR *pszName) {
assertWriteEnabled();
m_sSndName = pszName;
}
// sg add 090508,获取所属户,动态数据
AcDbObjectId GetHouseId() const;
void SetHouseId(AcDbObjectId id);
// sg add 100907,增加粉刷层厚度的动态数据
double GetStuccoThickness() const;
void SetStuccoThickness(double dThickness);
// sg add 100907,增加房间填充真彩色的动态数据,原有的m_nHatchColor不再使用
AcCmColor GetHatchTrueColor() const;
void SetHatchTrueColor(const AcCmColor &color);
// add by xly on 101020 支持改进房间对象编号、名称、面积和面积单位的显示控制
// 8.5版不使用图纸中的变量控制,采用对象的动态数据,保证图纸中的房间对象可以用不同的形式显示
// 设置高级选项中的控制方式:1——随图纸中的变量统一控制,默认,考虑与旧图兼容;0——独立控制
void SetSpaceDispMode(int nConfig);
int GetSpaceDispMode() const;
// 2——随图纸中的变量统一控制,默认,考虑与旧图兼容;1——显示,0——不显示
// 房间名称、编号是否标注
void SetDimNameAndCode(BOOL bDimName, BOOL bDimCode);
BOOL IsDimName() const; // 已自动获取图纸中变量的状态
BOOL IsDimCode() const;
// 房间面积是否标注
void SetDimArea(BOOL bDim);
BOOL IsDimArea() const;
// 面积单位是否标注
void SetDimUnit(BOOL bDim);
BOOL IsDimUnit() const;
public: //节能属性
BOOL IsHvacSpace() const {return ((m_nSpaceFlag&SF_HVAC)!=0);}//是否空调房间
void SetHvacSpace(BOOL bTrue)
{
assertWriteEnabled();
if(bTrue)
m_nSpaceFlag |= SF_HVAC;
else
m_nSpaceFlag &= ~SF_HVAC;
}
private:
CString GetAreaByPrecision() const; // 按精度获取房间面积,sg add 081127
void GetCodeExtentPts(XPoly2D &poly, XPoint pt, XVector3D vt) const; // sg add 081211
// sg add 081211,返回文字位置距离m_ptLocation点的字高系数
// 房间名称,bChineseName表示中文名称,一般在上一行,英文名称在下一行
double GetNameDistRatio(BOOL bChineseName = TRUE) const;
double GetCodeDistRatio() const; // 编号
double GetAreaDistRatio() const; // 面积
// add by xly on 101020 支持改进房间对象编号、名称、面积和面积单位的显示控制
// 默认从全局数据中拷贝数据
void SetSpaceDispFlag(int nFlag);
int GetSpaceDispFlag() const;
// add by gjm
void DrawHatchInExplode(TGGiExplodeDrawBase &dc, const std::vector<TGGePoly2D> &holds) const;
void DrawTextInExplode(TGGiExplodeDrawBase &dc, std::vector<TGGePoly2D> &holds) const;
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
TARCH_IMPEXP int EditSpace0(AcDbObjectId id);
// 通过一点确定一房间的信息
// ptPick--WCS point
// Return: 0--Fail, 1--Normal Space, 2--External Space
TARCH_IMPEXP int GenSpaceInfo(const XPoint &ptPick, TDbSpace &space, BOOL bIgnoreVirt=FALSE);
#endif