// 暖通弯头实现类 // // 弯头示意图: // 水平放置: 垂直放置: // ┏━━━━━━━━━━━┓ ┏━━━━━┓ // ┃ ┃ ┃ ④ ┃ // ┃ ┃ ┃ ┃ // ④①━━━━━━━━③ ┃ ┃ ① ┃ // ┃ ┃ ┃ ┃ ┃ // ┃ ┃ ┃ ┃ ③ ┃ // ┗━━━━━┓ ┃ ┃ ┣━━━━━┫ // ┃ ┃ ┃ ┃ ┃ // ┃ ┃ ┃ ┃ ┃ // ┃ ┃ ┃ ┃ ┃ // ┃ ┃ ┃ ┃ ┃ // ┗━━②━━┛ ┗━━②━━┛ // ⑤ ⑤ // // 夹点说明: // ①: 弯头左端移动点 // ②: 弯头下端移动点 // ③: 中心命令激活点 // ④: 左端命令激活点 // ⑤: 下端命令激活点 #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参数清空 virtual bool GetSection(const AcDbFace &face, const AcGeVector3d &vtPlaneSecDir, std::vector §ionRecord, 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__