Files
envi-code/SourceCode/Code2026/tg_shs/shs_siteplan/TlandScapeDragjig.cpp
T

816 lines
19 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
#include "stdafx.h"
2026-09-28 15:28:50 +08:00
#include "TlandScapeDragjig.h"
#include <gepnt2d.h>
#include "TDbRoadEntity.h"
#include "LandScapeStyle.h"
#include "GlwGlobalVariable.h"
using namespace RoadDrag;
extern void Point3DTo2D(AcGePoint3d &ptOri, AcGePoint2d &ptDest);
inline bool KeyRet(AcEdJig::DragStatus ret)
{
return ret >= AcEdJig::kKW1 && ret <= AcEdJig::kKW9;
}
CString CLandScapeStateData::m_arSzPrompt[] =
{
2026-10-04 00:04:20 +08:00
_T("\n指定起点<退出>: "),
_T("\n直段下一点或[弧段(A)] <退出>: "),
_T("\n直段下一点或[弧段(A) /回退(U)] <退出>: "),
_T("\n直段下一点或[弧段(A) /回退(U) /闭合(C)] <退出>: "),
_T("\n弧段终点或[直段(L)] <退出>: "),
_T("\n弧段终点或[直段(L)/回退(U)] <退出>: "),
_T("\n点取弧上任意点<结束>: ")
2026-09-28 15:28:50 +08:00
};
CString CLandScapeStateData::m_szKeyListLine = _T("A");
CString CLandScapeStateData::m_szKeyListNextLine = _T("A U C");
CString CLandScapeStateData::m_szKeyListArc = _T("L");
CString CLandScapeStateData::m_szKeyListNextArc = _T("L U");
CString CLandScapeStateData::m_szKeyListArcRad = _T("U");
TlandScapeDragjig::TlandScapeDragjig(CLandScapeStyle* landStyle)
: m_pLandStyle(landStyle)
{
m_pState = NULL;
m_pLineRoad = new TDbLineLandScapeEntity();
m_pArcRoad = new TDbArcLandScapeEntity();
m_pRoad = new CMixRoadForJig(m_pLineRoad, m_pArcRoad);
2026-10-04 00:04:20 +08:00
NullShow(); // 初始不绘制。
2026-09-28 15:28:50 +08:00
}
TlandScapeDragjig::~TlandScapeDragjig(void)
{
2026-10-04 00:04:20 +08:00
// 当然,如果该实体被添加到了CAD中,该实体不需要删除,
// 因此,实体被绘制之后,需要取消针对该实体的引用(置空)
2026-09-28 15:28:50 +08:00
ASSERT(m_pLineRoad != NULL);
ASSERT(m_pArcRoad != NULL);
ASSERT(m_pRoad != NULL);
delete m_pRoad;
m_pRoad = NULL;
delete m_pLineRoad;
m_pLineRoad = NULL;
delete m_pArcRoad;
m_pArcRoad = NULL;
//m_pDrawDlg->SetCmdNum(1);
}
2026-10-04 00:04:20 +08:00
// 读取对话框的内容,构造圆弧道路
2026-09-28 15:28:50 +08:00
Adesk::Boolean TlandScapeDragjig::ConArcRoad()
{
CLandScapeStyle* pLandScape = GET_GLOBAL_VARIABLE(CLandScapeStyle);
//ASSERT(m_pDrawDlg != NULL);
if (m_ptFirst.distanceTo(m_ptNext) < 1.0
|| m_ptFirst.distanceTo(m_ptThird) < 1.0
|| m_ptThird.distanceTo(m_ptNext) < 1.0
)
{
return Adesk::kFalse;
}
m_pArcRoad->SetArcRoad(m_ptFirst, m_ptThird, m_ptNext, m_pLandStyle);
m_pRoad->SetState(CMixRoadForJig::eArc);
return Adesk::kTrue;
}
2026-10-04 00:04:20 +08:00
// 读取对话框的内容,构造直线道路。
2026-09-28 15:28:50 +08:00
Adesk::Boolean TlandScapeDragjig::ConLineRoad()
{
if (m_ptFirst.distanceTo(m_ptNext) < 1.0)
{
return Adesk::kFalse;
}
m_pLineRoad->SetLineRoad(m_ptFirst, m_ptNext, m_pLandStyle);
m_pRoad->SetState(CMixRoadForJig::eLine);
return Adesk::kTrue;
}
Adesk::Boolean TlandScapeDragjig::NullShow()
{
m_pRoad->SetState(CMixRoadForJig::eNone);
return Adesk::kTrue;
}
void TlandScapeDragjig::NextPoint()
{
m_ptFirst = m_ptNext;
}
void TlandScapeDragjig::DoIt()
{
ASSERT(m_pState != NULL);
m_pState->Drag();
}
// overide of parent cls
AcEdJig::DragStatus TlandScapeDragjig::sampler()
{
//m_pDrawDlg->SetCmdNum(2);
setUserInputControls((UserInputControls)
(AcEdJig::kAccept3dCoordinates | AcEdJig::kNullResponseAccepted
| AcEdJig::kNoNegativeResponseAccepted
| AcEdJig::kNoZeroResponseAccepted));
ASSERT(m_pState != NULL);
return m_pState->sampler();
}
Adesk::Boolean TlandScapeDragjig::update()
{
ASSERT(m_pState != NULL);
return m_pState->update();
}
AcDbEntity* TlandScapeDragjig::entity() const
{
2026-10-04 00:04:20 +08:00
return m_pRoad;// 这个road中集成几种道路类型
2026-09-28 15:28:50 +08:00
}
//////////////////////////////////////////////////////////////////////////
// state fun!!
CLandScapeStateData::CLandScapeStateData (TlandScapeDragjig *jig, TLandScapeDragContext *pContext) : m_pRoadJig(jig), m_pContext(pContext)
{
}
CLandScapeStateData::~CLandScapeStateData()
{
}
AcEdJig::DragStatus CLandScapeStateData::LineSamplerFun(CString &m_szKeyList)
{
ASSERT(m_pRoadJig != NULL);
m_pRoadJig->setKeywordList(m_szKeyList);
AcGePoint3d ptDump;
AcEdJig::DragStatus ret = m_pRoadJig->acquirePoint(ptDump, POINT_2D_TO_3D(PtFirst()));
if (ret == AcEdJig::kNormal)
{
AcGePoint2d ptDump2d;
Point3DTo2D(ptDump, ptDump2d);
m_pRoadJig->m_ptNext = ptDump2d;
if (m_pRoadJig->m_ptFirst.distanceTo(ptDump2d) < 1.0)
return AcEdJig::kNoChange;
if (m_pRoadJig->m_ptCheck.distanceTo(ptDump2d) < 1.0)
return AcEdJig::kNoChange;
else
m_pRoadJig->m_ptCheck = ptDump2d;
}
2026-10-04 00:04:20 +08:00
return ret; // 需要处理,然后生成实体
2026-09-28 15:28:50 +08:00
}
AcEdJig::DragStatus CLandScapeStateData::ArcSamplerFun(CString &m_szKeyList)
{
ASSERT(m_pRoadJig != NULL);
m_pRoadJig->setKeywordList(m_szKeyList);
AcGePoint3d ptDump;
AcEdJig::DragStatus ret = m_pRoadJig->acquirePoint(ptDump, POINT_2D_TO_3D(PtFirst()));
if (ret == AcEdJig::kNormal)
{
AcGePoint2d ptDump2d;
Point3DTo2D(ptDump, ptDump2d);
m_pRoadJig->m_ptNext = ptDump2d;
if (PtFirst().distanceTo(ptDump2d) < 1.0)
return AcEdJig::kNoChange;
}
return ret;
}
// First in
AcEdJig::DragStatus CLandScapeFirstInState::Drag()
{
m_pRoadJig->setDispPrompt(m_arSzPrompt[TLandScapeDragContext::eFirstIn]);
AcEdJig::DragStatus ret = m_pRoadJig->drag();
2026-10-04 00:04:20 +08:00
// 需要判断的返回类型:
// 1、正常选中一个点,
// 2、其他
2026-09-28 15:28:50 +08:00
if (ret == AcEdJig::kNormal)
2026-10-04 00:04:20 +08:00
{ // 应该是进入下一个状态了。
2026-09-28 15:28:50 +08:00
m_pContext->SetSequenceState(m_pContext->SequenceAfterFirstIn());
}
else
{
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
return ret;
}
2026-10-04 00:04:20 +08:00
// 取点
2026-09-28 15:28:50 +08:00
AcEdJig::DragStatus CLandScapeFirstInState::sampler()
{
AcGePoint3d ptDump;
AcEdJig::DragStatus ret = m_pRoadJig->acquirePoint(ptDump);
2026-10-04 00:04:20 +08:00
// 这个决定了drag的返回值
2026-09-28 15:28:50 +08:00
if (ret == AcEdJig::kNormal)
{
Point3DTo2D(ptDump, PtFirst());
m_pContext->RecordFirstPoint(PtFirst());
m_pRoadJig->NullShow();
return AcEdJig::kNoChange;
}
2026-10-04 00:04:20 +08:00
return ret; // 需要处理,然后生成实体
2026-09-28 15:28:50 +08:00
}
Adesk::Boolean CLandScapeFirstInState::update()
{
return m_pRoadJig->NullShow();
}
// LineRoad
AcEdJig::DragStatus CLineLandScapeState::Drag()
{
ASSERT(m_pRoadJig != NULL);
m_pRoadJig->setDispPrompt(m_arSzPrompt[TLandScapeDragContext::eLineRoad]);
AcEdJig::DragStatus ret;
INITGET_BEG(-1, m_szKeyListLine)
ret = m_pRoadJig->drag();
INITGET_END()
if (ret == AcEdJig::kNull)
{
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
else if (ret == AcEdJig::kNormal)
{
2026-10-04 00:04:20 +08:00
// 下一个道路了
2026-09-28 15:28:50 +08:00
m_pContext->PushPoint(PtFirst());
m_pContext->SetSequenceState(TLandScapeDragContext::eNextLineRoad);
m_pRoadJig->NextPoint();
m_pContext->AddLineRoad(m_pRoadJig->m_pLineRoad);
}
else if (ret == AcEdJig::kKW1)
2026-10-04 00:04:20 +08:00
{ // 关键字1,切换到圆弧
2026-09-28 15:28:50 +08:00
m_pContext->SetSequenceState(TLandScapeDragContext::eArcRoad);
}
else
2026-10-04 00:04:20 +08:00
{ // 其他的情况!
2026-09-28 15:28:50 +08:00
// do Nothing!!
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
return ret;
}
AcEdJig::DragStatus CLineLandScapeState::sampler()
{
return LineSamplerFun(m_szKeyListLine);
}
Adesk::Boolean CLineLandScapeState::update()
{
ASSERT(m_pRoadJig != NULL);
2026-10-04 00:04:20 +08:00
// 这时候,需要处理实体
2026-09-28 15:28:50 +08:00
return m_pRoadJig->ConLineRoad();
}
// NextLineRoad
AcEdJig::DragStatus CNextLineLandScapeState::Drag()
{
ASSERT(m_pRoadJig != NULL);
m_pRoadJig->setDispPrompt(m_arSzPrompt[TLandScapeDragContext::eNextLineRoad]);
AcEdJig::DragStatus ret;
INITGET_BEG(-1, m_szKeyListNextLine)
ret = m_pRoadJig->drag();
INITGET_END()
if (ret == AcEdJig::kNull)
{
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
else if (ret == AcEdJig::kNormal)
{
// still this state
m_pContext->PushPoint(PtFirst());
m_pContext->SetSequenceState(TLandScapeDragContext::eThirdLineRoad);
m_pRoadJig->NextPoint();
m_pContext->AddLineRoad(m_pRoadJig->m_pLineRoad);
}
else if (ret == AcEdJig::kKW1)
2026-10-04 00:04:20 +08:00
{ // 关键字_T("A U C");
2026-09-28 15:28:50 +08:00
m_pContext->SetSequenceState(TLandScapeDragContext::eNextArcRoad);
}
else if (ret == AcEdJig::kKW2)
2026-10-04 00:04:20 +08:00
{// 关键字_T("A U C");
2026-09-28 15:28:50 +08:00
PtFirst() = m_pContext->RoolBack();
}
else
2026-10-04 00:04:20 +08:00
{ // 其他的情况!
2026-09-28 15:28:50 +08:00
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
return ret;
}
AcEdJig::DragStatus CNextLineLandScapeState::sampler()
{
return LineSamplerFun(m_szKeyListNextLine);
}
Adesk::Boolean CNextLineLandScapeState::update()
{
ASSERT(m_pRoadJig != NULL);
2026-10-04 00:04:20 +08:00
// 这时候,需要处理实体
2026-09-28 15:28:50 +08:00
return m_pRoadJig->ConLineRoad();
}
// NextLineRoad
AcEdJig::DragStatus CThirdLineLandScapeState::Drag()
{
ASSERT(m_pRoadJig != NULL);
m_pRoadJig->setDispPrompt(m_arSzPrompt[TLandScapeDragContext::eThirdLineRoad]);
AcEdJig::DragStatus ret;
INITGET_BEG(-1, m_szKeyListNextLine)
ret = m_pRoadJig->drag();
INITGET_END()
if (ret == AcEdJig::kNull)
{
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
else if (ret == AcEdJig::kNormal)
{
// still this state
m_pContext->PushPoint(PtFirst());
m_pContext->SetSequenceState(TLandScapeDragContext::eThirdLineRoad);
m_pRoadJig->NextPoint();
m_pContext->AddLineRoad(m_pRoadJig->m_pLineRoad);
}
else if (ret == AcEdJig::kKW1)
2026-10-04 00:04:20 +08:00
{ // 关键字_T("A U C");
2026-09-28 15:28:50 +08:00
m_pContext->SetSequenceState(TLandScapeDragContext::eNextArcRoad);
}
else if (ret == AcEdJig::kKW2)
2026-10-04 00:04:20 +08:00
{// 关键字_T("A U C");
2026-09-28 15:28:50 +08:00
PtFirst() = m_pContext->RoolBack();
}
else if (ret == AcEdJig::kKW3)
2026-10-04 00:04:20 +08:00
{// 关键字_T("A U C");
2026-09-28 15:28:50 +08:00
m_pRoadJig->MakeClosed(m_pContext->GetFirstPoint());
if (m_pRoadJig->ConLineRoad())
m_pContext->AddLineRoad(m_pRoadJig->m_pLineRoad);
m_pContext->ClearStep();
m_pContext->SetSequenceState(TLandScapeDragContext::eFirstIn);
m_pContext->SetStateAfterFirstIn(TRUE);
}
else
2026-10-04 00:04:20 +08:00
{ // 其他的情况!
2026-09-28 15:28:50 +08:00
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
return ret;
}
AcEdJig::DragStatus CThirdLineLandScapeState::sampler()
{
return LineSamplerFun(m_szKeyListNextLine);
}
Adesk::Boolean CThirdLineLandScapeState::update()
{
ASSERT(m_pRoadJig != NULL);
2026-10-04 00:04:20 +08:00
// 这时候,需要处理实体
2026-09-28 15:28:50 +08:00
return m_pRoadJig->ConLineRoad();
}
// ArcRoad
AcEdJig::DragStatus CArcLandScapeState::Drag()
{
ASSERT(m_pRoadJig != NULL);
m_pRoadJig->setDispPrompt(m_arSzPrompt[TLandScapeDragContext::eArcRoad]);
AcEdJig::DragStatus ret;
INITGET_BEG(-1, m_szKeyListArc)
ret = m_pRoadJig->drag();
INITGET_END()
if (ret == AcEdJig::kNull)
{
m_pContext->SetSequenceState(TLandScapeDragContext::eFirstIn);
m_pContext->SetStateAfterFirstIn(FALSE);
m_pContext->ClearStep();
}
else if (ret == AcEdJig::kNormal)
{
m_pContext->SetSequenceState(TLandScapeDragContext::eArcMidRoad);
}
else if (ret == AcEdJig::kKW1)
2026-10-04 00:04:20 +08:00
{ // 关键字1,切换到线段
2026-09-28 15:28:50 +08:00
m_pContext->SetSequenceState(TLandScapeDragContext::eLineRoad);
}
else
2026-10-04 00:04:20 +08:00
{ // 其他的情况!
2026-09-28 15:28:50 +08:00
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
return ret;
}
AcEdJig::DragStatus CArcLandScapeState::sampler()
{
return ArcSamplerFun(m_szKeyListArc);
}
Adesk::Boolean CArcLandScapeState::update()
{
return m_pRoadJig->NullShow();
}
// NextArcRoad
AcEdJig::DragStatus CNextArcLandScapeState::Drag()
{
ASSERT(m_pRoadJig != NULL);
m_pRoadJig->setDispPrompt(m_arSzPrompt[TLandScapeDragContext::eNextArcRoad]);
AcEdJig::DragStatus ret;
INITGET_BEG(-1, m_szKeyListNextArc)
ret = m_pRoadJig->drag();
INITGET_END()
2026-10-04 00:04:20 +08:00
// 需要判断的返回类型:
// 1、选中了一个点,(组成了一个线段回路)
// 2、取消
// 3、关键字选中
// 3、其他,比如:右键,空格,回车等
2026-09-28 15:28:50 +08:00
if (ret == AcEdJig::kNull)
{
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
else if (ret == AcEdJig::kNormal)
{
m_pContext->SetSequenceState(TLandScapeDragContext::eArcMidRoad);
}
else if (ret == AcEdJig::kKW1)
2026-10-04 00:04:20 +08:00
{ // 关键字,切换到LineRoad,_T("L U");
2026-09-28 15:28:50 +08:00
if (m_pContext->PushPointNum() >= 2)
m_pContext->SetSequenceState(TLandScapeDragContext::eThirdLineRoad);
else
m_pContext->SetSequenceState(TLandScapeDragContext::eNextLineRoad);
}
else if (ret == AcEdJig::kKW2)
2026-10-04 00:04:20 +08:00
{ // Undo;
2026-09-28 15:28:50 +08:00
PtFirst() = m_pContext->RoolBack();
}
else
2026-10-04 00:04:20 +08:00
{ // 其他的情况!
2026-09-28 15:28:50 +08:00
// do Nothing!!
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
return ret;
}
AcEdJig::DragStatus CNextArcLandScapeState::sampler()
{
return ArcSamplerFun(m_szKeyListNextArc);
}
Adesk::Boolean CNextArcLandScapeState::update()
{
return m_pRoadJig->NullShow();
}
// MidArcRoad
AcEdJig::DragStatus CMidArcLandScapeState::Drag()
{
ASSERT(m_pRoadJig != NULL);
m_pRoadJig->setDispPrompt(m_arSzPrompt[TLandScapeDragContext::eArcMidRoad]);
AcEdJig::DragStatus ret;
INITGET_BEG(-1, m_szKeyListArcRad)
ret = m_pRoadJig->drag();
INITGET_END()
2026-10-04 00:04:20 +08:00
// 需要判断的返回类型:
// 1、选中了一个点,(组成了一个线段回路)
// 2、取消
// 3、关键字选中
// 3、其他,比如:右键,空格,回车等
2026-09-28 15:28:50 +08:00
if (ret == AcEdJig::kCancel)
{
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
else if (ret == AcEdJig::kNull)
{
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
else if (ret == AcEdJig::kNormal)
{
m_pContext->PushPoint(PtFirst());
m_pContext->SetSequenceState(TLandScapeDragContext::eNextArcRoad);
m_pRoadJig->NextPoint();
m_pContext->AddArcRoad(m_pRoadJig->m_pArcRoad);
}
else if (ret == AcEdJig::kKW1)
{
m_pContext->SetSequenceState(TLandScapeDragContext::eArcRad);
}
else if (ret == AcEdJig::kKW2)
2026-10-04 00:04:20 +08:00
{ // Undo;
2026-09-28 15:28:50 +08:00
PtFirst() = m_pContext->RoolBack();
}
else if (ret == AcEdJig::kNoChange)
{
// do nothing;
}
else
2026-10-04 00:04:20 +08:00
{ // 其他的情况!
2026-09-28 15:28:50 +08:00
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
return ret;
}
AcEdJig::DragStatus CMidArcLandScapeState::sampler()
{
ASSERT(m_pRoadJig != NULL);
m_pRoadJig->setKeywordList(m_szKeyListArcRad);
AcGePoint3d ptDump;
AcEdJig::DragStatus ret = m_pRoadJig->acquirePoint(ptDump);
if (ret == AcEdJig::kNormal)
{
AcGePoint2d ptDump2d;
Point3DTo2D(ptDump, ptDump2d);
if (PtFirst().distanceTo(ptDump2d) < 1.0)
return AcEdJig::kNoChange;
else if (m_pRoadJig->m_ptNext.distanceTo(ptDump2d) < 1.0)
return AcEdJig::kNoChange;
m_pRoadJig->m_ptThird = ptDump2d;
if (m_pRoadJig->m_ptCheck.distanceTo(ptDump2d) < 1.0)
return AcEdJig::kNoChange;
else
m_pRoadJig->m_ptCheck = ptDump2d;
}
2026-10-04 00:04:20 +08:00
return ret; // 需要处理,然后生成实体
2026-09-28 15:28:50 +08:00
}
Adesk::Boolean CMidArcLandScapeState::update()
{
ASSERT(m_pRoadJig != NULL);
return m_pRoadJig->ConArcRoad();
}
AcEdJig::DragStatus CArcRadLandScapeState::Drag()
{
ASSERT(m_pRoadJig != NULL);
CLandScapeStyle* pLandScape = GET_GLOBAL_VARIABLE(CLandScapeStyle);
m_dArcRad = pLandScape->m_dArcRad;
2026-10-04 00:04:20 +08:00
CString strPrompt = _T("输入半径");
2026-09-28 15:28:50 +08:00
if (DocGetMeterUnitDraw())
{
2026-10-04 00:04:20 +08:00
strPrompt.Format(_T("\n输入半径<%.3f>"), m_dArcRad);
2026-09-28 15:28:50 +08:00
}
else
{
2026-10-04 00:04:20 +08:00
strPrompt.Format(_T("\n输入半径<%.0f>"), m_dArcRad);
2026-09-28 15:28:50 +08:00
}
m_pRoadJig->setDispPrompt(strPrompt);
AcEdJig::DragStatus ret;
INITGET_BEG(-1, m_szKeyListArcRad)
ret = m_pRoadJig->drag();
INITGET_END()
2026-10-04 00:04:20 +08:00
// 需要判断的返回类型:
// 1、选中了一个点,(组成了一个线段回路)
// 2、取消
// 3、关键字选中
// 3、其他,比如:右键,空格,回车等
2026-09-28 15:28:50 +08:00
if (ret == AcEdJig::kCancel)
{
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
/*else if (ret == AcEdJig::kNull)
{
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}*/
else if (ret == AcEdJig::kNormal || ret == AcEdJig::kNull || ret == AcEdJig::kOther)
{
m_pContext->PushPoint(PtFirst());
m_pContext->SetSequenceState(TLandScapeDragContext::eNextArcRoad);
m_pRoadJig->NextPoint();
m_pContext->AddArcRoad(m_pRoadJig->m_pArcRoad);
}
else if (ret == AcEdJig::kNoChange)
{
// do nothing;
}
else
2026-10-04 00:04:20 +08:00
{ // 其他的情况!
2026-09-28 15:28:50 +08:00
m_pContext->SetSequenceState(TLandScapeDragContext::eSequenceCancel);
}
return ret;
}
AcEdJig::DragStatus CArcRadLandScapeState::sampler()
{
ASSERT(m_pRoadJig != NULL);
CLandScapeStyle* pLandScape = GET_GLOBAL_VARIABLE(CLandScapeStyle);
double dTemp;
XPoint ptBase;
m_pRoadJig->setUserInputControls((AcEdJig::UserInputControls)
(AcEdJig::kAccept3dCoordinates | AcEdJig::kNullResponseAccepted
| AcEdJig::kNoNegativeResponseAccepted
| AcEdJig::kNoZeroResponseAccepted));
AcGePoint3d ptDump;
AcEdJig::DragStatus ret = m_pRoadJig->acquireDist(dTemp, POINT_2D_TO_3D(m_pRoadJig->m_ptNext));
if (ret == AcEdJig::kNormal)
{
if (fabs(dTemp-m_dArcRad)>_DIST_SNAP && dTemp > 0) {
m_dArcRad = dTemp;
pLandScape->m_dArcRad = m_dArcRad;
}
else
{
return AcEdJig::kNoChange;
}
}
2026-10-04 00:04:20 +08:00
return ret; // 需要处理,然后生成实体
2026-09-28 15:28:50 +08:00
}
Adesk::Boolean CArcRadLandScapeState::update()
{
ASSERT(m_pRoadJig != NULL);
XPoint ptBase, ptPrev;
double nChordLen=m_pRoadJig->m_ptFirst.distanceTo(m_pRoadJig->m_ptNext);
if(nChordLen<2.0*m_dArcRad+1.0E-6) {
double bulge=2.0*asin(nChordLen/2.0/m_dArcRad);
if(XLine((XPoint)m_pRoadJig->m_ptFirst, (XPoint)m_pRoadJig->m_ptNext).OnWhichSide(m_pRoadJig->m_ptCheck)==OFFSET_LEFT)
bulge = -bulge;
XArc* pxArc = new XArc((XPoint)m_pRoadJig->m_ptFirst, (XPoint)m_pRoadJig->m_ptNext, bulge);
m_pRoadJig->m_ptThird = pxArc->MidPoint();
}
else
{
return Adesk::kFalse;
}
return m_pRoadJig->ConArcRoad();
}
//////////////////////////////////////////////////////////////////////////
// TRoadDragContext
TLandScapeDragContext::TLandScapeDragContext(CLandScapeStyle* pLandStyle)
: m_pLandStyle(pLandStyle), m_bLineAfterFirstrIn(TRUE), m_eSequence(eFirstIn)
{
}
TLandScapeDragContext::~TLandScapeDragContext()
{
ClearStep();
}
void TLandScapeDragContext::AddArcRoad(TDbArcLandScapeEntity *pArcRoadEnt)
{
ASSERT(pArcRoadEnt != NULL);
CLandScapeStyle* pLandScape = GET_GLOBAL_VARIABLE(CLandScapeStyle);
PickSet ssAll(SS_FREE);
pLandScape->ssAll = ssAll;
pLandScape->ssAll.IncludeBegin();
CArcRoad *pArcRoad = pArcRoadEnt->CreateArcRoad(m_pLandStyle);
AcGeCircArc2d circle2d = AcGeCircArc2d(AsMMUnitPoint2d(pArcRoadEnt->GetFirstPt()), AsMMUnitPoint2d(pArcRoadEnt->GetThirdPt()), AsMMUnitPoint2d(pArcRoadEnt->GetEndPt()));
pLandScape->m_dArcRad = circle2d.radius();
m_datas.AddArcRoad(*pArcRoad);
delete pArcRoad;
pArcRoad = NULL;
}
void TLandScapeDragContext::AddLineRoad(TDbLineLandScapeEntity *pLineRoadEnt)
{
ASSERT(pLineRoadEnt != NULL);
CLandScapeStyle* pLandScape = GET_GLOBAL_VARIABLE(CLandScapeStyle);
PickSet ssAll(SS_FREE);
pLandScape->ssAll = ssAll;
pLandScape->ssAll.IncludeBegin();
CLineRoad *pLineRoad = pLineRoadEnt->CreateLineRoad(m_pLandStyle);
m_datas.AddLineRoad(*pLineRoad);
delete pLineRoad;
pLineRoad = NULL;
}
void TLandScapeDragContext::PushPoint(const AcGePoint2d &ptPush)
{
m_arPushPoint.append(ptPush);
}
AcGePoint2d TLandScapeDragContext::PopPoint()
{
if (PushPointNum() > 0)
{
2026-10-04 00:04:20 +08:00
PopSequence();// 调整状态
2026-09-28 15:28:50 +08:00
AcGePoint2d ptPop = m_arPushPoint[m_arPushPoint.length() - 1];
m_arPushPoint.removeLast();
return ptPop;
}
else
{
ASSERT(0);
return AcGePoint2d();
}
}
AcGePoint2d TLandScapeDragContext::RoolBack()
{
m_datas.RoolBack();
return PopPoint();
}
TLandScapeDragContext::ESequence TLandScapeDragContext::SequenceAfterFirstIn()
{
return m_bLineAfterFirstrIn ? eLineRoad : eArcRoad;
}
void TLandScapeDragContext::PopSequence()
{
ASSERT(PushPointNum() > 0);
if (m_eSequence == eNextLineRoad)
{
m_eSequence = eLineRoad;
}
else if (m_eSequence == eThirdLineRoad)
{
if (PushPointNum() > 2)
m_eSequence = eThirdLineRoad;
else
m_eSequence = eNextLineRoad;
}
else if (m_eSequence == eNextArcRoad)
{
if (PushPointNum() > 1)
m_eSequence = eNextArcRoad;
else
m_eSequence = eArcRoad;
}
else
{
ASSERT(0);
}
}
void TLandScapeDragContext ::ClearStep()
{
ClearAcaryAll(m_arPushPoint);
m_datas.ClearStep();
}