Files
envi-code/SourceCode/Code2026/tg_shs/shs_annotate/RoadElevStyle.cpp
T

807 lines
21 KiB
C++
Raw Normal View History

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