Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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;
};