#pragma once #include "dbjig.h" #include "AecDbCurveBase.h" #include "EarThwormDef.h" #include "AecDbObjXDataMap.h" #ifdef EARTHWORM_EXPORT #define DLLIMPEXP __declspec(dllexport) #else #define DLLIMPEXP __declspec(dllimport) #endif class AecAngleWatch; class AECStatusRecord; class AecDb3dRoadAxisLine; class AcPolyline : public AecDbCurveBase { public: AcPolyline( ); virtual ~AcPolyline(void); virtual Acad::ErrorStatus Draw2d(AcGiDraw &mode) const; virtual const AecDbObjXDataMap *GetSpecialtyData() const; virtual AecDbObjXDataMap *GetSpecialtyData(AcDb::OpenMode bMode = AcDb::kForWrite); void SetDoubleLineDraw(bool bDblLine, double dW, double dLW,EAlign eAlign = kMid) { m_bDblLine = bDblLine; m_dW = dW;m_dLW = dLW, m_eAlign = eAlign; } EAlign m_eAlign; double m_dW; double m_dLW; bool m_bDblLine; bool m_bAngleWatchDraw; AcDbCurve* m_pCurve; //当前线段 mutable AcDbCurve* m_pCurve1; //当前线段 mutable AcDbCurve* m_pCurve2; //当前线段 AecAngleWatch* m_pAngleWatch; //仪表盘 AecDbObjXDataMap m_mapSpecXData; }; class DLLIMPEXP AcPolylineJig : public AcEdJig { public: AcPolylineJig(void); ~AcPolylineJig(void); public: void SetElevation(double dStEl); bool DoIt( ); bool DoArcIt(); bool DoItISO(int nAngMode, int nAngle); AcDbObjectId GetRoadAxisLineId() const; public: //Jig 提示和交互设置 //2D pline线 void InitStatusRecsForPolyline(); //标准墙 void InitStatusRecsForWall(double dWallW, double dLW,EAlign eAlign = kMid); //弧墙 void InitStatusRecsForArcWall(double dWallW, double dLW,EAlign eAlign = kMid); //一段线 void InitStatusRecsForOnLine(); //空间 3D系列线段 带坡度 void InitStatusRecsForLineSegs(); //2D系列线段 void InitStatusRecsFor2DLineSegs(); //ISO void InitStatusRecsFor2DISOLineSegs(); //空间 3dRoad 带弧 带坡度 void InitStatusRecsFor3dRoadAxisLine(); void SetAngleWatchDraw(bool bAngleWatchDraw = false); protected: virtual AcEdJig::DragStatus sampler(); virtual AcDbEntity* entity() const; virtual Adesk::Boolean update(); protected: void FreeBuffer(); BOOL AddRoadNode(WPipe::PipeDraw ePipe); BOOL AddRoadNode(double dAngle,double dR); BOOL AddArcRoadNode(WPipe::PipeDraw ePipe); public: bool GetLastStatusAquire(AcGePoint3d& ptGe); private: void PushBackStatusRec(AECStatusRecord* pRec); void PopUpStatusRec(); double GetEndElevation() const; BOOL MakeLine(); BOOL MakeArc(); void SetDispPromptWithEleTip(CString& sPrompt); void SetUndoGroupBegin(); void SetUndoGroupEnd(); AECStatusRecord* GetTailStatusRec() const; void MoveAngWatchPosition(); AcGeVector3d GetLastInterface() const; void CalReferencePoint(); protected: CPtrArray m_arStaPtrs; //状态集 CPtrList m_lstStaPtrsBack; //上次状态 AECStatusRecord* m_pCurStaRec; //当前请求状态 AcDbLine* m_pLine; //当前的直线段 AcDbArc* m_pArc; //当前的圆弧段 AcDbCurve* m_pCurve; //当前线段 AecAngleWatch* m_pAngleWatch; //导向罗盘 AecDb3dRoadAxisLine* m_pRoadAxisLine; //总线段 AcDbObjectId m_idRoadLine; //路线 int m_nUndoGoupid; //undo标记id protected: AcPolyline* m_pPolylineProxy; //绘制代理 };