#pragma once #include "earthwormdef.h" #include "AcGiDraw.h" #ifdef EARTHWORM_EXPORT #define DLLIMPEXP __declspec(dllexport) #else #define DLLIMPEXP __declspec(dllimport) #endif class DLLIMPEXP AecComplexCurve { public: AecComplexCurve(); AecComplexCurve(const AecComplexCurve& src); ~AecComplexCurve(); AecComplexCurve& operator = (const AecComplexCurve& src); AecComplexCurve& copyFrom(const AecComplexCurve& src); AecEqui::AecCurveElement operator [] (int nIndex); const AecEqui::AecCurveElement operator [] (int nIndex) const; AcDbCurve* segat(int nIndex); AecEqui::AecCurveElement at(int nIndex) const; AecEqui::AecCurveElement& atByRef(int nIndex); const AecEqui::AecCurveElement& atByCstRef(int nIndex) const; AecComplexCurve& setAt(int nIndex, AecEqui::AecCurveElement& value); AecEqui::AecCurveElement first(); const AecEqui::AecCurveElement first() const; AecEqui::AecCurveElement last(); const AecEqui::AecCurveElement last() const; int append(const AecEqui::AecCurveElement& value); //Line Arc int append(AcDbCurve* pCurve); AecComplexCurve& append(const AecComplexCurve& src); AecEqui::AecCurveElement removeAt(int nIndex); BOOL remove(AecEqui::AecCurveElement& value, int start = 0); AecEqui::AecCurveElement removeFirst(); AecEqui::AecCurveElement removeLast(); void removeAll(); BOOL find(const AecEqui::AecCurveElement& value, int& foundAt,int start = 0) const; int length() const; BOOL isEmpty() const; int logicalLength() const; void setLogicalLength(int nIndex); BOOL isEqual(const AecEqui::AecCurveElement& value1,const AecEqui::AecCurveElement& value2) const; void setSubElementGsMark(int nGsMark); BOOL CanBoolUnite(const AecEqui::AecCurveElement& el) const; Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform); void setColorIndex(int nColor); //同类合并 void merge(); bool merge(AecEqui::AecCurveElement& el0,AecEqui::AecCurveElement& el1,AecEqui::AecCurveElement*& pelAdd); //实线减去挖空线,前提先同类合并merge void boolSubtract(); int boolSubtract(AecEqui::AecCurveElement& elR,AecEqui::AecCurveElement& elH,CArray& arEl0); void OrthoProjectedToXYPlane(double dz = 0.0); AcDbPolyline* MakePoly() const; //获取 元素的类型0:line 1 : Arc static int GetElementType(const AecEqui::AecCurveElement& el); static BOOL MakeArc(const AecEqui::AecCurveElement& el,AcDbArc*& pArc); static BOOL MakeLine(const AecEqui::AecCurveElement& el,AcDbLine*& pLine); //根据 GetElementType 创建曲线 static BOOL MakeCurve(const AecEqui::AecCurveElement& el,AcDbCurve*& pCurve); static BOOL MakeElement(AecEqui::AecCurveElement& el,const AcDbCurve* pCurve); static Acad::ErrorStatus IntersectWith(AecEqui::AecCurveElement& el1,AecEqui::AecCurveElement& el2,AcDb::Intersect nType,AcGePoint3dArray& arPts); static Acad::ErrorStatus ExtendTo(AecEqui::AecCurveElement& el,const AcGePoint3d& ptTo); Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* pFiler) const; Acad::ErrorStatus dxfInFields(AcDbDxfFiler* pFiler); Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const; Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler); private: CArray m_arCurElements; }; class DLLIMPEXP AecComplexCurveDraw { public: AecComplexCurveDraw(); AecComplexCurveDraw(const AecComplexCurveDraw& src); ~AecComplexCurveDraw(); void SetOwnerId(AcDbObjectId& id); AcDbObjectId GetOwnerId(); void SetEdage(const AecComplexCurve& curEdage); BOOL GetEdage(AecComplexCurve& curEdage); BOOL GetEdage(AecComplexCurve& curEdage) const; AecComplexCurve& GetRefEdage(); const AecComplexCurve& GetRefEdage() const; BOOL HasEdage() const; BOOL RemoveEdage(); void merge(); void boolSubtract(); //设置隐藏段的绘制方式 0:不绘制 1: 绘制 void SetHideDraw(Adesk::Int32 bHideDraw); Adesk::Int32 GetHideDraw() const; void SetColor(int nColor); // 延伸(收缩)首末点 为了支持遮挡扩展区域,dExtLen:单边延伸值 void ExtendStartAndEnd(double dExtLen); AecComplexCurveDraw& operator = (const AecComplexCurveDraw& src); AecComplexCurveDraw& copyFrom(const AecComplexCurveDraw& src); Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* pFiler) const; Acad::ErrorStatus dxfInFields(AcDbDxfFiler* pFiler); Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler, Adesk::UInt32 nVer = 1) const; Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler, Adesk::UInt32 nVer = 1); //遮挡绘制 idReal实线图层,idDash 虚线图层,idCen中心线图层 Adesk::Boolean Draw2d(AcGiDraw &dc, const AcDbObjectId& idReal, const AcDbObjectId& idDash, const AcDbObjectId& idCen, AecEqui::AecCurveElement* pElTmpl = NULL, BOOL bWeight = FALSE, BOOL bCenWeight = FALSE, double dPScale = 1.0) const; //无遮挡绘制 Adesk::Boolean Draw2d(AcGiDraw& dc) const; Adesk::Boolean explode(AcDbVoidPtrArray& entitySet, const AcDbObjectId& idReal, const AcDbObjectId& idDash, const AcDbObjectId& idCen, AecEqui::AecCurveElement* pElTmpl = NULL, BOOL bWeight = FALSE, BOOL bCenWeight = FALSE); Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform); void OrthoProject2XY(); protected: BOOL MakePolgon(AecEqui::AecCurveElement& el, AcDbPolyline*& pPl, BOOL bIsArc = FALSE) const; void SetProperty(AecEqui::AecCurveElement& el, AcDbEntity* pEnt, const AcDbObjectId& idReal, const AcDbObjectId& idDash, const AcDbObjectId& idCen); BOOL MakeArc(AecEqui::AecCurveElement& el, AcDbArc*& pArc) const; BOOL MakeLine(AecEqui::AecCurveElement& el, AcDbLine*& pPl) const; void OrthProjectEl2XYPlan(AecEqui::AecCurveElement& el) const; public: Adesk::Int32 m_bHideDraw; AcDbSoftPointerId m_idOwner; AecComplexCurve m_curEdage; };