//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TWallData.h // = Version : ver2.0 // = Author : xlc // = CreateDate : 2002-09-09 // = Description: 墙体数据类的声明 // = Maintainers: // //-----------------------------------------------------------------------------+ #ifndef _TWALLDATA_H_ #define _TWALLDATA_H_ #ifndef __OPENINGDATA_H #include "OpeningData.h" #endif #ifndef _TGGECURVESEGMENT_H_ #include "TGGeCurveSegment.h" #endif #ifndef _TSORTWALLONPT_H_ #include "TSortWallOnPt.h" #endif #ifndef __DBOPENING_H #include "dbopening.h" #endif #define WALLMATE_NoDefine _T("其它") #define WALLMATE_Divider _T("石膏板") #define WALLMATE_Curtain _T("玻璃幕") #define WALLMATE_Fill _T("填充墙") #define WALLMATE_Fill1 _T("加气块") #define WALLMATE_Fill2 _T("空心砖") #define WALLMATE_Brick _T("砖") #define WALLMATE_Brick1 _T("耐火砖") #define WALLMATE_Rocket _T("石材") #define WALLMATE_Rocket1 _T("毛石") #define WALLMATE_Concrete _T("钢筋砼") #define WALLMATE_Concrete1 _T("混凝土") class TARCH_EXP TWallData : public TGGeCurveSegment { friend class TSearchSpaceFromWall; friend int DoubleWall(const TGGeCurveSegment &curve, int nwk); public: TWallData(); TWallData(const TWallData &src); TWallData(const TEntitySet &ent); TWallData(const TADSGePoint3d &ptStart, const TADSGePoint3d &ptEnd, ads_real nSweepAng = 0.0); virtual void UpdateWallWidth(); // 用途标志 enum UsageFlag { kNormal = 0, //一般墙 kApartment = 1, //卫生断墙 kEdJig = 2, //交互拖曳 // TArch6 kVirtual = 3, //虚墙,仅仅作为空间的逻辑分隔 // TArch7 kParapet = 4, //矮墙,如女儿墙 }; enum TWallStyle { kDivider = 10, //隔墙 kCurtain = 20, //玻璃幕墙 kFill = 30, //填充墙 kFill1 = 31, //填充墙1,TArch7 kFill2 = 32, //填充墙2,TArch7 kBrick = 40, //砖墙 kRocket = 50, //石墙 kConcrete = 60, //钢筋混凝土墙 }; TWallData & operator = (const TWallData &src); int GetWallFlag() const; void SetWallFlag(int nFlag); void SetFlagData(int nFlag); TWallStyle GetStyle() const; void SetStyle(TWallStyle st); //add by xlc on 101110 墙体材料字符串 CString GetStyle(TWallStyle st) const; double GetInsulateThick(int nSide = 0) const ; void SetInsulateThick(double nThick, int nSide = 0); BOOL IsInsulateOnSide(int nSide) const; void SetInsulateOnSide(int nSide, BOOL bAdd); // 增加或移除保温 BOOL HasTop() const; void SetTop(BOOL bTrue); BOOL HasBottom() const; void SetBottom(BOOL bTrue); BOOL HasColumnAt(int nTerm) const; BOOL IsTermAt(int nTerm) const; BOOL IsLowPriorityAt(int nTerm) const; double GetWidth() const; // 0--左侧; 1--右侧; 2--包括保温层左侧; 3--包括保温层右侧; 4--包括保温层的总厚度 double GetWidth(int nSide) const; Acad::ErrorStatus SetWidth(int nSide, double nw); double GetHeight() const; Acad::ErrorStatus SetHeight(double nh); void SetUsageFlag(UsageFlag flg) ; UsageFlag GetUsageFlag() const; //add by xlc on 101110 墙体用途字符串 CString GetUsageFlag(UsageFlag flg) const; double GetElevation() const; double GetAzimuth(int nSide) const; //朝向 double GetAzimuth(int nSide, TADSGePoint3d ptPos) const; const TCHAR *GetStyleText() const; AcDbObjectId GetEndColumnId() const; AcDbObjectId GetStartColumnId() const; struct TARCH_EXP IdDotStyle { AcDbObjectId id; int nStyleEx; IdDotStyle(AcDbObjectId id0, int st) { id = id0; nStyleEx = st; } int GetPriority()const{return nStyleEx;} }; // 按逆时针方向,以pt点为起点的射线,找下一个墙 AcDbObjectId GetNextWall(TADSGePoint3d pt) const; AcDbObjectId GetSameStyleId(int st, const TDPtrList &lstStyles, BOOL bReverse = FALSE) const; void RemoveColumn(AcDbObjectId idColumn); // 内外特征,内墙也可以有外侧,即房间外 //设置外墙标记,但还没有指定左右 void SetExternal(BOOL bTrue); //设置外侧,但不改变外墙、内墙性质 void SetExternal(int nSide, BOOL bTrue); // 0:左侧;1:右侧;2:双侧;-1:无外 int GetExtSide() const; int GetPriority() const; //是外墙,并且nSide朝外 BOOL IsExternal(int nSide) const; //nSide是否朝外(可以不是外墙) BOOL IsExternal1(int nSide) const; //是否为外墙 BOOL IsExternal() const; BOOL Has3D() const; int CompareLocation(const TADSGePoint3d &p1, const TADSGePoint3d &p2) const; void SortOpening(TDPtrList &lstOpenings) const ; void SortOpening(TDPtrList &lstOpenings) const ; ads_real ExtDirection(const TADSGePoint3d &ptLoc) const; // 立面转平面的转换矩阵 void GetPlanarMatrix(ads_matrix matTrans) const; #ifndef OBJECTDBX int GetAxises(const TADSGePoint3d &ptAt, TEntitySet &lEntAxis, TEntitySet &rEntAxis) const; // sg add 110119,修改根据墙体得到轴线的算法,扩大搜索范围 TGGeCurveSegment GetLongBaseLine() const; #endif static int CompareOpening(const TOpeningData *p1, const TOpeningData *p2); static int CompareOpening(const TDbOpening *p1, const TDbOpening *p2); static int CompareIdDotStyleForFind(const IdDotStyle *p1, const void *p2); int CompareWallStyle(int st1, int st2) const; int GetStyleCount(int, const TDPtrList &lstStyles) const; int GetAnotherStyle(int st, const TDPtrList &lstStyles) const; // New method on 2002/4/5 // nSide: 0--start; 1--end; // 以端点出发的射线为起始轴,按逆时针排序,不包括自己 void GetIdStyles(int nSide, TDPtrList &lstIdStyle) const; void GetStyleKindArray(const TDPtrList &lstStyles, AcDbIntArray &intArray)const; // From TWallData // 往侧边投影, 如果src在中心,则投影点在中心 // 返回: 0--左侧,1--右侧,-1有错,否则在中心 int ProjectSide(const TADSGePoint3d &src, TADSGePoint3d &res) const; Adesk::Boolean MergeWith(const TWallData &another); Adesk::Boolean Validate(TDPtrList &lstOpenings) const; Adesk::Boolean GetOpeningLocation(const TADSGePoint3d &ptBase, TOpeningData::OpeningKind, ads_real nOpenWidth, TADSGePoint3d &ptInsert) const; void StandardGetOutlinePoly(double nElev, TGGePoly2D &wOutline, BOOL bIncludeInsulate = FALSE) const; // 不扣除柱子的OutlinePoly void GetOutlinePoly(double nElev, TGGePoly2D &wOutline, BOOL bIncludeInsulate = FALSE) const; // 扣除柱子的OutlinePoly void GetOutlinePoly1(double nElev, TGGePoly2D &wOutline, BOOL bIncludeInsulate = FALSE) const; //找相邻的墙段,bBaseOnPrior--是启用优先级 AcDbObjectId GetLeftStart(BOOL bBaseOnPrior) const; AcDbObjectId GetRightStart(BOOL bBaseOnPrior) const; AcDbObjectId GetLeftEnd(BOOL bBaseOnPrior) const; AcDbObjectId GetRightEnd(BOOL bBaseOnPrior) const; // 返回一AcDbCurve的指针, 调用程序负责删除 // nFlag: 0--基线; 1--几何中线; 2--左边线; 3--右边线 AcDbCurve * GetAcDbCurve(int nFlag) const; // 用AcDbCurve的参数来更新墙体的几何 Acad::ErrorStatus SetFromCurve(const AcDbCurve &curve); // 几何形心上的曲线, 对基线的原始偏移 TGGeCurveSegment OffsetGeomCenter(int cvFlag = LS_INFINITE, BOOL bIncludeInsulateLayer = FALSE) const; // 以ptRef为参考点定义左右方向,返回指定的原始侧边线的偏移线 // nSide--相对与ptFef的左右侧, nDistToSide--距侧边的距离(负往内,正往外) TGGeCurveSegment GetRelativeSideCurve(int nSide, const TADSGePoint3d &ptRef, double nDistToSide = 0.0, BOOL bFromInsulate = FALSE) const; // 求标准的两侧边线(即不考虑墙角是否有柱子) TGGeCurveSegment GetStandardSideCurve(int nSide, double nDistToSide = 0.0, BOOL bFromInsulate = FALSE, BOOL *pPareStart = NULL, BOOL *pPareEnd = NULL) const; // 考虑保温线的标准边线 TGGeCurveSegment GetStandardSideCurve1(int nSide, double nDistToSide = 0.0, BOOL *pPareStart = NULL, BOOL *pPareEnd = NULL) const; // 取得墙的最终偏移线, 考虑柱子裁剪, wlw mod 100913 增加柱子保温的支持 TGGeCurveSegment GetFinalSideCurve(int nSide, double nDistToSide = 0.0, BOOL bFromInsulate = FALSE, bool bColInsulate = true) const; //以下三个函数对中心线进行偏移 // 以ptRef为参考点定义左右方向,返回对几何中心指定偏移率的原始曲线 TGGeCurveSegment GetRelativeOffsetCurveFromCenter(int nSide, double nRatio, const TADSGePoint3d &ptRef) const; // 即不考虑柱子的裁剪对几何中心的偏移, 用来求多线墙, nRatio--墙厚系数 TGGeCurveSegment GetStdOffsetCurveFromCenter(int nSide, double nRatio) const; // 取得墙的最终偏移线, 考虑柱子裁剪 TGGeCurveSegment GetFinalOffsetCurveFromCenter(int nSide, double nRatio) const; // 取填充中心线 TGGeCurveSegment GetHatchCenterCurve() const; // 取得墙基面上的最终的两条边线,考虑了扣除了柱子和邻居墙体的影响 , wlw mod 100913 增加柱子保温的支持 // 返回: 0--正常; 1--无左边线; 2--无右边线; 3--无左右边线 void GetSideCurve(TGGeCurveSegment &lCurve, TGGeCurveSegment &rCurve, double nDistToSide = 0.0, BOOL bFromInsulate = FALSE, bool bColInsulate = true) const; void GetStandardCurve(TGGeCurveSegment &lCurve, TGGeCurveSegment &rCurve, double nDistToSide = 0.0, BOOL bFromInsulate = FALSE) const; //返回柱子的标记 int CalSideParameters(const TEntitySet &entThis, TDPtrList &lstAllSortedWalls, TGGeRectAngle *pUpdateRect = NULL); int CalSideParameters(const TEntitySet &entThis, TDPtrList &lstAllSortedWalls, TGGeCurveSegment &lCurve, TGGeCurveSegment &rCurve); void CalSideParameters1(TGGeRectAngle *pBox = NULL); void DoubleToTowInt(double dSrc, int& nLeftThick,int& nRightThick) const; double TowIntToDouble(int nLeftThick, int nRightThick) const; //保温强制封口 BOOL HasInsulateCap() const; void SetInsulateCap(BOOL bTrue = TRUE); //端部是否保温 BOOL HasInsulateEnd() const; void SetInsulateEnd(BOOL bTrue = TRUE); void SetStartKatanaID(const AcDbObjectId &sid){m_idKatanaStart = sid;} void SetEndKatanaID(const AcDbObjectId &eid){m_idKatanaEnd = eid;} AcDbObjectId GetStartKatanaID() const {return m_idKatanaStart;} AcDbObjectId GetEndKatanaID()const {return m_idKatanaEnd;} protected: virtual AcDbObjectId GetMyObjectId() const; virtual AcDbObjectId GetMyOwnerId()const; void _TWallData(); //add by xlc on 091106 校正墙线 void AdjustStandardSideCurve(TADSGePoint3d &ptInitStart,TADSGePoint3d &ptInitEnd)const; protected: TWallStyle m_style; //用途标志 UsageFlag m_nUsageFlag; //类型标志 Adesk::UInt32 m_nWallFlag; //保温厚度 double m_nInsuThick; //左宽,右宽,墙高 double m_lWidth, m_rWidth, m_nHeight; // 用于加速的参数(细线和三维) double m_nFromLeftStart, m_nFromLeftEnd, m_nFromRightStart, m_nFromRightEnd; //起点和终点的柱子 AcDbSoftPointerId m_idColuStart, m_idColuEnd; //起点和终点的邻接墙 AcDbSoftPointerId m_idLeftStart, m_idRightStart, m_idLeftEnd, m_idRightEnd; /* 一堵墙最多有两个 glwkatana 对象, 位于墙的起点与终点 left wall end katana -> | right wall end katana -> | |------------------------|------------------------------|-------------------------| | left wall | right wall | | |------------------------|------------------------------|-------------------------| | <- right wall start katana */ // 起点/终点 连接的 GlwKatana 对象 AcDbSoftPointerId m_idKatanaStart, m_idKatanaEnd; private: static TWallData *g_pWall; }; #endif