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

234 lines
8.9 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
// 暖乙子弯实现类
//
// 乙子弯示意图(角接类型, 其他类型详见管件类型.doc):
//
// 水平放置: 侧面垂直放置: 正面垂直放置:
// ┃ ┏━━━━━┓ ┏━━━━━┓
// ┃\ ┃ ┃ ┃ ┃
// ┃ \ ┃ ③ ┃ ┃ ┃
// ③ ① \ ┃ ① ┃ ③ ① ② ④
// ┃ \ ┃ ┃ ┃ ┃
// ┃ \ ┃ ┃ ┃ ┃
// \ ┃ ┣━━━━━┫ ┗━━━━━┛
// \ ┃ ┃ ┃
// \ ┃ ┃ ④ ┃
// \ ② ④ ┃ ② ┃
// \ ┃ ┃ ┃
// \┃ ┗━━━━━┛
//
//
// 夹点说明:
// ①②: 移动点
// ③④: 命令点,用于引出新管线
#if !defined(AFX_THIMPHVACOFFSET_H__)
#define AFX_THIMPHVACOFFSET_H__
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "TImpSpecFitting.h"
class THImpHvacOffset : public TImpSpecFitting
{
public:
THImpHvacOffset();
virtual ~THImpHvacOffset();
protected:
//{{AFX_ARX_METHODS(THImpHvacOffset)
virtual BOOL IsValid(TDbXDataMap* pXMap);
virtual void GetKindName(CString& sName);
virtual int GetInterfaceCount() const;
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 SetInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect);
virtual BOOL RemoveInterfaceRelation(const AcGePoint3d& ptConnect,const AcDbObjectId& idConnect);
virtual BOOL NotifyInterfaceToModify(const TInterfaceModifyMsg& iModiMsg,TInterfaceModifyMsgs& iModiMsgs);
virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
virtual TDb::Position ExplainGripIndex(int nIndex) const;
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 Acad::ErrorStatus moveStretchPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset);
virtual Acad::ErrorStatus moveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset);
virtual Acad::ErrorStatus ExplodeOrDraw3d(XExplodeDraw &mode) const;
virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &mode) const;
virtual AcDbPolyline* MakePolyCurve() const;
virtual BOOL MakeCurves(TComplexCurve& compCurve) const;
virtual BOOL GetCurvesInSide(TComplexCurve& compCurve) const;
virtual BOOL MakePolyCurveFaces(AcDbVoidPtrArray& arFaces);
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 AcGeVector3d normal() const;
//}}AFX_ARX_METHODS
public:
//获取三维的壳对象
virtual int GetXBaseShell(TXShell& xShell);
//获取体的范围方块
virtual int GetBodyBox(AcDbExtents& ext);
// add by hh 2010-12-27 导出XML
// virtual CString GetXml() const;
virtual CString GetXml(const AcGeMatrix3d& mat) const;
// add by 2011.02.10 剖切功能 注意 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;
// add by hh 2014-08-06 支持管件与水管遮挡
virtual Acad::ErrorStatus GetClipBoundary(TGGePoly2D& poly)const;
virtual bool IsMeClip() const;
virtual bool IsClipMe(const TEntityBase* pEnt=NULL)const;//ok是否被裁剪
private:
// 夹点移动消息处理
BOOL OnMoveGripPointMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs);
// 对象移动消息处理
BOOL OnTransformMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs);
// 尺寸调整消息处理
BOOL OnSizeMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs);
// 移动夹点处理
Acad::ErrorStatus MoveTransGripPointsAt(TDb::Position ePos, const AcGeVector3d& offset, BOOL bAutoWork);
// 命令夹点处理
Acad::ErrorStatus MoveCommandGripPointsAt(TDb::Position ePos, const AcGeVector3d& offset);
// 移动夹点,实现自由移动
Acad::ErrorStatus MoveGripRandom(TDb::Position ePos, const AcGeVector3d& offset );
// 辅助函数
// 获取接口尺寸数据type,size,size1
BOOL GetInterfaceSizeData(int nIndex, TInterface& pipeInterface) const;
// 是否水平放置
BOOL IsHorzAlignment() const;
// 是否侧面垂直放置
BOOL IsSideVertAlignment() const;
// 是否正面垂直放置
BOOL IsFaceVertAlignment() const;
// 是否是单线
BOOL IsSingleLine() const;
// 是否绘制中心线
BOOL IsBaseLine() const;
// 管向量
AcGeVector3d StartVect() const;
AcGeVector3d EndVect() const;
/*
0━7
┃ \
┃ \
S ┃ \
┃ \
┃ \
1━2 6━ 5
\ ┃
\ ┃
\ ┃
\ ┃ E
\ ┃
3━4
*/
void GetMidKeyPoints( AcGePoint3dArray &ptArr, BOOL bSingleLine = FALSE) const;
// 创建关键的两面16个点
BOOL GetTwoSideKeyPoints( AcGePoint3dArray &ptUpArr, AcGePoint3dArray &ptDownArr, BOOL bSingleLine = FALSE) const;
// 得到双弧类型中心弧线多段线各点
// 如有变径,在起始端变
// 0-7点说明:起始端、起始弧点、起始弧中点、中点、末端弧中点、末端弧点、末端点
/*
0----1\
--\--2--\
--\
 3
\--
\--4--\
5----6
*/
BOOL GetArcBaseKeyPt(AcGePoint3dArray &ptKeyArr) const;
// 以中线线弧点为基准,得到双弧类型两边多段线各点(左右从起始法向看),推到方法同弯头
// bSingleLine:是否是单线模式,用于polyline和3Dface,而单线三维也要求正常显示
BOOL GetArcTwoSideKeyPt(AcGePoint3dArray &ptArrLeft, AcGePoint3dArray &ptArrRight, BOOL bSingleLine = FALSE) const;
// 得到所有按分度角划分后的点
void GetAllMinAnglePt(AcGePoint3dArray &ptArrLeftPart, AcGePoint3dArray &ptArrRightPart, BOOL bSingleLine = FALSE) const;
// 是否能够绘制正确的乙子弯
BOOL IsCanDraw() const;
// 检验特性表修改参数是否合法
BOOL ValidOpmCanDraw(const CString &csKey, TDb::OPMInfo* pInfo);
// 获取边线、中线/端部线宽
double GetEdgeLineWidth() const;
double GetCentLineWidth() const;
double GetEndLineWidth() const;
// 3D 绘制
Acad::ErrorStatus ExplodeOrDrawRectArcuate3d(XExplodeDraw &mode) const ; // 矩形双弧
Acad::ErrorStatus ExplodeOrDrawRectLinear3d(XExplodeDraw &mode) const ; // 矩形角接
Acad::ErrorStatus ExplodeOrDrawCircleArcuate3d(XExplodeDraw &mode) const ; // 圆形双弧
Acad::ErrorStatus ExplodeOrDrawCircleLinear3d(XExplodeDraw &mode) const ; // 圆形角接
// 2D Curve 绘制
BOOL MakeHorizArcuate2DCurves(TComplexCurve& cplCurve, const int &nOutOrIn) const; // 双弧放置
BOOL MakeHorizLinear2DCurves(TComplexCurve& cplCurve, const int &nOutOrIn) const; // 角接放置
BOOL MakeSideVertRect2DCurves(TComplexCurve& cplCurve, const int &nOutOrIn) const; // 侧垂直矩形放置
BOOL MakeSideVertCircle2DCurves(TComplexCurve& cplCurve, const int &nOutOrIn) const; // 侧垂直圆形放置
BOOL MakeFaceVert2DCurves(TComplexCurve& cplCurve, const int &nOutOrIn) const; // 正垂直放置
// PolyCurve 绘制
AcDbPolyline* MakeHorizArcuatePolyCurves() const; // 水平双弧放置
AcDbPolyline* MakeHorizLinearPolyCurves() const; // 水平角接放置
AcDbPolyline* MakeSideVertRectPolyCurves() const; // 侧垂直矩形放置
AcDbPolyline* MakeSideVertCirclePolyCurves() const; // 侧垂直圆形放置
AcDbPolyline* MakeFaceVertPolyCurves() const; // 正垂直放置
// PolyCurves围成的 3Dface面 绘制
BOOL MakeHorizArcuateCurvesFaces(AcDbVoidPtrArray& arFaces) const; // 水平放置
BOOL MakeHorizLinearCurvesFaces(AcDbVoidPtrArray& arFaces) const; // 水平放置
BOOL MakeSideVertRectCurvesFaces(AcDbVoidPtrArray& arFaces) const; // 侧垂直矩形放置
BOOL MakeSideVertCircleCurvesFaces(AcDbVoidPtrArray& arFaces) const; // 侧垂直圆形放置
BOOL MakeFaceVertCurvesFaces(AcDbVoidPtrArray& arFaces) const; // 正垂直放置
AcDbObjectId GetBaseLayerId() const;
// 端部壳对象
int GetEndSideShell(TXShell& xShell);
// 获取角度双弧为半圆弧弧度,角接为倾斜角度
double GetAngle();
// 通过起始点及角度计算末点
AcGePoint3d GetEndPointByAngle();
// 通过起始点及长度参数等计算末点
AcGePoint3d GetEndPtByLength();
// 生成3D轮廓PL线 iFlag: 1 顶面 2 底面 3 前面 4 背面
BOOL Make3DOutline(TGGePoly2D& poly, int iFlag) const;
BOOL MakeRect3DOutline(TGGePoly2D& poly, int iFlag) const; // 方形
BOOL MakeCirc3DOutline(TGGePoly2D& poly, int iFlag) const; // 圆形
};
#endif // !defined(AFX_THIMPHVACOFFSET_H__)