Files
envi-code/SourceCode/Code2026/tg_shs/shs_pipebase/THImpHvacDuct.h
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

379 lines
16 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 暖通风管实现类
//
// 直风管示意图:
// 水平管: ⑩━━⑾ 垂直矩形/扁圆管: 垂直圆管:
// / ⑤
// ┏━━━━/ ━━⑨━━━━━━┓ ┏━━⑥━━┓ /~~~~~\
// ┃ / ──→ ┃ ┃ ② ┃ / ②\
// ⑥②━━━④━━━①━━━━━━③⑦ ④ ① ③ | ① ③
// ┃ ┃ ┃ ┃ \ /
// ┗━━━━━━━⑧━━━━━━┛ ┗━━⑤━━┛ \_____/
//
// 单线: ⑧━━⑨ 垂直矩形/扁圆管/垂直圆管:
// /
// / ⑤ ②
// ⑥②━━━④━━━①━━━━━━③⑦ ①
//
//
// 软风管示意图:
// 水平管: ⑩━━⑾ 垂直矩形/扁圆管: 垂直圆管:
// /
// ┏━━━━/ ━━⑨━━━━━━┓ ┏━━⑥━━┓ /~~~~~\
// ┃ / ──→ ┃ ┃ ② ┃ / ②\
// ⑥②━━━④━⑤━①━━━━━━③⑦ ④ ① ③ | ① ③
// ┃ ┃ ┃ ┃ \ /
// ┗━━━━━━━⑧━━━━━━┛ ┗━━⑤━━┛ \_____/
//
// 单线: ⑧━━⑨ 垂直矩形/扁圆管/垂直圆管:
// /
// / ②
// ⑥②━━━④━⑤━①━━━━━━③⑦ ①
//
//
// 水平管夹点说明:
// ①: 风管中心移动点
// ②: 风管长度延伸点
// ③: 风管长度延伸点
// ④: 标注位置点
// ⑤: 直风管中间命令激活点/软风管中间曲率调整点
// ⑥: 左端命令激活点
// ⑦: 右端命令激活点
// ⑧: 管径尺寸调整点/单线管标注引线位置点
// ⑨: 管径尺寸调整点/单线标注引线方向点
// ⑩: 双线标注引线位置点
// ⑾: 双线标注引线方向点
//
// 垂直管夹点说明:
// ①: 风管中心移动点
// ②: 命令激活点
// ③: 管径尺寸调整点
// ④: 管径尺寸调整点
// ⑤: 管径尺寸调整点
// ⑥: 管径尺寸调整点
#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__)