#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 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 &lstCurves) { assertWriteEnabled(); m_lstFrameLines.Reset(); for(int i=0; i &) 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 §ionRecords, 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 &lstWalls); //验证调整和墙的配属关系 virtual void ValidateDim(DList &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