Files
envi-code/SourceCode/Code2026/Dimension/DrawSectionSymbol.cpp
T
2026-09-28 15:28:50 +08:00

1639 lines
49 KiB
C++

#include "StdAfx.h"
#include "globalFunc.h"
#include "DrawSectionSymbol.h"
#include "dbelipse.h"
#include <set>
#include "dbpipe.h"
#include "AecDbDimension.h"
#include "AecDbText.h"
extern AcDbObjectId InitLayer(const TCHAR *szLayer, BOOL bApplyChange = TRUE);
extern AcDbObjectId InitDimStyle(TDimStyle ds);
CDrawSectionSymbol::CDrawSectionSymbol()
{
m_pmapData = NULL;
}
void CDrawSectionSymbol::SetDataContainer(CDataContainer *pData)
{
if (pData != NULL)
{
m_pmapData = pData;
}
}
bool CDrawSectionSymbol::DrawPipe(const AcDbObjectId& idPipe, AcDbEntity*& pOutEnt)
{
bool bRet = false;
CDbPipe *pPipe = NULL;
acdbOpenObject(pPipe, idPipe, AcDb::kForRead);
if (pPipe != NULL)
{
AcGePoint3d ptS, ptE;
pPipe->getStartPoint(ptS);
pPipe->getEndPoint(ptE);
ptS.z = 0;
ptE.z = 0;
AcDbLine line1(ptS, ptE);
AcGePoint3d ptCutS, ptCutE;
if (m_pmapData->GetData(_T("CutS"), ptCutS) &&
m_pmapData->GetData(_T("CutE"), ptCutE))
{
ptCutS.z = 0.0;
ptCutE.z = 0.0;
AcDbLine line2(ptCutS, ptCutE); // 剖切线
AcGePoint3d ptInt;
if (IsIntersect(line1, line2, ptInt)) // 判断管线与剖切线是否相交
{
//求交点处标高
double dEle = 0.0;
double dI = pPipe->GetPipeGradient();
TPipeSys::FlowDirection dir = pPipe->GetFlowDir();
XPoint ptWell;
if(dir == TPipeSys::kFromStart)
{
dEle = pPipe->StartPoint().z ;
ptWell = pPipe->StartPoint();
}
else
{
dEle = pPipe->EndPoint().z ;
ptWell = pPipe->EndPoint();
}
ptWell.z = 0;
double nDistWell = ptInt.distanceTo(ptWell);
dEle = dEle - nDistWell * dI;
// 设置交点标高
ptInt.z = dEle;
// 坐标变换
AcGeVector3d vtView; //剖切方向
if (m_pmapData->GetData(_T("vtView"), vtView))
{
AcGePlane plane(ptCutS, vtView); //以剖切0点,剖切方向,确定投影面
AcGePoint3d ptOrigin;
AcGeVector3d vtNormal(0,0,1);
AcGeVector3d vtToX(1,0,0);
AcGeVector3d vtToY(0,1,0);
//顺着剖切的方向是Y轴,根据右手定则,与z轴差乘是X轴
AcGeMatrix3d mat;
AcGeVector3d vtFromX = vtView.crossProduct(vtNormal);
mat.setToAlignCoordSys(ptOrigin, vtFromX, vtView, vtNormal, ptOrigin, vtToX, vtToY, vtNormal);
//把投影到PLANE的结果,坐标转换到正常坐标,因为有高度,所以再旋转90度
AcGeMatrix3d matWcs;
matWcs.setToRotation(-PI/2, AcGeVector3d::kXAxis);
ptInt.transformBy(mat);
ptInt.transformBy(matWcs);
ptInt.z = 0;
// 获取横纵比例系数
double dScaleX = 0.0, dScaleY = 0.0;
if (m_pmapData->GetData(_T("ScaleX"), dScaleX) &&
m_pmapData->GetData(_T("ScaleY"), dScaleY))
{
double dX = 1, dY = 1;
dX = GlobalFunc::DocGetPScale() / dScaleX;
dY = GlobalFunc::DocGetPScale() / dScaleY;
if (GlobalFunc::DocGetMeterUnitDraw())
{
int nType = -1;
m_pmapData->GetData(_T("Type"), nType);
if (nType == 0)
{
double dRoadEle = 0.0;
AcGePoint3d ptCus;
if (m_pmapData->GetData(_T("RoadEld"), dRoadEle)&& m_pmapData->GetData(_T("CutS"), ptCus))
{
ptCus.z = dRoadEle;
ptCus.transformBy(mat);
ptCus.transformBy(matWcs);
ptCus.z = 0;
ptInt.x = ptCus.x + (ptInt.x - ptCus.x) * 1000;
ptInt.y = ptCus.y + (ptInt.y - ptCus.y) * 1000;
}
}
else if (nType == 1)
{
AcGePoint3d ptMid;
if (m_pmapData->GetData(_T("RoadMidPt"), ptMid))
{
ptMid.transformBy(mat);
ptMid.transformBy(matWcs);
ptMid.z = 0;
ptInt.x = ptMid.x + (ptInt.x - ptMid.x) * 1000;
ptInt.y = ptMid.y + (ptInt.y - ptMid.y) * 1000;
}
}
}
ptInt.x *= dX;
ptInt.y *= dY;
ptInt = GlobalFunc::Ucs2Wcs(ptInt);
m_mapPipe.insert(std::make_pair(idPipe, ptInt));
// 绘制管线切面图
AcDbEllipse *pEllipse = NULL;
double dRadius = GlobalFunc::GetPipeOutDByDn(pPipe->GetMaterial(), pPipe->GetDnDiameter()) / 2.0;
CString strLayerName = pPipe->GetLayer();
if (dScaleX < dScaleY)
{
AcGeVector3d vt = GlobalFunc::Ucs2Wcs(AcGeVector3d::kXAxis, true);
vt *= dRadius * GlobalFunc::DocGetPScale() / dScaleY;
pEllipse =new AcDbEllipse(ptInt,
AcGeVector3d::kZAxis,
vt,
dScaleX / dScaleY);
}
else
{
AcGeVector3d vt = GlobalFunc::Ucs2Wcs(AcGeVector3d::kYAxis, true);
vt *= dRadius * GlobalFunc::DocGetPScale() / dScaleX;
pEllipse =new AcDbEllipse(ptInt,
AcGeVector3d::kZAxis,
vt,
dScaleY / dScaleX);
}
pEllipse->setLayer(strLayerName);
pOutEnt = pEllipse;
bRet = true;
}
}
}
}
pPipe->close();
}
return bRet;
}
bool CDrawSectionSymbol::DrawText(const AcGePoint3d &ptLoc,LPCTSTR pszText, BOOL bDir, AcDbEntity*& pOutText)
{
bool bRet = false;
double dH = 7.0;
double dWidth = GlobalFunc::DocGetPScale();
if (GlobalFunc::DocGetMeterUnitDraw())
{
dH = 10;
dWidth = 10.0 * GlobalFunc::DocGetPScale();
}
if (pszText != NULL)
{
double dAngle = GlobalFunc::Ucs2Wcs(0.0);
if (bDir)
{
AcDbText *pText = new AcDbText;
AcDbObjectId idTextStyle=GlobalFunc::InitTwtTextStyle(_T("STANDARD"));
pText->setTextStyle(idTextStyle);
pText->setHorizontalMode(AcDb::kTextCenter);
pText->setVerticalMode(AcDb::kTextBase);
pText->setTextString(pszText);
pText->setHeight(dH * GlobalFunc::DocGetPScale());
pText->setRotation(GlobalFunc::Ucs2Wcs(0.0));
pText->setAlignmentPoint(ptLoc);
pText->setPosition(ptLoc);
pText->setColorIndex(7);
pOutText = pText;
}
else
{
AcDbMText *pText = new AcDbMText;
AcDbObjectId idTextStyle=GlobalFunc::InitTwtTextStyle(_T("STANDARD"));
pText->setTextStyle(idTextStyle);
pText->setTextHeight(dH * GlobalFunc::DocGetPScale());
pText->setWidth(dWidth);
pText->setRotation(0.0);
pText->setContents(pszText);
pText->setLocation(ptLoc);
pText->setColorIndex(7);
pOutText = pText;
}
bRet = true;
}
return bRet;
}
bool CDrawSectionSymbol::DrawArrow(AcDbEntity*& pArrow)
{
bool bRet = false;
int nType = -1;
m_pmapData->GetData(_T("Type"), nType);
if (nType == 1) // 选择了中心线
{
// 获取剖切点,剖切方向
AcGePoint3d ptS, ptE;
AcGeVector3d vtView;
if (!(m_pmapData->GetData(_T("CutS"), ptS)&&
m_pmapData->GetData(_T("CutE"), ptE)&&
m_pmapData->GetData(_T("vtView"), vtView)))
{
return false;
}
AcGePlane plane(ptS, vtView); //以剖切0点,剖切方向,确定投影面
AcGePoint3d ptOrigin;
AcGeVector3d vtNormal(0,0,1);
AcGeVector3d vtToX(1,0,0);
AcGeVector3d vtToY(0,1,0);
//顺着剖切的方向是Y轴,根据右手定则,与z轴差乘是X轴
AcGeMatrix3d mat;
AcGeVector3d vtFromX = vtView.crossProduct(vtNormal);
mat.setToAlignCoordSys(ptOrigin, vtFromX, vtView, vtNormal, ptOrigin, vtToX, vtToY, vtNormal);
//把投影到PLANE的结果,坐标转换到正常坐标,因为有高度,所以再旋转90度
AcGeMatrix3d matWcs;
matWcs.setToRotation(-PI/2, vtToX);
double dUnitMeter = 1000;
// 比例系数
double dX = 1, dY = 1;
GetScaleXY(dX, dY);
dX = GlobalFunc::DocGetPScale() / dX;
dY = GlobalFunc::DocGetPScale() / dY;
AcGePoint3d ptMid;
double dRoadMidEle = 0.0;
if (!m_pmapData->GetData(_T("RoadMidPt"), ptMid)) // 道路中心线点
{
return false;
}
ptMid.transformBy(mat);
ptMid.transformBy(matWcs);
ptMid.z = 0.0;
ptMid.x *= dX;
ptMid.y *= dY;
double dVal = 0.0;
GetMaxVal(dVal); // 道牙最大值
AcGePoint3d ptDraw; // 箭头起点
ptDraw = ptMid + vtToY * (2 * dUnitMeter + dVal) * dY;
AcGePoint2d pt1, pt2, pt3, pt4;
pt1 = ptDraw.convert2d(AcGePlane::kXYPlane);
pt2 = (ptDraw + vtToY * 0.3 * dUnitMeter * dY).convert2d(AcGePlane::kXYPlane);
pt3 = (ptDraw + vtToY * 0.3 * dUnitMeter * dY).convert2d(AcGePlane::kXYPlane);
pt4 = (ptDraw + vtToY * 0.45 * dUnitMeter * dY).convert2d(AcGePlane::kXYPlane);
pt1 = GlobalFunc::Ucs2Wcs(pt1);
pt2 = GlobalFunc::Ucs2Wcs(pt2);
pt3 = GlobalFunc::Ucs2Wcs(pt3);
pt4 = GlobalFunc::Ucs2Wcs(pt4);
AcDbPolyline *pPoly = new AcDbPolyline();
pPoly->addVertexAt(0, pt1, 0, 0.8 * dUnitMeter * dX, 0.8 * dUnitMeter * dX);
pPoly->addVertexAt(1, pt2, 0, 0.8 * dUnitMeter * dX, 0.8 * dUnitMeter * dX);
pPoly->addVertexAt(2, pt3, 0, 1.6 * dUnitMeter * dX, 0);
pPoly->addVertexAt(3, pt4);
pPoly->setColorIndex(1);
pArrow = pPoly;
bRet = true;
}
return bRet;
}
bool CDrawSectionSymbol::DrawDivision(AcDbVoidPtrArray& arPtr)
{
bool bRet = false;
int nType = -1;
m_pmapData->GetData(_T("Type"), nType);
if (nType == 1) // 选择了中心线
{
// 获取剖切点,剖切方向
AcGePoint3d ptS, ptE;
AcGeVector3d vtView;
if (!(m_pmapData->GetData(_T("CutS"), ptS)&&
m_pmapData->GetData(_T("CutE"), ptE)&&
m_pmapData->GetData(_T("vtView"), vtView)))
{
return false;
}
AcGePlane plane(ptS, vtView); //以剖切0点,剖切方向,确定投影面
AcGePoint3d ptOrigin;
AcGeVector3d vtNormal(0,0,1);
AcGeVector3d vtToX(1,0,0);
AcGeVector3d vtToY(0,1,0);
//顺着剖切的方向是Y轴,根据右手定则,与z轴差乘是X轴
AcGeMatrix3d mat;
AcGeVector3d vtFromX = vtView.crossProduct(vtNormal);
mat.setToAlignCoordSys(ptOrigin, vtFromX, vtView, vtNormal, ptOrigin, vtToX, vtToY, vtNormal);
//把投影到PLANE的结果,坐标转换到正常坐标,因为有高度,所以再旋转90度
AcGeMatrix3d matWcs;
matWcs.setToRotation(-PI/2, vtToX);
double dUnitMeter = 1000;
// 比例系数
double dX = 1, dY = 1;
GetScaleXY(dX, dY);
dX = GlobalFunc::DocGetPScale() / dX;
dY = GlobalFunc::DocGetPScale() / dY;
AcGePoint3d ptMid;
double dRoadMidEle = 0.0;
if (!m_pmapData->GetData(_T("RoadMidPt"), ptMid)) // 道路中心线点
{
return false;
}
ptMid.transformBy(mat);
ptMid.transformBy(matWcs);
ptMid.z = 0.0;
ptMid.x *= dX;
ptMid.y *= dY;
AcGePoint3d ptDraw; // 箭头起点
ptDraw = ptMid;
double dVal = 0.0;
GetMaxVal(dVal); // 道牙最大值
AcDbLine *pLine = new AcDbLine(GlobalFunc::Ucs2Wcs(ptDraw + vtToY * (0.5 * dUnitMeter + dVal) * dY) , GlobalFunc::Ucs2Wcs(ptDraw - vtToY * 0.5 * dUnitMeter * dY));
pLine->setColorIndex(2);
arPtr.append(pLine);
pLine = new AcDbLine(GlobalFunc::Ucs2Wcs(ptDraw+vtToY * (dUnitMeter + dVal) * dY), GlobalFunc::Ucs2Wcs(ptDraw + vtToY * (1.5 * dUnitMeter + dVal) * dY));
pLine->setColorIndex(2);
arPtr.append(pLine);
double dWayWidth = 0.0; // 道路宽度
std::set<double> setWay;
GetWayInfo(dWayWidth,setWay); // 获得道路宽度,道路各个部分距道路一端的距离
AcGePoint3d ptBase = ptDraw + vtToY * (dUnitMeter + dVal) * dY - vtToX * dWayWidth / 2;
std::set<double>::iterator it;
for (it = setWay.begin(); it != setWay.end(); it++)
{
ptS = ptBase + vtToX * (*it) * dUnitMeter;
ptE = ptS + vtToY * 0.5 * dUnitMeter * dY;
ptS = GlobalFunc::Ucs2Wcs(ptS);
ptE = GlobalFunc::Ucs2Wcs(ptE);
pLine = new AcDbLine(ptS, ptE);
pLine->setColorIndex(7);
arPtr.append(pLine);
}
bRet = true;
}
return bRet;
}
bool CDrawSectionSymbol::DrawRoadway(AcDbPolyline*& pOutLine, AcDbVoidPtrArray& arSplitLine, AcDbVoidPtrArray& arSubPtr, BOOL bCreateSub)
{
// 获取剖切点,剖切方向
AcGePoint3d ptS, ptE;
AcGeVector3d vtView;
if (!(m_pmapData->GetData(_T("CutS"), ptS)&&
m_pmapData->GetData(_T("CutE"), ptE)&&
m_pmapData->GetData(_T("vtView"), vtView)))
{
return false;
}
AcGePlane plane(ptS, vtView); //以剖切0点,剖切方向,确定投影面
AcGePoint3d ptOrigin;
AcGeVector3d vtNormal(0,0,1);
AcGeVector3d vtToX(1,0,0);
AcGeVector3d vtToY(0,1,0);
//顺着剖切的方向是Y轴,根据右手定则,与z轴差乘是X轴
AcGeMatrix3d mat;
AcGeVector3d vtFromX = vtView.crossProduct(vtNormal);
mat.setToAlignCoordSys(ptOrigin, vtFromX, vtView, vtNormal, ptOrigin, vtToX, vtToY, vtNormal);
//把投影到PLANE的结果,坐标转换到正常坐标,因为有高度,所以再旋转90度
AcGeMatrix3d matWcs;
matWcs.setToRotation(-PI/2, vtToX);
double dUnitMeter = 1000;
// 比例系数
double dX = 1, dY = 1;
GetScaleXY(dX, dY);
dX = GlobalFunc::DocGetPScale() / dX;
dY = GlobalFunc::DocGetPScale() / dY;
bool bRet = false;
int nType = -1;
m_pmapData->GetData(_T("Type"), nType);
if (nType == 0) // 未选择中心线
{
double dRoadEle = 0.0;
if (m_pmapData->GetData(_T("RoadEld"), dRoadEle)) // 获取道路标高
{
ptS.transformBy(mat);
ptS.transformBy(matWcs);
ptE.transformBy(mat);
ptE.transformBy(matWcs);
ptS.z = 0.0;
ptE.z = 0.0;
ptS.y = dRoadEle * dUnitMeter;
ptE.y = dRoadEle * dUnitMeter;
// 绘制道路线
AcGePoint3d pt1 = ptS, pt2 = ptE;
if (GlobalFunc::DocGetMeterUnitDraw())
{
pt1.y = dRoadEle;
pt1.x *= dX;
pt1.y *= dY;
double dLen = ptS.distanceTo(ptE);
pt2 = pt1 + vtToX * ptS.distanceTo(ptE) * 1000 * dX;
}
else
{
pt1.x *= dX;
pt1.y *= dY;
pt2.x *= dX;
pt2.y *= dY;
}
pt1 = GlobalFunc::Ucs2Wcs(pt1);
pt2 = GlobalFunc::Ucs2Wcs(pt2);
AcDbPolyline *pPoly = new AcDbPolyline();
pPoly->addVertexAt(0, pt1.convert2d(AcGePlane::kXYPlane));
pPoly->addVertexAt(1, pt2.convert2d(AcGePlane::kXYPlane));
pPoly->setColorIndex(7);
pOutLine = pPoly;
bRet = true;
// 绘制边界线
if (!bCreateSub)
{
DrawWayBorder(pt1, pt2, arSubPtr);
}
}
}
else if (nType == 1) // 选择了中心线
{
int nBlockType = -1;
if (m_pmapData->GetData(_T("BlockType"), nBlockType)) // 板块类型
{
AcGePoint3d ptMid;
double dRoadMidEle = 0.0;
if (!m_pmapData->GetData(_T("RoadMidPt"), ptMid)) // 道路中心线点
{
return false;
}
ptMid.transformBy(mat);
ptMid.transformBy(matWcs);
ptMid.z = 0.0;
ptMid.x *= dX;
ptMid.y *= dY;
AcGeVector3d vtY = AcGeVector3d::kYAxis;
AcGeVector3d vtX = AcGeVector3d::kXAxis;
AcGePoint3d ptRoadLeft, ptRoadRight; // 道路端点
AcGePoint3dArray arPt;
if (nBlockType == 0) // 简单类型
{
arPt.setLogicalLength(3);
double dGrad = 0.0; // 车行道坡度
double dWidth = 0.0; // 车行道宽度
if (m_pmapData->GetData(_T("CarRoadWidth"), dWidth) &&
m_pmapData->GetData(_T("CarRoadGradient"), dGrad))
{
dWidth *= dUnitMeter * dX;
dGrad /= 100;
AcGePoint3d pt1, pt2;
pt1 = ptMid - vtX * dWidth + vtY * (dWidth * dGrad);
pt2 = ptMid + vtX * dWidth + vtY * (dWidth * dGrad);
arPt[0] = GlobalFunc::Ucs2Wcs(pt1);
arPt[1] = GlobalFunc::Ucs2Wcs(ptMid);
arPt[2] = GlobalFunc::Ucs2Wcs(pt2);
ptRoadLeft = arPt[0];
ptRoadRight = arPt[2];
}
}
else if (nBlockType == 1) // 单块板路
{
arPt.setLogicalLength(7);
double dCarGrad = 0.0; // 车行道坡度
double dCarWidth = 0.0; // 车行道宽度
double dMenGrad = 0.0; // 人行道坡度
double dMenWidth = 0.0; // 人行道宽度
double dMenHeight = 0.0; // 人道牙高度
if (m_pmapData->GetData(_T("CarRoadWidth"), dCarWidth)&&
m_pmapData->GetData(_T("CarRoadGradient"), dCarGrad)&&
m_pmapData->GetData(_T("MenRoadWidth"), dMenWidth)&&
m_pmapData->GetData(_T("MenRoadGrad"), dMenGrad)&&
m_pmapData->GetData(_T("MenHeight"), dMenHeight))
{
dCarGrad /= 100;
dCarWidth *= dUnitMeter * dX;
dMenGrad /= 100;
dMenWidth *= dUnitMeter * dX;
dMenHeight *= dUnitMeter * dY;
AcGePoint3d pt1, pt2, pt3, pt4, pt5, pt6;
pt1 = ptMid - vtX * dCarWidth + vtY * (dCarWidth * dCarGrad);
pt2 = ptMid + vtX * dCarWidth + vtY * (dCarWidth * dCarGrad);
pt3 = pt1 + vtY * dMenHeight;
pt4 = pt2 + vtY * dMenHeight;
pt5 = pt3 - vtX * dMenWidth + vtY * (dMenWidth * dMenGrad);
pt6 = pt4 + vtX * dMenWidth + vtY * (dMenWidth * dMenGrad);
arPt[0] = GlobalFunc::Ucs2Wcs(pt5);
arPt[1] = GlobalFunc::Ucs2Wcs(pt3);
arPt[2] = GlobalFunc::Ucs2Wcs(pt1);
arPt[3] = GlobalFunc::Ucs2Wcs(ptMid);
arPt[4] = GlobalFunc::Ucs2Wcs(pt2);
arPt[5] = GlobalFunc::Ucs2Wcs(pt4);
arPt[6] = GlobalFunc::Ucs2Wcs(pt6);
ptRoadLeft = arPt[0];
ptRoadRight = arPt[6];
}
}
else if (nBlockType == 2) // 两块板路
{
arPt.setLogicalLength(11);
double dGreenGrad = 0.0; // 绿化带坡度
double dGreenWidth = 0.0; // 绿化带宽度
double dCarGrad = 0.0; // 车行道坡度
double dCarWidth = 0.0; // 车行道宽度
double dMenGrad = 0.0; // 人行道坡度
double dMenWidth = 0.0; // 人行道宽度
double dMenHeight = 0.0; // 人道牙高度
double dSplitHeight = 0.0; // 分道牙高度
if (m_pmapData->GetData(_T("GreenGrad"), dGreenGrad)&&
m_pmapData->GetData(_T("GreenWidth"), dGreenWidth)&&
m_pmapData->GetData(_T("CarRoadWidth"), dCarWidth)&&
m_pmapData->GetData(_T("CarRoadGradient"), dCarGrad)&&
m_pmapData->GetData(_T("MenRoadWidth"), dMenWidth)&&
m_pmapData->GetData(_T("MenRoadGrad"), dMenGrad)&&
m_pmapData->GetData(_T("MenHeight"), dMenHeight)&&
m_pmapData->GetData(_T("SplitHeight"), dSplitHeight))
{
dGreenGrad /= 100;
dGreenWidth *= dUnitMeter * dX;
dCarGrad /= 100;
dCarWidth *= dUnitMeter * dX;
dMenGrad /= 100;
dMenWidth *= dUnitMeter * dX;
dMenHeight *= dUnitMeter * dY;
dSplitHeight *= dUnitMeter * dY;
AcGePoint3d pt1, pt2, pt3, pt4, pt5, pt6, pt7, pt8, pt9, pt10;
pt1 = ptMid - vtX * dGreenWidth + vtY * (dGreenWidth * dMenGrad);
pt2 = ptMid + vtX * dGreenWidth + vtY * (dGreenWidth * dMenGrad);
pt3 = pt1 - vtY * dSplitHeight;
pt4 = pt2 - vtY * dSplitHeight;
pt5 = pt3 - vtX * dCarWidth + vtY * (dCarWidth * dCarGrad);
pt6 = pt4 + vtX * dCarWidth + vtY * (dCarWidth * dCarGrad);
pt7 = pt5 + vtY * dMenHeight;
pt8 = pt6 + vtY * dMenHeight;
pt9 = pt7 - vtX * dMenWidth + vtY * (dMenWidth * dMenGrad);
pt10 = pt8 + vtX * dMenWidth + vtY * (dMenWidth * dMenGrad);
arPt[0] = GlobalFunc::Ucs2Wcs(pt9);
arPt[1] = GlobalFunc::Ucs2Wcs(pt7);
arPt[2] = GlobalFunc::Ucs2Wcs(pt5);
arPt[3] = GlobalFunc::Ucs2Wcs(pt3);
arPt[4] = GlobalFunc::Ucs2Wcs(pt1);
arPt[5] = GlobalFunc::Ucs2Wcs(ptMid);
arPt[6] = GlobalFunc::Ucs2Wcs(pt2);
arPt[7] = GlobalFunc::Ucs2Wcs(pt4);
arPt[8] = GlobalFunc::Ucs2Wcs(pt6);
arPt[9] = GlobalFunc::Ucs2Wcs(pt8);
arPt[10] = GlobalFunc::Ucs2Wcs(pt10);
ptRoadLeft = arPt[0];
ptRoadRight = arPt[10];
}
}
else if (nBlockType == 3) // 三块板路
{
arPt.setLogicalLength(15);
double dGreenGrad = 0.0; // 绿化带坡度
double dGreenWidth = 0.0; // 绿化带宽度
double dCarGrad = 0.0; // 车行道坡度
double dCarWidth = 0.0; // 车行道宽度
double dMenGrad = 0.0; // 人行道坡度
double dMenWidth = 0.0; // 人行道宽度
double dMenHeight = 0.0; // 人道牙高度
double dSplitHeight = 0.0; // 分道牙高度
double dNoCarWidth = 0.0; // 非机动车道宽度
double dNoCarGrad = 0.0; // 非机动车道坡度
if (m_pmapData->GetData(_T("GreenGrad"), dGreenGrad)&&
m_pmapData->GetData(_T("GreenWidth"), dGreenWidth)&&
m_pmapData->GetData(_T("CarRoadWidth"), dCarWidth)&&
m_pmapData->GetData(_T("CarRoadGradient"), dCarGrad)&&
m_pmapData->GetData(_T("MenRoadWidth"), dMenWidth)&&
m_pmapData->GetData(_T("MenRoadGrad"), dMenGrad)&&
m_pmapData->GetData(_T("MenHeight"), dMenHeight)&&
m_pmapData->GetData(_T("SplitHeight"), dSplitHeight) &&
m_pmapData->GetData(_T("NoCarWidth"), dNoCarWidth) &&
m_pmapData->GetData(_T("NoCarGrad"), dNoCarGrad))
{
dGreenGrad /= 100;
dGreenWidth *= dUnitMeter * dX;
dCarGrad /= 100;
dCarWidth *= dUnitMeter * dX;
dMenGrad /= 100;
dMenWidth *= dUnitMeter * dX;
dMenHeight *= dUnitMeter * dY;
dSplitHeight *= dUnitMeter * dY;
dNoCarGrad /= 100;
dNoCarWidth *= dUnitMeter * dX;
AcGePoint3d pt1, pt2, pt3, pt4, pt5, pt6, pt7, pt8, pt9, pt10, pt11, pt12, pt13, pt14;
pt1 = ptMid - vtX * dCarWidth + vtY * (dCarWidth * dCarGrad);
pt2 = ptMid + vtX * dCarWidth + vtY * (dCarWidth * dCarGrad);
pt3 = pt1 + vtY * dSplitHeight;
pt4 = pt2 + vtY * dSplitHeight;
pt5 = pt3 - vtX * dGreenWidth + vtY * (dGreenWidth * dGreenGrad);
pt6 = pt4 + vtX * dGreenWidth + vtY * (dGreenWidth * dGreenGrad);
pt7 = pt5 - vtY * dSplitHeight;
pt8 = pt6 - vtY * dSplitHeight;
pt9 = pt7 - vtX * dNoCarWidth + vtY * (dNoCarWidth * dNoCarGrad);
pt10 = pt8 + vtX * dNoCarWidth + vtY * (dNoCarWidth * dNoCarGrad);
pt11 = pt9 + vtY * dMenHeight;
pt12 = pt10 + vtY * dMenHeight;
pt13 = pt11 - vtX * dMenWidth + vtY * (dMenWidth * dMenGrad);
pt14 = pt12 + vtX * dMenWidth + vtY * (dMenWidth * dMenGrad);
arPt[0] = GlobalFunc::Ucs2Wcs(pt13);
arPt[1] = GlobalFunc::Ucs2Wcs(pt11);
arPt[2] = GlobalFunc::Ucs2Wcs(pt9);
arPt[3] = GlobalFunc::Ucs2Wcs(pt7);
arPt[4] = GlobalFunc::Ucs2Wcs(pt5);
arPt[5] = GlobalFunc::Ucs2Wcs(pt3);
arPt[6] = GlobalFunc::Ucs2Wcs(pt1);
arPt[7] = GlobalFunc::Ucs2Wcs(ptMid);
arPt[8] = GlobalFunc::Ucs2Wcs(pt2);
arPt[9] = GlobalFunc::Ucs2Wcs(pt4);
arPt[10] = GlobalFunc::Ucs2Wcs(pt6);
arPt[11] = GlobalFunc::Ucs2Wcs(pt8);
arPt[12] = GlobalFunc::Ucs2Wcs(pt10);
arPt[13] = GlobalFunc::Ucs2Wcs(pt12);
arPt[14] = GlobalFunc::Ucs2Wcs(pt14);
ptRoadLeft = arPt[0];
ptRoadRight = arPt[14];
}
}
else if (nBlockType == 4) // 四块板路
{
arPt.setLogicalLength(19);
double dGreenGrad = 0.0; // 绿化带坡度
double dGreenWidth = 0.0; // 绿化带宽度
double dGreenGrad2 = 0.0; // 绿化带坡度
double dGreenWidth2 = 0.0; // 绿化带宽度
double dCarGrad = 0.0; // 车行道坡度
double dCarWidth = 0.0; // 车行道宽度
double dMenGrad = 0.0; // 人行道坡度
double dMenWidth = 0.0; // 人行道宽度
double dMenHeight = 0.0; // 人道牙高度
double dSplitHeight = 0.0; // 分道牙高度
double dNoCarWidth = 0.0; // 非机动车道宽度
double dNoCarGrad = 0.0; // 非机动车道坡度
if (m_pmapData->GetData(_T("GreenGrad"), dGreenGrad)&&
m_pmapData->GetData(_T("GreenWidth"), dGreenWidth)&&
m_pmapData->GetData(_T("GreenGrad2"), dGreenGrad2)&&
m_pmapData->GetData(_T("GreenWidth2"), dGreenWidth2)&&
m_pmapData->GetData(_T("CarRoadWidth"), dCarWidth)&&
m_pmapData->GetData(_T("CarRoadGradient"), dCarGrad)&&
m_pmapData->GetData(_T("MenRoadWidth"), dMenWidth)&&
m_pmapData->GetData(_T("MenRoadGrad"), dMenGrad)&&
m_pmapData->GetData(_T("MenHeight"), dMenHeight)&&
m_pmapData->GetData(_T("SplitHeight"), dSplitHeight) &&
m_pmapData->GetData(_T("NoCarWidth"), dNoCarWidth) &&
m_pmapData->GetData(_T("NoCarGrad"), dNoCarGrad))
{
dGreenGrad /= 100;
dGreenWidth *= dUnitMeter * dX;
dCarGrad /= 100;
dCarWidth *= dUnitMeter * dX;
dMenGrad /= 100;
dMenWidth *= dUnitMeter * dX;
dMenHeight *= dUnitMeter * dY;
dSplitHeight *= dUnitMeter * dY;
dNoCarGrad /= 100;
dNoCarWidth *= dUnitMeter * dX;
dGreenGrad2 /= 100;
dGreenWidth2 *= dUnitMeter * dX;
AcGePoint3d pt1, pt2, pt3, pt4, pt5, pt6, pt7, pt8, pt9,
pt10, pt11, pt12, pt13, pt14, pt15, pt16, pt17, pt18;
pt1 = ptMid - vtX * dGreenWidth + vtY * (dGreenWidth * dGreenGrad);
pt2 = ptMid + vtX * dGreenWidth + vtY * (dGreenWidth * dGreenGrad);
pt3 = pt1 - vtY * dSplitHeight;
pt4 = pt2 - vtY * dSplitHeight;
pt5 = pt3 - vtX * dCarWidth + vtY * (dCarWidth * dCarGrad);
pt6 = pt4 + vtX * dCarWidth + vtY * (dCarWidth * dCarGrad);
pt7 = pt5 + vtY * dSplitHeight;
pt8 = pt6 + vtY * dSplitHeight;
pt9 = pt7 - vtX * dGreenWidth2 + vtY * (dGreenWidth2 * dGreenGrad2);
pt10 = pt8 + vtX * dGreenWidth2 + vtY * (dGreenWidth2 * dGreenGrad2);
pt11 = pt9 - vtY * dSplitHeight;
pt12 = pt10 - vtY * dSplitHeight;
pt13 = pt11 - vtX * dNoCarWidth + vtY * (dNoCarWidth * dNoCarGrad);
pt14 = pt12 + vtX * dNoCarWidth + vtY * (dNoCarWidth * dNoCarGrad);
pt15 = pt13 + vtY * dMenHeight;
pt16 = pt14 + vtY * dMenHeight;
pt17 = pt15 - vtX * dMenWidth + vtY * (dMenWidth * dMenGrad);
pt18 = pt16 + vtX * dMenWidth + vtY * (dMenWidth * dMenGrad);
arPt[0] = GlobalFunc::Ucs2Wcs(pt17);
arPt[1] = GlobalFunc::Ucs2Wcs(pt15);
arPt[2] = GlobalFunc::Ucs2Wcs(pt13);
arPt[3] = GlobalFunc::Ucs2Wcs(pt11);
arPt[4] = GlobalFunc::Ucs2Wcs(pt9);
arPt[5] = GlobalFunc::Ucs2Wcs(pt7);
arPt[6] = GlobalFunc::Ucs2Wcs(pt5);
arPt[7] = GlobalFunc::Ucs2Wcs(pt3);
arPt[8] = GlobalFunc::Ucs2Wcs(pt1);
arPt[9] = GlobalFunc::Ucs2Wcs(ptMid);
arPt[10] = GlobalFunc::Ucs2Wcs(pt2);
arPt[11] = GlobalFunc::Ucs2Wcs(pt4);
arPt[12] = GlobalFunc::Ucs2Wcs(pt6);
arPt[13] = GlobalFunc::Ucs2Wcs(pt8);
arPt[14] = GlobalFunc::Ucs2Wcs(pt10);
arPt[15] = GlobalFunc::Ucs2Wcs(pt12);
arPt[16] = GlobalFunc::Ucs2Wcs(pt14);
arPt[17] = GlobalFunc::Ucs2Wcs(pt16);
arPt[18] = GlobalFunc::Ucs2Wcs(pt18);
ptRoadLeft = arPt[0];
ptRoadRight = arPt[18];
}
}
if (arPt.length() != 0)
{
AcDbPolyline *pPoly = new AcDbPolyline();
for (int i = 0; i < arPt.length(); i++)
{
pPoly->addVertexAt(i, arPt[i].convert2d(AcGePlane::kXYPlane));
}
pPoly->setColorIndex(7);
pOutLine = pPoly;
bRet = true;
// 绘制边界线
if (!bCreateSub)
{
DrawWayBorder(ptRoadLeft, ptRoadRight, arSubPtr);
}
}
}
}
if (bCreateSub)
{
// 绘制箭头
AcDbEntity *pEnt = NULL;
DrawArrow(pEnt);
arSubPtr.append((void *)pEnt);
//分割线
DrawDivision(arSplitLine);
//绘制文字
AcGePoint3d ptL, ptR, ptUp;
if (nType == 1) // 选择了中心线
{
AcGePoint3d ptMid;
double dRoadMidEle = 0.0;
if (!m_pmapData->GetData(_T("RoadMidPt"), ptMid)) // 道路中心线点
{
return false;
}
ptMid.transformBy(mat);
ptMid.transformBy(matWcs);
ptMid.z = 0.0;
ptMid.x *= dX;
ptMid.y *= dY;
double dVal = 0.0;
GetMaxVal(dVal); // 道牙最大值
std::set<double> data;
double dLen = 0.0;
GetWayInfo(dLen, data);
if (GlobalFunc::DocGetMeterUnitDraw())
{
dLen += dUnitMeter * dX;
ptUp = ptMid + vtToY * (2.6 * dUnitMeter + dVal) * dY - vtToX * 15 * GlobalFunc::DocGetPScale();
ptL = ptMid - vtToX * (dLen / 2 + 7 * GlobalFunc::DocGetPScale()) + vtToY * (2.5 * dUnitMeter + dVal) * dY;
ptR = ptMid + vtToX * dLen / 2 + vtToY * (2.5 * dUnitMeter + dVal) * dY;
}
else
{
dLen += dUnitMeter * dX;
ptUp = ptMid + vtToY * (2.6 * dUnitMeter + dVal) * dY - vtToX * 10 * GlobalFunc::DocGetPScale();
ptL = ptMid - vtToX * (dLen / 2 + 5 * GlobalFunc::DocGetPScale()) + vtToY * (2.5 * dUnitMeter + dVal) * dY;
ptR = ptMid + vtToX * dLen / 2 + vtToY * (2.5 * dUnitMeter + dVal) * dY;
}
DrawText(GlobalFunc::Ucs2Wcs(ptUp), _T("剖切方向"), TRUE, pEnt);
if (pEnt != NULL)
{
arSplitLine.append(pEnt);
}
DrawText(GlobalFunc::Ucs2Wcs(ptL), _T("道路左侧"), FALSE, pEnt);
if (pEnt != NULL)
{
arSplitLine.append(pEnt);
}
DrawText(GlobalFunc::Ucs2Wcs(ptR), _T("道路右侧"), FALSE, pEnt);
if (pEnt != NULL)
{
arSplitLine.append(pEnt);
}
}
}
return bRet;
}
inline bool CDrawSectionSymbol::IsIntersect(const AcDbLine &line1, const AcDbLine &line2, AcGePoint3d &ptInt)
{
AcGePoint3dArray arPt;
line1.intersectWith(&line2, AcDb::kOnBothOperands, arPt);
if (arPt.length() == 1)
{
ptInt = arPt[0];
return true;
}
return false;
}
bool CDrawSectionSymbol::DrawRoadDist(AcDbVoidPtrArray &arPtr)
{
bool bRet = false;
int nType = -1;
m_pmapData->GetData(_T("Type"), nType);
std::set<double> setData;
std::map<AcDbObjectId,AcGePoint3d>::iterator it;
double dMinY = 0.0, dMinX = 0.0;
for (it = m_mapPipe.begin(); it != m_mapPipe.end(); it++)
{
AcGePoint3d ptPipe = (*it).second;
ptPipe = GlobalFunc::Wcs2Ucs(ptPipe);
if (it == m_mapPipe.begin())
{
dMinX = ptPipe.x;
dMinY = ptPipe.y;
}
else
{
if (dMinY > ptPipe.y)
{
dMinY = ptPipe.y;
}
if (dMinX > ptPipe.x)
{
dMinX = ptPipe.x;
}
}
setData.insert(ptPipe.x);
}
double dUnitMeter = 1000;
// 比例系数
double dX = 1, dY = 1;
GetScaleXY(dX, dY);
dX = GlobalFunc::DocGetPScale() / dX;
dY = GlobalFunc::DocGetPScale() / dY;
double dDist = dUnitMeter;
AcGeVector3d vtX = AcGeVector3d::kXAxis;
if (nType == 0) // 未选择中心线
{
if (m_mapPipe.size() > 1)
{
AcGePoint3d ptBase(dMinX, dMinY - dDist * dY, 0.0);
std::set<double>::iterator iter;
AcGePoint3dArray arPt;
for (iter = setData.begin(); iter != setData.end(); iter++)
{
AcGePoint3d pt = ptBase + vtX * (*iter - dMinX);
pt = GlobalFunc::Ucs2Wcs(pt);
arPt.append(pt);
}
DrawLabel(arPt, arPtr); // 标注管线间距
// 绘制名称,比例
AcGeVector3d vtY = AcGeVector3d::kYAxis;
DrawNameInfo(GlobalFunc::Wcs2Ucs(arPt[0]) - vtY * dUnitMeter * dY, arPtr, true);
}
bRet = true;
}
else if (nType == 1) // 选择了中心线
{
// 获取剖切点,剖切方向,道路中心点
AcGePoint3d ptS, ptE, ptMid;
AcGeVector3d vtView;
double dRoadMidEle = 0.0;
if (m_pmapData->GetData(_T("CutS"), ptS)&&
m_pmapData->GetData(_T("CutE"), ptE)&&
m_pmapData->GetData(_T("vtView"), vtView)&&
m_pmapData->GetData(_T("RoadMidPt"), ptMid)&&
m_pmapData->GetData(_T("RoadEle"), dRoadMidEle))
{
AcGePlane plane(ptS, vtView); //以剖切0点,剖切方向,确定投影面
AcGePoint3d ptOrigin;
AcGeVector3d vtNormal(0,0,1);
AcGeVector3d vtToX(1,0,0);
AcGeVector3d vtToY(0,1,0);
//顺着剖切的方向是Y轴,根据右手定则,与z轴差乘是X轴
AcGeMatrix3d mat;
AcGeVector3d vtFromX = vtView.crossProduct(vtNormal);
mat.setToAlignCoordSys(ptOrigin, vtFromX, vtView, vtNormal, ptOrigin, vtToX, vtToY, vtNormal);
//把投影到PLANE的结果,坐标转换到正常坐标,因为有高度,所以再旋转90度
AcGeMatrix3d matWcs;
matWcs.setToRotation(-PI/2, vtToX);
ptMid.transformBy(mat);
ptMid.transformBy(matWcs);
ptMid.z = 0.0; // 道路中心点
ptMid.x *= dX;
ptMid.y *= dY;
AcGePoint3d ptTemp(ptMid.x, dMinY - dDist * dY, 0.0);
double dWayWidth = 0.0; // 道路宽度
std::set<double> setWay;
GetWayInfo(dWayWidth,setWay, true); // 获得道路宽度,道路各个部分距道路一端的距离
AcGePoint3d ptBase = ptTemp - vtToX * dWayWidth / 2;
// 管线道路标注
std::set<double> setData;
std::set<double>::iterator it2;
for(it2 = setWay.begin(); it2 != setWay.end(); it2++)
{
setData.insert((*it2) * dUnitMeter);
}
for (it = m_mapPipe.begin(); it != m_mapPipe.end(); it++)
{
AcGePoint3d pt = (*it).second;
pt = GlobalFunc::Wcs2Ucs(pt);
setData.insert(pt.x - ptBase.x);
}
AcGePoint3dArray arPt;
for (it2 = setData.begin(); it2 != setData.end(); it2++)
{
AcGePoint3d pt = ptBase + vtX * (*it2);
pt = GlobalFunc::Ucs2Wcs(pt);
arPt.append(pt);
}
DrawLabel(arPt, arPtr);
// 道路标注
setWay.clear();
GetWayInfo(dWayWidth,setWay);
arPt.setLogicalLength(0);
for (it2 = setWay.begin(); it2 != setWay.end(); it2++)
{
AcGePoint3d pt = ptBase + vtX * (*it2) * dUnitMeter - AcGeVector3d::kYAxis * 0.5 * dUnitMeter * dY;
pt = GlobalFunc::Ucs2Wcs(pt);
arPt.append(pt);
}
DrawLabel(arPt, arPtr);
//道路总长标注
if (setWay.size() >= 2)
{
arPt.setLogicalLength(0);
it2 = setWay.begin();
AcGePoint3d pt1 = ptBase + vtX * (*it2) * dUnitMeter - AcGeVector3d::kYAxis * dUnitMeter * dY;
arPt.append(GlobalFunc::Ucs2Wcs(pt1));
it2 = setWay.end();
--it2;
AcGePoint3d pt2 = ptBase + vtX * (*it2) * dUnitMeter - AcGeVector3d::kYAxis * dUnitMeter * dY;
arPt.append(GlobalFunc::Ucs2Wcs(pt2));
DrawLabel(arPt, arPtr);
}
// 绘制管线信息
AcGePoint3d ptS, ptE;
ptS = ptBase - vtToY * 2.5 * dUnitMeter * dY;
ptE = ptS + vtToX * dWayWidth;
ptS = GlobalFunc::Ucs2Wcs(ptS);
ptE = GlobalFunc::Ucs2Wcs(ptE);
AecDbDimension* pDim = new AecDbDimension;
pDim->setLayer(InitLayer(_T("TWT_DIM")));
pDim->SetPScale(0.08 * GlobalFunc::DocGetPScale());
pDim->SetLocation(arPt[0]);
pDim->SetDist2DimLine(-2.0 * dUnitMeter * dY, FALSE);
pDim->SetStyleId(InitDimStyle(DS_LINEAR));
pDim->SetRotation(GlobalFunc::Ucs2Wcs(0.0));
pDim->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
pDim->AddSegment(ptS);
pDim->AddSegment(ptE);
pDim->SetTextContent(0, _T(" "));
arPtr.append((void*)pDim);
ptS = GlobalFunc::Wcs2Ucs(ptS);
std::map<AcDbObjectId, AcGePoint3d> mapData;
for (it = m_mapPipe.begin(); it != m_mapPipe.end(); it++)
{
AcGePoint3d ptPipe = GlobalFunc::Wcs2Ucs((*it).second);
AcGePoint3d pt = ptS + vtX * (ptPipe.x - ptS.x) - vtToY * 0.4 * dUnitMeter * dY;
pt = GlobalFunc::Ucs2Wcs(pt);
mapData.insert(std::make_pair((*it).first, pt));
}
DrawPipeInfo(mapData, arPtr);
// 绘制名称,比例
AcGeVector3d vtY = AcGeVector3d::kYAxis;
DrawNameInfo(ptS - vtY * dUnitMeter * dY + vtX * dWayWidth / 2, arPtr);
// 绘制道路中心线
ptS = ptMid + vtToY * 2.0 * dUnitMeter * dY;
ptE = ptMid - vtToY * (ptMid.y - ptBase.y + 0.7 * dUnitMeter * dY) ;
ptS = GlobalFunc::Ucs2Wcs(ptS);
ptE = GlobalFunc::Ucs2Wcs(ptE);
AcDbLine *pLine = new AcDbLine(ptS, ptE);
pLine->setLayer(InitLayer(_T("TWT_室外")));
pLine->setLinetype(_T("DASH"));
pLine->setColorIndex(7);
arPtr.append((void *)pLine);
}
}
return bRet;
}
bool CDrawSectionSymbol::DrawLabel(const AcGePoint3dArray &arPt, AcDbVoidPtrArray &arPtr)
{
if (arPt.length() < 2)
{
return false;
}
double dUnitMeter = 1000;
// 比例系数
double dX = 1 , dY = 1;
GetScaleXY(dX, dY);
dX = dX / GlobalFunc::DocGetPScale();
dY = GlobalFunc::DocGetPScale() / dY;
AecDbDimension* pDim = new AecDbDimension;
pDim->setLayer(InitLayer(_T("TWT_DIM")));
pDim->SetPScale(0.8 * GlobalFunc::DocGetPScale());
pDim->SetLocation(arPt[0]);
pDim->SetDist2DimLine(-0.5 * dUnitMeter * dY, FALSE);
pDim->SetStyleId(InitDimStyle(DS_LINEAR));
pDim->SetRotation(GlobalFunc::Ucs2Wcs(0.0));
pDim->SetLayoutRotation(GlobalFunc::Ucs2Wcs(0.0));
CString strLabel;
pDim->AddSegment(arPt[0]);
for (int i = 1; i < arPt.length(); i++)
{
pDim->AddSegment(arPt[i]);
double dDist = arPt[i-1].distanceTo(arPt[i]) / dUnitMeter * dX;
strLabel.Format(_T("%.2f"), dDist);
int nIndex = strLabel.GetLength() - 1;
if (!strLabel.IsEmpty() && strLabel.GetAt(nIndex) == _T('0'))
{
strLabel.SetAt(nIndex,_T(' '));
}
pDim->SetTextContent(i-1,strLabel);
}
arPtr.append((void*)pDim);
return true;
}
bool CDrawSectionSymbol::DrawNameInfo(const AcGePoint3d &ptText, AcDbVoidPtrArray &arPtr, bool bGeneral)
{
bool bRet = false;
CString strNumber;
double dScaleX = 0.0, dScaleY = 0.0;
if (m_pmapData->GetData(_T("ScaleX"), dScaleX)&&
m_pmapData->GetData(_T("ScaleY"), dScaleY)&&
m_pmapData->GetData(_T("Number"), strNumber))
{
double dUnitMeter = 1000;
double dH = 1.0;
// 比例系数
double dX = 1, dY = 1;
GetScaleXY(dX, dY);
dX = GlobalFunc::DocGetPScale() / dX;
dY = GlobalFunc::DocGetPScale() / dY;
CString strText = strNumber + _T("-") + strNumber + _T(" 标准横断面图");
AecXDbText *pText1 = new AecXDbText;
AcDbObjectId idTextStyle=GlobalFunc::InitTwtTextStyle(g_Option::instance().g_csSheetStyle);
pText1->SetStyleId(idTextStyle);
pText1->SetHeight(5.0);
pText1->setColorIndex(7);
if (bGeneral)
{
pText1->SetAlignment(AcGiDraw::kTopLeft);
}
else
{
pText1->SetAlignment(AcGiDraw::kMiddleCenter);
}
pText1->SetRotation(GlobalFunc::Ucs2Wcs(0.0));
pText1->SetText(strText);
pText1->setLayer(InitLayer(_T("TWT_室外")));
pText1->SetLocation(GlobalFunc::Ucs2Wcs(ptText));
arPtr.append((void*)pText1);
double dWidth = 0.0, dHeight = 0.0;
pText1->GetExtents(&dWidth, &dHeight);
AcGePoint3d ptS, ptE;
if (bGeneral)
{
ptS = ptText - AcGeVector3d::kYAxis * dHeight;
ptE = ptText + AcGeVector3d::kXAxis * dWidth - AcGeVector3d::kYAxis * dHeight;
ptS = GlobalFunc::Ucs2Wcs(ptS);
ptE = GlobalFunc::Ucs2Wcs(ptE);
AcDbPolyline *pLine = new AcDbPolyline();
pLine->addVertexAt(0, ptS.convert2d(AcGePlane::kXYPlane), 0, 20 * dY, 20 * dY);
pLine->addVertexAt(0, ptE.convert2d(AcGePlane::kXYPlane), 0, 20 * dY, 20 * dY);
pLine->setLayer(InitLayer(_T("TWT_室外")));
pLine->setColorIndex(7);
arPtr.append((void*)pLine);
}
else
{
ptS = ptText - AcGeVector3d::kXAxis * dWidth / 2 - AcGeVector3d::kYAxis * dHeight / 2;
ptE = ptText + AcGeVector3d::kXAxis * dWidth / 2 - AcGeVector3d::kYAxis * dHeight / 2;
ptS = GlobalFunc::Ucs2Wcs(ptS);
ptE = GlobalFunc::Ucs2Wcs(ptE);
AcDbPolyline *pLine = new AcDbPolyline();
pLine->addVertexAt(0, ptS.convert2d(AcGePlane::kXYPlane), 0, 20 * dY, 20 * dY);
pLine->addVertexAt(0, ptE.convert2d(AcGePlane::kXYPlane), 0, 20 * dY, 20 * dY);
pLine->setLayer(InitLayer(_T("TWT_室外")));
pLine->setColorIndex(7);
arPtr.append((void*)pLine);
}
if (fabs(dScaleX - dScaleY) < 1e-3)
{
strText.Empty();
strText.Format(_T("比例 1: %.3f"), dScaleX);
strText.TrimRight(_T("0"));
strText.TrimRight(_T("."));
}
else
{
CString strScale;
strScale.Format(_T("横 1: %.3f"), dScaleX);
strScale.TrimRight(_T("0"));
strScale.TrimRight(_T("."));
strText.Empty();
strText += strScale;
strScale.Format(_T("\\P纵 1: %.3f"), dScaleY);
strScale.TrimRight(_T("0"));
strScale.TrimRight(_T("."));
strText += strScale;
}
AcDbMText *pText2 = new AcDbMText;
idTextStyle=GlobalFunc::InitTwtTextStyle(g_Option::instance().g_csSheetStyle);
pText2->setTextStyle(idTextStyle);
pText2->setTextHeight(3.0 * GlobalFunc::DocGetPScale());
pText2->setColorIndex(7);
pText2->setRotation(GlobalFunc::Ucs2Wcs(0.0));
pText2->setContents(strText);
pText2->setRotation(0.0);
pText2->setLayer(InitLayer(_T("TWT_室外")));
if (bGeneral)
{
if (fabs(dScaleX - dScaleY) < 1e-3)
{
pText2->setLocation(GlobalFunc::Ucs2Wcs(ptText + AcGeVector3d::kXAxis * (dWidth + dHeight) - AcGeVector3d::kYAxis * dHeight / 4));
}
else
{
pText2->setLocation(GlobalFunc::Ucs2Wcs(ptText + AcGeVector3d::kXAxis * (dWidth + dHeight) + AcGeVector3d::kYAxis * dHeight / 4));
}
}
else
{
if (fabs(dScaleX - dScaleY) < 1e-3)
{
pText2->setLocation(GlobalFunc::Ucs2Wcs(ptText + AcGeVector3d::kXAxis * (dWidth / 2 + dHeight) + AcGeVector3d::kYAxis * dHeight / 4));
}
else
{
pText2->setLocation(GlobalFunc::Ucs2Wcs(ptText + AcGeVector3d::kXAxis * (dWidth / 2 + dHeight) + AcGeVector3d::kYAxis * dHeight * 3 / 4));
}
}
arPtr.append((void*)pText2);
bRet = true;
}
return bRet;
}
bool CDrawSectionSymbol::DrawWayBorder(const AcGePoint3d &ptL, const AcGePoint3d &ptR, AcDbVoidPtrArray& arPtr)
{
double dUnitMeter = 1000;
double dX = 1.0, dY = 1.0;
GetScaleXY(dX, dY);
dX = GlobalFunc::DocGetPScale() / dX;
dY = GlobalFunc::DocGetPScale() / dY;
AcGePoint3d pt1 = GlobalFunc::Wcs2Ucs(ptL);
AcGePoint3d pt2 = GlobalFunc::Wcs2Ucs(ptR);
AcGeVector3d vtX = AcGeVector3d::kXAxis;
AcGeVector3d vtY = AcGeVector3d::kYAxis;
AcGeVector3d vtL = vtX * dX, vtR = vtX * dX;
vtL.rotateBy(-PI / 4, AcGeVector3d::kZAxis);
vtR.rotateBy(PI / 4, AcGeVector3d::kZAxis);
AcDbLine *pLineLeft = new AcDbLine(GlobalFunc::Ucs2Wcs(pt1), GlobalFunc::Ucs2Wcs(pt1 + vtY * 2.0 * dUnitMeter * dY));
pLineLeft->setLayer(InitLayer(_T("TWT_室外")));
pLineLeft->setColorIndex(7);
AcDbLine *pLineRight = new AcDbLine(GlobalFunc::Ucs2Wcs(pt2), GlobalFunc::Ucs2Wcs(pt2 + vtY * 2.0 * dUnitMeter * dY));
pLineRight->setLayer(InitLayer(_T("TWT_室外")));
pLineRight->setColorIndex(7);
arPtr.append((void *)pLineLeft);
arPtr.append((void *)pLineRight);
AcDbLine *pLine1 = new AcDbLine(GlobalFunc::Ucs2Wcs(pt1 + vtY * 2.0 * dUnitMeter * dY + vtL * 0.2 * dUnitMeter), GlobalFunc::Ucs2Wcs(pt1 + vtY * 2.0 * dUnitMeter * dY - vtL * 0.2 * dUnitMeter));
pLine1->setLayer(InitLayer(_T("TWT_室外")));
pLine1->setColorIndex(7);
AcDbLine *pLine2 = new AcDbLine(GlobalFunc::Ucs2Wcs(pt2 + vtY * 2.0 * dUnitMeter * dY + vtR * 0.2 * dUnitMeter), GlobalFunc::Ucs2Wcs(pt2 + vtY * 2.0 * dUnitMeter * dY - vtR * 0.2 * dUnitMeter));
pLine2->setLayer(InitLayer(_T("TWT_室外")));
pLine2->setColorIndex(7);
arPtr.append((void *)pLine1);
arPtr.append((void *)pLine2);
return false;
}
bool CDrawSectionSymbol::GetWayInfo(double &dWayWidth, std::set<double> &setWay, bool bMidPt)
{
bool bRet = false;
int nBlockType = -1;
double dUnitMeter = 1000;
// 比例系数
double dX = 1, dY = 1;
GetScaleXY(dX, dY);
dX = GlobalFunc::DocGetPScale() / dX;
dY = GlobalFunc::DocGetPScale() / dY;
if (m_pmapData->GetData(_T("BlockType"), nBlockType)) // 板块类型
{
if (nBlockType == 0) // 简单类型
{
double dGrad = 0.0; // 车行道坡度
double dWidth = 0.0; // 车行道宽度
if (m_pmapData->GetData(_T("CarRoadWidth"), dWidth))
{
dWayWidth = dWidth * dUnitMeter * dX;
setWay.insert(0.0);
if (bMidPt)
{
setWay.insert(dWidth * dX);
}
setWay.insert(dWidth*2 * dX);
}
}
else if (nBlockType == 1) // 单块板路
{
double dCarWidth = 0.0; // 车行道宽度
double dMenWidth = 0.0; // 人行道宽度
if (m_pmapData->GetData(_T("CarRoadWidth"), dCarWidth)&&
m_pmapData->GetData(_T("MenRoadWidth"), dMenWidth))
{
dWayWidth = (dCarWidth + dMenWidth) * dUnitMeter * dX;
setWay.insert(0.0);
setWay.insert(dMenWidth * dX);
if (bMidPt)
{
setWay.insert((dMenWidth + dCarWidth) * dX);
}
setWay.insert((dMenWidth + dCarWidth * 2) * dX);
setWay.insert((dMenWidth * 2 + dCarWidth * 2) * dX);
}
}
else if (nBlockType == 2) // 两块板路
{
double dGreenWidth = 0.0; // 绿化带宽度
double dCarWidth = 0.0; // 车行道宽度
double dMenWidth = 0.0; // 人行道宽度
if (m_pmapData->GetData(_T("GreenWidth"), dGreenWidth)&&
m_pmapData->GetData(_T("CarRoadWidth"), dCarWidth)&&
m_pmapData->GetData(_T("MenRoadWidth"), dMenWidth))
{
dWayWidth = (dGreenWidth + dCarWidth + dMenWidth) * dUnitMeter * dX;
setWay.insert(0.0);
setWay.insert(dMenWidth * dX);
setWay.insert((dMenWidth + dCarWidth) * dX);
if (bMidPt)
{
setWay.insert((dMenWidth + dCarWidth + dGreenWidth) * dX);
}
setWay.insert((dMenWidth + dCarWidth + dGreenWidth * 2) * dX);
setWay.insert((dMenWidth + dCarWidth * 2 + dGreenWidth * 2) * dX);
setWay.insert((dMenWidth * 2 + dCarWidth * 2 + dGreenWidth * 2) * dX);
}
}
else if (nBlockType == 3) // 三块板路
{
double dGreenWidth = 0.0; // 绿化带宽度
double dCarWidth = 0.0; // 车行道宽度
double dMenWidth = 0.0; // 人行道宽度
double dNoCarWidth = 0.0; // 非机动车道宽度
if (m_pmapData->GetData(_T("GreenWidth"), dGreenWidth)&&
m_pmapData->GetData(_T("CarRoadWidth"), dCarWidth)&&
m_pmapData->GetData(_T("MenRoadWidth"), dMenWidth)&&
m_pmapData->GetData(_T("NoCarWidth"), dNoCarWidth))
{
dWayWidth = (dGreenWidth + dCarWidth + dMenWidth + dNoCarWidth) * dUnitMeter * dX;
setWay.insert(0.0);
setWay.insert(dMenWidth * dX);
setWay.insert((dMenWidth + dNoCarWidth) * dX);
setWay.insert((dMenWidth + dNoCarWidth + dGreenWidth) * dX);
if (bMidPt)
{
setWay.insert((dMenWidth + dNoCarWidth + dGreenWidth + dCarWidth) * dX);
}
setWay.insert((dMenWidth + dNoCarWidth + dGreenWidth + dCarWidth * 2) * dX);
setWay.insert((dMenWidth + dNoCarWidth + dGreenWidth * 2 + dCarWidth * 2) * dX);
setWay.insert((dMenWidth + dNoCarWidth * 2 + dGreenWidth * 2 + dCarWidth * 2) * dX);
setWay.insert((dMenWidth * 2 + dNoCarWidth * 2 + dGreenWidth * 2 + dCarWidth * 2) * dX);
}
}
else if (nBlockType == 4) // 四块板路
{
double dGreenWidth = 0.0; // 绿化带宽度
double dGreenWidth2 = 0.0; // 绿化带宽度
double dCarWidth = 0.0; // 车行道宽度
double dMenWidth = 0.0; // 人行道宽度
double dNoCarWidth = 0.0; // 非机动车道宽度
if (m_pmapData->GetData(_T("GreenWidth"), dGreenWidth)&&
m_pmapData->GetData(_T("GreenWidth2"), dGreenWidth2)&&
m_pmapData->GetData(_T("CarRoadWidth"), dCarWidth)&&
m_pmapData->GetData(_T("MenRoadWidth"), dMenWidth)&&
m_pmapData->GetData(_T("NoCarWidth"), dNoCarWidth))
{
dWayWidth = (dGreenWidth + dGreenWidth2 + dCarWidth + dMenWidth + dNoCarWidth) * dUnitMeter * dX;
setWay.insert(0.0);
setWay.insert(dMenWidth * dX);
setWay.insert((dMenWidth + dNoCarWidth) * dX);
setWay.insert((dMenWidth + dNoCarWidth + dGreenWidth2) * dX);
setWay.insert((dMenWidth + dNoCarWidth + dGreenWidth2 + dCarWidth) * dX);
if (bMidPt)
{
setWay.insert((dMenWidth + dNoCarWidth + dGreenWidth2 + dCarWidth + dGreenWidth) * dX);
}
setWay.insert((dMenWidth + dNoCarWidth + dGreenWidth2 + dCarWidth + dGreenWidth * 2) * dX);
setWay.insert((dMenWidth + dNoCarWidth + dGreenWidth2 + dCarWidth * 2 + dGreenWidth * 2) * dX);
setWay.insert((dMenWidth + dNoCarWidth + dGreenWidth2 * 2 + dCarWidth * 2 + dGreenWidth * 2) * dX);
setWay.insert((dMenWidth + dNoCarWidth * 2 + dGreenWidth2 * 2 + dCarWidth * 2 + dGreenWidth * 2) * dX);
setWay.insert((dMenWidth * 2 + dNoCarWidth * 2 + dGreenWidth2 * 2 + dCarWidth * 2 + dGreenWidth * 2) * dX);
}
}
dWayWidth *= 2;
}
return bRet;
}
bool CDrawSectionSymbol::DrawPipeInfo(const std::map<AcDbObjectId, AcGePoint3d>& mapData, AcDbVoidPtrArray& arPtr)
{
if (mapData.size() == 0)
{
return false;
}
std::map<AcDbObjectId,AcGePoint3d>::const_iterator it, it2;
CDbPipe *pPipe = NULL;
for (it = mapData.begin(); it != mapData.end(); it++)
{
it2 = m_mapPipe.find((*it).first);
if (it2 == m_mapPipe.end())
{
continue;
}
XPoint ptIns = (*it2).second;
acdbOpenObject(pPipe, (*it).first, AcDb::kForRead);
if (pPipe != NULL)
{
// 获取管子名称,规格,标高
TPipeSys::SysType sys;
CString strPipeType; // 管道类型
CString strPipeSpec; // 管道规格
double dHigh = 0.0; // 管道高程
CString strEle;
CString strHighType; // 标高类型
sys = pPipe->GetSysType();
CString strLabel = pPipe->GetLabel();
double dPipeDia = pPipe->GetDnDiameter();
CString strTmp;
strTmp.Format(_T("%.0f"), dPipeDia);
strPipeSpec = strLabel + strTmp;
strPipeType = GlobalFunc::GetPipeNameBySys(sys);
// cet 2013.1.24 modify 给水、中水、消防有低中高三种类型,名称不同
// if(strPipeType.Compare(_T("给水")) == 0 || strPipeType.Compare(_T("中水")) == 0
// || strPipeType.Compare(_T("消防")) == 0)
if(strPipeType.Find(_T("给水")) != -1 || strPipeType.Find(_T("中水")) != -1
|| strPipeType.Find(_T("消防")) != -1)
{
strHighType = _T("CEN"); // 管子中心的标高
}
else if (strPipeType.Compare(_T("污水")) == 0 || strPipeType.Compare(_T("废水")) == 0
|| strPipeType.Compare(_T("雨水")) == 0 || strPipeType.Compare(_T("其它管")) == 0)
{
strHighType = _T("BOT"); // 管内底标高
}
double dUnitMeter = 1000;
if(GlobalFunc::DocGetMeterUnitDraw())
{
dUnitMeter = 1.0;
}
double dH = 2.0;
double dI = pPipe->GetPipeGradient();
double dn = pPipe->GetDnDiameter();
int iMaterial = pPipe->GetMaterial();
CString csMat = GlobalFunc::GetPipeMaterialByIdx(iMaterial);
dn = GlobalFunc::GetPipeDjByDn(csMat, (int)dn); //内径
TPipeSys::FlowDirection dir = pPipe->GetFlowDir();
XPoint ptWell;
if(dir == TPipeSys::kFromStart)
{
if (strHighType.Compare(_T("CEN")) == 0)
{
dHigh = pPipe->StartPoint().z / dUnitMeter;
}
else
{
dHigh = pPipe->StartPoint().z / dUnitMeter - dn / 2;
}
ptWell = pPipe->StartPoint();
}
else
{
if (strHighType.Compare(_T("CEN")) == 0)
{
dHigh = pPipe->EndPoint().z / dUnitMeter;
}
else
{
dHigh = pPipe->EndPoint().z / dUnitMeter - dn / 2;
}
ptWell = pPipe->EndPoint();
}
ptWell.z = 0;
double nDistWell = ads_distance(ptIns, ptWell) / dUnitMeter;
dHigh = dHigh - nDistWell * dI;
strEle.Format(_T("%.3f"), dHigh);
strEle.TrimRight(_T("0"));
strEle.TrimRight(_T("."));
pPipe->close();
CString strText;
strPipeType.TrimRight(_T("管"));
strPipeType += _T("管");
strText = strPipeType + _T(" ") + strPipeSpec + _T(" 标高 ") + strEle;
AecXDbText *pText = new AecXDbText;
AcDbObjectId idTextStyle=GlobalFunc::InitTwtTextStyle(g_Option::instance().g_csSheetStyle);
pText->SetStyleId(idTextStyle);
pText->SetHeight(dH);
pText->SetAlignment(AcGiDraw::kBottomLeft);
pText->SetRotation(GlobalFunc::Ucs2Wcs(PI / 2));
pText->SetText(strText);
pText->setLayer(InitLayer(_T("TWT_室外")));
pText->SetLocation((*it).second);
pText->setColorIndex(7);
arPtr.append((void*)pText);
}
}
return true;
}
inline bool CDrawSectionSymbol::GetScaleXY(double &dX, double &dY)
{
if (m_pmapData->GetData(_T("ScaleX"), dX)&& m_pmapData->GetData(_T("ScaleY"), dY))
{
return true;
}
return false;
}
bool CDrawSectionSymbol::GetMaxVal(double &dMax)
{
bool bRet = false;
int nType = -1;
m_pmapData->GetData(_T("Type"), nType);
if (nType == 0) // 未选择中心线
{
dMax = 0.0;
bRet = true;
}
else if (nType == 1) // 选择了中心线
{
int nBlockType = -1;
if (m_pmapData->GetData(_T("BlockType"), nBlockType)) // 板块类型
{
if (nBlockType == 0) // 简单类型
{
dMax = 0.0;
bRet = true;
}
else if (nBlockType == 1) // 单块板路
{
double dMenHeight = 0.0;
if (m_pmapData->GetData(_T("MenHeight"), dMenHeight))
{
dMax = fabs(dMenHeight);
bRet = true;
}
}
else if (nBlockType == 2 || nBlockType == 3 || nBlockType == 4) // 两块板路 三块板路 四块板路
{
double dMenHeight = 0.0;
double dSplitHeight = 0.0;
if (m_pmapData->GetData(_T("MenHeight"), dMenHeight)&&
m_pmapData->GetData(_T("SplitHeight"), dSplitHeight))
{
if (fabs(dMenHeight) > fabs(dSplitHeight))
{
dMax = fabs(dMenHeight);
}
else
{
dMax = fabs(dSplitHeight);
}
bRet = true;
}
}
}
dMax *= 1000;
}
return bRet;
}