#ifndef __OPENINGDATA_H #define __OPENINGDATA_H #include "BayWindow.h" // 门窗风格 #define OPS_SLOT 0x01 //有门窗套 #define OPS_NOT_BORE 0x02 //不穿透的孔洞 #define OPS_HIGH_LEVEL 0x04 //上层窗(不同于高窗) //#define OPS_DOORWIN 0x08 //门联窗 //#define OPS_HOLE_VER1 0x10 //1.x版的洞, 兼容旧版 //#define OPS_HOLE_NONE 0x10 //二维什么都不显示的洞 #define OPS_HOLE_FLAG1 0x08 #define OPS_HOLE_FLAG2 0x10 #define OPS_ATHIGH 0x20 //高窗或未剖到的洞 #define OPS_LIFTDOOR 0x40 //电梯门 #define OPS_LVTRY 0x80 //隔断门 #define OPS_SLOT3D 0x100 //有三维窗套 #define OPS_DOORLINE1 0x200 //开启反向的门口线(m_nOpStyle) #define OPS_DOORLINE2 0x400 //开启方向的门口线(m_nOpStyle) #define OPS_DOORLINE_MID 0x0008 //居中门口线(m_nOpStyleEx) #define OPS_LONE 0x10 //孤立的门窗(m_nOpStyleEx) #define OPS_POLY_HOLE 0x800 //异形洞 // 节能属性 #define OPS_OWNER_DOOR 0x1000//户门 #define OPS_BALCONY_DOOR 0x2000 //阳台门 #define OPS_EXT_SHADING 0x4000 //有固定外遮阳 //门窗套保温 #define OPS_SLOT_INSULATE 0x8000 //门窗套保温 #define OPSEX_HIDE_LABEL 0x0001//隐藏编号 #define OPSEX_LEFT_SLAB 0x0002 //左侧挡板,凸窗专用 #define OPSEX_RIGHT_SLAB 0x0004//右侧挡板,凸窗专用 using namespace TchGeLib; class TARCH_EXP TOpeningData { friend class TDbWall; friend class TWallData; public: // sg modify 120523,增加了设备箱对象 //enum OpeningKind { OP_DOOR=0, OP_WINDOW=1, OP_HOLE=2, OP_ARCWIN=3, // OP_PROWIN=4, OP_CORNWIN=5, OP_DOORWIN=6, OP_TWODOOR=7, OP_GROUP=8}; enum OpeningKind { OP_DOOR=0, OP_WINDOW=1, OP_HOLE=2, OP_ARCWIN=3, OP_PROWIN=4, OP_CORNWIN=5, OP_DOORWIN=6, OP_TWODOOR=7, OP_GROUP=8, OP_EQUIPBOX=9}; XPoint m_ptLocation; // 含Z坐标,作为窗台高度 // m_nThickness仅当门窗不在墙上时使用 ads_real m_nWidth, m_nThickness, m_nHeight; // nWidth, nHeight, nThickness>0 ads_real m_nRotation; // 0~2*PI, 门窗插入点在墙的切向 Adesk::UInt8 m_nQuadrant; // 象限0,1,2,3代表第1~4象限, m_nRotation为象限的X正方向 OpeningKind m_opKind; // 门窗类型 ads_real m_nBulge; // 对于弧形窗不为0 XPoint m_ptLabel; // 标注点的位置 XString m_sLabel; // 标号 AcDbHardPointerId m_nIdStyle2d, m_nIdStyle3d; // 块表中的ID AcDbSoftPointerId m_nIdOfWall; // 门窗所在的墙 public: // V2.0 新成员 Adesk::UInt16 m_nOpStyle; // 是否包含门窗套等标记 double m_nSlotExt, m_nSlotWidth; // 伸出墙的距离,窗套宽度 XBayWindow *m_pBayWin; double m_nDoorWidth, m_nWinHeight; // 门联窗门宽(或子母大门宽)和窗高 // TArch7 data Adesk::Int32 m_nOpStyleEx; // TArch8 data double m_nProWinSlabWidth; // 凸窗挡板厚 double m_nCornWinProtrude; // 转角凸窗伸出矩离,不存盘! // wlw add 100719保温层过渡数据,不存储 int m_nMaterial; double m_dInsWidth; BOOL m_bSlotInsCap; // 门窗套是否封口 double m_dInsBack; // 墙保温线回退距离 // TArch9 data // sg add 120606,转角窗出挑长度,包括了m_nCornWinProtrude,m_nCornWinProtrude中只考虑了有挡板的情况下,不保存 double m_dCornWinTrueProtrude; public: TOpeningData(); TOpeningData(const TOpeningData &src): m_pBayWin(NULL) { *this = src; } virtual ~TOpeningData() { if(m_pBayWin) delete m_pBayWin; m_pBayWin=NULL; } BOOL Has3D() const { return (m_nHeight>_DIST_SNAP); } void SetQuadrant(Adesk::UInt8 n){m_nQuadrant=n;} BOOL IsLinear() const; TOpeningData & operator = (const TOpeningData &src); Adesk::Boolean IsGoThroughBy(const XCurveSegment &seg) const; Adesk::Boolean IsHigh() const;//wlw mod 140220 移到cpp中 void SetHigh(BOOL bTrue); Adesk::Boolean IsHighLevel() const { return ((m_nOpStyle&OPS_HIGH_LEVEL)!=0); } void SetHighLevel(BOOL bTrue) { if(bTrue) m_nOpStyle |= OPS_HIGH_LEVEL; else m_nOpStyle &= ~OPS_HIGH_LEVEL; } void GetPlanarMatrix(ads_matrix matTrans) const; // modify by xlc on 100824 减法运算时,弧墙上的直门窗洞有误差 //void GetOutlinePoly(ads_real nZ, XPoly2D &poly) const; //在XY平面上的轮廓 void GetOutlinePoly(ads_real nZ, XPoly2D &poly ,BOOL bSubtract = FALSE) const; //在XY平面上的轮廓 virtual void GetElevOutline(XPoly2D&poly)const;//立面上的轮廓 void GetOutlinePoly(XPoly &poly, int nCirDiv=30) const; Acad::ErrorStatus GetStyle3dName(XString &sName) const; Acad::ErrorStatus GetStyle2dName(XString &sName) const; Acad::ErrorStatus GetStyle3dName(XString &sDwb, XString &sDwg) const; Acad::ErrorStatus GetStyle2dName(XString &sDwb, XString &sDwg) const; void GetSidePoints(XPoint &ptSideBack, XPoint &ptSideFront) const; //取得门窗的边界点 bool GetCenterCurve(XCurveSegment &wall)const; void GetSidePointsOnBase(XPoint &ptSideBack, XPoint &ptSideFront) const; // Get methods AcDbObjectId GetWallId() const { return m_nIdOfWall; } OpeningKind GetKind() const { return m_opKind; } ads_real GetRotation() const { return m_nRotation; } void SetRotation(double nRot){m_nRotation=nRot;}//ok XPoint GetLocation() const { return m_ptLocation; } void SetLocation(XPoint pt) { m_ptLocation=pt; } bool IsDoor()const{CString sKind=GetKindString();return sKind.Find(_T("门"))>=0;} ads_real GetWallElevation() const; // 取得所在的墙的基面标高 ads_real GetWallThickness(BOOL bIncludeInsulateLayer=FALSE) const; // 取得所在的墙的宽度 void SetSidePoints(const XPoint &ptSideBack, const XPoint &ptSideFront); // OPM属性 double GetOutlineArea() const; //洞口面积 double GetOutlineLength() const; //洞口长度 ads_real GetWidth() const { return m_nWidth; } //门窗宽度 ads_real GetElevation() const { return m_ptLocation.z; } //底标高 ads_real GetHeight() const { return m_nHeight; } ads_real GetTopElev()const{return GetElevation()+GetHeight();}//顶标高 ads_real GetThickness() const { return m_nThickness; } //窗框厚度 const TCHAR * GetLabel() const { return (const TCHAR *)m_sLabel; } virtual const TCHAR * GetKindString() const; double GetSill() const { //取得窗台高度 return GetElevation()-GetWallElevation(); } BOOL HasSlot() const { //是否有门窗套 return ((m_nOpStyle&OPS_SLOT)!=0); } BOOL HasSlot3d() const { return (HasSlot()&& (m_nOpStyle&OPS_SLOT3D)!=0); } double GetSlotExt() const { //门窗套申出长度 return m_nSlotExt; } double GetSlotWidth() const {//门窗套宽度 return m_nSlotWidth; } XPoint GetLabelPos() const { return m_ptLabel; } BOOL HasLeftSlab()const{return (m_nOpStyleEx&OPSEX_LEFT_SLAB)!=0;} BOOL HasRightSlab()const{return (m_nOpStyleEx&OPSEX_RIGHT_SLAB)!=0;} //add by xlc on 110131 独立门窗接口 BOOL IsLoneOpening() const; void SetLoneOpening(BOOL bTrue); // Set methods Acad::ErrorStatus SetSlot(double nExt, double nWid) { m_nOpStyle |= OPS_SLOT; m_nSlotExt = nExt; m_nSlotWidth = nWid; return Acad::eOk; } void SetSlot3d(BOOL bTrue) { if(bTrue) m_nOpStyle |= (OPS_SLOT|OPS_SLOT3D); else m_nOpStyle &= ~OPS_SLOT3D; } void RemoveSlot() { m_nOpStyle &= ~OPS_SLOT; m_nSlotExt = m_nSlotWidth = 0; } Acad::ErrorStatus SetLabel(const TCHAR *szLab) { m_sLabel = szLab; return Acad::eOk; } virtual Acad::ErrorStatus SetSill(double nSill) { //改变窗台高度 if(nSill < -1.0E-6) return Acad::eInvalidInput; m_ptLocation.z = GetWallElevation()+nSill; return Acad::eOk; } virtual Acad::ErrorStatus SetWidth(double nW) { if(nW<1.0E-6) return Acad::eInvalidInput; m_nWidth = nW; return Acad::eOk; } virtual Acad::ErrorStatus SetHeight(double nH) { //窗高为0,则无3D m_nHeight = nH; return Acad::eOk; } Acad::ErrorStatus SetThickness(double nT) { //窗框厚度 if(nT<1.0E-6) return Acad::eInvalidInput; m_nThickness = nT; return Acad::eOk; } void SetLabelPos(XPoint pt) { m_ptLabel=pt; } XPoint GetDoorPos() const; XPoint GetWinPos() const; // 返回值:0x01-lnLeft, 0x02-lnRight,lnLeft/lnRight都是无限长 int GetSideLine2d(XLine &lnLeft, XLine &lnRight) const; }; #endif