Files
envi-code/SourceCode/Code2026/tg_shs/shs_annotate/RoadElevStyle.cpp
T
2026-09-28 15:28:50 +08:00

808 lines
21 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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;
}