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

703 lines
18 KiB
C++
Raw Normal View History

2026-09-28 15:28:50 +08:00
#include "stdafx.h"
#include "RoadGradeStyle.h"
#include "TchGlobalFunc.h"
#include "TRoadGradeArrowJig.h"
#include "TchAnnotateGlobalFunc.h"
#include "RoadGradeDlg.h"
#include "acappvar.h"
void GetArrowPolyLineByParam(AcGePoint3d &ptCenter, AcGeVector2d &vecDirction, double dArrowLenth, XPoly2D &poly2d)
{
AcGePoint3d ptGeStart, ptGeEnd;
ptGeStart = (vecDirction * dArrowLenth * 0.5 / vecDirction.length()) + ptCenter;
ptGeEnd = (-vecDirction * dArrowLenth * 0.5 / vecDirction.length()) + ptCenter;
poly2d.AppendNode(ptGeStart);
poly2d.AppendNode(ptGeEnd);
}
double CRoadGradeStyle::m_dAngle = 0;
double CRoadGradeStyle::m_dRoadGrade = 0.0;
double CRoadGradeStyle::m_dRoadLenth = 10.00;
CRoadGradeStyle::CRoadGradeStyle(void)
{
}
CRoadGradeStyle::~CRoadGradeStyle(void)
{
}
//判断选择的道路标高是否满足规定的个数
bool CRoadGradeStyle::JudgeSelectRoadElevation(PickSet &ss)
{
int len = ss.Length();
if (len < 1)
{
ads_prompt(_T("\n未选择,请选择!"));
return false;
}
else if (len == 1)
{
ads_prompt(_T("\n请选取第二个道路标高!"));
TRBList rbFilter(acutBuildList(RTDXF0, _T("ATS_ELEVATION"), NULL));
TEntitySet ent;
if (RTNORM != SelectEntity(_T("\n请选取第二个道路标高!"),ent, rbFilter))
return false;
else
{
AcDbObjectId id = NULL;
acdbGetObjectId(id, ent);
ss += id;
return true;
}
}
else if (len == 2)
{
return true;
}
else if (len > 2 )
{
ads_prompt(_T("选择超过两个标高,请重新选择!"));
return false;
}
return false;
}
//判断选择道路中心线是否连续
//返回true,连续,返回false,不连续
bool CRoadGradeStyle::JudgeRoadCentersIsContinue(const PickSet &ssRoadCenter, XPoly2D &roadCenterLine2d)//判断选择道路中心线是否连续
{
int nRoadLen = ssRoadCenter.Length();
if (nRoadLen == 1)
{
Entity ent = ssRoadCenter[0];
XPoly2D polyTemp(ent);
roadCenterLine2d = polyTemp;
return true;
}
int nFirstPoly(0), nSecondPoly(0);
int nInterNum = 0;
AcGePoint3d ptInter;
//////////////////////////////////////////////////////////////////////////
for (int nEndpt = 0; nEndpt < nRoadLen; ++nEndpt)
{
TGGePoly2D poly2d;
Entity ent = ssRoadCenter[nEndpt];
XCurveSegment cvFirst(ent);
cvFirst.AsPoly2D(poly2d);
AcGePoint3d ptStart,ptEnd;
ptStart = poly2d.GetPointListAt(0)->AsAcGePoint3d();
ptEnd = poly2d.GetPointListAt(poly2d.Length() - 1)->AsAcGePoint3d();
for (int n = 0; n < nRoadLen; ++n)
{
nInterNum = 0;
if (n == nEndpt)
continue;
TGGePoly2D poly2dTemp(ssRoadCenter[n]);
if (ptStart.isEqualTo(poly2dTemp.GetPointListAt(0)->AsAcGePoint3d()) || ptStart.isEqualTo(poly2dTemp.GetPointListAt(poly2dTemp.Length() - 1)->AsAcGePoint3d()))
{
ptInter = ptStart;
++nInterNum;
}
if (ptEnd.isEqualTo(poly2dTemp.GetPointListAt(0)->AsAcGePoint3d()) || ptEnd.isEqualTo(poly2dTemp.GetPointListAt(poly2dTemp.Length() - 1)->AsAcGePoint3d()))
{
ptInter = ptEnd;
++nInterNum;
}
if (nInterNum == 1)
{
if (ptInter.isEqualTo(poly2d.GetPointListAt(0)->AsAcGePoint3d()))
{
roadCenterLine2d.AppendSegment(cvFirst, 1, 0);
}
else
{
roadCenterLine2d.AppendSegment(cvFirst, 0, 0);
}
nFirstPoly = nEndpt;
nSecondPoly = nFirstPoly;
break;
}
}
if (nInterNum == 1)
{
break;
}
}
if (nInterNum == 2)
{
TGGePoly2D poly2d;
Entity ent = ssRoadCenter[0];
XCurveSegment cvFirst(ent);
cvFirst.AsPoly2D(poly2d);
nFirstPoly = 0;
nSecondPoly = nFirstPoly;
roadCenterLine2d.AppendSegment(cvFirst, 0, 0);
ptInter = poly2d.GetPointListAt(poly2d.Length() - 1)->AsAcGePoint3d();
}
for (int nNum = 0; nNum < nRoadLen - 1; ++nNum)
{
for (int i = 0; i < nRoadLen; ++i)
{
if (i == nFirstPoly || i == nSecondPoly)
{
continue;
}
TGGePoly2D poly2dTemp;
Entity ent = ssRoadCenter[i];
XCurveSegment cv(ent);
cv.AsPoly2D(poly2dTemp);
if (ptInter.isEqualTo(poly2dTemp.GetPointListAt(0)->AsAcGePoint3d()))
{
ptInter = poly2dTemp.GetPointListAt(poly2dTemp.Length() - 1)->AsAcGePoint3d();
if (roadCenterLine2d.TotalSegments() == nRoadLen - 2)
{
roadCenterLine2d.AppendSegment(cv, 0, 1);
}
else
{
roadCenterLine2d.AppendSegment(cv, 0, 0);
}
nSecondPoly = i;
break;
}
else if (ptInter.isEqualTo(poly2dTemp.GetPointListAt(poly2dTemp.Length() - 1)->AsAcGePoint3d()))
{
ptInter = poly2dTemp.GetPointListAt(0)->AsAcGePoint3d();
if (roadCenterLine2d.TotalSegments() == nRoadLen - 2)
{
roadCenterLine2d.AppendSegment(cv, 1, 1);
}
else
{
roadCenterLine2d.AppendSegment(cv, 1, 0);
}
nSecondPoly = i;
break;
}
}
}
if (roadCenterLine2d.TotalSegments() == nRoadLen)
{
return true;
}
else
{
return false;
}
}
//判断标高是否在选择的道路中心线上
bool CRoadGradeStyle::JudgeElevationOnRoadCenter(const XPoly2D &roadCenterLine2d, const PickSet &ssElevation)
{
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();//返回的是世界坐标的点
}
else
{
ptEnd = pEnt->GetLocation();
}
}
OPENOBJ_END();
}
}
len = roadCenterLine2d.Length() - 1;
bool bStartOnLine = false, bEndOnLine = false;
XPoint ptProjectStart, ptProjectEnd;//投影点
for (int i = 0; i < len; ++i)
{
TGGeCurveSegment curve;
roadCenterLine2d.Nth(i, curve);
curve.ProjectToMe(ptStart, ptProjectStart);
curve.ProjectToMe(ptEnd, ptProjectEnd);
if (ptProjectStart == ptStart && ( 5 == curve.HitTest2d(ptProjectStart) || 4 == curve.HitTest2d(ptProjectStart) || 3 == curve.HitTest2d(ptProjectStart)))
bStartOnLine = true;
if (ptProjectEnd == ptEnd && ( 5 == curve.HitTest2d(ptProjectEnd) || 3 ==curve.HitTest2d(ptProjectEnd) || 4 ==curve.HitTest2d(ptProjectEnd)))
bEndOnLine = true;
}
if (bStartOnLine && bEndOnLine)
return true;
else
return false;
}
void CRoadGradeStyle::SetArrowDirection(XPoly2D &roadCenterLine2d, const PickSet &ssElevation)
{
XPoint ptStart, ptEnd;
double dStartElevation(0.0), dEndElevation(0.0);
int len = ssElevation.Length();
if (len != 2)
return;
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(dStartElevation);
}
else
{
ptEnd = pEnt->GetLocation();
pEnt->GetElev1(dEndElevation);
}
}
OPENOBJ_END();
}
}
len = roadCenterLine2d.Length() - 1;
bool bStartOnLine = false, bEndOnLine = false;
XPoint ptProjectStart, ptProjectEnd;//投影点
for (int i = 0; i < len; ++i)
{
TGGeDirectionCurve curve;
roadCenterLine2d.Nth(i, curve);
curve.ProjectToMe(ptStart, ptProjectStart);
curve.ProjectToMe(ptEnd, ptProjectEnd);
if (ptProjectStart == ptStart)
{
bStartOnLine = true;
}
if (ptProjectEnd == ptEnd)
{
bEndOnLine = true;
}
}
//两个标高在同一条线段上,判断方向了。
if (bStartOnLine && bEndOnLine)
{
if (roadCenterLine2d.PathDistance2d(ptProjectStart) >= roadCenterLine2d.PathDistance2d(ptProjectEnd))
{
bEndOnLine = false;
}
else
bStartOnLine = false;
}
if ((dStartElevation - dEndElevation) >= 0 )
{
//判断起始标高点是否在多段线的前侧,如果不是,则返回
if (!bStartOnLine && bEndOnLine)
roadCenterLine2d.Reverse();
}
else
{
if (bStartOnLine && !bEndOnLine)
roadCenterLine2d.Reverse();
}
}
bool CRoadGradeStyle::GetDistanceAndGrade(const XPoly2D &roadCenterLine2d, const PickSet &ssElevation, double &dRoadLenth, double &dRoadGrade)
{
XPoint ptStart, ptEnd;
double dStartElevation(0.0), dEndElevation(0.0);
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(dStartElevation);
}
else
{
ptEnd = pEnt->GetLocation();
pEnt->GetElev1(dEndElevation);
}
}
OPENOBJ_END();
}
}
int nLen = roadCenterLine2d.Length();
double d1 = roadCenterLine2d.PathDistance2d(ptStart);
double d2 = roadCenterLine2d.PathDistance2d(ptEnd);
dRoadLenth = abs(roadCenterLine2d.PathDistance2d(ptStart) - roadCenterLine2d.PathDistance2d(ptEnd))/1000.0;;
if (DocGetCurMeterUnitDraw())
dRoadLenth = abs(roadCenterLine2d.PathDistance2d(ptStart) - roadCenterLine2d.PathDistance2d(ptEnd));
dRoadGrade = abs(dStartElevation - dEndElevation) / (dRoadLenth) * 100;
return true;
}
//返回1:成功;返回0,则不选择道路中心线;返回-1,则直接退出命令,框选图层为Road_Dot的实体
int CRoadGradeStyle::SelectRoadCenterLine(PickSet &ssRoadCenter, XPoly2D &pCenterLine)
{
bool bFirst = true;
while (1)
{
PickSet ssSelect;
TRBList rbFilter(acutBuildList(RTDXF0, _T("POLYLINE,LWPOLYLINE,LINE,ARC"), NULL));
//rbFilter.Append(ads_buildlist(8, _T("ROAD_DOTE"), NULL));//图层过滤
int nReturnValue = 0;
if (bFirst)
{
nReturnValue = SelectEnts(_T("\n请选择道路中心线<按直线标注>!"), ssSelect, rbFilter, _T(" "));
bFirst = false;
}
else
nReturnValue = SelectEnts(_T(""), ssSelect, rbFilter, _T(" "));
if (RTNONE == nReturnValue)
{
break;
}
if (RTNORM == nReturnValue)
{
ssRoadCenter += ssSelect;
ssRoadCenter.Redraw(3);
}
else
{
return 0;
}
}
if (ssRoadCenter.Length() == 0)
return 0;
if (!JudgeRoadCentersIsContinue(ssRoadCenter, pCenterLine))//判断选择道路中心线是否连续
{
ads_prompt(_T("\n所选道路中心线不连续,请检查!"));
return -1;
}
else
{
return kRetEsc;
}
}
//功能:自动标高,程序把所选的两个标高之间按直线连接,并在其连线中点位置自动生成坡度标注,箭头方向沿两标高的连线方向从标高值高的点指向标高值低的点
bool CRoadGradeStyle::AutoCreateRoadGradeSymble(const PickSet &ssElevation, TDbSymbArrow *pSymbArrowEnt, CRoadGradeDlg* pDlg)
{
if (!pSymbArrowEnt)
return false;
XPoint ptStart, ptEnd;
double dStartElevation(0.0), dEndElevation(0.0);
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(dStartElevation);
}
else
{
ptEnd = pEnt->GetLocation();
pEnt->GetElev1(dEndElevation);
}
}
OPENOBJ_END();
}
}
AcGeVector2d vecDirction;
if (dStartElevation > dEndElevation)
{
vecDirction = ptStart - ptEnd;
}
else
vecDirction = ptEnd - ptStart;
XPoint ptCenter;
ptCenter.x = (ptStart.x + ptEnd.x)/2.0;
ptCenter.y = (ptStart.y + ptEnd.y)/2.0;
ptCenter.z = (ptStart.z + ptEnd.z)/2.0;
double dDis = abs(ptStart.Distance(ptEnd));
if (dDis <= 0.000001)
return false;
double dRoadGrade = abs((dStartElevation-dEndElevation) / (dDis/1000)) * 100;
if (DocGetCurMeterUnitDraw())
dRoadGrade = abs((dStartElevation-dEndElevation) / (dDis)) * 100;
double dArrowLenth = pDlg->GetArrowLineLength();
XPoly2D poly2d;
AcGePoint3d ptGeCenter(ptCenter.x ,ptCenter.y, ptCenter.z);
GetArrowPolyLineByParam(ptGeCenter, vecDirction, dArrowLenth, poly2d);
pSymbArrowEnt->SetPoly2D(poly2d);
double dRoadLenth = abs(ptStart.Distance(ptEnd))/1000.0;//mm单位下以米单位为距离
if (DocGetCurMeterUnitDraw())
dRoadLenth= abs(ptStart.Distance(ptEnd));
pDlg->SetDisFormatData(pSymbArrowEnt, dRoadLenth, dRoadGrade);
TDbSymbArrow *pSymbArrowEntClone = new TDbSymbArrow();
pSymbArrowEntClone = (TDbSymbArrow*)pSymbArrowEnt->clone();
double dSize = pDlg->GetArrowSize();
if (dSize > 1.0E-3)
pSymbArrowEntClone->SetArrowSize(dSize);
AddToModelSpace(pSymbArrowEntClone);
return true;
}
//选择标高进行道路坡度标注
int CRoadGradeStyle::SelectStyle(TDbSymbArrow *pSymbArrowEnt, CRoadGradeDlg* pDlg)
{
PickSet ssElevation(SS_FREE);
TRBList rbFilter(acutBuildList(RTDXF0, _T("ATS_ELEVATION"), NULL));
TCHAR chRet;
const TCHAR *kword=_T("` D S");
THookMsg hookmsg;
int iRetCode = SelectEntities(_T("\n请选取两个道路标高自动标注或[手工绘制(D)/设置(S)]<退出>:"), ssElevation, rbFilter, kword, chRet);
int vn = hookmsg.GetValue();
if (iRetCode == RTNORM)//选择标注
{
if (!JudgeSelectRoadElevation(ssElevation))//判断选择的道路标高是否满足规定的个数
return kRetContinue;
PickSet ssRoadCenter(SS_FREE);
XPoly2D roadCenterLine;
int nRet = SelectRoadCenterLine(ssRoadCenter, roadCenterLine);
if (1 == nRet)//选择道路中心线
{
if (!JudgeElevationOnRoadCenter(roadCenterLine, ssElevation))
{
ads_prompt(_T("\n有标高点不在所选道路中心线上,请检查!!"));
ssRoadCenter.Redraw(4);
return kRetEsc;//直接退出命令
}
acutPrintf(_T("\n 请点取标注位置<退出>"));
//箭头方向沿两标高的连线方向从标高值高的点指向标高值低的点。
SetArrowDirection(roadCenterLine, ssElevation);
double dRoadLenth= 0.00, dRoadGrade = 0.00;
GetDistanceAndGrade(roadCenterLine, ssElevation, dRoadLenth, dRoadGrade);
pDlg->SetDisFormatData(pSymbArrowEnt, dRoadLenth, dRoadGrade);
TADSGePoint3d ptCenter = roadCenterLine.GetPoint(0, roadCenterLine.GetLength() * 0.5);
TRoadGradeArrowJig jig(roadCenterLine, ptCenter, pSymbArrowEnt, pDlg->GetArrowLineLength(),false);
int nRetValue = jig.doIt();
if (nRetValue == RTNORM)
{
TDbSymbArrow *pSymbArrowEntClone = new TDbSymbArrow();
pSymbArrowEntClone = (TDbSymbArrow*)pSymbArrowEnt->clone();
double dSize = pDlg->GetArrowSize();
if (dSize > 1.0E-3)
pSymbArrowEntClone->SetArrowSize(dSize);
AddToModelSpace(pSymbArrowEntClone);
}
ssRoadCenter.Redraw(4);
}
else if (0 == nRet)//如果没有选择道路中心线,则按选中标高在图上自动生成坡度标注
{
if (!AutoCreateRoadGradeSymble(ssElevation, pSymbArrowEnt, pDlg))
{
return kRetEsc;
}
else
{
ssRoadCenter.Redraw(4);
}
}
else
{
ssRoadCenter.Redraw(4);
return kRetEsc;//返回-1,则直接退出命令
}
}
else if (iRetCode == RTKWORD)
{
if (chRet == _T('S'))//打开道路坡度标注对话框
{
acutPrintf(_T("S"));
return kRetSettingDlg;
}
else if (chRet == _T('D'))//动态绘制
{
acutPrintf(_T("D"));
return kRetDynamicStyle;
}
else
return kRetEsc;
}
else
{
//当前焦点在CAD上,并且没有选中
if(vn == 0 && GetFocus() == acedGetAcadDwgView()->GetSafeHwnd())
{
acutPrintf(_T("\n选择无效,请重新选择!"));
return kRetContinue;
}
else
return kRetEsc;
}
return kRetContinue;
}
namespace
{
double Str2Double(const CString& str)
{
CString sTemp(str);
double d;
LPTSTR p = sTemp.GetBuffer(10);
d = _tstof(p);
sTemp.ReleaseBuffer( );
return d;
}
}
namespace
{
#if ADS <= 17
double _ttof(LPCTSTR psz)
{
if (!psz) return .0;
USES_CONVERSION;
return atof(W2A(psz));
}
#endif
}
//动态绘制道路坡度标注
void CRoadGradeStyle::DynamicStyle(TDbSymbArrow *pSymbArrowEnt, CRoadGradeDlg* pDlg)
{
XPoint ptCenter;
int rc (0);
if (RTNORM != acedGetPoint(NULL, _T("\n请点取标注道路坡度的位置<自动标注>"), ptCenter))
return;
AcGePoint3d ptPos = Ucs2Wcs(ptCenter).AsAcGePoint3d();//add by yyc 20160407 坐标系修正
CString str(_T("")), strTmp(_T(""));
XPoly2D roadCenterLine;
pSymbArrowEnt->SetText(_T(""));
pSymbArrowEnt->SetText2(_T(""));
TRoadGradeArrowJig jig(roadCenterLine, ptPos, pSymbArrowEnt, pDlg->GetArrowLineLength(),true,true);
CString strPrompt(_T(""));
strPrompt.Format(_T("\n请确定标注方向<%.f>:"), m_dAngle);
jig.SetPrompt(strPrompt);
int nRet = jig.doIt();
if (nRet == RTCAN )
{
return;
}
else if (nRet == RTNONE)//回车或者右键时
{
jig.SetAngle(m_dAngle / 180 * PI);
}
else
{
m_dAngle = jig.GetAngle() / PI * 180;
}
strTmp = str = strPrompt = _T("");
do
{
int nAccuracyGrade = pDlg->GetAccuracyGrade();
if (nAccuracyGrade == 0)
strPrompt.Format(_T("\n请输入道路坡度<%0.0f>:"), m_dRoadGrade);
else if (nAccuracyGrade == 1)
strPrompt.Format(_T("\n请输入道路坡度<%0.1f>:"), m_dRoadGrade);
else if (nAccuracyGrade == 2)
strPrompt.Format(_T("\n请输入道路坡度<%0.2f>:"), m_dRoadGrade);
else if (nAccuracyGrade == 3)
strPrompt.Format(_T("\n请输入道路坡度<%0.3f>:"), m_dRoadGrade);
rc = acedGetString(FALSE, strPrompt, str.GetBufferSetLength(1000));
if (rc == RTNORM)
{
str.ReleaseBufferSetLength(1000);
if (str == _T(""))
{
if (nAccuracyGrade == 0)
strTmp.Format(_T("%.0f"), m_dRoadGrade);
else if (nAccuracyGrade == 1)
strTmp.Format(_T("%.1f"), m_dRoadGrade);
else if (nAccuracyGrade == 2)
strTmp.Format(_T("%.2f"), m_dRoadGrade);
else if (nAccuracyGrade == 3)
strTmp.Format(_T("%.3f"), m_dRoadGrade);
}
else
{
strTmp = str.SpanIncluding(_T(".0123456789"));
if (strTmp.IsEmpty())
acutPrintf(_T("\n输入无效,请重新输入数值!"));
}
}
else
return;
} while (strTmp.IsEmpty());
m_dRoadGrade = _tstof(strTmp);
strTmp = str = strPrompt = +_T("");
do
{
int nAccuracyLength = pDlg->GetAccuracyLength();
if (nAccuracyLength == 0)
strPrompt.Format(_T("\n请输入道路坡长(M)<%0.0f>:"), m_dRoadLenth);
else if (nAccuracyLength == 1)
strPrompt.Format(_T("\n请输入道路坡长(M)<%0.1f>:"), m_dRoadLenth);
else if (nAccuracyLength == 2)
strPrompt.Format(_T("\n请输入道路坡长(M)<%0.2f>:"), m_dRoadLenth);
else if (nAccuracyLength == 3)
strPrompt.Format(_T("\n请输入道路坡长(M)<%0.3f>:"), m_dRoadLenth);
rc = acedGetString(FALSE, strPrompt, str.GetBufferSetLength(1000));
if (rc == RTNORM)
{
str.ReleaseBufferSetLength(1000);
if (str == _T(""))
{
if (nAccuracyLength == 0)
strTmp.Format(_T("%.0f"), m_dRoadLenth);
else if (nAccuracyLength == 1)
strTmp.Format(_T("%.1f"), m_dRoadLenth);
else if (nAccuracyLength == 2)
strTmp.Format(_T("%.2f"), m_dRoadLenth);
else if (nAccuracyLength == 3)
strTmp.Format(_T("%.3f"), m_dRoadLenth);
}
else
{
strTmp = str.SpanIncluding(_T(".0123456789"));
if (strTmp.IsEmpty())
acutPrintf(_T("\n输入无效,请重新输入数值!"));
}
}
else
return;
} while (strTmp.IsEmpty());
m_dRoadLenth = _tstof(strTmp);
pDlg->SetDisFormatData(pSymbArrowEnt, m_dRoadLenth, m_dRoadGrade);
TDbSymbArrow *pSymbArrowEntClone = new TDbSymbArrow();
pSymbArrowEntClone = (TDbSymbArrow*)pSymbArrowEnt->clone();
double dSize = pDlg->GetArrowSize();
if (dSize > 1.0E-3)
pSymbArrowEntClone->SetArrowSize(dSize);
AddToModelSpace(pSymbArrowEntClone);
}