217 lines
7.7 KiB
C++
217 lines
7.7 KiB
C++
#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<CurveDir>& curDirs,double dTol = 1.e-2) const;
|
|
|
|
Acad::ErrorStatus AddGripPoint(const AcGePoint3d& ptBr);
|
|
|
|
//每一段模拟接口
|
|
bool GetInterface(AcArray<AecInterface>& arInfs) const;
|
|
int GetInterface(int nIndex,AcArray<AecInterface>& 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;
|
|
};
|