// Copyright (C), 1998-2007, Beijing Tangent Engineering Software Co. Ltd. // = FileName: TRoadDragJig.h // = Version: 8.5 // = Author: lgh // = Date: 2010-9-13 10:04:48 // = Description: 道路拖动jig类 // = Maintainers: #pragma once #include #include "RoadDataCenterNew.h" #include "DrawRoadDlg.h" class TDbLineRoadEntity; class TDbArcRoadEntity; class TDbRoadEntity; namespace RoadDrag { // 用于Jig时,控制绘制直线道路Or圆弧道路or不绘制。 class CMixRoadForJig : public TDbEntity { public: enum EDrawState{eNone, eLine, eArc}; CMixRoadForJig() : m_pLineRoad(NULL), m_pArcRoad(NULL), m_eDrawState(eNone){} CMixRoadForJig(TDbLineRoadEntity *pLineRoad, TDbArcRoadEntity *pArcRoad) : m_pLineRoad(pLineRoad), m_pArcRoad(pArcRoad), m_eDrawState(eNone){} ~CMixRoadForJig(){} DECLARE_TENTBASE(); ACRX_DECLARE_MEMBERS(CMixRoadForJig); virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler*); virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const; virtual Acad::ErrorStatus ExplodeOrDraw2d(XExplodeDraw &dc) const; void SetState (EDrawState estate){m_eDrawState = estate;} void SetChildEnt(TDbLineRoadEntity *pLineRoad, TDbArcRoadEntity *pArcRoad) { assertWriteEnabled(); m_pLineRoad = pLineRoad; m_pArcRoad = pArcRoad; } public: EDrawState m_eDrawState; TDbLineRoadEntity *m_pLineRoad; TDbArcRoadEntity *m_pArcRoad; }; class CStateData; class TRoadDragJig : public AcEdJig { // 状态类 friend class CStateData; friend class CFirstInState; friend class CLineRoadState; friend class CNextLineRoadState; friend class CThirdLineRoadState; friend class CArcRoadState; friend class CNextArcRoadState; friend class CMidArcRoadState; public: TRoadDragJig (CDrawRoadDlg *pDlg); ~TRoadDragJig(void); void DoIt(); // overide of parent cls virtual DragStatus sampler(); virtual Adesk::Boolean update(); virtual AcDbEntity* entity() const; void MakeClosed(const AcGePoint2d &ptFirstRec){m_ptNext = ptFirstRec;} // 构造当前用于显示的直线道路; Adesk::Boolean ConLineRoad(); // 构造当前用于显示的弧线道路; Adesk::Boolean ConArcRoad(); // 什么都不显示。 Adesk::Boolean NullShow(); void SetState(CStateData *pState) {m_pState = pState;} // 准备绘制下一道路 void NextPoint(); private: AcGePoint2d m_ptFirst, m_ptNext, m_ptThird, m_ptCheck; // 分别对应一段道路的几个点 CMixRoadForJig *m_pRoad;// 需要实时绘制的道路,仅仅保持对直线道路或者圆弧道路的引用,不开辟独立的内存 TDbLineRoadEntity *m_pLineRoad; // 直线道路 TDbArcRoadEntity *m_pArcRoad; // 圆弧道路 CStateData *m_pState; // 控制对话框 CDrawRoadDlg *m_pDrawDlg; }; class TRoadDragContext; // 其子类分别对应RoadDrag类的五个状态。 class CStateData { public: CStateData (TRoadDragJig *jig, TRoadDragContext *pContext); ~CStateData(); virtual AcEdJig::DragStatus Drag() = 0; virtual AcEdJig::DragStatus sampler() = 0; virtual Adesk::Boolean update() = 0; AcEdJig::DragStatus LineSamplerFun(CString &m_szKeyList); AcEdJig::DragStatus ArcSamplerFun(CString &m_szKeyList); AcGePoint2d& PtFirst() {return m_pRoadJig->m_ptFirst;} TRoadDragJig *m_pRoadJig; TRoadDragContext *m_pContext; // 命令提示信息 static CString m_arSzPrompt[]; static CString m_szKeyListLine; static CString m_szKeyListNextLine; static CString m_szKeyListArc; static CString m_szKeyListNextArc; }; // 初始进入,选择第一个点。 class CFirstInState : public CStateData { public: CFirstInState (TRoadDragJig *jig, TRoadDragContext *pContext) : CStateData(jig, pContext) {}; ~CFirstInState(){}; virtual AcEdJig::DragStatus Drag(); virtual AcEdJig::DragStatus sampler(); virtual Adesk::Boolean update(); }; // 选择第一直线的终点 class CLineRoadState : public CStateData { public: CLineRoadState (TRoadDragJig *jig, TRoadDragContext *pContext) : CStateData(jig, pContext) {}; ~CLineRoadState(){}; virtual AcEdJig::DragStatus Drag(); virtual AcEdJig::DragStatus sampler(); virtual Adesk::Boolean update(); }; // 选择后续直线段的终点 class CNextLineRoadState : public CStateData { public: CNextLineRoadState (TRoadDragJig *jig, TRoadDragContext *pContext) : CStateData(jig, pContext) {}; ~CNextLineRoadState(){}; virtual AcEdJig::DragStatus Drag(); virtual AcEdJig::DragStatus sampler(); virtual Adesk::Boolean update(); }; class CThirdLineRoadState : public CStateData { public: CThirdLineRoadState(TRoadDragJig *jig, TRoadDragContext *pContext) : CStateData(jig, pContext) {} ~CThirdLineRoadState(){} virtual AcEdJig::DragStatus Drag(); virtual AcEdJig::DragStatus sampler(); virtual Adesk::Boolean update(); }; // 选择圆弧起点 class CArcRoadState : public CStateData { public: CArcRoadState (TRoadDragJig *jig, TRoadDragContext *pContext) : CStateData(jig, pContext) {}; ~CArcRoadState(){}; virtual AcEdJig::DragStatus Drag(); virtual AcEdJig::DragStatus sampler(); virtual Adesk::Boolean update(); }; // 选择圆弧下一点 class CNextArcRoadState : public CStateData { public: CNextArcRoadState (TRoadDragJig *jig, TRoadDragContext *pContext) : CStateData(jig, pContext) {}; ~CNextArcRoadState(){}; virtual AcEdJig::DragStatus Drag(); virtual AcEdJig::DragStatus sampler(); virtual Adesk::Boolean update(); }; // 选择圆弧中点 class CMidArcRoadState : public CStateData { public: CMidArcRoadState (TRoadDragJig *jig, TRoadDragContext *pContext) : CStateData(jig, pContext) {}; ~CMidArcRoadState(){}; virtual AcEdJig::DragStatus Drag(); virtual AcEdJig::DragStatus sampler(); virtual Adesk::Boolean update(); }; class TRoadDragContext { public: enum ESequence{eFirstIn = 0, // 选取初始点,此时没有一个道路被绘制 eLineRoad, // 选取直线道路的下一个点,此时没有一个道路被绘制 eNextLineRoad, // 选取直线道路的下一个点,此时已经有道路被绘制 eThirdLineRoad, // 绘制第三条道路线 eArcRoad, // 选择弧道路的下一个点,此时没有一个道路被绘制 eNextArcRoad, // 选取弧道路的下一点,此时已经有道路被绘制。 eArcMidRoad, // 选取弧道路的中间点,待选择 eSequenceOk, // 完毕 eSequenceCancel, // 取消! }; TRoadDragContext(CDrawRoadDlg *pDrawDlg); ~TRoadDragContext(); void RecordFirstPoint(const AcGePoint2d &ptFirst) {m_ptFirectRec = ptFirst;} AcGePoint2d GetFirstPoint() const {return m_ptFirectRec;} void AddArcRoad(TDbArcRoadEntity *pArcRoadEnt); void AddLineRoad(TDbLineRoadEntity *pLineRoadEnt); void SetSequenceState(ESequence eSequence) {m_eSequence = eSequence;} ESequence GetSequenceState() const {return m_eSequence;} void SetStateAfterFirstIn(BOOL bLine) {m_bLineAfterFirstrIn = bLine;} // 压栈 void PushPoint(const AcGePoint2d &ptPush); // 回退操作 AcGePoint2d PopPoint(); AcGePoint2d RoolBack(); ESequence SequenceAfterFirstIn(); // 回退操作的时候,状态也需要回退 void PopSequence(); // 清空回退 void ClearStep(); int PushPointNum() const {return m_arPushPoint.length();} private: AcGePoint2d m_ptFirectRec; // 记录第一个点 AcGePoint2dArray m_arPushPoint; // 记录每一个道路线的起点 ESequence m_eSequence; BOOL m_bLineAfterFirstrIn; // firstIn之后的状态。 CRoadDataCenterNew m_datas; // 控制对话框 CDrawRoadDlg *m_pDrawDlg; }; }