256 lines
6.9 KiB
C++
256 lines
6.9 KiB
C++
#include "StdAfx.h"
|
|
#include "globalfunc.h"
|
|
#include "ImpDrawControllableSection.h"
|
|
#include "DataContainer.h"
|
|
#include "DrawSectionSymbol.h"
|
|
#include "PickEntSet.h"
|
|
|
|
extern AcDbArc* FormatArc(const AcGePoint3d& ptGe1,const AcGePoint3d& ptGe2,const AcGePoint3d& ptGe3);
|
|
extern AcDbObjectId InitLayer(const TCHAR *szLayer, BOOL bApplyChange = TRUE);
|
|
|
|
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 (!GlobalFunc::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_室外")));
|
|
GlobalFunc::AddToCurrentSpace(pOutLine, Adesk::kTrue);
|
|
}
|
|
|
|
for (int i = 0; i < arSplitLine.length(); i++)
|
|
{
|
|
AcDbEntity *pEnt = (AcDbEntity *)arSplitLine.at(i);
|
|
if (pEnt != NULL)
|
|
{
|
|
GlobalFunc::AddToCurrentSpace(pEnt, Adesk::kTrue);
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < arSubPtr.length(); i++)
|
|
{
|
|
AcDbEntity *pEnt = (AcDbEntity *)arSubPtr.at(i);
|
|
if (pEnt != NULL)
|
|
{
|
|
GlobalFunc::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)
|
|
{
|
|
GlobalFunc::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)
|
|
{
|
|
GlobalFunc::AddToCurrentSpace(pEnt, Adesk::kTrue);
|
|
}
|
|
}
|
|
|
|
ssNew.IncludeEnd();
|
|
|
|
XPoint ptIns;
|
|
double x,y,z;
|
|
ssNew.Redraw(2);
|
|
ssNew.GetExtend(ptIns, &x, &y, &z);
|
|
|
|
ptIns = GlobalFunc::Wcs2Ucs(ptIns);
|
|
ptIns.z = 0;
|
|
XPoint xp;
|
|
int nRet = GlobalFunc::DragMovePickSet(ssNew, _T("\n请点取系统图位置<退出>: "), ptIns, xp);
|
|
if(nRet != RTNORM)
|
|
{
|
|
ssNew.Erase();
|
|
return false;
|
|
}
|
|
ssNew.Redraw(1);
|
|
|
|
acedUpdateDisplay();
|
|
actrTransactionManager->flushGraphics(); //acad 刷新
|
|
|
|
return true;
|
|
}
|
|
|