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

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);
}