Files
envi-code/SourceCode/Code2026/tg_shs/shs_siteplan/TRoadDragJig.h
T
2026-09-28 15:28:50 +08:00

267 lines
7.1 KiB
C++

// 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 <dbjig.h>
#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;
};
}