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