Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

253 lines
6.7 KiB
C++

#include "StdAfx.h"
#include "ImpDrawControllableSection.h"
#include "DataContainer.h"
#include "DrawSectionSymbol.h"
extern AcDbArc* FormatArc(const AcGePoint3d& ptGe1,const AcGePoint3d& ptGe2,const AcGePoint3d& ptGe3);
CImpDrawControllableSection::CImpDrawControllableSection()
{
m_dRoadMidEle = 0.0; // 道路中心线标高
m_dGreenGrad = 0.0; // 靠近道路中心线的绿化带坡度
m_dGreenWidth = 0.0; // 靠近道路中心线的绿化带坡度
m_dGreenGrad2 = 0.0; // 远离道路中心线的绿化带坡度
m_dGreenWidth2 = 0.0; // 远离道路中心线的绿化带坡度
m_dCarGrad = 0.0; // 车行道坡度
m_dCarWidth = 0.0; // 车行道宽度
m_dMenGrad = 0.0; // 人行道坡度
m_dMenWidth = 0.0; // 人行道宽度
m_dNoCarGrad = 0.0; // 非机动车道坡度
m_dNoCarWidth = 0.0; // 非机动车道宽度
m_dMenHeight = 0.0; // 人道牙高度
m_dSplitHeight = 0.0; // 分道牙高度
}
bool CImpDrawControllableSection::DrawSection()
{
// 求剖切线与道路中线的交点
AcDbEntity *pEnt = NULL;
acdbOpenObject(pEnt, m_idMidLine, AcDb::kForRead);
if (pEnt == NULL)
{
return false;
}
AcDbArc *pArc = AcDbArc::cast(pEnt);
AcDbLine *pLine = AcDbLine::cast(pEnt);
AcDbPolyline *pPoly = AcDbPolyline::cast(pEnt);
AcGePoint3d ptS = m_ptS, ptE = m_ptE;
ptS.z = 0.0;
ptE.z = 0.0;
AcDbLine line(ptS, ptE);
AcGePoint3dArray arPt;
if (pLine != NULL)
{
AcGePoint3d pt1, pt2;
pt1 = pLine->startPoint();
pt2 = pLine->endPoint();
pEnt->close();
pt1.z = 0.0;
pt2.z = 0.0;
AcDbLine line2(pt1, pt2);
line2.intersectWith(&line, AcDb::kExtendBoth, arPt);
}
else if (pArc != NULL)
{
double dRadius = pArc->radius();
double dStartAngle = pArc->startAngle();
double dEndAngle = pArc->endAngle();
AcGePoint3d ptCenter = pArc->center();
pEnt->close();
ptCenter.z = 0.0;
AcDbArc arc(ptCenter, dRadius, dStartAngle, dEndAngle);
arc.intersectWith(&line, AcDb::kExtendBoth, arPt);
}
else if (pPoly != NULL)
{
AcDbPolyline poly;
AcGePoint2d pt;
for (int i = 0; i< pPoly->numVerts(); i++)
{
pPoly->getPointAt(i, pt);
poly.addVertexAt(i, pt);
}
pEnt->close();
poly.intersectWith(&line, AcDb::kExtendBoth, arPt);
}
else
{
CString sClassName = pEnt->isA()->name();
if (sClassName.CompareNoCase(_T("AecDb3dRoad")) == 0)
{
AcDbCurve* pRoad = AcDbCurve::cast(pEnt);
if (pRoad != NULL)
{
AcGePoint3d ptSta,ptEnd;
pRoad->getStartPoint(ptSta);
pRoad->getEndPoint(ptEnd);
double dSta = 0.0,dEnd = 0.0;
pRoad->getStartParam(dSta);
pRoad->getEndParam(dEnd);
AcGeVector3d vtDir = ptEnd - ptSta;
vtDir.normalize();
AcGePoint3d ptMid;
pRoad->getPointAtParam((dSta + dEnd) / 2.0,ptMid);
AcGeVector3d vtMid = ptMid - ptEnd;
if (vtMid.isParallelTo(vtDir))//LINE
{
ptSta.z = 0.0;
ptEnd.z = 0.0;
AcDbLine line2(ptSta, ptEnd);
line2.intersectWith(&line, AcDb::kExtendBoth, arPt);
}
else//ARC
{
ptSta.z = 0.0;
ptEnd.z = 0.0;
ptMid.z = 0.0;
AcDbArc* pArc = FormatArc(ptSta,ptMid,ptEnd);
if (pArc != NULL)
{
pArc->intersectWith(&line, AcDb::kExtendBoth, arPt);
delete pArc;
}
}
}
}
else
{
ads_printf(_T("\n道路中心线选择不当!"));
return false;
}
}
if (arPt.length() != 1)
{
return false;
}
AcGePoint3d ptRoadMid = arPt[0];
ptRoadMid.z = m_dRoadMidEle;
if (!DocGetMeterUnitDraw())
{
ptRoadMid.z = m_dRoadMidEle * 1000;
}
PickSet ssNew(SS_FREE);
ssNew.IncludeBegin();
// 设置参数
CDataContainer* mapData = new CDataContainer();
mapData->SetData(_T("Type"), 1); // 道路类型
mapData->SetData(_T("CutS"), m_ptS); // 剖切起点
mapData->SetData(_T("CutE"), m_ptE); // 剖切终点
mapData->SetData(_T("vtView"), m_vt); // 剖切方向
mapData->SetData(_T("RoadMidPt"), ptRoadMid); // 道路中心点
mapData->SetData(_T("Number"), m_strNumber); // 横断图名称
mapData->SetData(_T("ScaleX"), m_dScaleX); // 横向比例
mapData->SetData(_T("ScaleY"), m_dScaleY); // 纵向比例
mapData->SetData(_T("GreenGrad"), m_dGreenGrad); // 第一绿化带坡度
mapData->SetData(_T("GreenWidth"), m_dGreenWidth); // 第一绿化带宽度
mapData->SetData(_T("GreenGrad2"), m_dGreenGrad2); // 第二绿化带坡度
mapData->SetData(_T("GreenWidth2"), m_dGreenWidth2); // 第二绿化带宽度
mapData->SetData(_T("CarRoadWidth"), m_dCarWidth); // 车行道宽度
mapData->SetData(_T("CarRoadGradient"), m_dCarGrad); // 车行道坡度
mapData->SetData(_T("MenRoadWidth"), m_dMenWidth); // 人行道宽度
mapData->SetData(_T("MenRoadGrad"), m_dMenGrad); // 人行道坡度
mapData->SetData(_T("MenHeight"), m_dMenHeight); // 人道牙高度
mapData->SetData(_T("SplitHeight"), m_dSplitHeight); // 分道牙高度
mapData->SetData(_T("NoCarWidth"), m_dNoCarWidth); // 非机动车道宽度
mapData->SetData(_T("NoCarGrad"), m_dNoCarGrad); // 非机动车道坡度
mapData->SetData(_T("BlockType"), m_nType); // 板路类型
mapData->SetData(_T("RoadEle"), m_dRoadMidEle); // 道路标高
CDrawSectionSymbol draw;
draw.SetDataContainer(mapData);
//绘制道路线
AcDbPolyline *pOutLine = NULL;
AcDbVoidPtrArray arSplitLine, arSubPtr;
draw.DrawRoadway(pOutLine, arSplitLine, arSubPtr, false);
if (pOutLine != NULL)
{
pOutLine->setLayer(InitLayer(_T("TWT_室外")));
AddToCurrentSpace(pOutLine, Adesk::kTrue);
}
for (int i = 0; i < arSplitLine.length(); i++)
{
AcDbEntity *pEnt = (AcDbEntity *)arSplitLine.at(i);
if (pEnt != NULL)
{
AddToCurrentSpace(pEnt, Adesk::kTrue);
}
}
for (i = 0; i < arSubPtr.length(); i++)
{
AcDbEntity *pEnt = (AcDbEntity *)arSubPtr.at(i);
if (pEnt != NULL)
{
AddToCurrentSpace(pEnt, Adesk::kTrue);
}
}
// 绘制管线
std::vector<AcDbObjectId>::iterator it;
for (it = m_idVecPipe.begin(); it != m_idVecPipe.end(); it++)
{
AcDbEntity *pEnt = NULL;
draw.DrawPipe(*it, pEnt);
if (pEnt != NULL)
{
AddToCurrentSpace(pEnt, Adesk::kTrue);
}
}
// 绘制板路间距
AcDbVoidPtrArray arPtr;
draw.DrawRoadDist(arPtr);
for (i = 0; i < arPtr.length(); i++)
{
AcDbEntity *pEnt = (AcDbEntity *)arPtr.at(i);
if (pEnt != NULL)
{
AddToCurrentSpace(pEnt, Adesk::kTrue);
}
}
ssNew.IncludeEnd();
XPoint ptIns;
double x,y,z;
ssNew.Redraw(2);
ssNew.GetExtend(ptIns, &x, &y, &z);
ptIns = Wcs2Ucs(ptIns);
ptIns.z = 0;
XPoint xp;
int nRet = DragMovePickSet(ssNew, _T("\n请点取系统图位置<退出>: "), ptIns, xp);
if(nRet != RTNORM)
{
ssNew.Erase();
return false;
}
ssNew.Redraw(1);
acedUpdateDisplay();
actrTransactionManager->flushGraphics(); //acad 刷新
return true;
}