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

375 lines
18 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
// 暖通弯头实现类
//
// 弯头示意图:
// 水平放置: 垂直放置:
// ┏━━━━━━━━━━━┓ ┏━━━━━┓
// ┃ ┃ ┃ ④ ┃
// ┃ ┃ ┃ ┃
// ④①━━━━━━━━③ ┃ ┃ ① ┃
// ┃ ┃ ┃ ┃ ┃
// ┃ ┃ ┃ ┃ ③ ┃
// ┗━━━━━┓ ┃ ┃ ┣━━━━━┫
// ┃ ┃ ┃ ┃ ┃
// ┃ ┃ ┃ ┃ ┃
// ┃ ┃ ┃ ┃ ┃
// ┃ ┃ ┃ ┃ ┃
// ┗━━②━━┛ ┗━━②━━┛
// ⑤ ⑤
//
// 夹点说明:
// ①: 弯头左端移动点
// ②: 弯头下端移动点
// ③: 中心命令激活点
// ④: 左端命令激活点
// ⑤: 下端命令激活点
#ifndef __THIMPHVACELBOW_H__
#define __THIMPHVACELBOW_H__
#if _MSC_VER > 1000
#pragma once
#endif
#include "TImpSpecFitting.h"
class THImpHvacElbow : public TImpSpecFitting
{
public:
THImpHvacElbow();
virtual ~THImpHvacElbow();
protected:
//{{AFX_ARX_METHODS(THImpHvacElbow)
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 ExplodeOrDraw2d(XExplodeDraw &dc) const;
virtual Acad::ErrorStatus ExplodeOrDraw3d(XExplodeDraw &dc) const;
virtual AcDbPolyline* MakePolyCurve() const;
virtual BOOL MakeCurves(TComplexCurve& cplCurve) const;
virtual BOOL GetCurvesInSide(TComplexCurve& compCurve) const;
virtual BOOL MakePolyCurveFaces(AcDbVoidPtrArray& arFaces);
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 getClassID(CLSID* pClsid) const;
virtual BOOL OPMInfo(LPCTSTR pszName, TDb::OPMInfo* pInfo);
virtual void GetTips(CMapStringToString& mapLable2Tip) const;
virtual void list() const;
virtual AcGeVector3d THImpHvacElbow::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;
// 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;
// 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:
// 得到边线宽
double GetEdgeLineWidth() const;
// 得到中心线宽
double GetCentLineWidth() const;
// 得到端线宽
double GetEndLineWidth() const;
//得到单线遮挡线宽
BOOL SetSingleDashWidth(double& dDiameterS,double& dDiameterE) const;
// 弯头是否水平放置
BOOL IsHorzAlignment() const;
// 弯头是否垂直放置
BOOL IsVertAlignment() const;
// 弯头是否倾斜放置
BOOL IsInclineAlignment() const;
// 是否是单线弯头
BOOL IsSingleLine() const;
BOOL HasBaseLine() const;
// 是否是弧形弯头
BOOL IsArcuate() const;
// 获取接口尺寸数据type,size,size1
BOOL GetInterfaceSizeData(int nIndex, TInterface& pipeInterface) const;
// 夹点移动消息处理
BOOL OnMoveGripPointMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs);
// 对象移动消息处理
BOOL OnTransformMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs);
// 尺寸调整消息处理
BOOL OnSizeMsgNotify(const TInterfaceModifyMsg& iModiMsg, TInterfaceModifyMsgs& iModiMsgs);
// 内外圆弧
//三维绘制函数
void ExplodeOrDrawAllArcuate3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeAllArcuatePolyCurve() const;
// 构建二维图形
BOOL MakeAllArcuate2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeAllArcuatePolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 内外圆弧消声
//三维绘制函数
void ExplodeOrDrawAllArcWrap3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeAllArcWrapPolyCurve() const;
// 构建二维图形
BOOL MakeAllArcWrap2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeAllArcWrapPolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 消声弯头
//三维绘制函数
void ExplodeOrDrawAllArcInWrap3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeAllArcInWrapPolyCurve() const;
// 构建二维图形
BOOL MakeAllArcInWrap2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeAllArcInWrapPolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 分段拟合
//三维绘制函数
void ExplodeOrDrawSegmental3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeSegmentalPolyCurve() const;
// 构建二维图形
BOOL MakeSegmental2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建分段拟合倾斜二维图形
BOOL MakeSegmental2DInc(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeSegmentalPolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 内斜线
//三维绘制函数
void ExplodeOrDrawIncline3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeInclinePolyCurve() const;
// 构建二维图形
BOOL MakeIncline2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeInclinePolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 内斜线消声
//三维绘制函数
void ExplodeOrDrawInclineWrap3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeInclineWrapPolyCurve() const;
// 构建二维图形
BOOL MakeInclineWrap2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeInclineWrapPolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 内斜线隔板消声
//三维绘制函数
void ExplodeOrDrawInclineBoard3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeInclineBoardPolyCurve() const;
// 构建二维图形
BOOL MakeInclineBoard2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeInclineBoardPolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 内斜线导流
//三维绘制函数
void ExplodeOrDrawInclineLead3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeInclineLeadPolyCurve() const;
// 构建二维图形
BOOL MakeInclineLead2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeInclineLeadPolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 内弧线
//三维绘制函数
void ExplodeOrDrawArcuate3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeArcuatePolyCurve() const;
// 构建二维图形
BOOL MakeArcuate2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeArcuatePolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 内弧线消声
//三维绘制函数
void ExplodeOrDrawArcuateWrap3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeArcuateWrapPolyCurve() const;
// 构建二维图形
BOOL MakeArcuateWrap2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeArcuateWrapPolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 内弧线隔板消声
//三维绘制函数
void ExplodeOrDrawArcuateBoard3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeArcuateBoardPolyCurve() const;
// 构建二维图形
BOOL MakeArcuateBoard2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeArcuateBoardPolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 内弧线筛板消声
//三维绘制函数
void ExplodeOrDrawArcuateSieve3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeArcuateSievePolyCurve() const;
// 构建二维图形
BOOL MakeArcuateSieve2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeArcuateSievePolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 内弧线导流
//三维绘制函数
void ExplodeOrDrawArcuateLead3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeArcuateLeadPolyCurve() const;
// 构建二维图形
BOOL MakeArcuateLead2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeArcuateLeadPolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 内外直角
//三维绘制函数
void ExplodeOrDrawAllOrtho3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeAllOrthoPolyCurve() const;
// 构建二维图形
BOOL MakeAllOrtho2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeAllOrthoPolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 内外直角消声
//三维绘制函数
void ExplodeOrDrawOrthoWrap3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeOrthoWrapPolyCurve() const;
// 构建二维图形
BOOL MakeOrthoWrap2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeOrthoWrapPolyCurveFaces(AcDbVoidPtrArray& arFaces);
// 内外直角导流
//三维绘制函数
void ExplodeOrDrawOrthoLead3d(XExplodeDraw &mode) const;
// 构建外轮廓
AcDbPolyline* MakeOrthoLeadPolyCurve() const;
// 构建二维图形
BOOL MakeOrthoLead2DCurves(TComplexCurve& cplCurve,int &nType) const;
// 构建外轮廓所围平面的3DFace组
BOOL MakeOrthoLeadPolyCurveFaces(AcDbVoidPtrArray& arFaces);
Acad::ErrorStatus OnCHorEqualRMoveGripPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset);
//AllArcuate的辅助函数
//三维模型
void ExplodeOrDrawAllArcuate3dRec(XExplodeDraw &mode) const;
void ExplodeOrDrawAllArcuate3dCir(XExplodeDraw &mode) const;
void GetPtsAllArcuate3dRec(AcGePoint3dArray &arptSides,AcGePoint3d & pt,AcGeVector3d & vtStr,AcGeVector3d & vtNormal,double& dWidth,double& dThick) const;
//求弯头的圆心,即开始点终止点,垂直切线方向的交点。
BOOL GetIntersectWith(AcGePoint3d &pt1,AcGePoint3d &pt2,AcGeVector3d &vt1,AcGeVector3d &vt2,AcGePoint3d &ptIntersect) const;
//求弯头圆弧上的中心点。
BOOL GetPtOnArc(AcGePoint3d &ptStart,AcGePoint3d &ptCorner,AcGePoint3d &ptEnd,double &dPlusEdge) const;
//BEGIN=======================================================================================================================================================================
//扩展后的计算弯头圆弧上的点
BOOL GetPtOnArcExt(AcGePoint3d &ptStartArc, const AcGePoint3d &ptCorStart, AcGePoint3d &ptEndArc, const AcGePoint3d &ptCorEnd, AcGePoint3d &ptOnArcOut, double &dPlusEdge) const;
//修改时间:2009-11-19
//修改人 :王亚东
//修改原因:对GetPtOnArc进行扩展,用于计算中心线偏离情况下的圆弧上点
//END=========================================================================================================================================================================
//2D轮廓线
// ptStart,ptMid,ptEnd表示的一段曲线,向ptOnPlan投影,得到的曲线上的点放在arPt中返回,
BOOL GetPtsOnHidePlanFromInc(AcGePoint3d &ptStart, AcGePoint3d &ptMid, AcGePoint3d &ptEnd, AcGePoint3d &ptOnPlan, AcGePoint3dArray &arPt) const;
BOOL GetPrjPts(AcGePoint3dArray &arPtsU, AcGePoint3dArray &arPtsD) const;
BOOL DrawAllArcuate2DInc(TComplexCurve& cplCurve,int &nType) const;
BOOL GetAllArcuateCplCurveInc(TComplexCurve& cplCurve,int &nType,AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dPlusEdge,double& dDiameterS,double& dDiameterE,int& nWrapType) const;
BOOL DrawAllArcuate2DHor(TComplexCurve& cplCurve,int &nType) const;
BOOL DrawAllArcuate2DVer(TComplexCurve& cplCurve,int &nType) const;
BOOL GetAllArcuateCplCurveHor(TComplexCurve& cplCurve,int &nType,AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dPlusEdge,double& dDiameterS,double& dDiameterE,int& nWrapType) const;
BOOL GetAllArcuateCplCurveVerRec(TComplexCurve& cplCurve,int &nType,AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dPlusEdge,double& dDiameterS,double& dDiameterE,double& dThick, double& dEndThick) const; //修改时间:2009-12-29 修改人:王亚东 修改原因:添加方口弯头末端厚度参数
BOOL GetAllArcuateCplCurveVerRecForOffset(TComplexCurve& cplCurve, int &nType) const;
BOOL GetAllArcuateCplCurveVerCir(TComplexCurve& cplCurve,int &nType,AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dPlusEdge,double& dDiameterS,double& dDiameterE) const;
BOOL GetInclineCplCurveHor(TComplexCurve& cplCurve,int &nType,AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dPlusEdge,double& dDiameterS,double& dDiameterE) const;
BOOL GetPtsSegmentalHor(AcGePoint3dArray& pts) const;
BOOL GetArcuateCplCurveHor(TComplexCurve& cplCurve,int &nType,AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dPlusEdge,double& dDiameterS,double& dDiameterE) const;
BOOL GetAllOrthoCplCurveHor(TComplexCurve& cplCurve,int &nType,AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dPlusEdge,double& dDiameterS,double& dDiameterE) const;
//2DPolyline
AcDbPolyline* DrawAllArcuatePolyHorRec(AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dPlusEdge,double& dDiameterS,double& dDiameterE) const;
//BEGIN==================================================================================================================================================
AcDbPolyline* DrawAllArcuatePolyHorCir(AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dPlusEdge,double& dDiameterS, double& dDiameterE) const;
//END====================================================================================================================================================
AcDbPolyline* DrawAllArcuatePolyIncCir(AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dPlusEdge,double& dDiameterS, double& dDiameterE) const;
//BEGIN=======================================================================
//内外圆弧和非内外圆弧的方口弯头立式消影多段线生成函数
AcDbPolyline* DrawAllArcuatePolyVerRec(AcGePoint3d& ptStart, AcGePoint3d& ptCorner, AcGePoint3d& ptEnd, double& dPlusEdge, double& dDiameterS, double& dDiameterE, double& dThick, double &dEndThick) const;
AcDbPolyline* DrawNotAllArcuatePolyVerRec(AcGePoint3d& ptStart, AcGePoint3d& ptCorner, AcGePoint3d& ptEnd, double& dPlusEdge, double& dDiameterS, double& dDiameterE, double& dThick, double &dEndThick) const;
//修改时间:2010-1-6
//修改人 :王亚东
//修改原因:支持方口变径弯头的立式消影多段线生成
//END=========================================================================
AcDbPolyline* DrawAllArcuatePolyVerCir(AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dDiameterS, double& dDiameterE) const;
AcDbPolyline* DrawInclinePolyCurveHor(AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dPlusEdge,double& dDiameterS,double& dDiameterE) const;
AcDbPolyline* DrawArcuatePolyCurveHor(AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dPlusEdge,double& dDiameterS,double& dDiameterE) const;
AcDbPolyline* DrawAllOrthoPolyCurveHor(AcGePoint3d& ptStart, AcGePoint3d& ptCorner,AcGePoint3d& ptEnd,double& dPlusEdge,double& dDiameterS,double& dDiameterE) const;
//Polyline画弧,圆弧上位于起点与终点之间的一点,半径,开始点,终止点,线宽,Polyline开始index
BOOL CreatePlElbow(AcDbPolyline *p,AcGePoint3d& pt,double dradius,AcGePoint3d& pt1,AcGePoint3d& pt2,double dWidth,int index) const;
double AngleTo(AcGePoint3d pt,AcGePoint3d pt1,AcGePoint3d pt2) const;
Adesk::Boolean IsClockWise(AcGePoint3d pt1 ,AcGePoint3d pt2,AcGePoint3d pt3) const;
//Face面
BOOL DrawAllArcuatePolyCurveFacesHor(AcDbVoidPtrArray& arFaces);
BOOL DrawAllArcuatePolyCurveFacesVer(AcDbVoidPtrArray& arFaces);
BOOL DrawAllArcuatePolyCurveFacesInc(AcDbVoidPtrArray& arFaces);
BOOL GetPtsAllArcuateCurveFacesHor(AcGePoint3dArray& arpts,AcGePoint3d &ptStart,AcGePoint3d &ptCorner,AcGePoint3d &ptEnd,double& dDiameterS,double& dDiameterE,double &dPlusEdge) const;
void GetArcPoint(AcDbPolyline &polyLine, AcGePoint3dArray &ptArcArr) const;
BOOL MergerPline(AcDbPolyline* pPl,AcDbPolyline* pSrc) const;
void GetSideFace(TXShell& xShell, AcGePoint3d ptStart, double dStartWidth);
// 智能拖动处理发送消息
Acad::ErrorStatus MoveGripRandom(TDb::Position ePos, const AcGeVector3d& offset );
// 生成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; // 圆形
// 得到弯头端口圆截面投影下来的半个椭圆面(椭圆面向外)Lixl
BOOL GetEllipseFaces(AcDbVoidPtrArray& arFaces) const;
};
#endif //__THIMPHVACELBOW_H__