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

348 lines
14 KiB
C++

#ifndef __DBOPENING_H
#define __DBOPENING_H
//#include "DbEntity.h"
#include "OpeningData.h"
class XAcGiViewDraw;
class XExplodeDraw;
class TDbText;
class TARCH_EXP TDbOpening: public TDbEntity, public TOpeningData
{
friend class TDbWall;
DECLARE_TENTBASE();
ACRX_DECLARE_MEMBERS(TDbOpening);
private:
const static Adesk::UInt8 g_nVersion;
protected:
// TArch6 data
AcDbHardPointerId m_idTextStyle, m_idLayerText; //门窗号的文字样式
double m_nTextHeight; //门窗号的高度(图纸尺寸)
//修改原因 : 增加记录 boundary,hatch 命令涉及到的 动态变换矩阵 m_mat3d
// 当AcDbBlockRef 中引用到门窗时,对于boundary,hatch 这样的边界分析命令,
// 先调用 transformby,然后调用 ExplodeOrDraw2d时,对关联的墙分析有误,此时
// 墙还没有transformby,导致门窗和墙关系不同步错误,boundary,hatch 分析乱线
// 该矩阵不序列化
//修改人 : lfy 2009-11-08
AcGeMatrix3d m_mat3d;
//
double m_nSlabThickness; //窗台板厚,对于凸窗
// 对于映射窗框
AcDbHardPointerId m_idLayerGlass3d, m_idLayerFrame3d, m_idLayerSlab3d; //玻璃、窗框和窗台板的图层
double m_uFrame, m_vFrame; //窗框(竖直)高度和窗框(水平)厚度
DList<XCurveSegment> m_lstFrameLines; //待映射的窗框线,不包括外框
//TArch7
Adesk::UInt16 m_colorText;//文字颜色
public:
//节能数据
int m_iEnFlag;//节能特性,obsolete
XString m_sCons;//构造
double m_dbAbsorption;//日射吸收率
double m_dbShadeCo;//遮阳系数
double m_dbOutShadeCoSum;//夏季外遮阳系数
double m_dbOutShadeCoWin;//冬季外遮阳系数
public:
XPoint m_ptBackOld,m_ptFrontOld;//原先左右两点,用于尺寸联动
protected:
void GetLabelText(TDbText &text) const;
void DrawDoorLine(XExplodeDraw &dc) const;
//add by xlc on 120510 解决丁字行墙上的带形窗豁口问题
BOOL IsSameDrtAtPt(const TGGeCurveSegment& cvThis, const TGGeCurveSegment& cvThat, const TADSGePoint3d& pt) const;
public:
// sg modify 110224,增加返回标注,告诉用户端是否需要补充数字
// CString GetAutoLabel()const;
CString GetAutoLabel(bool &bAddNum)const;
double GetUFrame() const {return m_uFrame;}
double GetVFrame() const {return m_vFrame;}
double GetSlabThickness() const {return m_nSlabThickness;}
AcDbObjectId GetLayerGlass3d() const {return m_idLayerGlass3d;}
AcDbObjectId GetLayerFrame3d() const { return m_idLayerFrame3d;}
AcDbObjectId GetLayerSlab3d() const {return m_idLayerSlab3d;}
AcDbObjectId GetTextStyle() const {return m_idTextStyle;}
AcDbObjectId GetLayerText() const {return m_idLayerText;}
double GetTextHeight(BOOL bAsPaperUnit=TRUE) const {return bAsPaperUnit?m_nTextHeight:m_nTextHeight*GetPScale();}
BOOL HasFrameLines() const {return (m_lstFrameLines.Length()!=0);}
void SetUFrame(double u) {assertWriteEnabled(); m_uFrame=u;}
void SetVFrame(double v) {assertWriteEnabled();m_vFrame=v;}
void SetSlabThickness(double nThick) {assertWriteEnabled();m_nSlabThickness = nThick;}
void SetLayerGlass3d(AcDbObjectId idLay) {assertWriteEnabled();m_idLayerGlass3d=idLay;}
void SetLayerFrame3d(AcDbObjectId idLay) {assertWriteEnabled();m_idLayerFrame3d=idLay;}
void SetLayerSlab3d(AcDbObjectId idLay) {assertWriteEnabled();m_idLayerSlab3d=idLay;}
void SetTextStyle(AcDbObjectId idStyle) {assertWriteEnabled();m_idTextStyle=idStyle;}
void SetLayerText(AcDbObjectId idLayer) {assertWriteEnabled();m_idLayerText=idLayer;}
void SetTextHeight(double nHeight, BOOL bAsPaperUnit=TRUE)
{
assertWriteEnabled();
if(bAsPaperUnit)
m_nTextHeight=nHeight;
else
m_nTextHeight=nHeight/GetPScale();
}
void SetFrameLines(const DList<XCurveSegment> &lstCurves)
{
assertWriteEnabled();
m_lstFrameLines.Reset();
for(int i=0; i<lstCurves.Length(); i++)
m_lstFrameLines.Append(new XCurveSegment(lstCurves[i]));
}
bool IsShowLabel()const{assertReadEnabled();return (m_nOpStyleEx&OPSEX_HIDE_LABEL)==0;}
void SetLabelVisible(bool bTrue)
{
assertWriteEnabled();
if(bTrue)
m_nOpStyleEx&=~OPSEX_HIDE_LABEL;
else
m_nOpStyleEx|=OPSEX_HIDE_LABEL;
}
bool IsDoorAsWin()const;
//矩形凸窗挡板数据接口
BOOL HasLeftSlab()const{return (m_nOpStyleEx&OPSEX_LEFT_SLAB)!=0;}
BOOL HasRightSlab()const{return (m_nOpStyleEx&OPSEX_RIGHT_SLAB)!=0;}
void SetProWinSlabWidth(double w){assertWriteEnabled();m_nProWinSlabWidth=w;}
double GetProWinSlabWidth(double w)const{return m_nProWinSlabWidth;}
void SetSideSlab(int type);//0,无,1,双侧,2,左侧,3,右侧
public:
TDbOpening();
TDbOpening(AcDbObjectId idWall, AcDbObjectId idStyle2d, AcDbObjectId idStyle3d);
virtual BOOL IsValid() const;
virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag);
virtual TEntityBase::DrawType GetDrawType() const;
virtual Acad::ErrorStatus DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet, BOOL *bErase);
// 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 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);
//virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet) const;
virtual Acad::ErrorStatus subDeepClone(AcDbObject* pOwner,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary) const;
virtual Acad::ErrorStatus subGetOsnapPoints(
AcDb::OsnapMode osnapMode,
INT_PTR gsSelectionMark,
const AcGePoint3d& pickPoint,
const AcGePoint3d& lastPoint,
const AcGeMatrix3d& viewXform,
AcGePoint3dArray& snapPoints,
AcDbIntArray& geomIds) const;
// 为了通知墙体更新显示
virtual Acad::ErrorStatus subClose();
virtual Acad::ErrorStatus subErase(Adesk::Boolean bErasing);
virtual Acad::ErrorStatus subOpen(AcDb::OpenMode mode);
// Helper Method
Acad::ErrorStatus GetInsert3DScale(double *pScaleX, double *pScaleY, double *pScaleZ) const; // 求插入比例
Acad::ErrorStatus GetInsert2DScale(double *pScaleX, double *pScaleY) const;
// Set methods
void SetKind(OpeningKind opk);
void SetWallId(const AcDbObjectId &id) { m_nIdOfWall = id; }
// 绘制函数
BOOL GetBanWinSegs(XCurveSegment &segLeftSide, XCurveSegment &segLeft,
XCurveSegment &segMid, XCurveSegment &segRight, XCurveSegment &segRightSide) const;
BOOL DrawDoorOrWin3d(XExplodeDraw &dc, const XLine &lnPos, BOOL bDoor) const;
BOOL DrawBayWindow2d(XExplodeDraw &dc) const; // 绘制二维凸窗
BOOL DrawBayWindow3d(XExplodeDraw &dc) const; //绘制三维凸窗
BOOL DrawFrame3d(XExplodeDraw &dc, const XPoly2D &polyGlass) const; //绘制三维窗框
BOOL DrawBanWin(XExplodeDraw &dc, BOOL bDraw3d) const; //绘制带形窗
BOOL DrawArcWin3d(XExplodeDraw &dc) const;
void DrawLabel(XExplodeDraw &dc, const TCHAR *szLab) const;
void ExplodeOrDrawDoorWin(XExplodeDraw &dc, BOOL bDraw3d) const;
void ExplodeOrDrawTwoDoor(XExplodeDraw &dc, BOOL bDraw3d) const;
void DragDraw(XAcGiViewDraw &dc) const; //动态绘制
bool GetNeighbourPoint(XPoint &pt,bool bPre)const;
// driver from TDbEntity
virtual bool IsModelEntity() const{return true;}
virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const;
virtual Acad::ErrorStatus ExplodeOrDraw3d(XExplodeDraw &dc) const;
virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const;
virtual void GetTips(DList<TObjInfoUnit> &) 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 1;}//ok
virtual TSubText* HitTestText(XPoint pt)const;
virtual TSubText* GetSubText(long iText)const;
virtual void SetSubText(long i,CString sText){assertWriteEnabled();SetLabel(sText);}//ok
virtual bool IsClipMe(const TEntityBase* pEnt=NULL)const;
virtual bool IsMeClip()const{return true;}//add by whl on 060112
virtual Acad::ErrorStatus GetClipBoundary(XPoly2D& poly)const;//add by whl on 060112
//virtual Acad::ErrorStatus GetQuantumByName(const char *pszName, double *pQuantum) const;
// add by gjm 三维剖切
virtual bool GetSection(const AcDbFace &face, const AcGeVector3d& vtPlaneSecDir,
std::vector<TObjSectionRecord> &sectionRecords,
AcDbVoidPtrArray& arFillPtrs) const;
#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
//add by xlc on 101112
virtual CString GetXml(const AcGeMatrix3d& mat) const;
// sg add 101115,支持统一标高
// 需要特殊说明,此类中的dElevation形参,表示的是门窗所在墙,未来会变成的标高值
virtual bool UnifyElevation(double dElevation = 0.0);
void UpdateOwnerWallGraphic() const;
Acad::ErrorStatus
InsertIntoWall(TDbWall *pWall);
virtual void ValidateContainership(DList<AcDbObjectId> &lstWalls); //验证调整和墙的配属关系
virtual void ValidateDim(DList<AcDbObjectId> &lstDims);
static BOOL GetOriginal3DSize(AcDbObjectId idSyle3d, XPoint &sizeXYZ);
//static void InitQuantumProtocol(BOOL bTrue);
//static void InitProperty(BOOL bTrue);
virtual void MirrorSelf(BOOL bLeftRight); //左右镜像或上下进行
BOOL ExpandFrame(AcDbVoidPtrArray &entSetFix, AcDbVoidPtrArray &entSetCustom) const; //窗框展开
XPoint GetDefaultLabPos() const;
void InitHardPointerId(); //只能用于当前图对象,设置缺省子图层和文字样式
//保温 wlw修改100629
int GetSlotMaterial() const; // 门窗套材料
void SetSlotMaterial(int nMat);
double GetSlotInsulateThick() const; // 门窗套保温厚
void SetSlotInsulateThick(double dThick);
BOOL HasSlotInsulateCap() const; // 门窗套保温是否封口
void SetSlotInsulateCap(BOOL bSlotInsCap = TRUE);
double GetProWinSlabInsuThick() const; // 凸窗挡板保温厚
void SetProWinSlabInsuThick(double dThick);
double GetDoorLineOffsetDist() const; // 门口线偏移距离(只对单侧、双侧起作用)
void SetDoorLineOffsetDist(double dOffsetDist);
CString GetSubKind() const; // 门、窗、弧窗的自类型(支持用户设置,无法用枚举类型)
void SetSubKind(const TCHAR *csKind);
BOOL HasInsulate() const;
void SetInsulate(BOOL bTrue);
bool ReadInsulateFromXData(int& nMaterial, double& dThick, BOOL &bSlotInsCap)const;
bool WriteInsulateToXData(int nMaterial, double dThick, BOOL bSlotInsCap);
public:
// 访问属性的方法, 见基类TOpeningData, 凡是修改属性, 需要先assertWriteEnabled();
// 修改完宽度和高度的属性后需要UpdateOwnerWallGraphic();
/////////////////////////////////////////
// 节能属性
//窗墙面积比:>0正常,其他为错误发生。只考虑本窗与墙的面积比
double GetAreaIndex() const;
//求方位角:弧窗取中心点的朝向
//弧度:>=0正常,<0错误发生:如内门窗等
double GetAzimuth() const;
//求平均传热系数:W/m2.K
// 待完成
// <0:有错误发生
double GetUValue() const { return -1; }
// 有无外遮阳
BOOL HasExtShading() const { return ((m_nOpStyle&OPS_EXT_SHADING)!=0); }
void SetExtShading(BOOL bTrue) {
assertWriteEnabled();
if(bTrue)
m_nOpStyle |= OPS_EXT_SHADING;
else
m_nOpStyle &= ~OPS_EXT_SHADING;
}
// 是否为户门
BOOL IsOwnerDoor() const {
BOOL bRet=FALSE;
if(m_opKind==OP_DOOR || m_opKind==OP_TWODOOR)
bRet=((m_nOpStyle&OPS_OWNER_DOOR)!=0);
return bRet;
}
Acad::ErrorStatus SetOwnerDoor(BOOL bTrue) {
assertWriteEnabled();
Acad::ErrorStatus es=Acad::eOk;
if(m_opKind==OP_DOOR || m_opKind==OP_TWODOOR) {
if(bTrue) m_nOpStyle|=OPS_OWNER_DOOR;
else m_nOpStyle &= ~OPS_OWNER_DOOR;
} else {
es=Acad::eInvalidInput;
}
return es;
}
// 是否为阳台门
BOOL IsBalconyDoor() const {
BOOL bRet=FALSE;
if(m_opKind==OP_DOOR || m_opKind==OP_TWODOOR || m_opKind==OP_DOORWIN)
bRet=((m_nOpStyle&OPS_BALCONY_DOOR)!=0);
return bRet;
}
Acad::ErrorStatus SetBalconyDoor(BOOL bTrue) {
assertWriteEnabled();
Acad::ErrorStatus es=Acad::eOk;
if(m_opKind==OP_DOOR || m_opKind==OP_TWODOOR || OP_DOORWIN) {
if(bTrue) m_nOpStyle|=OPS_BALCONY_DOOR;
else m_nOpStyle &= ~OPS_BALCONY_DOOR;
} else {
es=Acad::eInvalidInput;
}
return es;
}
// 0-其他;1-户门;2-阳台门
int GetDoorEnFlag() const {
int nFlag=0;
if(IsOwnerDoor())
nFlag=1;
else if(IsBalconyDoor())
nFlag=2;
return nFlag;
}
void SetDoorEnFlag(int iFlag) {
assertWriteEnabled();
if(iFlag==1) {
SetOwnerDoor(TRUE);
SetBalconyDoor(FALSE);
} else if(iFlag==2) {
SetOwnerDoor(FALSE);
SetBalconyDoor(TRUE);
} else {
SetOwnerDoor(FALSE);
SetBalconyDoor(FALSE);
}
}
void BackupPoints(){GetSidePoints(m_ptBackOld,m_ptFrontOld);}//ok
};
#endif