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