280 lines
7.3 KiB
C++
280 lines
7.3 KiB
C++
#include "stdafx.h"
|
|
#include "commonRoad.h"
|
|
//#include "RoadOri.h"
|
|
#include "Road.h"
|
|
#include "DrawRoadDlg.h"
|
|
#include "TDbRoadEntity.h"
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// TDbRoadEntity ..
|
|
//
|
|
ACRX_DXF_DEFINE_MEMBERS(TDbRoadEntity, ATSEntity, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
|
|
1, ATS_ROAD, "ATS_ROAD缺乏解释器图形看不见, 请下载上华软件|网址: www.shanghuasoft.com");
|
|
|
|
IMPLEMENT_TENTBASE(TDbRoadEntity);
|
|
|
|
void TDbRoadEntity::SetHalfWid(double dHalfWid)
|
|
{
|
|
assertWriteEnabled();
|
|
ASSERT(dHalfWid > 1.0);
|
|
m_dHalfWid = dHalfWid;
|
|
}
|
|
|
|
|
|
Acad::ErrorStatus TDbRoadEntity::dwgInFields (AcDbDwgFiler *pFiler)
|
|
{
|
|
assertWriteEnabled();
|
|
Acad::ErrorStatus errorStatus = TDbEntity::dwgInFields(pFiler);
|
|
if (Acad::eOk != errorStatus)
|
|
{
|
|
return errorStatus;
|
|
}
|
|
|
|
pFiler->readDouble(&m_dHalfWid);
|
|
|
|
return pFiler->filerStatus();
|
|
}
|
|
|
|
Acad::ErrorStatus TDbRoadEntity::dwgOutFields(AcDbDwgFiler*pFiler) const
|
|
{
|
|
assertReadEnabled();
|
|
Acad::ErrorStatus errorStatus = TDbEntity::dwgOutFields(pFiler);
|
|
if (Acad::eOk != errorStatus)
|
|
{
|
|
return errorStatus;
|
|
}
|
|
|
|
pFiler->writeDouble(m_dHalfWid);
|
|
|
|
return pFiler->filerStatus();
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// TDbLineRoadEntity
|
|
ACRX_DXF_DEFINE_MEMBERS(TDbLineRoadEntity, ATSEntity, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
|
|
1, ATS_LINEROAD, "ATS_LINEROAD缺乏解释器图形看不见, 请下载上华软件|网址: www.shanghuasoft.com");
|
|
|
|
IMPLEMENT_TENTBASE(TDbLineRoadEntity);
|
|
|
|
void TDbLineRoadEntity::SetMidLine(const AcGeLineSeg2d &midLine)
|
|
{
|
|
assertWriteEnabled();
|
|
|
|
m_ptStart = midLine.startPoint();
|
|
m_ptEnd = midLine.endPoint();
|
|
}
|
|
|
|
|
|
Acad::ErrorStatus TDbLineRoadEntity::dwgInFields (AcDbDwgFiler *pFiler)
|
|
{
|
|
assertWriteEnabled();
|
|
Acad::ErrorStatus errorStatus = TDbRoadEntity::dwgInFields(pFiler);
|
|
if (Acad::eOk != errorStatus)
|
|
{
|
|
return errorStatus;
|
|
}
|
|
|
|
AcGePoint2d ptStart, ptEnd;
|
|
pFiler->readPoint2d(&m_ptStart);
|
|
pFiler->readPoint2d(&m_ptEnd);
|
|
|
|
return pFiler->filerStatus();
|
|
}
|
|
|
|
Acad::ErrorStatus TDbLineRoadEntity::dwgOutFields(AcDbDwgFiler*pFiler) const
|
|
{
|
|
assertReadEnabled();
|
|
Acad::ErrorStatus errorStatus = TDbRoadEntity::dwgOutFields(pFiler);
|
|
if (Acad::eOk != errorStatus)
|
|
{
|
|
return errorStatus;
|
|
}
|
|
|
|
pFiler->writePoint2d(m_ptStart);
|
|
pFiler->writePoint2d(m_ptEnd);
|
|
|
|
return pFiler->filerStatus();
|
|
}
|
|
|
|
Acad::ErrorStatus TDbLineRoadEntity::ExplodeOrDraw2d(XExplodeDraw &dc) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
if (m_ptStart.distanceTo(m_ptEnd) < 1e-6 || m_dHalfWid < 1e-6)
|
|
return Acad::eOk;
|
|
|
|
ASSERT(m_ptStart.distanceTo(m_ptEnd) > 1e-6);
|
|
ASSERT(m_dHalfWid > 1e-6);
|
|
|
|
AcGeLineSeg2d midLine(m_ptStart, m_ptEnd);
|
|
AcGeLineSeg2d leftLine = LeftLine(midLine, m_dHalfWid);
|
|
AcGeLineSeg2d rightLine = RightLine(midLine, m_dHalfWid);
|
|
AcDbLine leftDbLine(POINT_2D_TO_3D(leftLine.startPoint()), POINT_2D_TO_3D(leftLine.endPoint()));
|
|
AcDbLine rightDbLine(POINT_2D_TO_3D(rightLine.startPoint()), POINT_2D_TO_3D(rightLine.endPoint()));
|
|
|
|
dc.DrawEntity(leftDbLine);
|
|
dc.DrawEntity(rightDbLine);
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
CLineRoad* TDbLineRoadEntity::CreateLineRoad(CDrawRoadDlg *pDlg) const
|
|
{
|
|
ASSERT(pDlg != NULL);
|
|
|
|
CLineRoad *pLineRoad = new CLineRoad(pDlg->GetLeftWidthMM(), pDlg->GetRightWidthMM(),
|
|
pDlg->IsDrawMidLine(), pDlg->IsFillet(), pDlg->GetCharmRadiusMM(),
|
|
pDlg->FilletStyle(), AcGeLineSeg2d(AsMMUnitPoint2d(m_ptStart), AsMMUnitPoint2d(m_ptEnd)));
|
|
|
|
return pLineRoad;
|
|
}
|
|
|
|
void TDbLineRoadEntity::SetLineRoad(const AcGePoint2d &ptStart, const AcGePoint2d &ptEnd, CDrawRoadDlg *pDlg)
|
|
{
|
|
double dLeftWid = pDlg->GetLeftWidthSys();
|
|
double dRightWid = pDlg->GetRightWidthSys();
|
|
|
|
double dHalfWid = (dLeftWid + dRightWid)*0.5;
|
|
double dOffSet = 0.0;
|
|
if (pDlg->PositionLineStyle() == CDrawRoadDlg::eBaseLine)
|
|
{
|
|
dOffSet = dLeftWid - dHalfWid;
|
|
}
|
|
else if(pDlg->PositionLineStyle() == CDrawRoadDlg::eLeftLine)
|
|
{
|
|
dOffSet = -dHalfWid;
|
|
}
|
|
else
|
|
{
|
|
dOffSet = dHalfWid;
|
|
}
|
|
|
|
AcGeLineSeg2d lineseg(ptStart, ptEnd);
|
|
lineseg = LeftLine(lineseg, dOffSet);
|
|
|
|
SetMidLine(lineseg);
|
|
SetHalfWid(dHalfWid);
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// TDbArcRoadEntity
|
|
ACRX_DXF_DEFINE_MEMBERS(TDbArcRoadEntity, TDbRoadEntity, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
|
|
1, ATS_ARCROAD, "ATS_ARCROAD缺乏解释器图形看不见, 请下载上华软件|网址: www.shanghuasoft.com");
|
|
|
|
IMPLEMENT_TENTBASE(TDbArcRoadEntity);
|
|
|
|
Acad::ErrorStatus TDbArcRoadEntity::dwgInFields (AcDbDwgFiler *pFiler)
|
|
{
|
|
assertWriteEnabled();
|
|
Acad::ErrorStatus errorStatus = TDbRoadEntity::dwgInFields(pFiler);
|
|
if (Acad::eOk != errorStatus)
|
|
{
|
|
return errorStatus;
|
|
}
|
|
|
|
pFiler->readPoint2d(&m_ptFirst);
|
|
pFiler->readPoint2d(&m_ptThird);
|
|
pFiler->readPoint2d(&m_ptEnd);
|
|
|
|
return pFiler->filerStatus();
|
|
}
|
|
|
|
Acad::ErrorStatus TDbArcRoadEntity::dwgOutFields(AcDbDwgFiler*pFiler) const
|
|
{
|
|
assertReadEnabled();
|
|
Acad::ErrorStatus errorStatus = TDbRoadEntity::dwgOutFields(pFiler);
|
|
if (Acad::eOk != errorStatus)
|
|
{
|
|
return errorStatus;
|
|
}
|
|
|
|
pFiler->writePoint2d(m_ptFirst);
|
|
pFiler->writePoint2d(m_ptThird);
|
|
pFiler->writePoint2d(m_ptEnd);
|
|
|
|
return pFiler->filerStatus();
|
|
}
|
|
|
|
Acad::ErrorStatus TDbArcRoadEntity::ExplodeOrDraw2d(XExplodeDraw &dc) const
|
|
{
|
|
assertReadEnabled();
|
|
|
|
if (m_ptFirst.distanceTo(m_ptThird) < 1e-6 || m_ptFirst.distanceTo(m_ptEnd) < 1e-6
|
|
|| m_ptEnd.distanceTo(m_ptThird) < 1e-6 || m_dHalfWid < 1e-6)
|
|
return Acad::eInvalidInput;
|
|
|
|
AcGeCircArc2d midArc(m_ptFirst, m_ptThird, m_ptEnd);
|
|
AcGeCircArc2d leftArc = LeftArc(midArc, m_dHalfWid);
|
|
AcGeCircArc2d rightArc = RightArc(midArc, m_dHalfWid);
|
|
|
|
AcGePoint2d ptCenter = midArc.center();
|
|
double sangle = AcGeVector2d(m_ptFirst - ptCenter).angle();
|
|
double eangle = AcGeVector2d(m_ptEnd - ptCenter).angle();
|
|
|
|
if (midArc.isClockWise())
|
|
{
|
|
double dTemp = sangle;
|
|
sangle = eangle;
|
|
eangle = dTemp;
|
|
}
|
|
|
|
AcGePoint3d ptCenter3d = POINT_2D_TO_3D(ptCenter);
|
|
TGGeArc leftTArc(asDblArray(ptCenter3d), leftArc.radius(), sangle, eangle);
|
|
TGGeArc rightTArc(asDblArray(ptCenter3d), rightArc.radius(), sangle, eangle);
|
|
|
|
double dLen1 = leftTArc.GetLength();
|
|
double dLen2 = rightTArc.GetLength();
|
|
|
|
dc.DrawArc(leftTArc);
|
|
dc.DrawArc(rightTArc);
|
|
|
|
return Acad::eOk;
|
|
}
|
|
|
|
CArcRoad* TDbArcRoadEntity::CreateArcRoad(CDrawRoadDlg *pDlg)
|
|
{
|
|
ASSERT(pDlg != NULL);
|
|
|
|
CArcRoad *pArcRoad = new CArcRoad(pDlg->GetLeftWidthMM(), pDlg->GetRightWidthMM(),
|
|
pDlg->IsDrawMidLine(), pDlg->IsFillet(), pDlg->GetCharmRadiusMM(),
|
|
pDlg->FilletStyle(), AcGeCircArc2d(AsMMUnitPoint2d(m_ptFirst), AsMMUnitPoint2d(m_ptThird), AsMMUnitPoint2d(m_ptEnd)));
|
|
return pArcRoad;
|
|
|
|
}
|
|
void TDbArcRoadEntity::SetArcRoad(const AcGePoint2d &ptFir, const AcGePoint2d &ptThir, const AcGePoint2d &ptEnd, CDrawRoadDlg *pDlg)
|
|
{
|
|
double dLeftWid = pDlg->GetLeftWidthSys();
|
|
double dRightWid = pDlg->GetRightWidthSys();
|
|
|
|
double dHalfWid = (dLeftWid + dRightWid)*0.5;
|
|
double dOffSet = 0.0;
|
|
if (pDlg->PositionLineStyle() == CDrawRoadDlg::eBaseLine)
|
|
{
|
|
dOffSet = dLeftWid - dHalfWid;
|
|
}
|
|
else if(pDlg->PositionLineStyle() == CDrawRoadDlg::eLeftLine)
|
|
{
|
|
dOffSet = -dHalfWid;
|
|
}
|
|
else
|
|
{
|
|
dOffSet = dHalfWid;
|
|
}
|
|
|
|
AcGeCircArc2d arc(ptFir, ptThir, ptEnd);
|
|
// 一个圆弧拆成两个圆弧,然后分别作偏移。
|
|
AcGeCircArc2d arc1 = ConNewArc(arc, ptFir, ptThir);
|
|
AcGeCircArc2d arc2 = ConNewArc(arc, ptThir, ptEnd);
|
|
|
|
arc1 = LeftArc(arc1, dOffSet);
|
|
arc2 = LeftArc(arc2, dOffSet);
|
|
m_ptFirst = arc1.startPoint();
|
|
m_ptThird = arc1.endPoint();
|
|
m_ptEnd = arc2.endPoint();
|
|
|
|
SetHalfWid(dHalfWid);
|
|
}
|