//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TDbWall.h // = Version : ver2.0 // = Author : xlc // = CreateDate : 2002-09-09 // = Description: 墙体类的声明 // = Maintainers: // //-----------------------------------------------------------------------------+ #ifndef _TDBWALL_H_ #define _TDBWALL_H_ #ifndef _TDBCURVEENTITY_H_ #include "TDbCurveEntity.h" #endif #ifndef _TWALLBASE_H_ #include "TWallBase.h" #endif #ifndef _TWALLDATA_H_ #include "TWallData.h" #endif #ifndef _TGGECURVESEGMENT_H_ #include "TGGeCurveSegment.h" #endif #ifndef _TGGIEXPLODEDRAW_H_ #include "TGGiExplodeDraw.h" #endif #ifndef __OPENINGDATA_H #include "OpeningData.h" #endif #ifndef _TSORTEDVERTEXLIST_H_ #include "TSortedVertexList.h" #endif #ifndef _TGGEPOLY2D_H_ #include "TGGePoly2D.h" #endif #ifndef _TADSGEPOINT3D_H_ #include "TADSGePoint3d.h" #endif #ifndef _TPICKENTSET_H_ #include "TPickEntSet.h" #endif #ifndef _TACDBOBJECTPTR_H_ #include "TAcDbObjectPtr.h" #endif #ifdef TASD #ifndef _TSTRULOAD_H_ #include "TStruLoad.h" #endif #ifndef _WALLSOLITINFO_H_ #include "WallSplitInfo.h" #endif #endif // 墙体模型: 包括直线墙和圆弧墙,不支持圆墙 class TARCH_EXP TDbWall : public TDbCurveEntity, public TWallData ,public TWallBase { friend class TDbOpening; DECLARE_TENTBASE(); ACRX_DECLARE_MEMBERS(TDbWall); public: TDbWall(); // 起点,终点,夹角定墙段 TDbWall(const TADSGePoint3d &ptStart, const TADSGePoint3d &ptEnd, ads_real nSweepAng = 0.0); ~TDbWall(); // Overriden function from AcDbEntity virtual Acad::ErrorStatus audit(AcDbAuditInfo* pAuditInfo); virtual Acad::ErrorStatus subGetClassID(CLSID* pClsid) const; virtual Acad::ErrorStatus dwgInFields (AcDbDwgFiler* pFiler); virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const; virtual Acad::ErrorStatus dxfInFields (AcDbDxfFiler* pFiler); virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* pFiler) const; virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray&gripPoints,AcDbIntArray&,AcDbIntArray&)const; virtual Acad::ErrorStatus subGetStretchPoints(AcGePoint3dArray & stretchPoints) 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 subGetOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds, const AcGeMatrix3d& insertionMat) 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 subDeepClone(AcDbObject* pOwner, AcDbObject*& pClonedObject, AcDbIdMapping& idMap, Adesk::Boolean isPrimary) const; virtual Acad::ErrorStatus subWblockClone(AcRxObject* pOwner, AcDbObject*& pClonedObject, AcDbIdMapping& idMap, Adesk::Boolean isPrimary) const; virtual Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent, AcDb::Intersect intType, AcGePoint3dArray& points, INT_PTR thisGsMarker = 0, INT_PTR otherGsMarker = 0) const; virtual Acad::ErrorStatus subIntersectWith(const AcDbEntity* ent, AcDb::Intersect intType, const AcGePlane& projPlane, AcGePoint3dArray& points, INT_PTR thisGsMarker = 0, INT_PTR otherGsMarker = 0) const; // 为保留旧状态重载 virtual Acad::ErrorStatus subOpen(AcDb::OpenMode mode); // 为了通知门窗更新显示 virtual Acad::ErrorStatus subErase(Adesk::Boolean bErasing); // add by gjm 当与墙相关联的 glwkatana 对象发生改变时,通知 virtual void modified(const AcDbObject* dbObj); virtual Acad::ErrorStatus subClose(); virtual Acad::ErrorStatus extend(Adesk::Boolean extendStart, const AcGePoint3d& toPoint) ; virtual Acad::ErrorStatus getOffsetCurvesGivenPlaneNormal( const AcGeVector3d& normal, double offsetDist, AcDbVoidPtrArray& offsetCurves) const; virtual Acad::ErrorStatus getOffsetCurves(double offsetDist, AcDbVoidPtrArray& offsetCurves) const; virtual Acad::ErrorStatus getSplitCurves(const AcGeDoubleArray& params, AcDbVoidPtrArray& curveSegments) const; virtual Acad::ErrorStatus getSplitCurves(const AcGePoint3dArray& points, AcDbVoidPtrArray& curveSegments) const; virtual Acad::ErrorStatus GetClipBoundary(TGGePoly2D& poly)const; virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw *pWd); virtual Acad::ErrorStatus GetGripText(int i, CString &cs) const; virtual Acad::ErrorStatus ExplodeOrDraw3d(TGGiExplodeDrawBase &dc) const; virtual Acad::ErrorStatus ExplodeOrDraw2d(TGGiExplodeDrawBase &dc) const; virtual Acad::ErrorStatus DownGradeSave(int nDrawMode, AcDbVoidPtrArray &entSet, BOOL *bErase); // 加快速度,并防止虚墙求范围的错误 virtual Acad::ErrorStatus GetExtents2d(TADSGePoint3d &ptLow, TADSGePoint3d &ptUp) const; virtual Acad::ErrorStatus GetExtents(TADSGePoint3d &ptLow, TADSGePoint3d &ptUp) 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 virtual bool IsModelEntity() const; virtual bool IsMeClip()const; //取动态属性显示数据 virtual void GetTips(TDPtrList &) const; virtual const TCHAR *GetDefaultLayer() const; virtual bool OnExplodeOrDraw(TGGiDrawStreamBase &dc)const; virtual BOOL IsValid() const; virtual void CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag); virtual TEntityBase::DrawType GetDrawType() const; virtual AcDbCurve* GetBaseCurve()const; virtual Acad::ErrorStatus SetBaseCurve(AcDbCurve*pCurve); virtual AcDbEntity* GetMyEntity()const; virtual int GetMaterialIndex()const; virtual Usage GetUsage()const; //add by wlw on 101026 剖面 virtual bool GetStandardFaceBody(AcDbVoidPtrArray& arFacePtrs) const; virtual bool GetSafeProtectedSpace(AcDbVoidPtrArray& arFacePtrs) const; virtual bool GetSection(const AcDbFace &face, const AcGeVector3d& vtPlaneSecDir, std::vector §ionRecords, AcDbVoidPtrArray& arFillPtrs) const; virtual CString GetXml(const AcGeMatrix3d& mat) const; #ifdef TASD virtual void MakeAssocRelation(AcDbObjectIdArray& ids); // 移除关联关系 virtual void RemoveAssocRelation(AcDbObjectId& id); // 获取关联关系,nType:关联类型;ar:关联对象句柄数组 virtual void GetAssocRelation(int nType, AcDbObjectIdArray& ar)const; #endif // sg add 101115,支持统一标高 virtual bool UnifyElevation(double dElevation = 0.0); // 取门窗, bGetNormalOnly--1:只取标准的, 用于平面; 2:取全部,用于三维 void GetOpenings(TDPtrList &lstOpening, BOOL bGetNormalOnly) const; void GetSortedOpenings(TDPtrList &lstOpening) const; BOOL HasOpeningType(TOpeningData::OpeningKind opk) const; //考虑了转角窗对象TDbCornerWin BOOL HasCornerWin() const; //未考虑转角窗对象TDbCornerWin BOOL HasCornerWinAcrossPoint(TADSGePoint3d pt) const; bool HasOpeningOutWall()const; // 用于夹点的操作 Adesk::Boolean GetStretchLimit(TGGeCurveSegment &cvForStretch); void StretchStartPoint(const AcGeVector3d& offset); void StretchEndPoint(const AcGeVector3d& offset); // 墙内门窗和连接的附件的操作 // 加入一附件的ID Acad::ErrorStatus AddPatchId(AcDbObjectId id); // 加入一门窗的ID Acad::ErrorStatus AddOpeningId(AcDbObjectId idOpening); // 移走门窗的ID Acad::ErrorStatus RemoveReferenceOpening(AcDbObjectId nId); // 移走附件的ID Acad::ErrorStatus RemovePatchId(AcDbObjectId nId); const TDPtrList & GetPatchIdList() const; const TDPtrList & GetOpeningIdList() const; void ResetOpeningId(); //清空门窗列表 //把门窗的关系移到另一段墙上, 合并墙体时用 void MoveOpeningTo(TDbWall &another); // 移动一个门窗关系到另一段墙上,katana使用 add by gjm void MoveOneOpeningTo(TDbWall &another, AcDbObjectId &id); //把附件的关系移到另一段墙上, 合并墙体时用 void MovePatchTo(TDbWall &another); // 移动一个附件关系到另一段墙上,katana使用 add by gjm void MoveOnePatchTo(TDbWall &another, AcDbObjectId &id); // 判断是否可以插入一新的窗 Adesk::Boolean CanInsertOpening(const TOpeningData &op) const; // 判断是否可以插入一新的窗 Adesk::Boolean CanInsertOpening(const TADSGePoint3d &ptLoc, double nSill, double nWidth, double nHeight, TOpeningData::OpeningKind opKind) const; //验证同门窗之间的关系,并调整配属 void ValidateContainership(); Adesk::Boolean CanContain(const TOpeningData &opening) const; Acad::ErrorStatus InsertOpening(TDbOpening *pOpening); void ApplyTransformToOpenings(const AcGeMatrix3d &xform); // 改墙的标高, bChangeWin--是否连门窗一起改 Acad::ErrorStatus ChangeElevation(double nNewElev, BOOL bChangeWin); // 三维的绘制方法 //封顶面 void DrawWallTop3d(TGGiExplodeDrawBase &dc) const; Acad::ErrorStatus ExplodeTo3dSolid(TGGiExplodeDraw &dc) const; // 绘制三维弧墙的主墙面 void DrawArcFace(TGGiExplodeDrawBase &dc, const TGGeArc &ar, double nHeight, const TDPtrList &holes) const; // 绘制弧段的三维墙 void Draw3dArcWall(TGGiExplodeDrawBase &dc) const; // 二维的绘制和炸碎方法 // 求粗边线内侧的线 void GetThickLineSideCurve(TGGeCurveSegment &lCurve, TGGeCurveSegment &rCurve) const; // 取得门窗洞侧线在指定路径上的排序 void GetOpeningSidePoints(const TGGeCurveSegment &curveSeg, const TDPtrList &lstOpenings, BOOL bHasSortOpening, TSortedVertexList &lstVertexes, BOOL bInsulate = FALSE) const; // 构成墙二维显示边线的区域, polyStart1和polyEnd1不封闭 // wlw add 11.01.18 加lstPolyPatch1混凝土材质的门窗套 额外线段,lstPolyPatch2轻质的门窗套 额外线段 // sg modify 120607,增加2个参数,专门用于如果是材料不同的门窗套,区分墙体和门窗套的挡板,分别填充 //void Get2dPolys(TGGePoly2D &polyStart1, TGGePoly2D &polyEnd1, TDPtrList &lstPolyMid, // TDPtrList &lstPolyHole, TGGePoly2D &lInsulate, TGGePoly2D &rInsulate, // TDPtrList &lstPolyPatch1,TDPtrList &lstPolyPatch2) const; void Get2dPolys(TGGePoly2D &polyStart1, TGGePoly2D &polyEnd1, TDPtrList &lstPolyMid, TDPtrList &lstPolyHole, TGGePoly2D &lInsulate, TGGePoly2D &rInsulate, TDPtrList &lstPolyPatch1,TDPtrList &lstPolyPatch2, TDPtrList &lstPLWall,TDPtrList &lstPLSlot) const; // 取基线上的等分线, 奇数为洞, 偶数为墙, 等分线长度可以为0 // 备注: 所有的线段都在z=墙体标高 // 返回: TRUE--成功/FALSE--门窗有干涉 Adesk::Boolean GetDivideCurveOnBase(TGGePoly2D &polyDivide, BOOL bLimitBySide = FALSE) const; // 通过墙体附近的点找最近的一个子段 Adesk::Boolean GetSubSegmentAt(const TADSGePoint3d &ptPos, TGGeCurveSegment &segOn, BOOL bLimitBySide = FALSE) const; // 根据墙垛取基线上的一段 Adesk::Boolean GetSubSegmentByPierAt(const TADSGePoint3d &ptPos, TGGeCurveSegment &segOn) const; Adesk::Boolean GetSubSegmentByAxisAt(const TADSGePoint3d &ptNew, TGGeCurveSegment &segThis) const; // 求关键三段 Adesk::Boolean GetKey3Seg(const TADSGePoint3d &ptAt, double nWidth, TGGePoly2D &poly) const; Adesk::Boolean GetSubSegmentOnSideAt(const TADSGePoint3d &ptPos, TGGeCurveSegment &segOn) const; //取得直墙的外壳 void GetLinearShell(TGGePoly &polyOutline, TDPtrList &lstHoles); //取得直墙的外壳, 考虑了转角窗以及门坎和窗台为0 void GetLinearShell(TGGePoly2D &polyOutline, TDPtrList &lstHoles); //取得对应的填充图案名称,如果没有图案名称,返回NULL //返回的指针在下一次调用GetHatchPattern之前可以安全的使用 // sg modify 120607,增加一个形参其值在内部被转换为TWallStyle // 获得指定类型的材料的填充样式名,如果使用默认值,即传入值为0时,则使用m_style // const TCHAR *GetHatchPattern() const; const TCHAR *GetHatchPattern(int nStyle = 0) const; // Adesk::UInt16 GetHatchColor()const; Adesk::UInt16 GetHatchColor(int nStyle = 0)const; //取本墙线厚度,不管加粗开关是否开启 // double GetLineWeight(BOOL bAsPaperUnit = TRUE) const; double GetLineWeight(BOOL bAsPaperUnit = TRUE, int nStyle = 0) const; // AcDbObjectId GetLineHatchId()const; AcDbObjectId GetLineHatchId(int nStyle = 0)const; // BOOL IsLineHatch()const; BOOL IsLineHatch(int nStyle = 0)const; void GetSideSegments(TDPtrList &lSegs, TDPtrList &rSegs) const; // 被曲线分割, 如果分割点在柱子内,则不计入 int Divide(const TGGeCurveSegment &curve, TADSGePoint3d &pt1, TADSGePoint3d &pt2, TPickEntSet &ssColu); int PosRelationWith(const TGGeCurveSegment &curve); // 向一点靠齐(使得边线通过给定的点) // ptPick--指定对齐的边, ptDest--指定要对到的点 Acad::ErrorStatus AlignTo(const TADSGePoint3d &ptPick, const TADSGePoint3d &ptDest); // nPrecFlag: 0--使用墙体衔接精度(用于被另一墙打断), 1--使用ptLoc是否位于墙体内 //modify by lfy on 100418 优化墙体速度 //Adesk::Boolean BreakAt(const TADSGePoint3d &ptLoc, AcDbObjectId &idNewWall, const TGGePoly2D *pPoly = NULL); Adesk::Boolean BreakAt(const TADSGePoint3d &ptLoc, AcDbObjectId &idNewWall, const TGGePoly2D *pPoly = NULL,PVOID pExtMap = NULL, bool bPrompt = false); void RelocateOpening() const; //重新定位门窗 // 取得等分插窗的参数 // ptNew--点取位置, segThis(O)--等分发生的曲线段, nOpeningCount(O)--门窗个数, nUnitDist--单元距离 // 返回: RTNORM/RTERROR/RTCAN int GetIsoParameters(double nOpWidth, const TADSGePoint3d &ptNew, TGGeCurveSegment &segThis, int *nOpeningCount, double *nUnitDist) const; // 更新相关的对象的显示, 墙厚度改变后 void UpdateAssocObjectGraphics(); void ReLink(AcDbObjectId idOld,AcDbObjectId idNew); // add by xlc on 101119 解除与墙不在同一工作集里的对象绑定 void ReLinkWithOwner(); void PreErase(); // 得到属性的方法 // 取的异形立面的有效系数,即裁剪后基面积/裁剪前基面积. 对于矩形立面为1.0 double GetShapeRatio() const; // 求表面积, 扣除墙洞 double GetSurfaceArea(int nSide) const; //求表面积, 不扣除洞 double GetSegSurfaceArea(int nSide) const; //求墙洞的表面积(墙内) double GetHoleSurfaceArea() const; //求洞的面积(墙面) double GetHoleArea() const; double GetHoleArea(TOpeningData::OpeningKind op) const; //求墙段体积,不扣除门窗 double GetSegVolume() const; //求墙体体积,扣除墙洞 double GetVolume() const; //求洞的体积 double GetHoleVolume() const; //窗墙面积比:>=0正常,其他为错误发生,全部门窗面积和墙面积的比 double GetAreaIndex() const; // 平均传热系数W/m2.K // 待完成 double GetUValue() const; // 热惰性指标 // 待完成 double GetInertiaIndex() const; // 求墙的轴网坐标:sHor-横坐标,sVer-纵坐标 // 首先找墙端的两两相交的轴线,然后通过轴线找轴号 BOOL HitOnAxis(const TDPtrList &lstAxLab, const TDPtrList &lstAxis, TCString &sHorS, TCString &sVerS, TCString &sHorE, TCString &sVerE) const; // 内部使用 //对上华5Beta版本进行升级, ver=3->4 void UpdateFromBeta(); // 设置立面轮廓形状 void SetPolyShape(const TGGePoly2D &shape); // sg add 091120,获取立面轮廓形状 void GetPolyShape(TGGePoly2D &shape); void SetLeftSpace(AcDbObjectId id); AcDbObjectId GetLeftSpace() const; void SetRightSpace(AcDbObjectId id); AcDbObjectId GetRightSpace() const; void SetLayerLeft3d(AcDbObjectId id); AcDbObjectId GetLayerLeft3d() const; void SetLayerRight3d(AcDbObjectId id); AcDbObjectId GetLayerRight3d() const; void SetLayerHatch2d(AcDbObjectId id); AcDbObjectId GetLayerHatch2d() const; void SetLayerSurf2d(AcDbObjectId id); AcDbObjectId GetLayerSurf2d() const; #ifdef TASD //荷载 AcDbObjectId GetLayerLoad() const; void SetLayerLoad(AcDbObjectId idLayer); //活荷值 AcDbObjectId GetLayerLoadL() const; void SetLayerLoadL(AcDbObjectId idLayer); //恒荷值 AcDbObjectId GetLayerLoadC() const; void SetLayerLoadC(AcDbObjectId idLayer); //文字样式 AcDbObjectId GetTextStyle() const; void SetTextStyle(AcDbObjectId idLayer); //文字样式 AcDbObjectId GetTextStyleRB() const; void SetTextStyleRB(AcDbObjectId idLayer); //设置荷载数组 bool SetLoadsArray(const std::vector& vectLoads); //获得荷载数组 bool GetLoadsArray(std::vector& vectLoads)const; //清除荷载数组 void ClearLoadsArray(); bool SetAt(LPCTSTR pszKey,const std::vector& vectLoads); bool GetAt(LPCTSTR pszKey,std::vector& vectLoads)const; void RemoveLoadsKey(LPCTSTR pszKey); // 墙的榀数 void GetWallSplit(std::vector &vecWallSplit)const; void SetWallSplit(const std::vector &vecWallSplit); void GetTotalWidth(double &dWidth)const; // 获得总高度 void GetTotalHeight(double &dHeight)const; Acad::ErrorStatus SetStruWidth(double dLeftWidth , double dRightWidth); #endif //节能属性 BOOL IsTransparent()const; void SetTransparent(BOOL bTrue);//设透明幕墙 // 用途标志 enum Catalog { kUnknown = 0, //交互拖曳 kExternal = 1, //外墙 kInternal = 2, //内墙 kDispartOwner = 3, //户墙 kToiletSlab = 4, //卫生隔断 kVirtDispart = 5, //虚墙,仅仅作为空间的逻辑分隔 kFence = 6 //围墙:目前1~5合理 }; //以后取代Usage, TDbWall::Catalog GetCatalog() const; // 设置墙类型 Acad::ErrorStatus SetCatalog(TDbWall::Catalog cat) ; // 0:双内;1:左外;2:右外;3:双外; int GetIOFeature() const ; // iFlag:0: 双内;1:左外;2:右外;3:双外; Acad::ErrorStatus SetIOFeature(int iFlag); static TDbWall * UserSelect(TADSGePoint3d &ptOld, TADSGePoint3d &ptNew, AcDb::OpenMode opMode); //T20新材料wlw add140214 CString GetT20WallMat() const; void SetT20WallMat(CString sMat); private: // add by gjm Acad::ErrorStatus EraseWindow(Adesk::Boolean bErase); Acad::ErrorStatus EraseKatana(Adesk::Boolean bErase); void ProcessWallModified(TDbWall *pWall); public: // 不存盘的数据,用于修改前保留旧的墙角,以便更新墙角 TADSGePoint3d m_ptOldStart, m_ptOldEnd; //TArch7 data //节能数据 //节能特性,obsolete int m_iEnFlag; //墙构造 TCString m_sCons; //日照吸收率 double m_dbAbsorption; protected: virtual AcDbObjectId GetMyObjectId() const; virtual AcDbObjectId GetMyOwnerId()const; // Helper function // 求考虑柱子干涉的填充区域 // idColu(I)--柱子; polyStartIn(I/O)--区域 void GetHatchBoundary(const AcDbObjectId &idColut, TGGePoly2D &polyStartIn) const; //绘制和分解有关的辅助函数 BOOL GetSidePathNoHole(const TGGeCurveSegment &cvLeft, const TGGeCurveSegment &cvRight, TGGePoly2D &leftPath, TGGePoly2D &rightPath) const; // 虚墙的绘制,2D&3D void DrawVirtualWall(TGGiExplodeDrawBase &dc) const; // 绘制4线玻璃幕墙的内部线条 void Draw2dGlassLine4(TGGiExplodeDrawBase &dc, const TDPtrList &lstPolyHole) const; // 没有门窗洞时绘制二维墙体的内部填充图案 void Draw2dHatchNoHole(TGGiExplodeDrawBase &dc, const TCHAR *pszHatchPattern, const TGGeCurveSegment &cvLeft, const TGGeCurveSegment &cvRight) const; // 没有门窗时绘制/炸碎二维墙体 void Draw2dSideNoHole(TGGiExplodeDrawBase &dc, BOOL bThick, const TGGeCurveSegment &cvLeft, const TGGeCurveSegment &cvRight) const; //有门窗洞时绘制二维填充图案 void Draw2dHatchWithHole(TGGiExplodeDrawBase &dc, const TCHAR *pszHatchPattern,const TGGePoly2D &polyStart1, const TDPtrList &lstMid, const TGGePoly2D &polyEnd1) const; // 含二维门窗洞时的绘制方法 void Draw2dThinWithHole(TGGiExplodeDrawBase &dc, const TGGeCurveSegment &cvLeft, const TGGeCurveSegment &cvRight, const TGGePoly2D &polyStart1, const TDPtrList &lstPolyMid, const TGGePoly2D & polyEnd1) const; // 在没有门窗洞的情况下绘制粗线边线 void Draw2dThickWithHole(TGGiExplodeDrawBase &dc, const TGGeCurveSegment &segLeft, const TGGeCurveSegment &segRight, const TGGePoly2D &polyStart1, const TDPtrList &lstMid, const TGGePoly2D &polyEnd1) const; //绘制端头线 void Draw2dTerm(TGGiExplodeDrawBase &dc, const TGGeCurveSegment &cvLeft, const TGGeCurveSegment &cvRight, double nThick) const; void ClipByPatch(TDPtrList &lstCurveSegs, BOOL bClipAlways = FALSE) const; void ClipByPatch(TDPtrList &lstCurves, TDPtrList &lstCurvesIn) const; // 在cvOut和cvIn之间填实, 并考虑墙体附件的裁剪 void DrawSolid(TGGiExplodeDrawBase &dc, const TGGeCurveSegment &cvOut, const TGGeCurveSegment &cvIn) const; // 绘制填充, 考虑附件的裁剪, pszPatterh==NULL时进行填实 void DrawHatch(TGGiExplodeDrawBase &dc, const TGGePoly2D &cvPoly, const TCHAR *pszPattern = NULL) const; //绘制线填充 void DrawLineHatch(TGGiExplodeDrawBase&dc,const TGGeCurveSegment&cvLeft,const TGGeCurveSegment&cvRight)const; // 如果其他构件优先(强)于本构件, 则用它们的外轮廓, 如果相等用内轮廓 void GetInPatchObjectOutline(TDPtrList &lstClipPolies) const; void ExplodeOrDrawOpSlot3d(TGGiExplodeDrawBase &dc) const; // 绘制直段的三维墙 void ExplodeOrDrawLinearWall3d(TGGiExplodeDrawBase &dc, const TGGeCurveSegment &cvLeft, const TGGeCurveSegment &cvRight) const; void GetNoPoreHoleOutline2d(TDPtrList &lstOutlines) const; //得到门窗套保温参数 //wlw修改100629 BOOL GetOpeningSoltPA(TDPtrList& lstOpeningId, const TADSGePoint3d& ptPos, double& dW, double& dH, double& dIsThick,double& dInstBack, BOOL& bHasLeftSlab, BOOL& bHasRigSlab) const; // 节能属性 protected: // 是否为分户墙 BOOL IsDispartOwner() const; void SetDispartOwner(BOOL bTrue); protected: //墙上的所有门窗的ID TDPtrList m_lstOpeningId; //墙上所有附件的ID TDPtrList m_lstPatchId; //异形立面 TGGePoly2D *m_pShapePoly; // TArch6 data //左右2侧的三维图层 AcDbHardPointerId m_idLayerLeft3d, m_idLayerRight3d; //填充层和保温层(面层) AcDbHardPointerId m_idLayerHatch2d, m_idLayerSurf2d; //左边的房间和右边的房间 AcDbSoftPointerId m_idLeftSpace, m_idRightSpace; AcDbObjectIdArray m_arSlabIds; //关联板对象ID数组 #ifdef TASD //结构数据 AcDbHardPointerId m_idLayerLoad; //荷载 AcDbHardPointerId m_idLayerLoadL; //活荷值 AcDbHardPointerId m_idLayerLoadC; //恒荷值 AcDbHardPointerId m_idTextStyle; //文字样式 AcDbHardPointerId m_idTextStyleRB; //文字样式 #endif private: //当前版本 static const Adesk::UInt8 g_nVersion; private: void ModifyXPoly2DStart(TGGePoly2D& poly,TGGeCurveSegment seg) const; void ModifyXPoly2DEnd(TGGePoly2D& poly,TGGeCurveSegment seg) const; //wlw修改100629 //绘制保温线 void DrawInsulateLine(const TGGeCurveSegment &cvLeft, const TGGeCurveSegment &cvRight, const TGGePoly2D& lInsulate,const TGGePoly2D& rInsulate, TGGiExplodeDrawBase &dc) const; //得到保温线的CAP void DrawInsulateCapLine(const TGGePoly2D& lInsulate, const TGGePoly2D& rInsulate, const TGGeCurveSegment&cvLeft, const TGGeCurveSegment& cvRight, TGGiExplodeDrawBase &dc) const; //画不同厚度下两个墙相连时,临墙保温线加拐弯。 //根据返回值回缩当前墙的保温线,0不做处理,1start点需要回缩,2,end点需要回缩,3都需要回缩 BOOL DrawInsulateCapLineEx(const TGGePoly2D& polyInsulate, const TGGeCurveSegment& segSide, AcGeVector3d& vtStart, AcGeVector3d& vtEnd, TGGiExplodeDrawBase &dc) const; // add by xlc on 100913 绘制不贯穿洞紧贴柱子时的融合墙线 void DrawLineOnHoleAndColu(TGGiExplodeDrawBase &dc, BOOL bThick, AcDbObjectId idColu, BOOL bStart)const; // add by wlw on 101028 剖面算面用 BOOL GetFaceFrom2Line(const TGGeCurveSegment& cvLeft,const TGGeCurveSegment& cvRight, double dHeight,AcDbVoidPtrArray& arFacePtrs) const; //add by xlc on 101224 计算cvSeg与poly的交点 bool CalIntersect(TGGeCurveSegment &cvSeg, TGGePoly2D &poly, BOOL bStart, TADSGePoint3d &ptRes)const; #ifdef TASD /// Acad::ErrorStatus StruExplodeOrDraw3d(TGGiExplodeDrawBase &dc) const; Acad::ErrorStatus StruExplodeOrDraw2d(TGGiExplodeDrawBase &dc) const; // 墙宽标注 void DrawBH(TGGiExplodeDrawBase &dc) const; // 墙体构件编号标注 void DrawCLab(TGGiExplodeDrawBase &dc) const; // 功能:得到中心线的中心点和圆心得连线的角度和距离 // [in]:dDis: 到墙边的距离 // return: 中心线的中点和圆心连线的角度 double GetCenetrAngle(double &dDis) const; BOOL GetLRPoint(XPoint &ptStart, XPoint &ptEnd)const; void DrawWallLoad(TGGiExplodeDrawBase &dc) const; void DrawWallLoadText2d(TStruLoad loadData, double dAugle, double &dDis, TGGiExplodeDrawBase &dc) const; void DrawArrow3D(TGGeCurveSegment seg, TGGiExplodeDrawBase &dc, int nEdgeFalg=1)const; void DrawWallLoad3D(TGGiExplodeDrawBase &dc)const; void DrawLoadText3D(TStruLoad loadData, double dAugle, double &dZ, TGGiExplodeDrawBase &dc)const; // 几何形心上的曲线, 端点位置不能作为准确的依据 TGGeCurveSegment TDbWall::GetCenterLine() const; void IsFloorCover(TGGeCurveSegment cvLeft, TGGeCurveSegment cvRight, BOOL& bLeft, BOOL& bRight)const; #endif }; inline BOOL HasBanWinAcross(AcDbObjectId idWall, TADSGePoint3d ptAt) { BOOL bRet = FALSE; OPENOBJ_BEGIN(idWall, AcDb::kForRead, TDbWall, pWall); if (pWall) { bRet = pWall->HasCornerWinAcrossPoint(ptAt); } OPENOBJ_END(); return bRet; } #endif