2026-10-04 00:04:20 +08:00
|
|
|
|
#include "stdafx.h"
|
2026-09-28 15:28:50 +08:00
|
|
|
|
#include "RoadElevStyle.h"
|
|
|
|
|
|
static int g_iSelPrecision = 0;
|
|
|
|
|
|
namespace
|
|
|
|
|
|
{
|
|
|
|
|
|
#if ADS <= 18
|
|
|
|
|
|
double _ttof(LPCTSTR psz)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!psz) return .0;
|
|
|
|
|
|
USES_CONVERSION;
|
|
|
|
|
|
return atof(W2A(psz));
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
double CRoadElevStyle::m_dRoadGrade = 0.0;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
int CRoadElevStyle::m_iRoadGradePrecision = 1;//坡度精度 add tyj 20160906
|
2026-09-28 15:28:50 +08:00
|
|
|
|
double CRoadElevStyle::m_dStartElevation = 0.0;
|
|
|
|
|
|
double CRoadElevStyle::m_dEndElevation = 0.0;
|
|
|
|
|
|
double CRoadElevStyle::m_dRoadLenth =0.0;
|
|
|
|
|
|
|
|
|
|
|
|
XPoint CRoadElevStyle::m_ptProjectStart (0,0,0);
|
|
|
|
|
|
XPoint CRoadElevStyle::m_ptProjectend (0, 0, 0);
|
|
|
|
|
|
XPoint CRoadElevStyle::m_ptElevStart (0, 0, 0);
|
|
|
|
|
|
XPoint CRoadElevStyle::m_ptElevEnd (0, 0, 0);
|
|
|
|
|
|
XPoint CRoadElevStyle::m_ptBaselineStart (0, 0, 0);
|
|
|
|
|
|
XPoint CRoadElevStyle::m_ptBaseLineEnd (0, 0, 0);
|
|
|
|
|
|
bool CRoadElevStyle::m_bsingleElev = false;
|
|
|
|
|
|
bool CRoadElevStyle::m_bSelectRoadLine = false;
|
|
|
|
|
|
CRoadElevStyle::CRoadElevStyle()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CRoadElevStyle::~CRoadElevStyle()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CRoadElevStyle::SelectStyle(TDbSymbElevation *pSymbElevEnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
PickSet ssElevation(SS_FREE);
|
|
|
|
|
|
TRBList rbFilter(acutBuildList(RTDXF0, _T("ATS_ELEVATION"), NULL));
|
|
|
|
|
|
int iRetCode;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
iRetCode = SelectEntities(_T("\n请选择道路基准标高<退出>:"), ssElevation, rbFilter);
|
|
|
|
|
|
if (iRetCode == RTNORM)//选择道路基准标高
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (!JudgeSelectRoadElevation(ssElevation))//判断选择的道路标高是否满足规定的个数
|
2026-09-28 15:28:50 +08:00
|
|
|
|
return kRetContinue;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
TDbSymbElevation *pNewElev = GetFirstElevEnty(ssElevation);//克隆第一个标高实体
|
|
|
|
|
|
g_iSelPrecision = pNewElev->IsPrec2()?0:1; // 当前精度
|
2026-09-28 15:28:50 +08:00
|
|
|
|
PickSet ssRoadBaseLine(SS_FREE);
|
|
|
|
|
|
XPoly2D roadBaseLine;
|
|
|
|
|
|
int nRet = SelectRoadBaseLine(ssRoadBaseLine, roadBaseLine);
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (1 == nRet)//选择了道路基准线
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
m_bSelectRoadLine = true;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (!JudgeElevationOnRoadCenter(roadBaseLine, ssElevation))//取得投影点
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ssRoadBaseLine.Redraw(4);//重绘刷新
|
2026-09-28 15:28:50 +08:00
|
|
|
|
return kRetEsc;
|
|
|
|
|
|
}
|
|
|
|
|
|
do
|
|
|
|
|
|
{
|
|
|
|
|
|
TRoadElevJig jig(roadBaseLine, pNewElev, FALSE, TRUE);
|
|
|
|
|
|
jig.SetKeyword(_T("M"));
|
2026-10-04 00:04:20 +08:00
|
|
|
|
jig.SetPrompt(_T("\n请点取标注位置或[修改标高(M)]<退出>: "));
|
2026-09-28 15:28:50 +08:00
|
|
|
|
int iRet = jig.doIt();
|
|
|
|
|
|
if (iRet == RTNORM)
|
|
|
|
|
|
{
|
|
|
|
|
|
TDbSymbElevation *pNewElev2 = new TDbSymbElevation();
|
|
|
|
|
|
ASSERT(pNewElev2);
|
|
|
|
|
|
pNewElev2 = (TDbSymbElevation *)pNewElev->clone();
|
|
|
|
|
|
AddToModelSpace(pNewElev2);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (iRet == RTKWORD)
|
|
|
|
|
|
{
|
|
|
|
|
|
TRBList rbFilter(acutBuildList(RTDXF0, _T("ATS_ELEVATION"), NULL));
|
|
|
|
|
|
PickSet ssElevation(SS_FREE);
|
|
|
|
|
|
int iRetCode;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (RTNORM != SelectEntities(_T("\n请选择待修改的标高标注<退出>:"), ssElevation, rbFilter))
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
delete pNewElev;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ssRoadBaseLine.Redraw(4);//重绘刷新
|
2026-09-28 15:28:50 +08:00
|
|
|
|
return kRetEsc;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
AutoMendElev(ssElevation, roadBaseLine, roadBaseLine.Length() - 1);
|
|
|
|
|
|
delete pNewElev;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ssRoadBaseLine.Redraw(4);//重绘刷新
|
2026-09-28 15:28:50 +08:00
|
|
|
|
return kRetEsc;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ssRoadBaseLine.Redraw(4);//重绘刷新
|
2026-09-28 15:28:50 +08:00
|
|
|
|
return kRetEsc;
|
|
|
|
|
|
}
|
|
|
|
|
|
} while (1);
|
|
|
|
|
|
}
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (0 == nRet)//没有选择道路基准线,直线计算
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
m_bSelectRoadLine = false;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//jig, XPolyLine = pt1 - pt2;沿着这个线进行标注
|
|
|
|
|
|
//生成
|
2026-09-28 15:28:50 +08:00
|
|
|
|
if (!GetDefaultLine(ssElevation, roadBaseLine))
|
|
|
|
|
|
{
|
|
|
|
|
|
ssRoadBaseLine.Redraw(4);
|
|
|
|
|
|
return kRetEsc;
|
|
|
|
|
|
}
|
|
|
|
|
|
do
|
|
|
|
|
|
{
|
|
|
|
|
|
TRoadElevJig jig(roadBaseLine, pNewElev, false, false);
|
|
|
|
|
|
jig.SetKeyword(_T("` M"));
|
2026-10-04 00:04:20 +08:00
|
|
|
|
jig.SetPrompt(_T("\n请点取标注位置或[修改标高(M)]<退出>: "));
|
2026-09-28 15:28:50 +08:00
|
|
|
|
int iRet = jig.doIt();
|
|
|
|
|
|
if (iRet == RTNORM)
|
|
|
|
|
|
{
|
|
|
|
|
|
TDbSymbElevation *pNewElev2 = new TDbSymbElevation();
|
|
|
|
|
|
ASSERT(pNewElev2);
|
|
|
|
|
|
pNewElev2 = (TDbSymbElevation *)pNewElev->clone();
|
|
|
|
|
|
AddToModelSpace(pNewElev2);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (iRet == RTKWORD)
|
|
|
|
|
|
{
|
|
|
|
|
|
TRBList rbFilter(acutBuildList(RTDXF0, _T("ATS_ELEVATION"), NULL));
|
|
|
|
|
|
PickSet ssElevation(SS_FREE);
|
|
|
|
|
|
int iRetCode;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (RTNORM != SelectEntities(_T("\n请选择待修改的标高标注<退出>:"), ssElevation, rbFilter))
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
delete pNewElev;
|
|
|
|
|
|
return kRetEsc;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
AutoMendElev(ssElevation, roadBaseLine, roadBaseLine.Length() - 1);
|
|
|
|
|
|
delete pNewElev;
|
|
|
|
|
|
return kRetEsc;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
delete pNewElev;
|
|
|
|
|
|
return kRetEsc;
|
|
|
|
|
|
}
|
|
|
|
|
|
} while (1);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (-1 == nRet)
|
|
|
|
|
|
return kRetEsc;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ssRoadBaseLine.Redraw(4);//重绘刷新
|
2026-09-28 15:28:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return kRetEsc;
|
|
|
|
|
|
}
|
|
|
|
|
|
return kRetContinue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TDbSymbElevation* CRoadElevStyle::GetFirstElevEnty(const PickSet &ssElevation)
|
|
|
|
|
|
{
|
|
|
|
|
|
Entity ent = ssElevation[0];
|
|
|
|
|
|
if (ent.Is(_T("ATS_ELEVATION")))
|
|
|
|
|
|
{
|
|
|
|
|
|
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbSymbElevation, pEnt);
|
|
|
|
|
|
if (pEnt)
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
m_ptElevStart = pEnt->GetLocation();//返回的是世界坐标的点
|
2026-09-28 15:28:50 +08:00
|
|
|
|
pEnt->GetElev1(m_dStartElevation);
|
|
|
|
|
|
CString strTemp = pEnt->GetText();
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (strTemp.Left(1) == _T("%"))//判断是否有正负号,如果有去掉
|
2026-09-28 15:28:50 +08:00
|
|
|
|
strTemp = strTemp.Right(strTemp.GetLength() - 3);
|
|
|
|
|
|
m_dStartElevation = _wtof(strTemp);
|
|
|
|
|
|
TDbSymbElevation *pNewElev = (TDbSymbElevation *)pEnt->clone();
|
|
|
|
|
|
ASSERT(pNewElev);
|
|
|
|
|
|
return pNewElev;
|
|
|
|
|
|
}
|
|
|
|
|
|
OPENOBJ_END();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void CRoadElevStyle::AutoMendElev(PickSet& ssElevation, XPoly2D &RoadBaseLine, int iNum)
|
|
|
|
|
|
{
|
|
|
|
|
|
XPoint ptStart, ptEnd,ptShort;
|
|
|
|
|
|
int len = ssElevation.Length();
|
|
|
|
|
|
for (long i = 0; i < len; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
Entity ent = ssElevation[i];
|
|
|
|
|
|
if (ent.Is(_T("ATS_ELEVATION")))
|
|
|
|
|
|
{
|
|
|
|
|
|
OPENOBJ_BEGIN(ent, AcDb::kForWrite, TDbSymbElevation, pEnt);
|
|
|
|
|
|
if (pEnt)
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
double dMinDis = 1.7976931348623158e+308;;//double类型数据的最大值
|
2026-09-28 15:28:50 +08:00
|
|
|
|
int iN(0);
|
|
|
|
|
|
for (int j = 0; j < iNum; j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
// TGGeCurveSegment cvSegent;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
// RoadBaseLine.Nth(j, cvSegent);//取出索引为j的曲段,第j段
|
|
|
|
|
|
// TADSGePoint3d ptProject;//投影点
|
2026-09-28 15:28:50 +08:00
|
|
|
|
// XPoint pt = pEnt->GetLocation();
|
2026-10-04 00:04:20 +08:00
|
|
|
|
// cvSegent.ProjectToMe(pt, ptProject);//点与哪个曲段近
|
|
|
|
|
|
// double len = (AcGePoint3d(ptProject)).distanceTo(pt);//找出原始点与投影点的距离最短的投影点,才为正确的投影点(存在投影到延长线的可能)
|
2026-09-28 15:28:50 +08:00
|
|
|
|
// if (j == 0)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// dMin = len;
|
|
|
|
|
|
// ptShort = ptProject;
|
|
|
|
|
|
// }
|
2026-10-04 00:04:20 +08:00
|
|
|
|
// if (!dMin)//点就在线上
|
2026-09-28 15:28:50 +08:00
|
|
|
|
// {
|
|
|
|
|
|
// j = iNum/* - 1*/;
|
|
|
|
|
|
// ptShort = pt;
|
|
|
|
|
|
// }
|
|
|
|
|
|
// if (len < dMin)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// dMin = len;
|
|
|
|
|
|
// iN = j;
|
|
|
|
|
|
// ptShort = ptProject;
|
|
|
|
|
|
// }
|
|
|
|
|
|
TGGeDirectionCurve curve;
|
|
|
|
|
|
XPoint ptProjectTemp;
|
|
|
|
|
|
XPoint pt = pEnt->GetLocation();
|
|
|
|
|
|
RoadBaseLine.Nth(j, curve);
|
2026-10-04 00:04:20 +08:00
|
|
|
|
curve.ProjectToMe(pt, ptProjectTemp);//第1个参数为原始点,第2个参数为计算好的点
|
|
|
|
|
|
if (!RoadBaseLine.HitTestOnCurve(ptProjectTemp))//能否投影到曲段上,延长线上
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
double dMinDisTemp = abs(ptProjectTemp.Distance(pt));
|
|
|
|
|
|
if (!j)dMinDis = dMinDisTemp;
|
|
|
|
|
|
if (dMinDisTemp <= dMinDis)
|
|
|
|
|
|
{
|
|
|
|
|
|
ptShort = ptProjectTemp;
|
|
|
|
|
|
dMinDis = dMinDisTemp;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
pEnt->SetText(CalcElevData(RoadBaseLine, ptShort));
|
|
|
|
|
|
|
|
|
|
|
|
pEnt->AddToMSpace(Adesk::kTrue);
|
|
|
|
|
|
}
|
|
|
|
|
|
OPENOBJ_END();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CRoadElevStyle::InputBaseLineGrade()
|
|
|
|
|
|
{
|
|
|
|
|
|
CString str(_T("")), strTmp(_T("")), strPrompt(_T(""));
|
|
|
|
|
|
do
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//add tyj 20160906:保证用户输入什么值,下次默认值就为什么值,不会自动取近似值
|
2026-09-28 15:28:50 +08:00
|
|
|
|
switch (m_iRoadGradePrecision)
|
|
|
|
|
|
{
|
|
|
|
|
|
case 0:
|
2026-10-04 00:04:20 +08:00
|
|
|
|
strPrompt.Format(_T("\n请输入道路坡度(正值为上坡)(%%)<%.0f>:"), m_dRoadGrade);
|
2026-09-28 15:28:50 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 1:
|
2026-10-04 00:04:20 +08:00
|
|
|
|
strPrompt.Format(_T("\n请输入道路坡度(正值为上坡)(%%)<%.1f>:"), m_dRoadGrade);
|
2026-09-28 15:28:50 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 2:
|
2026-10-04 00:04:20 +08:00
|
|
|
|
strPrompt.Format(_T("\n请输入道路坡度(正值为上坡)(%%)<%.2f>:"), m_dRoadGrade);
|
2026-09-28 15:28:50 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 3:
|
2026-10-04 00:04:20 +08:00
|
|
|
|
strPrompt.Format(_T("\n请输入道路坡度(正值为上坡)(%%)<%.3f>:"), m_dRoadGrade);
|
2026-09-28 15:28:50 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 4:
|
2026-10-04 00:04:20 +08:00
|
|
|
|
strPrompt.Format(_T("\n请输入道路坡度(正值为上坡)(%%)<%.4f>:"), m_dRoadGrade);
|
2026-09-28 15:28:50 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case 5:
|
2026-10-04 00:04:20 +08:00
|
|
|
|
strPrompt.Format(_T("\n请输入道路坡度(正值为上坡)(%%)<%.5f>:"), m_dRoadGrade);
|
2026-09-28 15:28:50 +08:00
|
|
|
|
break;
|
|
|
|
|
|
default:
|
2026-10-04 00:04:20 +08:00
|
|
|
|
strPrompt.Format(_T("\n请输入道路坡度(正值为上坡)(%%)<%.6f>:"), m_dRoadGrade);
|
2026-09-28 15:28:50 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int rc = acedGetString(FALSE, strPrompt, str.GetBufferSetLength(1000));
|
|
|
|
|
|
if (rc == RTNORM)
|
|
|
|
|
|
{
|
|
|
|
|
|
str.ReleaseBufferSetLength(1000);
|
|
|
|
|
|
if (_tcscmp(str, _T("")) == 0)
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//修改 tyj 201609013:解决第二次输入坡度时,使用默认值精度不对
|
2026-09-28 15:28:50 +08:00
|
|
|
|
switch (m_iRoadGradePrecision)
|
|
|
|
|
|
{
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
strTmp.Format(_T("%.0f"), m_dRoadGrade);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
strTmp.Format(_T("%.1f"), m_dRoadGrade);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 2:
|
|
|
|
|
|
strTmp.Format(_T("%.2f"), m_dRoadGrade);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
|
|
|
strTmp.Format(_T("%.3f"), m_dRoadGrade);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 4:
|
|
|
|
|
|
strTmp.Format(_T("%.4f"), m_dRoadGrade);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 5:
|
|
|
|
|
|
strTmp.Format(_T("%.5f"), m_dRoadGrade);
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
strTmp.Format(_T("%.6f"), m_dRoadGrade);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
strTmp = str.SpanIncluding(_T("-0123456789."));
|
|
|
|
|
|
if (strTmp.IsEmpty())
|
2026-10-04 00:04:20 +08:00
|
|
|
|
acutPrintf(_T("\n输入无效,请重新输入数值!"));
|
2026-09-28 15:28:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
} while (strTmp.IsEmpty());
|
2026-10-04 00:04:20 +08:00
|
|
|
|
int iDecimalPlace = strTmp.Find('.');//小数点存在的位置
|
2026-09-28 15:28:50 +08:00
|
|
|
|
if(iDecimalPlace != -1)
|
|
|
|
|
|
m_iRoadGradePrecision = strTmp.GetLength() - iDecimalPlace - 1;
|
|
|
|
|
|
else
|
|
|
|
|
|
m_iRoadGradePrecision = 0;
|
|
|
|
|
|
m_dRoadGrade = _ttof(strTmp);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CRoadElevStyle::JudgeSelectRoadElevation(PickSet &ss)
|
|
|
|
|
|
{
|
|
|
|
|
|
int len = ss.Length();
|
|
|
|
|
|
if (len < 1)
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ads_prompt(_T("\n未选择,请选择!"));
|
2026-09-28 15:28:50 +08:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (len == 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
TRBList rbFilter(acutBuildList(RTDXF0, _T("ATS_ELEVATION"), NULL));
|
|
|
|
|
|
TEntitySet ent;
|
|
|
|
|
|
int iRetCode;
|
|
|
|
|
|
XPoint ptPick;
|
|
|
|
|
|
INITGET_BEG(0, _T("W"));
|
2026-10-04 00:04:20 +08:00
|
|
|
|
iRetCode = SelectEntity(_T("\n请选择第二个标高或[输入坡度(W)]:"), ent, ptPick, rbFilter);//修正中文输入法输入W,出错
|
2026-09-28 15:28:50 +08:00
|
|
|
|
INITGET_END();
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//nRet = SelectEntity(_T("\n选择参考标高或 [参考当前用户坐标系(T)]<退出>"), Ent, ptPick, mask);
|
2026-09-28 15:28:50 +08:00
|
|
|
|
if (RTNORM == iRetCode)
|
|
|
|
|
|
{
|
|
|
|
|
|
AcDbObjectId id = NULL;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
acdbGetObjectId(id, ent);//取第2个标高id存放到选择集中
|
2026-09-28 15:28:50 +08:00
|
|
|
|
ss += id;
|
|
|
|
|
|
m_bsingleElev = false;
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (RTKWORD == iRetCode)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_bsingleElev = true;
|
|
|
|
|
|
//acutPrintf(_T("W"));
|
|
|
|
|
|
InputBaseLineGrade();
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (len == 2)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_bsingleElev = false;
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (len > 2)
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ads_prompt(_T("选择超过两个标高,请重新选择!"));
|
2026-09-28 15:28:50 +08:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CRoadElevStyle::SelectRoadBaseLine(PickSet &ssRoadBaseLine, XPoly2D &pRoadBaseLine)
|
|
|
|
|
|
{
|
|
|
|
|
|
PickSet ssSelect;
|
|
|
|
|
|
TRBList rbFilter(acutBuildList(RTDXF0, _T("POLYLINE,LWPOLYLINE,LINE,ARC"), NULL));
|
|
|
|
|
|
int nReturnValue;
|
|
|
|
|
|
if (m_bsingleElev)
|
2026-10-04 00:04:20 +08:00
|
|
|
|
nReturnValue = SelectEntities(_T("\n请选择道路基准线: "), ssSelect, rbFilter);
|
2026-09-28 15:28:50 +08:00
|
|
|
|
else
|
2026-10-04 00:04:20 +08:00
|
|
|
|
nReturnValue = SelectEntities(_T("\n请选择道路基准线<两标高点间按直线计算>: "), ssSelect, rbFilter);
|
2026-09-28 15:28:50 +08:00
|
|
|
|
if (RTNORM == nReturnValue)
|
|
|
|
|
|
{
|
|
|
|
|
|
ssRoadBaseLine = ssSelect;
|
|
|
|
|
|
// ssRoadBaseLine += ssSelect;
|
|
|
|
|
|
// ssRoadBaseLine.Redraw(3);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
/* }*/
|
|
|
|
|
|
|
|
|
|
|
|
if (ssRoadBaseLine.Length() == 0)
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (!JudgeRoadBaseLineIsContinue(ssRoadBaseLine, pRoadBaseLine))//判断选择道路基准线是否连续
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ads_prompt(_T("\n所选道路基准线不连续,请检查!"));
|
2026-09-28 15:28:50 +08:00
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return kRetEsc;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//计算生成的标高数据,m_ptProjectStart为点A, m_ptProjectend为点B, ptSelect为点C,以A点为基点进行计算
|
2026-09-28 15:28:50 +08:00
|
|
|
|
CString CRoadElevStyle::CalcElevData(XPoly2D &RoadBaseLine, XPoint ptSelect)
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
// 获取AC距离
|
2026-09-28 15:28:50 +08:00
|
|
|
|
double dLen(0.0);
|
|
|
|
|
|
if (m_bSelectRoadLine)
|
|
|
|
|
|
dLen = abs((RoadBaseLine.PathDistance2d(m_ptProjectStart) - RoadBaseLine.PathDistance2d(ptSelect)));
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
dLen = (m_ptProjectStart.Distance(ptSelect));
|
|
|
|
|
|
AcGeVector3d vecAC = ptSelect - m_ptProjectStart;
|
|
|
|
|
|
AcGeVector3d vecAB = m_ptProjectend - m_ptProjectStart;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (abs(vecAC.angleTo(vecAB)) > 1E-6)// 判断点C,在基点A左侧还是右侧,如果左侧,则AC距离为负
|
2026-09-28 15:28:50 +08:00
|
|
|
|
dLen = 0 - dLen;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
// 根据不同情况获取标高点
|
2026-09-28 15:28:50 +08:00
|
|
|
|
double dNewElev(0.0);
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
// 点取一个标高点
|
2026-09-28 15:28:50 +08:00
|
|
|
|
if (m_bsingleElev)
|
|
|
|
|
|
{
|
|
|
|
|
|
double dGrade = abs(m_dRoadGrade);
|
|
|
|
|
|
double dTmp = (dGrade / 100 + (dGrade - (dGrade / 100) * 100))*dLen;
|
|
|
|
|
|
if (m_dRoadGrade > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!DocGetMeterUnitDraw())
|
|
|
|
|
|
dNewElev = (dTmp / 1000 + (dTmp - (dTmp / 1000) * 1000)) + m_dStartElevation;
|
|
|
|
|
|
else
|
|
|
|
|
|
dNewElev = (dTmp + m_dStartElevation);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!DocGetMeterUnitDraw())
|
|
|
|
|
|
dNewElev = m_dStartElevation - (dTmp / 1000 + (dTmp - (dTmp / 1000) * 1000));
|
|
|
|
|
|
else
|
|
|
|
|
|
dNewElev = m_dStartElevation - dTmp;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-10-04 00:04:20 +08:00
|
|
|
|
else //点取两个标高点
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
double dElev = abs(m_dStartElevation - m_dEndElevation);
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//选择道路中心线
|
2026-09-28 15:28:50 +08:00
|
|
|
|
if (m_bSelectRoadLine)
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
double dTmp = RoadBaseLine.PathDistance2d(m_ptProjectStart) - RoadBaseLine.PathDistance2d(m_ptProjectend);//+-方向
|
2026-09-28 15:28:50 +08:00
|
|
|
|
if (m_dStartElevation < m_dEndElevation)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (dTmp > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((RoadBaseLine.PathDistance2d(ptSelect) - RoadBaseLine.PathDistance2d(m_ptProjectStart)) < 0)
|
|
|
|
|
|
dNewElev = (dElev / m_dRoadLenth + (dElev - (dElev / m_dRoadLenth)*m_dRoadLenth)) * dLen + m_dStartElevation;
|
|
|
|
|
|
else
|
|
|
|
|
|
dNewElev = m_dStartElevation - (dElev / m_dRoadLenth + (dElev - (dElev / m_dRoadLenth)*m_dRoadLenth)) * dLen;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((RoadBaseLine.PathDistance2d(ptSelect) - RoadBaseLine.PathDistance2d(m_ptProjectStart)) > 0)
|
|
|
|
|
|
dNewElev = (dElev / m_dRoadLenth + (dElev - (dElev / m_dRoadLenth)*m_dRoadLenth)) * dLen + m_dStartElevation;
|
|
|
|
|
|
else
|
|
|
|
|
|
dNewElev = m_dStartElevation - (dElev / m_dRoadLenth + (dElev - (dElev / m_dRoadLenth)*m_dRoadLenth)) * dLen;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (m_dStartElevation > m_dEndElevation)//
|
|
|
|
|
|
{
|
|
|
|
|
|
if (dTmp > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((RoadBaseLine.PathDistance2d(ptSelect) - RoadBaseLine.PathDistance2d(m_ptProjectStart)) >0)
|
|
|
|
|
|
dNewElev = (dElev / m_dRoadLenth + (dElev - (dElev / m_dRoadLenth)*m_dRoadLenth)) * dLen + m_dStartElevation;
|
|
|
|
|
|
else
|
|
|
|
|
|
dNewElev = m_dStartElevation - (dElev / m_dRoadLenth + (dElev - (dElev / m_dRoadLenth)*m_dRoadLenth)) * dLen;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if ((RoadBaseLine.PathDistance2d(ptSelect) - RoadBaseLine.PathDistance2d(m_ptProjectStart)) < 0)
|
|
|
|
|
|
dNewElev = (dElev / m_dRoadLenth + (dElev - (dElev / m_dRoadLenth)*m_dRoadLenth)) * dLen + m_dStartElevation;
|
|
|
|
|
|
else
|
|
|
|
|
|
dNewElev = m_dStartElevation - (dElev / m_dRoadLenth + (dElev - (dElev / m_dRoadLenth)*m_dRoadLenth)) * dLen;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
dNewElev = m_dStartElevation;
|
|
|
|
|
|
}
|
2026-10-04 00:04:20 +08:00
|
|
|
|
else //未选择道路中心线,按标高点连线自动生成
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
m_dRoadLenth = m_ptProjectStart.Distance(m_ptProjectend); //L
|
|
|
|
|
|
dNewElev = dLen / m_dRoadLenth * (m_dEndElevation - m_dStartElevation) + m_dStartElevation;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//基准标高
|
2026-09-28 15:28:50 +08:00
|
|
|
|
CString strRet(_T(""));
|
|
|
|
|
|
if (g_iSelPrecision)
|
|
|
|
|
|
{
|
|
|
|
|
|
strRet.Format(_T("%.3f"), dNewElev);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
strRet.Format(_T("%.2f"), dNewElev);
|
|
|
|
|
|
|
|
|
|
|
|
return strRet;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool CRoadElevStyle::JudgeRoadBaseLineIsContinue(const PickSet &ssRoadBaseLine, XPoly2D &roadBaseLine2d)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
XPoly2D NewroadBaseLine2d;
|
|
|
|
|
|
XPoly2D poly2d;
|
|
|
|
|
|
int nRoadLen = ssRoadBaseLine.Length();
|
|
|
|
|
|
int iNum = nRoadLen;
|
|
|
|
|
|
AcDbObjectId entid;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (nRoadLen == 1)//只有选择一个,正确不需要在判断
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
Entity ent = ssRoadBaseLine[0];//取选择集第一个实体
|
2026-09-28 15:28:50 +08:00
|
|
|
|
/*XCurveSegment cv(ent);*/
|
|
|
|
|
|
/*cv.AsPoly2D(roadBaseLine2d);*/
|
2026-10-04 00:04:20 +08:00
|
|
|
|
roadBaseLine2d = XPoly2D(ent);//转为2D
|
2026-09-28 15:28:50 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
int nFirstPoly(0), nSecondPoly(0);
|
|
|
|
|
|
int nInterNum = 0;
|
|
|
|
|
|
|
|
|
|
|
|
//add begin by zjt 20160929
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//////////////////////////////////////////////////////////////////////////多个选择判断
|
2026-09-28 15:28:50 +08:00
|
|
|
|
TGGePoly2D pPoly2D;
|
|
|
|
|
|
Entity ent = ssRoadBaseLine[0];
|
2026-10-04 00:04:20 +08:00
|
|
|
|
XCurveSegment cvFirst(ent);//曲线
|
|
|
|
|
|
cvFirst.AsPoly2D(pPoly2D);//转换为TGGePoly2D
|
2026-09-28 15:28:50 +08:00
|
|
|
|
AcGePoint3d ptStart, ptEnd;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ptStart = pPoly2D.GetPointListAt(0)->AsAcGePoint3d();//获取曲线中首点的坐标
|
|
|
|
|
|
ptEnd = pPoly2D.GetPointListAt(pPoly2D.Length() - 1)->AsAcGePoint3d();//获取曲线最后一点的坐标
|
2026-09-28 15:28:50 +08:00
|
|
|
|
AcGePoint3d ptHead, ptTail;
|
|
|
|
|
|
|
|
|
|
|
|
for (int nEndpt = 0; nEndpt < nRoadLen; ++nEndpt)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int n = 0; n < nRoadLen; ++n)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (n == nEndpt)
|
|
|
|
|
|
continue;
|
|
|
|
|
|
TGGePoly2D poly2dTemp(ssRoadBaseLine[n]);
|
|
|
|
|
|
ptHead = poly2dTemp.GetPointListAt(0)->AsAcGePoint3d();
|
|
|
|
|
|
ptTail = poly2dTemp.GetPointListAt(poly2dTemp.Length() - 1)->AsAcGePoint3d();
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (ptStart.isEqualTo(ptHead) || ptStart.isEqualTo(ptTail)) //判断第一根线的起点是否与其他实体有重合
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
roadBaseLine2d.InsertNodeAt(nInterNum, ptStart, cvFirst.GetBulge());
|
|
|
|
|
|
++nInterNum;
|
|
|
|
|
|
roadBaseLine2d.InsertNodeAt(nInterNum, ptEnd, 0);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2026-10-04 00:04:20 +08:00
|
|
|
|
else if (ptEnd.isEqualTo(ptHead) || ptEnd.isEqualTo(ptTail)) //判断第一根线的终点是否与其他实体有重合
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
roadBaseLine2d.InsertNodeAt(nInterNum, ptStart, cvFirst.GetBulge());
|
|
|
|
|
|
++nInterNum;
|
|
|
|
|
|
roadBaseLine2d.InsertNodeAt(nInterNum, ptEnd, 0);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (nInterNum == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (nInterNum == 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
for (int num = 0; num < nRoadLen - 1; ++num)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 1; i < nRoadLen; ++i)
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (i == nFirstPoly || i == nSecondPoly) //判断如果已经添加过该实体的断点则跳过该实体
|
2026-09-28 15:28:50 +08:00
|
|
|
|
continue;
|
|
|
|
|
|
TGGePoly2D poly2dTemp;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
Entity ent = ssRoadBaseLine[i]; //遍历实体
|
2026-09-28 15:28:50 +08:00
|
|
|
|
XCurveSegment cv(ent);
|
2026-10-04 00:04:20 +08:00
|
|
|
|
cv.AsPoly2D(poly2dTemp);//转为2D
|
|
|
|
|
|
ptHead = poly2dTemp.GetPointListAt(0)->AsAcGePoint3d(); //当前实体的起点
|
|
|
|
|
|
ptTail = poly2dTemp.GetPointListAt(poly2dTemp.Length() - 1)->AsAcGePoint3d(); //当前实体的终点
|
2026-09-28 15:28:50 +08:00
|
|
|
|
if (ptStart.isEqualTo(ptHead))
|
|
|
|
|
|
{
|
|
|
|
|
|
++nInterNum;
|
|
|
|
|
|
ptStart = ptTail;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
roadBaseLine2d.InsertNodeAt(0, ptStart, -cv.GetBulge()); //添加点
|
|
|
|
|
|
nFirstPoly = i; //记录已经添加过的点所属实体的位置
|
2026-09-28 15:28:50 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (ptStart.isEqualTo(ptTail))
|
|
|
|
|
|
{
|
|
|
|
|
|
++nInterNum;
|
|
|
|
|
|
ptStart = ptHead;
|
|
|
|
|
|
roadBaseLine2d.InsertNodeAt(0, ptStart, cv.GetBulge());
|
|
|
|
|
|
nFirstPoly = i;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (ptEnd.isEqualTo(ptHead))
|
|
|
|
|
|
{
|
|
|
|
|
|
roadBaseLine2d.SetBulge(nInterNum, cv.GetBulge());
|
|
|
|
|
|
++nInterNum;
|
|
|
|
|
|
ptEnd = ptTail;
|
|
|
|
|
|
roadBaseLine2d.InsertNodeAt(nInterNum, ptEnd, 0);
|
|
|
|
|
|
nSecondPoly = i;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (ptEnd.isEqualTo(ptTail))
|
|
|
|
|
|
{
|
|
|
|
|
|
roadBaseLine2d.SetBulge(nInterNum, -cv.GetBulge());
|
|
|
|
|
|
++nInterNum;
|
|
|
|
|
|
ptEnd = ptHead;
|
|
|
|
|
|
roadBaseLine2d.InsertNodeAt(nInterNum, ptEnd, 0);
|
|
|
|
|
|
nSecondPoly = i;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (nInterNum == nRoadLen)
|
|
|
|
|
|
{
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//add end
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//判断标高点是否在墙上
|
2026-09-28 15:28:50 +08:00
|
|
|
|
bool CRoadElevStyle::JudgeElevationOnRoadCenter(const XPoly2D &roadBaseLine2d, const PickSet &ssElevation)
|
|
|
|
|
|
{
|
|
|
|
|
|
XPoint ptStart, ptEnd;
|
|
|
|
|
|
int len = ssElevation.Length();
|
|
|
|
|
|
for (long i = 0; i < len; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
Entity ent = ssElevation[i];
|
|
|
|
|
|
if (ent.Is(_T("ATS_ELEVATION")))
|
|
|
|
|
|
{
|
|
|
|
|
|
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbSymbElevation, pEnt);
|
|
|
|
|
|
if (pEnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (i == 0)
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ptStart = pEnt->GetLocation();//返回的是世界坐标的点
|
2026-09-28 15:28:50 +08:00
|
|
|
|
pEnt->GetElev1(m_dStartElevation);
|
|
|
|
|
|
CString strTemp = pEnt->GetText();
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (strTemp.Left(1) == _T("%"))//判断是否有正负号,如果有去掉
|
2026-09-28 15:28:50 +08:00
|
|
|
|
strTemp = strTemp.Right(strTemp.GetLength() - 3);
|
|
|
|
|
|
m_dStartElevation = _wtof(strTemp);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
ptEnd = pEnt->GetLocation();
|
|
|
|
|
|
pEnt->GetElev1(m_dEndElevation);
|
|
|
|
|
|
CString strTemp = pEnt->GetText();
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (strTemp.Left(1) == _T("%"))//判断是否有正负号,如果有去掉
|
2026-09-28 15:28:50 +08:00
|
|
|
|
strTemp = strTemp.Right(strTemp.GetLength() - 3);
|
|
|
|
|
|
m_dEndElevation = _wtof(strTemp);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
OPENOBJ_END();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//获取标高投影点
|
2026-09-28 15:28:50 +08:00
|
|
|
|
len = roadBaseLine2d.Length() - 1;
|
|
|
|
|
|
bool bStartOnLine = false, bEndOnLine = false;
|
|
|
|
|
|
double dMinDis = 1.7976931348623158e+308;;
|
|
|
|
|
|
TADSGePoint3d ptHead, ptTail;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
BOOL bStart(false), bEnd(false);//在路线连续的情况下判断是否将标高的两端选中
|
2026-09-28 15:28:50 +08:00
|
|
|
|
for (int i = 0; i < len; ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
TGGeDirectionCurve curve;
|
|
|
|
|
|
XPoint ptProjectTemp;
|
|
|
|
|
|
roadBaseLine2d.Nth(i, curve);
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ptHead = curve.GetStartPoint();//判断是否将起点标高的所在位置加入
|
2026-09-28 15:28:50 +08:00
|
|
|
|
if (ptHead == ptStart)
|
|
|
|
|
|
bStart = true;
|
|
|
|
|
|
curve.ProjectToMe(ptStart, ptProjectTemp);
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (!roadBaseLine2d.HitTestOnCurve(ptProjectTemp))//延长线
|
2026-09-28 15:28:50 +08:00
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
double dMinDisTemp = abs(ptProjectTemp.Distance(ptStart));
|
|
|
|
|
|
if (dMinDisTemp < dMinDis)
|
|
|
|
|
|
{
|
|
|
|
|
|
dMinDis = dMinDisTemp;
|
|
|
|
|
|
m_ptProjectStart = ptProjectTemp;
|
|
|
|
|
|
bStartOnLine = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
dMinDis = 1.7976931348623158e+308;;
|
|
|
|
|
|
for (int i = 0; i < len; ++i)
|
|
|
|
|
|
{
|
|
|
|
|
|
TGGeDirectionCurve curve;
|
|
|
|
|
|
XPoint ptProjectTemp;
|
|
|
|
|
|
roadBaseLine2d.Nth(i, curve);
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ptTail = curve.GetEndPoint();//判断是否将终点标高的所在位置加入
|
2026-09-28 15:28:50 +08:00
|
|
|
|
if (ptTail == ptEnd)
|
|
|
|
|
|
bEnd = true;
|
|
|
|
|
|
curve.ProjectToMe(ptEnd, ptProjectTemp);
|
|
|
|
|
|
if (!roadBaseLine2d.HitTestOnCurve(ptProjectTemp))
|
|
|
|
|
|
{
|
|
|
|
|
|
continue;
|
|
|
|
|
|
}
|
|
|
|
|
|
double dMinDisTemp = abs(ptProjectTemp.Distance(ptEnd));
|
|
|
|
|
|
if (dMinDisTemp < dMinDis)
|
|
|
|
|
|
{
|
|
|
|
|
|
dMinDis = dMinDisTemp;
|
|
|
|
|
|
m_ptProjectend = ptProjectTemp;
|
|
|
|
|
|
bEndOnLine = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (m_bsingleElev)
|
|
|
|
|
|
bEndOnLine = true;
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//投影点间的道路长度
|
2026-09-28 15:28:50 +08:00
|
|
|
|
m_dRoadLenth = abs(roadBaseLine2d.PathDistance2d(m_ptProjectStart) - roadBaseLine2d.PathDistance2d(m_ptProjectend));
|
|
|
|
|
|
if (!bStartOnLine)
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
acutPrintf(_T("\n该标高位置超出标注范围!"));
|
2026-09-28 15:28:50 +08:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!bEndOnLine)
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
acutPrintf(_T("\n该标高位置超出标注范围!"));
|
2026-09-28 15:28:50 +08:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
if ((!bStart) && (!bEnd))
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
acutPrintf(_T("\n该标高位置超出标注范围!"));
|
2026-09-28 15:28:50 +08:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-10-04 00:04:20 +08:00
|
|
|
|
//获取默认的直线
|
2026-09-28 15:28:50 +08:00
|
|
|
|
bool CRoadElevStyle::GetDefaultLine(const PickSet ssElevation, XPoly2D &polyDefalutLine)
|
|
|
|
|
|
{
|
|
|
|
|
|
XPoint ptStart, ptEnd;
|
|
|
|
|
|
int len = ssElevation.Length();
|
|
|
|
|
|
if (len != 2)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
|
|
for (long i = 0; i < len; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
Entity ent = ssElevation[i];
|
|
|
|
|
|
if (ent.Is(_T("ATS_ELEVATION")))
|
|
|
|
|
|
{
|
|
|
|
|
|
OPENOBJ_BEGIN(ent, AcDb::kForRead, TDbSymbElevation, pEnt);
|
|
|
|
|
|
if (pEnt)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (i == 0)
|
|
|
|
|
|
{
|
2026-10-04 00:04:20 +08:00
|
|
|
|
ptStart = pEnt->GetLocation();//返回的是世界坐标的点
|
2026-09-28 15:28:50 +08:00
|
|
|
|
pEnt->GetElev1(m_dStartElevation);
|
|
|
|
|
|
CString strTemp = pEnt->GetText();
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (strTemp.Left(1) == _T("%"))//判断是否有正负号,如果有去掉
|
2026-09-28 15:28:50 +08:00
|
|
|
|
strTemp = strTemp.Right(strTemp.GetLength() - 3);
|
|
|
|
|
|
m_dStartElevation = _wtof(strTemp);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
ptEnd = pEnt->GetLocation();
|
|
|
|
|
|
pEnt->GetElev1(m_dEndElevation);
|
|
|
|
|
|
CString strTemp = pEnt->GetText();
|
2026-10-04 00:04:20 +08:00
|
|
|
|
if (strTemp.Left(1) == _T("%"))//判断是否有正负号,如果有去掉
|
2026-09-28 15:28:50 +08:00
|
|
|
|
strTemp = strTemp.Right(strTemp.GetLength() - 3);
|
|
|
|
|
|
m_dEndElevation = _wtof(strTemp);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
OPENOBJ_END();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
polyDefalutLine.AppendPointListAt(new TADSGePoint3d(ptStart));
|
|
|
|
|
|
polyDefalutLine.AppendBugle(0.0);
|
|
|
|
|
|
polyDefalutLine.AppendPointListAt(new TADSGePoint3d(ptEnd));
|
|
|
|
|
|
polyDefalutLine.AppendBugle(0.0);
|
|
|
|
|
|
polyDefalutLine.SetFlag(0);
|
|
|
|
|
|
m_ptProjectStart = ptStart;
|
|
|
|
|
|
m_ptProjectend = ptEnd;
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|