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