// 暖通风管实现类 // // 直风管示意图: // 水平管: ⑩━━⑾ 垂直矩形/扁圆管: 垂直圆管: // / ⑤ // ┏━━━━/ ━━⑨━━━━━━┓ ┏━━⑥━━┓ /~~~~~\ // ┃ / ──→ ┃ ┃ ② ┃ / ②\ // ⑥②━━━④━━━①━━━━━━③⑦ ④ ① ③ | ① ③ // ┃ ┃ ┃ ┃ \ / // ┗━━━━━━━⑧━━━━━━┛ ┗━━⑤━━┛ \_____/ // // 单线: ⑧━━⑨ 垂直矩形/扁圆管/垂直圆管: // / // / ⑤ ② // ⑥②━━━④━━━①━━━━━━③⑦ ① // // // 软风管示意图: // 水平管: ⑩━━⑾ 垂直矩形/扁圆管: 垂直圆管: // / // ┏━━━━/ ━━⑨━━━━━━┓ ┏━━⑥━━┓ /~~~~~\ // ┃ / ──→ ┃ ┃ ② ┃ / ②\ // ⑥②━━━④━⑤━①━━━━━━③⑦ ④ ① ③ | ① ③ // ┃ ┃ ┃ ┃ \ / // ┗━━━━━━━⑧━━━━━━┛ ┗━━⑤━━┛ \_____/ // // 单线: ⑧━━⑨ 垂直矩形/扁圆管/垂直圆管: // / // / ② // ⑥②━━━④━⑤━①━━━━━━③⑦ ① // // // 水平管夹点说明: // ①: 风管中心移动点 // ②: 风管长度延伸点 // ③: 风管长度延伸点 // ④: 标注位置点 // ⑤: 直风管中间命令激活点/软风管中间曲率调整点 // ⑥: 左端命令激活点 // ⑦: 右端命令激活点 // ⑧: 管径尺寸调整点/单线管标注引线位置点 // ⑨: 管径尺寸调整点/单线标注引线方向点 // ⑩: 双线标注引线位置点 // ⑾: 双线标注引线方向点 // // 垂直管夹点说明: // ①: 风管中心移动点 // ②: 命令激活点 // ③: 管径尺寸调整点 // ④: 管径尺寸调整点 // ⑤: 管径尺寸调整点 // ⑥: 管径尺寸调整点 #if !defined(__THIMPHVACDUCT_H__) #define __THIMPHVACDUCT_H__ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "TDbImpPipeBase.h" class TDbPipeBase; class THImpHvacDuct : public TDbImpPipeBase { public: THImpHvacDuct(); THImpHvacDuct(TDbPipeBase* pOwner); virtual ~THImpHvacDuct(); protected: //{{AFX_ARX_METHODS(TDbPipeBase) virtual BOOL IsValid(TDbXDataMap* pXMap); virtual BOOL GetInterface(int nIndex, TInterface& pipeInterface) const; virtual BOOL GetInterface(const AcGePoint3d& ptConnect, TInterface& pipeInterface) const; virtual BOOL HasInterface(const AcGePoint3d& ptConnect, const AcGeVector3d& vtDir); virtual BOOL NotifyInterfaceToModify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs); Acad::ErrorStatus ExplodeOrDraw3d(XExplodeDraw &mode) const; virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &mode) const; virtual BOOL MakeCurves(TComplexCurve& cplCurve) const; virtual BOOL GetCurvesInSide(TComplexCurve& compCurve) const; virtual AcDbPolyline* MakePolyCurve() const; virtual BOOL MakePolyCurveFaces(AcDbVoidPtrArray& arFaces); virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform); virtual Acad::ErrorStatus getStretchPoints(AcGePoint3dArray& stretchPoints) const; virtual Acad::ErrorStatus getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const; virtual Acad::ErrorStatus getOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const; virtual TDb::Position ExplainGripIndex(int nIndex) const; virtual Acad::ErrorStatus moveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset); virtual Acad::ErrorStatus moveStretchPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset); virtual Acad::ErrorStatus getStartPoint(AcGePoint3d& x0) const; virtual Acad::ErrorStatus getStartParam(double& x0) const; virtual Acad::ErrorStatus getEndPoint(AcGePoint3d& x0) const; virtual Acad::ErrorStatus getEndParam(double& x0) const; virtual Acad::ErrorStatus getParamAtDist(double dist,double& param) const; virtual Acad::ErrorStatus getParamAtPoint(const AcGePoint3d& x0,double& x1)const; virtual Acad::ErrorStatus getPointAtDist(double x0,AcGePoint3d& x1) const; virtual Acad::ErrorStatus getPointAtParam(double x0,AcGePoint3d& x1) const; virtual Acad::ErrorStatus getDistAtPoint(const AcGePoint3d& x0, double& x1)const; virtual Acad::ErrorStatus getDistAtParam(double param, double& dist) const; virtual Acad::ErrorStatus intersectWith(const AcDbEntity* pEnt, AcDb::Intersect intType, const AcGePlane& projPlane, AcGePoint3dArray& points, INT_PTR thisGsMarker = 0, INT_PTR otherGsMarker = 0) const; virtual Acad::ErrorStatus intersectWith(const AcDbEntity* pEnt, AcDb::Intersect intType, AcGePoint3dArray& points, INT_PTR thisGsMarker = 0, INT_PTR otherGsMarker = 0) const; virtual Acad::ErrorStatus getSplitCurves(const AcGePoint3dArray& points, AcDbVoidPtrArray& curveSegments) const; virtual Acad::ErrorStatus getSplitCurves(const AcGeDoubleArray& params, AcDbVoidPtrArray& curveSegments) const; virtual Acad::ErrorStatus getClosestPointTo( const AcGePoint3d& givenPnt, const AcGeVector3d& direction, AcGePoint3d& pointOnCurve, Adesk::Boolean extend) const; virtual Acad::ErrorStatus getClosestPointTo(const AcGePoint3d& givenPnt, AcGePoint3d& pointOnCurve, Adesk::Boolean extend = Adesk::kFalse) const; virtual Acad::ErrorStatus extend(double newParam); virtual Acad::ErrorStatus extend(Adesk::Boolean extendStart, const AcGePoint3d& toPoint); virtual Acad::ErrorStatus getClassID(CLSID* pClsid) const; virtual BOOL OPMInfo(LPCTSTR pszName, TDb::OPMInfo* pInfo); virtual void GetTips(CMapStringToString& mapLable2Tip) const; virtual void list() const; virtual void CopyPropertiesTo(AcDbObjectId& idTgr,unsigned gMatchFlag); virtual void CopyPropertiesTo(AcDbObjectIdArray& arIds,unsigned gMatchFlag); //}}AFX_ARX_METHODS public: //获取三维的壳对象 virtual int GetXBaseShell(TXShell& xShell); //获取体的范围方块 virtual int GetBodyBox(AcDbExtents& ext); // 导出XML mcl add 2010.12.20 // virtual CString GetXml() const; virtual CString GetXml(const AcGeMatrix3d& mat) const; // mcl add 2011.1.17 剖切功能。 注意 GetSection内不应将std::vector参数清空 virtual bool GetSection(const AcDbFace &face, const AcGeVector3d &vtPlaneSecDir, std::vector §ionRecord, AcDbVoidPtrArray& arFillPtrs) const; // 剖切用,返回Z坐标最高、最低点 virtual Acad::ErrorStatus GetExtents(TADSGePoint3d &ptLow, TADSGePoint3d &ptUp) const; virtual Acad::ErrorStatus GetClipBoundary(TGGePoly2D& poly) const; virtual bool IsMeClip() const; virtual bool IsClipMe(const TEntityBase* pEnt=NULL)const;//ok是否被裁剪 // 以下4个函数,开放给TDbHbacDuct使用Lixl modify 2012-3-10 // 得到软管圆心,如果不是软管,则返回0点 AcGePoint3d GetCirCenter() const; // 获得风管中点和两端方向向量 AcGePoint3d GetDirect(AcGeVector3d& vtStart, AcGeVector3d& vtEnd) const; // 是否是弧管 BOOL IsArcDuct() const; // 初始化为弧(仅仅针对弧管) BOOL InitArc(AcDbArc &arc) const; private: // 风管是否水平放置 BOOL IsHorzAlignment() const; // 风管是否垂直放置 BOOL IsVertAlignment() const; // 是否是单线风管 BOOL IsSingleLine() const; // 获取系统类型 HvacModelType GetModeType() const; // 判断软风管是否能正确绘制 BOOL IsCanDrawSoft() const; // 复原标注点 // void ReSetDimPoint() const; // 获取接口尺寸数据type,size,size1 BOOL GetInterfaceSizeData(int nIndex, TInterface& pipeInterface) const; // 求出软管调节点 AcGePoint3d GetAdjustPt() const; // 求出圆立管尺寸点 AcGePoint3d GetAVertCirSizePt() const; // 得到半个椭圆多段线 各个关键弧点, polyLine必须为顺序添加的4个Vertext点 void GetArcPoint(AcDbPolyline &polyLine, AcGePoint3dArray &ptArcArr) const; // 得到软管半径,如果不是软管,则返回0 double GetRadius() const; // 辅助构建决定遮挡面, pt1, pt2, pt3分别为面上不同三点,vtNormal为法向,dEle返回距原点高度 AcGePlane GetHidePlane(AcGePoint3d pt1, AcGePoint3d pt2, AcGePoint3d pt3, const AcGeVector3d vtNormal, double &dEle) const; // 得到用的较多的关键的四个点 void GetFourKeyPoints( AcGePoint3dArray &ptArr) const; // 如果弧管设置了起止点方向,将关键的四个点转换为实际的四个点 void ConverFourKeyPts(AcGePoint3dArray &ptArr) const; // 得到单线模式遮挡面关键点,仅限非立管 void GetSingleKeyPoints(AcGePoint3dArray &ptArr) const; AcDbObjectId GetBaseLayerId() const; // 得到边线宽 double GetEdgeLineWidth() const; // 得到中心线宽 double GetCentLineWidth() const; // 得到端部线宽 double GetEndLineWidth() const; // 是否绘制首端或末端 BOOL IsHideStart() const; BOOL IsHideEnd() const; // 首尾是否连接了管件 BOOL IsStartConnect() const; BOOL IsEndConnect() const; // 夹点移动消息处理 BOOL OnMoveGripPointMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs); // 对象移动消息处理 BOOL OnTransformMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs); // 尺寸调整消息处理 BOOL OnSizeMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs); // 绘制直风管三维图形 Acad::ErrorStatus ExplodeOrDrawStraight3d(XExplodeDraw &mode) const ; // 矩形直风管三维图形 Acad::ErrorStatus ExplodeOrDrawRectStraight3d(XExplodeDraw &mode) const; // 圆形直风管三维图形 Acad::ErrorStatus ExplodeOrDrawCircStraight3d(XExplodeDraw &mode) const; // 椭圆形直风管三维图形 Acad::ErrorStatus ExplodeOrDrawOblateStraight3d(XExplodeDraw &mode) const; // 绘制软风管三维图形 Acad::ErrorStatus ExplodeOrDrawSoft3d(XExplodeDraw &mode) const; // 矩形软风管三维图形 Acad::ErrorStatus ExplodeOrDrawRectSoft3d(XExplodeDraw &mode) const; // 圆形软风管三维图形 Acad::ErrorStatus ExplodeOrDrawCircSoft3d(XExplodeDraw &mode) const; // 椭圆形软风管三维图形 Acad::ErrorStatus ExplodeOrDrawOblateSoft3d(XExplodeDraw &mode) const; // 构件风管内衬图形 add by hh 2013-9-2 BOOL MakeDuctLiningCurves(TComplexCurve& cplCurve) const; // 构建水平风管二维图形 BOOL MakeHorz2DCurves(TComplexCurve& cplCurve, int nOutOrIn) const; // 构建水平直风管二维图形 BOOL MakeHorzStraight2DCurves(TComplexCurve& cplCurve, int nOutOrIn) const; // 构建水平软风管二维图形 BOOL MakeHorzSoft2DCurves(TComplexCurve& cplCurve, int nOutOrIn) const; // 构建垂直风管二维图形, nOutOrIn:外轮廓还是内部线, 0:外轮廓, 1内部线 BOOL MakeVert2DCurves(TComplexCurve& cplCurve, int nOutOrIn) const; // 构建垂直直风管二维图形 BOOL MakeVertStraight2DCurves(TComplexCurve& cplCurve, int nOutOrIn) const; // 构建垂直软风管二维图形 BOOL MakeVertSoft2DCurves(TComplexCurve& cplCurve, int nOutOrIn ) const; // 构建倾斜风管二维图形 BOOL MakeIncl2DCurves(TComplexCurve& cplCurve, int nOutOrIn) const; // 构建倾斜直风管二维图形 BOOL MakeInclStraight2DCurves(TComplexCurve& cplCurve, int nOutOrIn) const; // 构建倾斜软风管二维图形 BOOL MakeInclSoft2DCurves(TComplexCurve& cplCurve, int nOutOrIn) const; // 构建水平风管外轮廓 AcDbPolyline* MakeHorzPolyCurve() const; // 构建水平直风管外轮廓 AcDbPolyline* MakeHorzStraightPolyCurve() const; // 构建水平软风管外轮廓 AcDbPolyline* MakeHorzSoftPolyCurve() const; // 构建垂直风管外轮廓 AcDbPolyline* MakeVertPolyCurve() const; // 构建垂直直风管外轮廓 AcDbPolyline* MakeVertStraightPolyCurve() const; // 构建垂直软风管外轮廓 AcDbPolyline* MakeVertSoftPolyCurve() const; // 构建倾斜风管外轮廓 AcDbPolyline* MakeInclPolyCurve() const; // 构建倾斜直风管外轮廓 AcDbPolyline* MakeInclStraightPolyCurve() const; // 构建倾斜软风管外轮廓 AcDbPolyline* MakeInclSoftPolyCurve() const; // 构建水平风管外轮廓所围平面的3DFace组 BOOL MakeHorzPolyCurveFaces(AcDbVoidPtrArray& arFaces) const; // 构建水平直风管外轮廓所围平面的3DFace组 BOOL MakeHorzStraightPolyCurveFaces(AcDbVoidPtrArray& arFaces) const; // 构建水平软风管外轮廓所围平面的3DFace组 BOOL MakeHorzSoftPolyCurveFaces(AcDbVoidPtrArray& arFaces) const; // 构建垂直风管外轮廓所围平面的3DFace组 BOOL MakeVertPolyCurveFaces(AcDbVoidPtrArray& arFaces) const; // 构建垂直直风管外轮廓所围平面的3DFace组 BOOL MakeVertStraightPolyCurveFaces(AcDbVoidPtrArray& arFaces) const; // 构建垂直软风管外轮廓所围平面的3DFace组 BOOL MakeVertSoftPolyCurveFaces(AcDbVoidPtrArray& arFaces) const; // 构建倾斜风管外轮廓所围平面的3DFace组 BOOL MakeInclPolyCurveFaces(AcDbVoidPtrArray& arFaces) const; // 构建倾斜直风管外轮廓所围平面的3DFace组 BOOL MakeInclStraightPolyCurveFaces(AcDbVoidPtrArray& arFaces) const; // 构建倾斜软风管外轮廓所围平面的3DFace组 BOOL MakeInclSoftPolyCurveFaces(AcDbVoidPtrArray& arFaces) const; // 直管剖切 virtual bool GetStraightSection(const AcDbFace &face, const AcGeVector3d &vtPlaneSecDir, std::vector §ionRecord, AcDbVoidPtrArray& arFillPtrs) const; // 弧管剖切 virtual bool GetArcSection(const AcDbFace &face, const AcGeVector3d &vtPlaneSecDir, std::vector §ionRecord, AcDbVoidPtrArray& arFillPtrs) const; // 延伸夹点处理 Acad::ErrorStatus MoveExtendGripPointsAt(TDb::Position ePos, const AcGeVector3d& offset, BOOL bAutoWork); // 移动夹点处理 Acad::ErrorStatus MoveTransGripPointsAt(TDb::Position ePos, const AcGeVector3d& offset, BOOL bForcePer); // 调整夹点处理 Acad::ErrorStatus MoveAdjustGripPointsAt(TDb::Position ePos, const AcGeVector3d& offset); // 标注夹点处理 // Acad::ErrorStatus MoveDimGripPointsAt(TDb::Position ePos, const AcGeVector3d& offset); // 尺寸夹点处理 Acad::ErrorStatus MoveSizeGripPointsAt(TDb::Position ePos, const AcGeVector3d& offset); // 命令夹点处理 Acad::ErrorStatus MoveCommandGripPointsAt(TDb::Position ePos, const AcGeVector3d& offset); // 专业应用数据 TDbXDataMap* GetSpecialtyDataReadOnly() const; // 根据首尾点重新设置normal AcGeVector3d ResetNormalByPt(); // 更新反应器中的标注(由夹点变化引起的变化) void UpdateDimInReactor(Position eGridPos, const AcGeVector3d& vtOff); // 将倾斜软风管的数据转换为水平软风管 便于直接使用水平软风管的2D绘制 // dataMap保存转换之前的数据 BOOL TransInclSoftDuct(TDbXDataMap& dataMap) const; BOOL MakeRealHorzSoft2DCurves(TComplexCurve& cplCurve, int nOutOrIn) const; void DisPoseArcPoint(AcGePoint3dArray& ptArr, AcGePoint3d ptC, AcGeVector3d vtNor) const; BOOL IsEdgeStart() const; BOOL IsEdgeEnd() const; }; #endif // !defined(__THIMPHVACDUCT_H__)