Files
envi-code/SourceCode/Code2026/tg_shs/shs_pipebase/THImpHvacDuct.h
T

378 lines
15 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
// 暖通风管实现类
//
// 直风管示意图:
// 水平管: ⑩━━⑾ 垂直矩形/扁圆管: 垂直圆管:
// / ⑤
// ┏━━━━/ ━━⑨━━━━━━┓ ┏━━⑥━━┓ /~~~~~\
// ┃ / ──→ ┃ ┃ ② ┃ / ②\
// ⑥②━━━④━━━①━━━━━━③⑦ ④ ① ③ | ① ③
// ┃ ┃ ┃ ┃ \ /
// ┗━━━━━━━⑧━━━━━━┛ ┗━━⑤━━┛ \_____/
//
// 单线: ⑧━━⑨ 垂直矩形/扁圆管/垂直圆管:
// /
// / ⑤ ②
// ⑥②━━━④━━━①━━━━━━③⑦ ①
//
//
// 软风管示意图:
// 水平管: ⑩━━⑾ 垂直矩形/扁圆管: 垂直圆管:
// /
// ┏━━━━/ ━━⑨━━━━━━┓ ┏━━⑥━━┓ /~~~~~\
// ┃ / ──→ ┃ ┃ ② ┃ / ②\
// ⑥②━━━④━⑤━①━━━━━━③⑦ ④ ① ③ | ① ③
// ┃ ┃ ┃ ┃ \ /
// ┗━━━━━━━⑧━━━━━━┛ ┗━━⑤━━┛ \_____/
//
// 单线: ⑧━━⑨ 垂直矩形/扁圆管/垂直圆管:
// /
// / ②
// ⑥②━━━④━⑤━①━━━━━━③⑦ ①
//
//
// 水平管夹点说明:
// ①: 风管中心移动点
// ②: 风管长度延伸点
// ③: 风管长度延伸点
// ④: 标注位置点
// ⑤: 直风管中间命令激活点/软风管中间曲率调整点
// ⑥: 左端命令激活点
// ⑦: 右端命令激活点
// ⑧: 管径尺寸调整点/单线管标注引线位置点
// ⑨: 管径尺寸调整点/单线标注引线方向点
// ⑩: 双线标注引线位置点
// ⑾: 双线标注引线方向点
//
// 垂直管夹点说明:
// ①: 风管中心移动点
// ②: 命令激活点
// ③: 管径尺寸调整点
// ④: 管径尺寸调整点
// ⑤: 管径尺寸调整点
// ⑥: 管径尺寸调整点
#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<TObjSectionRecord>参数清空
virtual bool GetSection(const AcDbFace &face, const AcGeVector3d &vtPlaneSecDir,
std::vector<TObjSectionRecord> &sectionRecord, 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<TObjSectionRecord> &sectionRecord, AcDbVoidPtrArray& arFillPtrs) const;
// 弧管剖切
virtual bool GetArcSection(const AcDbFace &face, const AcGeVector3d &vtPlaneSecDir,
std::vector<TObjSectionRecord> &sectionRecord, 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__)