244 lines
7.0 KiB
C++
244 lines
7.0 KiB
C++
#pragma once
|
|
#include "dbmain.h"
|
|
#include "LandScapeStyle.h"
|
|
#include "RoadDataCenterNew.h"
|
|
#include "TRoadDragJig.h"
|
|
#include "LandScapeDataCenterNew.h"
|
|
|
|
class TDbArcLandScapeEntity;
|
|
class TDbLineLandScapeEntity;
|
|
class TDbRoadEntity;
|
|
|
|
using namespace RoadDrag;
|
|
class CLandScapeStateData;
|
|
class TlandScapeDragjig : public AcEdJig
|
|
{
|
|
// 状态类
|
|
friend class CLandScapeStateData;
|
|
friend class CLandScapeFirstInState;
|
|
friend class CLineLandScapeState;
|
|
friend class CNextLineLandScapeState;
|
|
friend class CThirdLineLandScapeState;
|
|
friend class CArcLandScapeState;
|
|
friend class CNextArcLandScapeState;
|
|
friend class CMidArcLandScapeState;
|
|
friend class CArcRadLandScapeState;
|
|
|
|
public:
|
|
TlandScapeDragjig (CLandScapeStyle* landStyle);
|
|
~TlandScapeDragjig(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(CLandScapeStateData *pState) {m_pState = pState;}
|
|
|
|
// 准备绘制下一道路
|
|
void NextPoint();
|
|
private:
|
|
AcGePoint2d m_ptFirst, m_ptNext, m_ptThird, m_ptCheck; // 分别对应一段道路的几个点
|
|
CMixRoadForJig *m_pRoad;// 需要实时绘制的道路,仅仅保持对直线道路或者圆弧道路的引用,不开辟独立的内存
|
|
TDbLineLandScapeEntity *m_pLineRoad; // 直线道路
|
|
TDbArcLandScapeEntity *m_pArcRoad; // 圆弧道路
|
|
CLandScapeStateData *m_pState;
|
|
// 对话框数据
|
|
CLandScapeStyle* m_pLandStyle;
|
|
};
|
|
|
|
|
|
class TLandScapeDragContext;
|
|
// 其子类分别对应RoadDrag类的六个状态。
|
|
class CLandScapeStateData
|
|
{
|
|
public:
|
|
CLandScapeStateData (TlandScapeDragjig *jig, TLandScapeDragContext *pContext);
|
|
~CLandScapeStateData();
|
|
|
|
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;}
|
|
|
|
TlandScapeDragjig *m_pRoadJig;
|
|
TLandScapeDragContext *m_pContext;
|
|
|
|
|
|
// 命令提示信息
|
|
static CString m_arSzPrompt[];
|
|
static CString m_szKeyListLine;
|
|
static CString m_szKeyListNextLine;
|
|
static CString m_szKeyListArc;
|
|
static CString m_szKeyListNextArc;
|
|
static CString m_szKeyListArcRad;
|
|
};
|
|
|
|
// 初始进入,选择第一个点。
|
|
class CLandScapeFirstInState : public CLandScapeStateData
|
|
{
|
|
public:
|
|
CLandScapeFirstInState (TlandScapeDragjig *jig, TLandScapeDragContext *pContext) : CLandScapeStateData(jig, pContext) {};
|
|
~CLandScapeFirstInState(){};
|
|
|
|
virtual AcEdJig::DragStatus Drag();
|
|
virtual AcEdJig::DragStatus sampler();
|
|
virtual Adesk::Boolean update();
|
|
|
|
};
|
|
|
|
// 选择第一直线的终点
|
|
class CLineLandScapeState : public CLandScapeStateData
|
|
{
|
|
public:
|
|
CLineLandScapeState (TlandScapeDragjig *jig, TLandScapeDragContext *pContext) : CLandScapeStateData(jig, pContext) {};
|
|
~CLineLandScapeState(){};
|
|
|
|
virtual AcEdJig::DragStatus Drag();
|
|
virtual AcEdJig::DragStatus sampler();
|
|
virtual Adesk::Boolean update();
|
|
|
|
};
|
|
|
|
// 选择后续直线段的终点
|
|
class CNextLineLandScapeState : public CLandScapeStateData
|
|
{
|
|
public:
|
|
CNextLineLandScapeState (TlandScapeDragjig *jig, TLandScapeDragContext *pContext) : CLandScapeStateData(jig, pContext) {};
|
|
~CNextLineLandScapeState(){};
|
|
|
|
virtual AcEdJig::DragStatus Drag();
|
|
virtual AcEdJig::DragStatus sampler();
|
|
virtual Adesk::Boolean update();
|
|
};
|
|
|
|
class CThirdLineLandScapeState : public CLandScapeStateData
|
|
{
|
|
public:
|
|
CThirdLineLandScapeState(TlandScapeDragjig *jig, TLandScapeDragContext *pContext) : CLandScapeStateData(jig, pContext) {}
|
|
~CThirdLineLandScapeState(){}
|
|
|
|
virtual AcEdJig::DragStatus Drag();
|
|
virtual AcEdJig::DragStatus sampler();
|
|
virtual Adesk::Boolean update();
|
|
};
|
|
|
|
// 选择圆弧起点
|
|
class CArcLandScapeState : public CLandScapeStateData
|
|
{
|
|
public:
|
|
CArcLandScapeState (TlandScapeDragjig *jig, TLandScapeDragContext *pContext) : CLandScapeStateData(jig, pContext) {};
|
|
~CArcLandScapeState(){};
|
|
|
|
virtual AcEdJig::DragStatus Drag();
|
|
virtual AcEdJig::DragStatus sampler();
|
|
virtual Adesk::Boolean update();
|
|
};
|
|
|
|
// 选择圆弧下一点
|
|
class CNextArcLandScapeState : public CLandScapeStateData
|
|
{
|
|
public:
|
|
CNextArcLandScapeState (TlandScapeDragjig *jig, TLandScapeDragContext *pContext) : CLandScapeStateData(jig, pContext) {};
|
|
~CNextArcLandScapeState(){};
|
|
|
|
virtual AcEdJig::DragStatus Drag();
|
|
virtual AcEdJig::DragStatus sampler();
|
|
virtual Adesk::Boolean update();
|
|
};
|
|
|
|
// 选择圆弧中点
|
|
class CMidArcLandScapeState : public CLandScapeStateData
|
|
{
|
|
public:
|
|
CMidArcLandScapeState (TlandScapeDragjig *jig, TLandScapeDragContext *pContext) : CLandScapeStateData(jig, pContext) {};
|
|
~CMidArcLandScapeState(){};
|
|
|
|
virtual AcEdJig::DragStatus Drag();
|
|
virtual AcEdJig::DragStatus sampler();
|
|
virtual Adesk::Boolean update();
|
|
};
|
|
|
|
// 输入圆弧半径
|
|
class CArcRadLandScapeState : public CLandScapeStateData
|
|
{
|
|
public:
|
|
CArcRadLandScapeState (TlandScapeDragjig *jig, TLandScapeDragContext *pContext) : CLandScapeStateData(jig, pContext) {};
|
|
~CArcRadLandScapeState(){};
|
|
|
|
virtual AcEdJig::DragStatus Drag();
|
|
virtual AcEdJig::DragStatus sampler();
|
|
virtual Adesk::Boolean update();
|
|
private:
|
|
double m_dArcRad;
|
|
};
|
|
|
|
|
|
class TLandScapeDragContext
|
|
{
|
|
public:
|
|
enum ESequence{eFirstIn = 0, // 选取初始点,此时没有一个道路被绘制
|
|
eLineRoad, // 选取直线道路的下一个点,此时没有一个道路被绘制
|
|
eNextLineRoad, // 选取直线道路的下一个点,此时已经有道路被绘制
|
|
eThirdLineRoad, // 绘制第三条道路线
|
|
eArcRoad, // 选择弧道路的下一个点,此时没有一个道路被绘制
|
|
eNextArcRoad, // 选取弧道路的下一点,此时已经有道路被绘制。
|
|
eArcMidRoad, // 选取弧道路的中间点,待选择
|
|
eArcRad, //输入半径
|
|
eSequenceOk, // 完毕
|
|
eSequenceCancel, // 取消!
|
|
};
|
|
TLandScapeDragContext(CLandScapeStyle *pLandStyle);
|
|
~TLandScapeDragContext();
|
|
|
|
void RecordFirstPoint(const AcGePoint2d &ptFirst) {m_ptFirectRec = ptFirst;}
|
|
AcGePoint2d GetFirstPoint() const {return m_ptFirectRec;}
|
|
|
|
void AddArcRoad(TDbArcLandScapeEntity *pArcRoadEnt);
|
|
void AddLineRoad(TDbLineLandScapeEntity *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之后的状态。
|
|
CLandScapeDataCenterNew m_datas;
|
|
|
|
// 对话框数据
|
|
CLandScapeStyle* m_pLandStyle;
|
|
};
|
|
|
|
|