#pragma once #include "AecDbCurveBase.h" #include "AecDbObjXDataMap.h" #include "AecComplexCurveDraw.h" #include "AecDbX3dPart.h" #ifndef MAX_AXISROTATS #define MAX_AXISROTATS 16 #endif #ifdef EARTHWORM_EXPORT #define DLLIMPEXP __declspec(dllexport) #else #define DLLIMPEXP __declspec(dllimport) #endif #include "AecMInterfaces.h" typedef struct PipeHatch { TCHAR szPattern[65]; double dScale; double dAngle; }PipeHatch; typedef struct DrawContext { double dD; AcGeVector3d vtDrawPlanNorm; AcGeVector3d vtDir; double dSingleW; double dDbLineW; int nShape; int nDrawGradient; int nColor; AcDbObjectId idCurLay; AcDbObjectId idCurLty; int nCrBk; AcDbCurve* pBaseCurXY; }DRAWCONTEXT; class DLLIMPEXP AecDbEwPipeBase : public AecDbCurveBase, public AecMInterfaces { public: ACRX_DECLARE_MEMBERS(AecDbEwPipeBase); protected: static Adesk::UInt32 kCurrentVersionNumber; public: AecDbEwPipeBase(void); virtual ~AecDbEwPipeBase(void); AcGePoint3d StartPoint() const; AcGePoint3d EndPoint() const; virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler); virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const; virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler* pFiler); virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* pFiler) const; virtual Acad::ErrorStatus copyFrom(const AcRxObject* pSrc); //清除后续特化的二维图形数据 virtual Acad::ErrorStatus ClearForDraw2dables(); #if ARX>16 virtual void subList() const; virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform); virtual Acad::ErrorStatus subGetGripPoints(AcDbGripDataPtrArray& grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d& curViewDir, const int bitflags) const; virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbVoidPtrArray& appData, const AcGeVector3d& offset, const int bitflags); virtual Acad::ErrorStatus subGetGripPoints (AcGePoint3dArray& gripPoints,AcDbIntArray& osnapModes,AcDbIntArray& geomIds) const; virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset); virtual Acad::ErrorStatus subGetStretchPoints(AcGePoint3dArray& stretchPoints) const; virtual Acad::ErrorStatus subMoveStretchPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset); virtual void GetGripText(int nPos, CString& sText); virtual Acad::ErrorStatus subGetOsnapPoints(AcDb::OsnapMode osnapMode, INT_PTR gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXform, AcGePoint3dArray& snapPoints, AcDbIntArray& geomIds) const; virtual Acad::ErrorStatus subGetGeomExtents(AcDbExtents& extents) const; virtual Acad::ErrorStatus subIntersectWith(const AcDbEntity* pEnt, AcDb::Intersect intType, AcGePoint3dArray& points, INT_PTR thisGsMarker, INT_PTR otherGsMarker) const; virtual Acad::ErrorStatus subIntersectWith(const AcDbEntity* pEnt, AcDb::Intersect intType, const AcGePlane& projPlane, AcGePoint3dArray& points, INT_PTR thisGsMarker, INT_PTR otherGsMarker) const; #endif public: virtual AcDbCurve* GetBaseCurve(bool bOrthoProjectToXY = false) const; virtual AcDbCurve* GetNativeCurve() const; virtual Acad::ErrorStatus subErase(Adesk::Boolean erasing); //AEC 派生 virtual Acad::ErrorStatus Draw2d(AcGiDraw &dc) const; virtual Acad::ErrorStatus Draw3d(AcGiDraw &dc) const; //绘制分段 virtual Acad::ErrorStatus Draw2dSingleSegment(AcGiDraw &dc,AcDbPolyline* pPl) const; //绘制接口 virtual Acad::ErrorStatus DrawInfArrow(AcGiDraw &dc) const; virtual LPCTSTR GetGripCmd() const; bool IsArcBaseCurve() const; void DrawSubAxis(AcGiDraw &dc,AcDbEntity* pEnt) const; void DrawGradient(AcGiDraw &dc,AcDbCurve* pBaseCur) const; void DrawHatch(AcGiDraw& dc) const; void DrawHatch(AcGiDraw& dc,AcDbPolyline* pPl) const; protected: AcDbCurve* BaseCurveDwgInFields(AcDbDwgFiler* pFiler,int nVer = 5);//5 默认兼容之前 AcDbRegion* RegionAcisInDwgInFields(AcDbDwgFiler* pFiler); AcDbRegion* RegionFromCurvesDwgInFields(AcDbDwgFiler* pFiler,Adesk::UInt32 nLen); AcDbRegion* SectionRegionDwgInFields(AcDbDwgFiler* pFiler,int nVer); Acad::ErrorStatus BaseCurveDwgOutFields(AcDbCurve* pBaseCurve,AcDbDwgFiler* pFiler) const; Acad::ErrorStatus RegionAcisoutDwgOutFields(AcDbDwgFiler* pFiler) const; Acad::ErrorStatus RegionExplodeDwgOutFields(AcDbDwgFiler* pFiler,AcDbVoidPtrArray& arCurPtrs) const; Acad::ErrorStatus SectionRegionDwgOutFields(AcDbDwgFiler* pFiler,int nVer) const; Acad::ErrorStatus AddDimPoints(AcDbGripDataPtrArray& grips,const AcGeVector3d& curViewDir, const AcGePoint3d& ptSta,const AcGePoint3d& ptEnd, const AcGePoint3d& ptMid,int nDimType,double dVal = -1.0,double dt = 0.0) const; public: virtual void AssertWriteEnabled(Adesk::Boolean autoUndo = true, Adesk::Boolean recordModified = true ); //设置中心路径,几种方式 virtual Acad::ErrorStatus SetBaseCurve(const AcArray& arStackPts); virtual Acad::ErrorStatus SetBaseCurve(const AcGePoint3dArray& arPts); virtual Acad::ErrorStatus SetBaseCurve(const AcDbCurve* pCurve); virtual Acad::ErrorStatus SetBaseCurve(const AcGePoint3d& ptSta,const AcGePoint3d& ptEnd); virtual Acad::ErrorStatus SetBaseCurve(const AcGePoint3d& ptSta,const AcGeVector3d& vtDir); /* _ pt3 _ pt2 | | | | | | | | | | | | | |__________| | |______________| pt0 O pt1 O - 原点 pt0->pt1 w pt1->pt2 h pt2->pt3 t */ Acad::ErrorStatus SetSection1(const double &w, const double &h, const double &t,bool bCenOrg = false); /* | | O | | \ \ / / \ \ / / \ \ / / \ \_pt1_/ / \______/ pt0 O - 原点 pt0->pt1 r 内径 O->pt1 厚度 */ Acad::ErrorStatus SetSection2(const double &r, const double &t,bool bCenOrg = false); //通用设置截面 Acad::ErrorStatus SetSection(AcDbPolyline* pPl,const AcGePoint3d& ptCen); //设置截面为管道外径和壁厚 Acad::ErrorStatus SetSection(double dD,double dt); //设置为方管 长x宽x厚 水平面为长,Z向为宽 Acad::ErrorStatus SetSection(double dL,double dW,double dt); //设置为墙体 长(dThick)x宽(dH) 水平面为长,Z向为宽 YEL为Y偏移量 Acad::ErrorStatus SetSection(double dThick,double dH,double dYOff,EAlign kAlign); //通用截面 Acad::ErrorStatus SetSection(AcDbRegion* pReg,const AcGePoint3d& ptCen); //设置角钢截面 Acad::ErrorStatus SetSection3(double dL,double dt); //设置为直角三角截面 Acad::ErrorStatus SetSection3(double dLx,double dLy,double dt); //设置正多边形 Acad::ErrorStatus SetSectionN(double dR, int nSides); //通用获取外径和壁厚 Acad::ErrorStatus GetODAndThick(AcGePoint2d& ptODt) const; //获取垂直切外径和厚度 Acad::ErrorStatus GetODAndID(AcGePoint2d& ptrODtTop,AcGePoint2d& ptrODtBom) const; //获取断面面积 double GetSectionArea(bool bHasInside = false) const; //获取最大reg面积 double CalBigRegionArea() const; //获取最大region AcDbRegion* GetBigRegion() const; //获取腔体region AcDbRegion* GeCavityRegion() const; //获取截面的复制 AcDbRegion* GetSection() const; //设置界面绕轴旋转,以X 方向为基准 Acad::ErrorStatus SetSectionRotation(double dAngle); double GetSectionRotation() const; //获取路径总长,是否包括省略长度 double GetLength(bool bHasBreakOpenLen = false) const; //添加截断 Acad::ErrorStatus AddBrokenOpen(double dOffFrSta,double dSize,double dTrueSize); Acad::ErrorStatus RemoveBrokenOpen(double dOffFrSta); Acad::ErrorStatus RemoveBrokenOpen(int nIndex); Acad::ErrorStatus GetBrokenOpenPnts(AcGePoint3dArray& arPnts) const; //获取首尾切线方向[接口方向] virtual AcGeVector3d GetHeadDir() const; virtual AcGeVector3d GetTailDir() const; //设置起点的标高,后续根据坡度计算高程 virtual void SetStartElevation(float dEl); virtual float StartElevation() const; //通过末点标高计算起点标高 virtual void SetEndElevation(float dEl); virtual float EndElevation() const; //获取位置标高0 中心 1顶部 2内底部 3 外底部 4内顶部 virtual float GetElevation(int nPos) const; //节点标高 virtual void SetVertexElevation(int nGripIndex,float dEl); virtual float GetVertexElevation(int nGripIndex) const; //设置坡度 virtual bool SetGradientAt(int nPos, double dGradient); virtual double GetGradientAt(int nPos) const; //专业数据 和绘制设置 特别说明,在实体的 draw2/3d 中使用 GetSpecialtyData,必须AcDb::kForRead!!! 否则图不能保存 AecDbObjXDataMap* GetSpecialtyData(AcDb::OpenMode bMode = AcDb::kForWrite); const AecDbObjXDataMap* GetSpecialtyData() const; //获取二维视图显示的图形 virtual int GetDraw2dables(Adesk::UInt16 nDrawStyle, AcDbVoidPtrArray& arEntPtrs) const; //获取三维显示图形 virtual int GetDraw3dables(AcDbVoidPtrArray& arEntPtrs,bool bWriteBimInfo = false) const; //剖切提取,符号法,对于管线构件 virtual bool GetSectionDraw(AcGePlane& plan,const AcGeVector3d& vtTo,AcDbVoidPtrArray& arRegionPtrs) const; //剖切提取,范围面剖切Slice切割法,对于土建构件 virtual int GetSectionDraw(const AcGePoint3d& ptFr,const AcGePoint3d& ptTo,const AcGeVector3d& vtViewDir,const AcGeVector3d& vtTo, AcDbVoidPtrArray& arRegionPtrs) const; //如下对于盾构巷道对象有意义 //整体体积 virtual double GetVolume(bool bIsBody = false) const; //腔体体积 nRoom = -1 全部 double GetCavityVolume(int nRoom) const; //外表面积 double GetOutSideArea() const; //内表面积 double GetInSideArea() const; //壁厚 0 上壁厚 1下壁厚 2水平壁厚 bool GetThick(int nPos,double& dThick) const; //接口方法重载 MINTERFACES_METHODS //获取唯一性标识 virtual LPCTSTR GetGUID() const; virtual void SetActive(bool bActive); virtual bool IsActive() const; virtual void NewGUID(); Acad::ErrorStatus TransformBy(const AcGeMatrix3d xform); //图层和线型 void SetSingleLayer(const AcDbObjectId& idLayer); AcDbObjectId GetSingleLayer() const; void SetSingleLineType(const AcDbObjectId& idLt); AcDbObjectId GetSingleLineType() const; void SetDoubleLayer(const AcDbObjectId& idLayer); AcDbObjectId GetDoubleLayer() const; void SetDoubleLineType(const AcDbObjectId& idLt); AcDbObjectId GetDoubleLineType() const; void SetDashLayer(const AcDbObjectId& idLayer); AcDbObjectId GetDashLayer() const; void SetCenterLayer(const AcDbObjectId& idLayer); AcDbObjectId GetCenterLayer() const; AcDb3dSolid* GetCreatPipe3dSolid() const; virtual int GetCreatPipe3dSolid(AcDbVoidPtrArray& ar3DSolidPtrs) const; bool ReadDandRatio(AcGePoint2d& ptDRatio) const; void SetHatch(LPCTSTR pszPatternName,double dAngle,double dScale); bool GetHatch(PipeHatch& sHatch) const; //断管符号的绘制,仅仅适用管线 void DrawBrokenOpen(AcGiDraw &dc,AcGePoint3d& ptFr,AcGePoint3d& ptTo,double dD,AecComplexCurve& cplCurve) const; void DrawDashSegment(AcGiDraw &dc,AcGePoint3d& ptFr,AcGePoint3d& ptTo,double dD,AecComplexCurve& cplCurve) const; void DrawSide(AcGiDraw &dc,AcGePoint3d ptSideCen,AcGeVector3d vcDir,double dD,AecComplexCurve& cplCurve,bool bMirror) const; //设置剖切图层 void SetSectionLayer(int nIndexFr,AcDbVoidPtrArray& arRegionPtrs,const AcDbObjectId& idLayer) const; //后续的法兰管子 virtual Acad::ErrorStatus DrawFlangInf2d(AcGiDraw &dc) const; virtual Acad::ErrorStatus DrawFlangInf3d(AcGiDraw &dc) const; virtual Acad::ErrorStatus DrawUserInf(AcGiDraw &dc) const; virtual Acad::ErrorStatus DrawUserInf3d(AcGiDraw &dc) const; Acad::ErrorStatus BoolSubtractUserInf3d(AecDbX3dPart &part) const; Acad::ErrorStatus DrawSingle2d(AcGiDraw &dc,DrawContext& dcCon) const; Acad::ErrorStatus DrawDouble2d(AcGiDraw &dc,DrawContext& dcCon) const; virtual SHJson::WValue& ToJson(bool bExprotGeo = true) const; virtual bool ByJson(const SHJson::WValue &v); //获取墙体的所有的洞Solid virtual Acad::ErrorStatus GetAllHolesSolid(AcDbVoidPtrArray& arSolidPtrs,AcDbVoidPtrArray& arCenLnPtrs,const AcGeMatrix3d& xform) const; Acad::ErrorStatus DefaultNo(); void SetPlotWidth(double dW); void GetAssocHandleObjs(AcDbObjectIdArray& arIds); static bool hasHatch(const AcDbEntity *pEnt, const int &var); virtual bool GetPositionGrip(int nIndex, AecGripData *&pGrip) const; //用户接口 void AddUserInterface(const AecUserInterface& inf); bool RemoveUserInterface(const TCHAR* pszNo); bool RemoveUserInterface(int nIndex); int GetUserInterfaceCount() const; bool GetUserInterface(int nIndex, AecUserInterface &inf) const; bool GetUserInterface(const AcGePoint3d &ptHit, AecUserInterface &inf) const; double GetGasketThick() const; protected: bool ReadUserInterface(AcDbDwgFiler *pFiler); void WriteUserInterface(AcDbDwgFiler *pFiler) const; protected: //轨迹数据 mutable AcDbCurve* m_pBaseCurve; //截面数据 mutable AcDbRegion* m_pRegion; //打断间隙段[作废]->改为预留使用 AcArray m_arBreaks; //活动接口 Adesk::Int16 m_nInfActive; CString m_sGUID; bool m_bActive; bool m_bShowFlowDir; bool m_bIsMainLock; bool m_bIsMinLock; //专业数据 AecDbObjXDataMap m_mapSpecXData; //新版本 AcArray< AecUserInterface> m_arUserInfs; //用户自定义接口带管长 //其他按通用图层和线型 AcDbSoftPointerId m_idSingleLayer; AcDbSoftPointerId m_idSingleLnType; //双线图层和线型 AcDbSoftPointerId m_idDoubleLayer; AcDbSoftPointerId m_idDoubleLnType; //遮挡图层 AcDbSoftPointerId m_idDashLayer; //中心线图层 AcDbSoftPointerId m_idCenterLayer; protected: mutable AcDbVoidPtrArray m_arDrawBuffer3d1; //子类附临时附加的图元集合 mutable AcDbVoidPtrArray m_arDrawBuffer3d2; //子类附临时附加的图元集合 mutable AcDbVoidPtrArray m_ar2DDrableBufPtrs2; //总图备份,纵断时保留总图显示 AecGripData* m_pGripAppData; };