// 暖乙子弯实现类 // // 乙子弯示意图(角接类型, 其他类型详见管件类型.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参数清空 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: // 夹点移动消息处理 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__)