#pragma once #include "AecDbCurveBase.h" #include "EarThwormDef.h" #include "AecDbObjXDataMap.h" #ifdef EARTHWORM_EXPORT #define DLLIMPEXP __declspec(dllexport) #else #define DLLIMPEXP __declspec(dllimport) #endif typedef struct CurveDir { AcDbCurve* pCurve;//ONLY LINE,ARC bool bDir; }CURVEDIR; class DLLIMPEXP AecDb3dRoadAxisLine : public AecDbCurveBase { public: ACRX_DECLARE_MEMBERS(AecDb3dRoadAxisLine); protected: static Adesk::UInt32 kCurrentVersionNumber; public: AecDb3dRoadAxisLine(void); virtual ~AecDb3dRoadAxisLine(void); ////ONLY LINE,ARC,POLYLINE(EXPLORDE INSIDE) Acad::ErrorStatus AppendCurveSeg(const AcDbCurve* pCurve); Acad::ErrorStatus RemoveLast(bool bDelete = true); Acad::ErrorStatus RemoveFirst(bool bDelete = true); Acad::ErrorStatus MakeEndToEnd(); AcDbCurve* GetCurveSeg(int nIndex) const; int GetCurveSegCount() const; //判断是否相切连续 bool IsSubTangentContinue() const; //尝试转成2d polyline AcDbPolyline* ConvertTo2dPline() const; //根据拟合长度转成3D polyline 默认10毫米,针对圆弧 工程 AcDb3dPolyline* ConvertTo3dPline(double dFitLen = 10.0) const; void ConvertTo3dPline(AcGePoint3dArray& arPts,double dFitLen = 10.0) const; //获取曲线的序 int GetCurveDirs(AcArray& curDirs,double dTol = 1.e-2) const; Acad::ErrorStatus AddGripPoint(const AcGePoint3d& ptBr); //每一段模拟接口 bool GetInterface(AcArray& arInfs) const; int GetInterface(int nIndex,AcArray& arInfs) const; int GetInterfaceCount() const; int GetActiveInf() const; void SetActiveInf(int nIndex); bool TransformAssocInf(int nIndex,int nInf,const AcGeMatrix3d& xform); //根据直径和弯曲半径创建轴线,[一系列直线和圆弧] bool Create3dRoadAxisLine(double dD,double dRatio,const AcGePoint3dArray& arPts); bool Create3dRoadAxisLine(double dD,double dRatio); bool GetReferLineSegPoints(AcGePoint3dArray& arPoints,bool bArcFit = true) const; bool ReCreate3dRoadAxisLine(double dD,double dRatio); bool ReadDandRatio(AcGePoint2d& ptDRatio) const; bool SaveDandRatio(double dD,double dRatio); //转为文本 bool GetAsString(CString& sScript) const; bool SetFromString(LPCTSTR pszScript); public: //AcDbEntity virtual void subList() const; virtual Acad::ErrorStatus subGetGripPoints(AcDbGripDataPtrArray& grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d& curViewDir, const int bitflags) const; virtual Acad::ErrorStatus copyFrom(const AcRxObject* pSrc); virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbVoidPtrArray& appData,const AcGeVector3d& offset,const int bitflags); virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform); virtual Acad::ErrorStatus subIntersectWith( const AcDbEntity* ent, AcDb::Intersect intType, AcGePoint3dArray& points, INT_PTR thisGsMarker, INT_PTR otherGsMarker) const; virtual Acad::ErrorStatus subIntersectWith( const AcDbEntity* ent, AcDb::Intersect intType, const AcGePlane& projPlane, AcGePoint3dArray& points, INT_PTR thisGsMarker, INT_PTR otherGsMarker) const; virtual Acad::ErrorStatus subExplode(AcDbVoidPtrArray& entitySet) const; 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 getOffsetCurvesGivenPlaneNormal(const AcGeVector3d& normal, double offsetDist,AcDbVoidPtrArray& offsetCurves) const; virtual Acad::ErrorStatus setColorIndex(Adesk::UInt16 color, Adesk::Boolean doSubents = true); virtual Acad::ErrorStatus setLayer( const ACHAR *newVal, Adesk::Boolean doSubents = true, bool allowHiddenLayer = false); virtual Acad::ErrorStatus setLayer(AcDbObjectId newVal, Adesk::Boolean doSubents = true, bool allowHiddenLayer = false); virtual Acad::ErrorStatus setLinetype(const ACHAR *newVal,Adesk::Boolean doSubents = true); virtual Acad::ErrorStatus setLinetype(AcDbObjectId newVal,Adesk::Boolean doSubents = true); virtual Acad::ErrorStatus subErase(Adesk::Boolean erasing); //AcDbCurve DBCURVE_METHODS double getLength() const; //dwg/in/out virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler*); virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const; virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler*); virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const; AcDbCurve* BaseCurveDwgInFields(LPCTSTR pszCurve); Acad::ErrorStatus BaseCurveDwgOutFields(AcDbCurve* pBaseCurve,CString& sCurve) const; AcDbCurve* BaseCurveDwgInFields(AcDbDwgFiler* pFiler); Acad::ErrorStatus BaseCurveDwgOutFields(AcDbCurve* pBaseCurve,AcDbDwgFiler* pFiler) const; virtual AcDbCurve* GetBaseCurve(bool bOrthoProjectToXY = false) const; //draw virtual Acad::ErrorStatus Draw2d(AcGiDraw &dc) const; virtual Acad::ErrorStatus Draw3d(AcGiDraw &dc) const; //偏移曲线 Acad::ErrorStatus offset(double dOffset); public: int getClosestPointToIndex(const AcGePoint3d &givenPnt, AcGePoint3d &pointOnCurve) const; //圆弧拟合实现 static AcDbArc* FilletLineAndLine(AcDbCurve* pCurveLast,AcDbCurve* pCurveNext,double dD,double dRatio); static AcDbArc* FilletLineAndArc(AcDbLine *pLineL, AcDbArc *pArcN, const AcGePoint3d &ptConnect, double dR); //圆弧拟合 bool MarkeArcSegFit(int nLast, int nNext, double dD, double dRatio); bool MarkeArcSegFit(const AcGePoint3d &pt1, const AcGePoint3d &pt2, double dD, double dRatio); //获取拟合线对象 AecDb3dRoadAxisLine* GetFittedRoadAxisLine(double dD,double dRatio) const; AcDbCurve* GetCurveByDist(const double &dist) const; AcDbCurve* GetCurveByPoint(const AcGePoint3d &pt) const; virtual const AecDbObjXDataMap *GetSpecialtyData() const; virtual AecDbObjXDataMap *GetSpecialtyData(AcDb::OpenMode bMode = AcDb::kForWrite); //确认复制过程,内部使用 bool ReMakeSureCopy(AecDb3dRoadAxisLine* pRoad2); static Acad::ErrorStatus ReMakeSureCopy(AcDbCurve* pCurTo,AcDbCurve* pCurFr); Acad::ErrorStatus ImpGetGripPoints(AcGePoint3dArray &gripPoints, AcDbIntArray &osnapModes, AcDbIntArray &geomIds) const; Acad::ErrorStatus GetSegIndexOnGripIndex(AcDbIntArray &segIndexes, AcDbIntArray &gripPoses) const; Acad::ErrorStatus ImpMoveGripPointsAt(const AcDbIntArray &indices, const AcDbIntArray &geomids, const AcGeVector3d &offset); //路径经过的桥架缆沟线管 bool AddPathHd(LPCTSTR pszHd); bool GetPathHd(int i, CString &sHd) const; int GetPathHdCount() const; void RemovePathHd(int i); void RemoveAllPathHd(); protected: void MakeSureDirByFirstLine(); bool IsLinesOnOneLineAndConnect(AcDbCurve* pLast,AcDbCurve* pNext); bool SplitToLineSegs(const AcDbCurve* pCurve,int nSegs,AcDbVoidPtrArray& arLnPtrs,const AcGePoint3d& ptLast) const; Acad::ErrorStatus ImpMoveIntPointAt(int nGripIndex, int nCurSeg, int nGripPos, const AcGeVector3d &offset); void ImpGetEnd2End(AcDbVoidPtrArray &arLeft, AcGePoint3d &ptOn, double dTol = 1.e-3); protected: GripAppData* m_pGripAppData; //夹点 Adesk::Int16 m_nInfActive; //活动接口 AcDbVoidPtrArray m_arCurvePtrs; //序列化数据 //ONLY LINE,ARC AcGePoint2d m_ptDR; //D-Ratio 2 version CStringArray m_arPathHds; //路径穿过的桥架缆沟的句柄,用于敷设记录 AecDbObjXDataMap m_mapSpecXData; };