public void GenerateFetchedObjects(int roomId, GameObject parent, RotateText loadingText = null) { if (loadingText != null) { loadingText.StartRotation("Loading Objects..."); } RestClient.Get <RoomPlan>($"{_urlBase}/RoomPlans/{roomId}").Then(roomPlan => { foreach (var wallBlock in roomPlan.wallBlocks) { GameObject wallInstance = Instantiate(_wallPrefab, new Vector3(wallBlock.positionX * scalePosX, 0, wallBlock.positionY * scalePosY), Quaternion.Euler(0, wallBlock.rotation, 0)); // wallInstance.transform.localScale = new Vector3(1f, 1, 1f); wallInstance.transform.parent = parent.transform; } if (loadingText != null) { loadingText.StopRotation(); } //move parent root parent.transform.Translate(-1.5f, -0.5f, -1.5f); }).Catch(error => { if (loadingText != null) { loadingText.StartRotation(error.Message); } }); }
private void DrawHDM() { try { if (this.bmp != null) { this.bmp.Dispose(); this.bmp = null; } if (this.g != null) { this.g.Dispose(); this.bmp = null; } this.bmp = new Bitmap(this.bmpWidth, this.bmpheight); this.g = Graphics.FromImage(bmp); this.g.Clear(Color.White); // 外廓线 Pen pen = new Pen(Color.Black, 4); int outlineXOrigin = left; int outlineYOrigin = top + titleHeight; int outlineWidth = this.bmpWidth - outlineXOrigin - right; int outlineHeight = this.bmpheight - outlineYOrigin - bottom; this.g.DrawRectangle(pen, outlineXOrigin, outlineYOrigin, outlineWidth, outlineHeight); // 标题 Font font = new Font("黑体", 16); SolidBrush brush = new SolidBrush(Color.Black); SizeF vSizeF = g.MeasureString(this.mapname, font); int pxMapName = (int)vSizeF.Width; g.DrawString(this.mapname, font, brush, outlineXOrigin + (outlineWidth - pxMapName) / 2, 3); // 所在道路 font = new Font("Times New Roman", 9); g.DrawString("所在道路:" + roadname, font, brush, outlineXOrigin, outlineYOrigin - 20); // 断面号 string tempMapNum = "断面号:" + mapnum; vSizeF = g.MeasureString(tempMapNum, font); int pxMapNum = (int)vSizeF.Width; g.DrawString(tempMapNum, font, brush, outlineXOrigin + outlineWidth - pxMapNum, outlineYOrigin - 20); // 表格线 pen = new Pen(Color.Black, 3); int tableXOrigin = outlineXOrigin + outlineInterval; int tableYEnd = this.bmpheight - bottom - outlineInterval; int tableYOrigin = tableYEnd - tableHeight; int tableXEnd = this.bmpWidth - tableXOrigin - right + outlineInterval; int rowHeight = tableHeight / rowCount; this.g.DrawLine(pen, tableXOrigin, tableYOrigin, tableXEnd, tableYOrigin); this.g.DrawLine(pen, tableXOrigin, tableYEnd, tableXEnd, tableYEnd); this.g.DrawLine(pen, tableXOrigin, tableYOrigin, tableXOrigin, tableYEnd); this.g.DrawLine(pen, tableXEnd, tableYOrigin, tableXEnd, tableYEnd); pen = new Pen(Color.Black, 2); for (int i = 1; i <= rowCount - 1; i++) { this.g.DrawLine(pen, tableXOrigin, tableYOrigin + rowHeight * i, tableXEnd, tableYOrigin + rowHeight * i); } this.g.DrawLine(pen, tableXOrigin + leftYAxis, tableYOrigin, tableXOrigin + leftYAxis, tableYEnd); // 表格文字 font = new Font("Times New Roman", 11); g.DrawString("地面高程(m)", font, brush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 0 + 15); g.DrawString("管线高程(m)", font, brush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 1 + 15); g.DrawString("规 格(mm)", font, brush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 2 + 15); g.DrawString("间 距(m)", font, brush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 3 + 15); g.DrawString("总 长(m)", font, brush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 4 + 15); //绘图 int drawXOrigin1 = tableXOrigin + leftYAxis; int drawYOrigin1 = outlineYOrigin + outlineInterval; int drawXEnd1 = tableXEnd; int drawYEnd1 = tableYOrigin; this.g.DrawLine(pen, drawXOrigin1, drawYOrigin1, drawXOrigin1, drawYEnd1); int drawXOrigin = drawXOrigin1 + interval; int drawYOrigin = drawYOrigin1 + 2 * interval; int drawXEnd = drawXEnd1 - 2 * interval; int drawYEnd = drawYEnd1 - interval; int drawWidth = drawXEnd - drawXOrigin; int drawHeight = drawYEnd - drawYOrigin; double scaleX = distsum / drawWidth; double scaleY = (hmax - hmin) / drawHeight; double scaleXReal = scaleX * g.DpiX / 0.0254; double scaleYReal = scaleY * g.DpiY / 0.0254; g.DrawString("比例尺", font, brush, drawXOrigin1 + (drawXEnd1 - drawXOrigin1) / 2 - 120, drawYOrigin1 + 10); g.DrawString("水平 1:" + scaleXReal.ToString("0"), font, brush, drawXOrigin1 + (drawXEnd1 - drawXOrigin1) / 2 - 60, drawYOrigin1); g.DrawString("垂直 1:" + scaleYReal.ToString("0"), font, brush, drawXOrigin1 + (drawXEnd1 - drawXOrigin1) / 2 - 60, drawYOrigin1 + 20); // 刻度 font = new Font("Times New Roman", 9); int ihmax = int.Parse(Math.Ceiling(hmax).ToString()); int ihmin = int.Parse(Math.Ceiling(hmin).ToString()); int deth = ihmax - ihmin; if (deth <= 10) { for (int i = ihmin; i <= ihmax; i = i + 1) { float dialY = (float)(drawYOrigin + (hmax - i) / scaleY); g.DrawLine(pen, drawXOrigin1 - 4, dialY, drawXOrigin1, dialY); g.DrawString(i.ToString("0.0"), font, brush, drawXOrigin1 - 30, dialY - 5); } } else if (deth < 20 && deth > 10) { for (int i = ihmin; i <= ihmax; i = i + 2) { float dialY = (float)(drawYOrigin + (hmax - i) / scaleY); g.DrawLine(pen, drawXOrigin1 - 4, dialY, drawXOrigin1, dialY); g.DrawString(i.ToString("0.0"), font, brush, drawXOrigin1 - 30, dialY - 5); } } else { double intervalDial = deth / 10 * 10.0 / dialCount; for (int i = 0; i <= dialCount; i++) { float dialY = (float)(drawYOrigin + i * intervalDial); double dialValue = hmax - i * intervalDial * scaleY; g.DrawLine(pen, drawXOrigin1 - 4, dialY, drawXOrigin1, dialY); g.DrawString(dialValue.ToString("0.0"), font, brush, drawXOrigin1 - 30, dialY - 5); } } // 管线 RotateText rotate = new RotateText(); rotate.Graphics = g; StringFormat format = new StringFormat(); format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center; PPLine2D pt0 = this.pplines[0]; foreach (PPLine2D pt in this.pplines) { PPPoint ptInter = pt.interPoint; double dis = Math.Sqrt((ptInter.X - pt0.interPoint.X) * (ptInter.X - pt0.interPoint.X) + (ptInter.Y - pt0.interPoint.Y) * (ptInter.Y - pt0.interPoint.Y)); int pxx = int.Parse(Math.Ceiling(dis / scaleX).ToString()); int pxy = int.Parse(Math.Ceiling((pt.clh - hmin) / scaleY).ToString()); int ippw = 10; int ipph = 10; int ppw = int.Parse(Math.Ceiling(pt.gj[0] * 0.001 / scaleX).ToString()); int pph = int.Parse(Math.Ceiling(pt.gj[1] * 0.001 / scaleY).ToString()); //if (ppw > ippw) ippw = ppw; //if (pph > ipph) ipph = pph; int detStandard = 0;// 内底or外顶 if (pt.hlb == 1) { detStandard += ipph / 2; } else if (pt.hlb == -1) { detStandard -= ipph / 2; } int ppcx = drawXOrigin + pxx - ippw / 2; int ppcy = drawYEnd - pxy - ipph / 2 + detStandard; pen = new Pen(Color.DarkBlue, 2); if (pt.isrect) { g.DrawRectangle(pen, ppcx, ppcy, ippw, ipph); } else { g.DrawEllipse(pen, ppcx, ppcy, ippw, ipph); } pen = new Pen(Color.Black, 1); pen.DashStyle = DashStyle.Dash; g.DrawLine(pen, drawXOrigin + pxx, drawYEnd - pxy, drawXOrigin + pxx, tableYEnd - rowHeight); font = new Font("Times New Roman", 8); brush = new SolidBrush(Color.DarkBlue); if (pt.hlb == 1) { g.DrawString(pt.facType, font, brush, ppcx + ippw / 2 + 3, ppcy + 3); } else if (pt.hlb == -1) { g.DrawString(pt.facType, font, brush, ppcx + ippw / 2 + 3, ppcy + ipph + 3); } else if (pt.hlb == 0) { g.DrawString(pt.facType, font, brush, ppcx + ippw / 2 + 3, ppcy + ipph / 2 + 3); } rotate.DrawString(pt.clh.ToString("0.000"), font, brush, new PointF(ppcx - 3, tableYOrigin + rowHeight * 1 + 20), format, -90f); if (pt.isrect) { rotate.DrawString(pt.dia, font, brush, new PointF(ppcx - 3, tableYOrigin + rowHeight * 2 + 20), format, -90f); } else { rotate.DrawString("DN" + pt.dia, font, brush, new PointF(ppcx - 3, tableYOrigin + rowHeight * 2 + 20), format, -90f); } brush = new SolidBrush(Color.Sienna); rotate.DrawString(pt.cgh.ToString("0.000"), font, brush, new PointF(ppcx - 3, tableYOrigin + rowHeight * 0 + 20), format, -90f); } int gxx0 = 0; int gxy0 = 0; int pxy0 = 0; for (int i = 0; i < this.pplines.Count; i++) { PPLine2D pt = this.pplines[i]; PPPoint ptInter = pt.interPoint; double dis = Math.Sqrt((ptInter.X - pt0.interPoint.X) * (ptInter.X - pt0.interPoint.X) + (ptInter.Y - pt0.interPoint.Y) * (ptInter.Y - pt0.interPoint.Y)); int gxx = int.Parse(Math.Ceiling(dis / scaleX).ToString()); int gxy = int.Parse(Math.Ceiling((pt.cgh - hmin) / scaleY).ToString()); int pxy = int.Parse(Math.Ceiling((pt.clh - hmin) / scaleY).ToString()); if (i == 0) { // 标识 font = new Font("Times New Roman", 9); brush = new SolidBrush(Color.Sienna); g.DrawString("地面", font, brush, drawXOrigin1 - 60, drawYEnd - gxy - 5); font = new Font("Times New Roman", 9); brush = new SolidBrush(Color.DarkBlue); g.DrawString("管线", font, brush, drawXOrigin1 - 60, drawYEnd - pxy - 5); gxx0 = gxx; gxy0 = gxy; pxy0 = pxy; } else { if (this._type == 1) { pen = new Pen(Color.DarkBlue, 3); g.DrawLine(pen, drawXOrigin + gxx0, drawYEnd - pxy0, drawXOrigin + gxx, drawYEnd - pxy); } //间距 double space = pt.space; string strspace = space.ToString("0.00"); vSizeF = g.MeasureString(strspace, font); int pxspace = (int)vSizeF.Width; g.DrawString(strspace, font, brush, drawXOrigin + (gxx + gxx0) / 2 - pxspace / 2, (float)tableYOrigin + rowHeight * 3 + 12); //地面线 pen = new Pen(Color.Sienna, 3); g.DrawLine(pen, drawXOrigin + gxx0, drawYEnd - gxy0, drawXOrigin + gxx, drawYEnd - gxy); gxx0 = gxx; gxy0 = gxy; } } //总长 string strdistnum = this.distsum.ToString("0.00"); vSizeF = g.MeasureString(strdistnum, font); int pxdistnum = (int)vSizeF.Width; g.DrawString(strdistnum, font, brush, (drawXOrigin + drawXEnd) / 2 - pxdistnum / 2, (float)tableYOrigin + rowHeight * 4 + 12); } catch (Exception ex) { } }
private void Draw(Graphics g, int winWidth, int winheight, List <VerticalPoint> listVertiPnts, string mapNum, string mapName, double totalLength) { try { Pen pen = new Pen(Color.Black, 2); Font font = new Font("Times New Roman", 9); SolidBrush drawBrush = new SolidBrush(Color.Black); //按照管线点的X值对管线点进行排序 //List<VerticalPoint> orderList = listVertiPnts.OrderBy(i => i.X).ToList<VerticalPoint>(); List <VerticalPoint> orderList = listVertiPnts; //确定竖向比例 double minHeight = double.MaxValue; double maxHeight = double.MinValue; string road = null; foreach (VerticalPoint inpnt in orderList) { if (inpnt.H < minHeight) { minHeight = inpnt.H; } if (inpnt.H > maxHeight) { maxHeight = inpnt.H; } if (inpnt.ZPipeTop < minHeight) { minHeight = inpnt.ZPipeTop; } if (inpnt.ZPipeTop > maxHeight) { maxHeight = inpnt.ZPipeTop; } if (inpnt.Road != null) { road = inpnt.Road; } else { road = "未知"; } } double constHeight = 20; //高程常数50m //double constwidth = 5;//管线截面两边预留长度5m double totalYSpan = maxHeight - minHeight + constHeight; //画图区域竖向总高度 double totalXSpan = 0.0; //画图区域横向总长度 foreach (VerticalPoint inpnt in orderList) { totalXSpan += inpnt.Length; } double paddingLeft = 30; double paddingRight = 30; double paddingBottom = 20; double paddingTop = 40; double canvasTotalWidth = winWidth; //图片横向总像素 double canvasTotalHeight = winheight; //图片纵向总像素 //绘制外图廓 double constOutlineY = 50;//外图廓据顶部边缘距离 double outlineXOrigin = paddingLeft; double outlineYOrigin = paddingTop + constOutlineY; double outlineWidth = canvasTotalWidth - paddingLeft - paddingRight; double outlineHeight = canvasTotalHeight - paddingBottom - outlineYOrigin; g.DrawRectangle(pen, (float)outlineXOrigin, (float)outlineYOrigin, (float)outlineWidth, (float)outlineHeight); Font fontTitle = new Font("宋体", 20); g.DrawString(mapName, fontTitle, drawBrush, new PointF((float)(canvasTotalWidth / 2) - 150, 20)); g.DrawString("所在道路:" + road, font, drawBrush, new PointF((float)outlineXOrigin + 10, (float)outlineYOrigin - 30)); g.DrawString("断面号:" + mapNum, font, drawBrush, new PointF((float)(canvasTotalWidth - paddingRight - 170), (float)outlineYOrigin - 30)); //绘制表格 double constTable = 30; double tableHeight = 150; int rowCount = 5; int rowHeight = (int)tableHeight / rowCount; double tableXOrigin = outlineXOrigin + constTable; double tableYOrigin = canvasTotalHeight - tableHeight - paddingBottom; double tableWidth = outlineWidth - 2 * constTable; g.DrawRectangle(pen, (int)tableXOrigin, (int)tableYOrigin, (float)tableWidth, (float)tableHeight); g.DrawString("地面高程(m)", font, drawBrush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 0 + 10); g.DrawString("管线高程(m)", font, drawBrush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 1 + 10); g.DrawString(" 规 格(mm)", font, drawBrush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 2 + 10); g.DrawString("管线长度(m)", font, drawBrush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 3 + 10); g.DrawString("总长度(m)", font, drawBrush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 4 + 10); float constCol = 100;//标题栏右边线 g.DrawLine(pen, new PointF((float)tableXOrigin + constCol, (float)tableYOrigin), new PointF((float)tableXOrigin + constCol, (float)(tableYOrigin + tableHeight))); for (int i = 1; i < rowCount; i++) { pen.Width = 1; g.DrawLine(pen, (float)tableXOrigin, (float)tableYOrigin + rowHeight * i, (float)(tableXOrigin + tableWidth), (float)tableYOrigin + rowHeight * i); } //绘制画图区域 double constCan = constCol + 50; double constCanY = 80; double constCanBlank = 100;//第一根管线距左侧边线的屏幕距离 double canXOrigin = tableXOrigin + constCan; double canYOrigin = outlineYOrigin + constCanY; double canWidth = canvasTotalWidth - canXOrigin - paddingRight - constCol; double canHeight = canvasTotalHeight - outlineYOrigin - paddingBottom - constCanY; double xRadio = totalXSpan * 1000 / (canWidth - 2 * constCanBlank); double yRadio = totalYSpan * 1000 / (canHeight); //确定管线在画图区域的相对位置,转换为屏幕距离,并写入VerticalPoint类 for (int i = 0; i < orderList.Count; i++) { if (i == 0) { orderList[i].DistanceDraw = constCanBlank; } else { orderList[i].DistanceDraw = orderList[i].Length * 1000 / xRadio + orderList[i - 1].DistanceDraw; } } //计算管线交点及地面高在画图区域的相对高程 double dH = maxHeight - minHeight; foreach (VerticalPoint intPnt in orderList) { intPnt.ZDraw = (intPnt.ZPipeTop / maxHeight) * (dH + constHeight); intPnt.HDraw = (intPnt.H / maxHeight) * (dH + constHeight); } g.DrawString("比例尺", font, drawBrush, (float)(canvasTotalWidth / 2) - 80, (float)outlineYOrigin + 40); g.DrawString("水平 1:" + Math.Ceiling(xRadio).ToString(), font, drawBrush, (float)(canvasTotalWidth / 2) - 20, (float)outlineYOrigin + 30); g.DrawString("垂直 1:" + Math.Ceiling(yRadio).ToString(), font, drawBrush, (float)(canvasTotalWidth / 2) - 20, (float)outlineYOrigin + 50); pen.Width = 2; PointF startP = new PointF((float)canXOrigin, (float)canYOrigin); PointF endP = new PointF((float)(canXOrigin + canWidth), (float)canYOrigin); g.DrawLine(pen, startP, new PointF((float)canXOrigin, (float)(canvasTotalHeight - paddingBottom))); g.DrawLine(pen, endP, new PointF((float)(canXOrigin + canWidth), (float)(canvasTotalHeight - paddingBottom))); //方向标 pen.Width = 1; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; g.DrawLine(pen, new PointF((float)(canXOrigin + canWidth - 160), (float)outlineYOrigin + 40), new PointF((float)(canXOrigin + canWidth - 80), (float)outlineYOrigin + 40)); g.DrawLine(pen, new PointF((float)(canXOrigin + canWidth - 100), (float)outlineYOrigin + 30), new PointF((float)(canXOrigin + canWidth - 80), (float)outlineYOrigin + 40)); g.DrawString("S", font, drawBrush, new PointF((float)(canXOrigin + canWidth - 120), (float)outlineYOrigin + 25)); //绘制地面线 g.DrawLine(pen, startP, new PointF((float)(orderList[0].DistanceDraw + canXOrigin), (float)((totalYSpan - orderList[0].HDraw) * 1000 / yRadio + canYOrigin)));//竖向因坐标方向与高程方向相反,需另行转化屏幕距离 g.DrawLine(pen, endP, new PointF((float)(orderList[orderList.Count - 1].DistanceDraw + canXOrigin), (float)((totalYSpan - orderList[orderList.Count - 1].HDraw) * 1000 / yRadio + canYOrigin))); double x0, y0, x1, y1; for (int i = 1; i < orderList.Count; i++) { x0 = orderList[i - 1].DistanceDraw + canXOrigin; x1 = orderList[i].DistanceDraw + canXOrigin; y0 = (totalYSpan - orderList[i - 1].HDraw) * 1000 / yRadio + canYOrigin; y1 = (totalYSpan - orderList[i].HDraw) * 1000 / yRadio + canYOrigin; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; pen.Width = 1; g.DrawLine(pen, (int)x0, (int)y0, (int)x1, (int)y1); } //绘制纵断面 double zoom = 1; float constfc = 20; float constStrY = 15; float constStrX = 10; RotateText rotate = new RotateText(); rotate.Graphics = g; StringFormat format = new StringFormat(); format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center; font = new Font("Times New Roman", 7); double radioTemp = xRadio > yRadio ? xRadio : yRadio; for (int i = 0; i < orderList.Count; i++) { if (i == 0) { VerticalPoint verPnt0 = orderList[i]; double dia0 = 0; if (verPnt0.IsCircle) { dia0 = double.Parse(verPnt0.Diameter); } else { string[] dia = verPnt0.Diameter.Split('*'); dia0 = double.Parse(dia[dia.Length - 1]); } pen.Width = 1; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; g.DrawEllipse(pen, (float)(verPnt0.DistanceDraw + canXOrigin - 5), (float)(verPnt0.ZDraw + canYOrigin - 2.5), 5, 5); pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; double xline0 = verPnt0.DistanceDraw + canXOrigin - 2.5; double yline0 = verPnt0.ZDraw + canYOrigin + 5; g.DrawLine(pen, new PointF((float)xline0, (float)yline0), new PointF((float)xline0, (float)(tableYOrigin + rowHeight * 4))); g.DrawString(verPnt0.FcName, font, drawBrush, (float)(xline0 - constfc), (float)(tableYOrigin - constStrY)); rotate.DrawString(Math.Round(verPnt0.H, 3).ToString(), font, drawBrush, new PointF((float)(xline0 - constStrX), (float)(tableYOrigin + rowHeight * 0 + constStrY)), format, -90f); rotate.DrawString(Math.Round(verPnt0.ZPipeTop - dia0 / 1000, 3).ToString(), font, drawBrush, new PointF((float)(xline0 - constStrX), (float)(tableYOrigin + rowHeight * 1 + constStrY)), format, -90f); rotate.DrawString("DN" + verPnt0.Diameter, font, drawBrush, new PointF((float)(xline0 - constStrX), (float)(tableYOrigin + rowHeight * 2 + constStrY)), format, -90f); rotate.DrawString("", font, drawBrush, new PointF((float)(xline0 - constStrX), (float)(tableYOrigin + rowHeight * 3 + constStrY)), format, -90f); } else { if (!orderList[i].IsFromPnt) { VerticalPoint verPnt1 = orderList[i - 1]; VerticalPoint verPnt2 = orderList[i]; double dia2 = 0; if (verPnt2.IsCircle) { dia2 = double.Parse(verPnt2.Diameter); } else { string[] dia = verPnt2.Diameter.Split('*'); dia2 = double.Parse(dia[dia.Length - 1]); } pen.Width = 1; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; g.DrawLine(pen, new PointF((float)(verPnt1.DistanceDraw + canXOrigin), (float)(verPnt1.ZDraw + canYOrigin)), new PointF((float)(verPnt2.DistanceDraw + canXOrigin), (float)(verPnt2.ZDraw + canYOrigin))); //g.DrawEllipse(pen, (float)(verPnt1.DistanceDraw + canXOrigin - 5), (float)(verPnt1.ZDraw + canYOrigin - 2.5), 5, 5); g.DrawEllipse(pen, (float)(verPnt2.DistanceDraw + canXOrigin), (float)(verPnt2.ZDraw + canYOrigin - 2.5), 5, 5); pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; //double xline1 = verPnt1.DistanceDraw + canXOrigin - 2.5; //double yline1 = verPnt1.ZDraw + canYOrigin + 5; double xline2 = verPnt2.DistanceDraw + canXOrigin + 2.5; double yline2 = verPnt2.ZDraw + canYOrigin + 5; g.DrawLine(pen, new PointF((float)xline2, (float)yline2), new PointF((float)xline2, (float)(tableYOrigin + rowHeight * 4))); g.DrawString(verPnt2.FcName, font, drawBrush, (float)(xline2 - constfc), (float)(tableYOrigin - constStrY)); rotate.DrawString(Math.Round(verPnt2.H, 3).ToString(), font, drawBrush, new PointF((float)(xline2 - constStrX), (float)(tableYOrigin + rowHeight * 0 + constStrY)), format, -90f); rotate.DrawString(Math.Round(verPnt2.ZPipeTop - dia2 / 1000, 3).ToString(), font, drawBrush, new PointF((float)(xline2 - constStrX), (float)(tableYOrigin + rowHeight * 1 + constStrY)), format, -90f); rotate.DrawString("DN" + verPnt2.Diameter, font, drawBrush, new PointF((float)(xline2 - constStrX), (float)(tableYOrigin + rowHeight * 2 + constStrY)), format, -90f); rotate.DrawString(Math.Round(verPnt2.Length, 3).ToString(), font, drawBrush, new PointF((float)(xline2 - constStrX), (float)(tableYOrigin + rowHeight * 3 + constStrY)), format, -90f); } } } g.DrawString(Math.Round(totalLength, 3).ToString(), font, drawBrush, (float)canvasTotalWidth / 2 - 20, (float)(tableYOrigin + rowHeight * 4 + 10)); } catch { } }
private void Draw(Graphics g, int winWidth, int winheight, List <IntersectPoint> listInterPnts, double length) { try { if (length == 0.0) { return; } Pen pen = new Pen(Color.Black, 2); Font font = new Font("Times New Roman", 9); SolidBrush drawBrush = new SolidBrush(Color.Black); //比例尺计算 double totalXSpan = length; double minInterval = double.MaxValue; double maxInterval = 0.0; double minHeight = double.MaxValue; double maxHeight = 0.0; string road = null; foreach (IntersectPoint inpnt in listInterPnts) { //totalXSpan += inpnt.Distance; if (inpnt.Distance < minInterval) { minInterval = inpnt.Distance; } if (inpnt.Distance > maxInterval) { maxInterval = inpnt.Distance; } if (inpnt.H < minHeight) { minHeight = inpnt.H; } if (inpnt.H > maxHeight) { maxHeight = inpnt.H; } if (inpnt.ZPipeTop < minHeight) { minHeight = inpnt.ZPipeTop; } if (inpnt.ZPipeTop > maxHeight) { maxHeight = inpnt.ZPipeTop; } if (inpnt.Road != null) { road = inpnt.Road; } else { road = "未知"; } } //double totalYSpan = maxHeight - minHeight; double totalYSpan = maxHeight + 20; double paddingLeft = 30; double paddingRight = 30; double paddingBottom = 20; double paddingTop = 40; double canvasTotalWidth = winWidth; double canvasTotalHeight = winheight; //绘制头 Font dontHead = new System.Drawing.Font("Tahoma", 15); //g.DrawString("横断面图", font, drawBrush, (float)canvasTotalWidth / 2 - 60, 80); //绘制外图廓 double outlineXOrigin = paddingLeft; double outlineYOrigin = paddingTop + 50; double outlineWidth = canvasTotalWidth - paddingLeft - paddingRight; double outlineHeight = canvasTotalHeight - paddingBottom - outlineYOrigin; g.DrawRectangle(pen, (float)outlineXOrigin, (float)outlineYOrigin, (float)outlineWidth, (float)outlineHeight); g.DrawString("所在道路:" + road, font, drawBrush, new PointF((float)outlineXOrigin + 10, (float)outlineYOrigin - 30)); g.DrawString("断面号:", font, drawBrush, new PointF((float)(canvasTotalWidth - paddingRight - 120), (float)outlineYOrigin - 30)); #region 绘制表格 double tableHeight = 150; int rowCount = 5; int rowHeight = (int)tableHeight / rowCount; double tableXOrigin = outlineXOrigin + 30; double tableYOrigin = canvasTotalHeight - tableHeight - paddingBottom; double tableWidth = outlineWidth - 60; g.DrawRectangle(pen, (int)tableXOrigin, (int)tableYOrigin, (float)tableWidth, (float)tableHeight); g.DrawString("地面高程(m)", font, drawBrush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 0 + 10); g.DrawString("管线高程(m)", font, drawBrush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 1 + 10); g.DrawString(" 规 格(mm)", font, drawBrush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 2 + 10); g.DrawString(" 间 距(m)", font, drawBrush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 3 + 10); g.DrawLine(pen, new PointF((float)tableXOrigin + 100, (float)tableYOrigin), new PointF((float)tableXOrigin + 100, (float)(tableYOrigin + tableHeight))); for (int i = 1; i < rowCount; i++) { pen.Width = 1; g.DrawLine(pen, (float)tableXOrigin, (float)tableYOrigin + rowHeight * i, (float)(tableXOrigin + tableWidth), (float)tableYOrigin + rowHeight * i); } #endregion // //绘制画图区域 double canXOrigin = outlineXOrigin + 200; double canYOrigin = outlineYOrigin + 80; double canvasWidth = canvasTotalWidth - canXOrigin - paddingRight - 60; double canvasHeight = canvasTotalHeight - outlineYOrigin - paddingBottom - 80; double xRadio = totalXSpan * 1000 / (canvasWidth); double yRadio = totalYSpan * 1000 / (canvasHeight); g.DrawString("比例尺", font, drawBrush, (float)(canvasTotalWidth / 2) - 80, (float)outlineYOrigin + 40); //g.DrawString("水平 1:30", font, drawBrush, (float)(canvasTotalWidth / 2) - 20, (float)outlineYOrigin + 30); //g.DrawString("垂直 1:200", font, drawBrush, (float)(canvasTotalWidth / 2) - 20, (float)outlineYOrigin + 50); g.DrawString("水平 1:" + Math.Ceiling(xRadio).ToString(), font, drawBrush, (float)(canvasTotalWidth / 2) - 20, (float)outlineYOrigin + 30); g.DrawString("垂直 1:" + Math.Ceiling(yRadio).ToString(), font, drawBrush, (float)(canvasTotalWidth / 2) - 20, (float)outlineYOrigin + 50); pen.Width = 2; //g.DrawRectangle(pen, (int)canXOrigin, (int)canYOrigin, (int)canvasWidth, (int)canvasHeight); PointF startP = new PointF((float)canXOrigin, (float)canYOrigin); PointF endP = new PointF((float)(canXOrigin + canvasWidth), (float)canYOrigin); g.DrawLine(pen, startP, new PointF((float)canXOrigin, (float)(canvasTotalHeight - paddingBottom))); g.DrawLine(pen, endP, new PointF((float)(canXOrigin + canvasWidth), (float)(canvasTotalHeight - paddingBottom))); //方向标 pen.Width = 1; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; g.DrawLine(pen, new PointF((float)(canXOrigin + canvasWidth - 160), (float)outlineYOrigin + 40), new PointF((float)(canXOrigin + canvasWidth - 80), (float)outlineYOrigin + 40)); g.DrawLine(pen, new PointF((float)(canXOrigin + canvasWidth - 100), (float)outlineYOrigin + 30), new PointF((float)(canXOrigin + canvasWidth - 80), (float)outlineYOrigin + 40)); g.DrawString("S", font, drawBrush, new PointF((float)(canXOrigin + canvasWidth - 120), (float)outlineYOrigin + 25)); //绘制地面线 double x0, y0, x1, y1; double maxH = double.MinValue; foreach (IntersectPoint intPnt in listInterPnts) { if (intPnt.H > maxH) { maxH = intPnt.H; } } List <IntersectPoint> orderList = listInterPnts.OrderBy(i => i.DistanceF).ToList <IntersectPoint>(); g.DrawLine(pen, startP, new PointF((float)(orderList[0].DistanceF * 1000 / xRadio + canXOrigin), (float)((maxH - orderList[0].H) * 1000 / yRadio + canYOrigin))); g.DrawLine(pen, endP, new PointF((float)(orderList[orderList.Count - 1].DistanceF * 1000 / xRadio + canXOrigin), (float)((maxH - orderList[orderList.Count - 1].H) * 1000 / yRadio + canYOrigin))); for (int i = 1; i < orderList.Count; i++) { x0 = orderList[i - 1].DistanceF * 1000 / xRadio + canXOrigin; x1 = orderList[i].DistanceF * 1000 / xRadio + canXOrigin; y0 = (maxH - orderList[i - 1].H) * 1000 / yRadio + canYOrigin; y1 = (maxH - orderList[i].H) * 1000 / yRadio + canYOrigin; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; pen.Width = 1; g.DrawLine(pen, (int)x0, (int)y0, (int)x1, (int)y1); } //绘制横断面 double maxZ = double.MinValue; double zoom = 1; //获得相交管线中管顶高最大值 foreach (IntersectPoint intPnt in orderList) { double diatemp; double zTop = intPnt.ZPipeTop; string diameter = intPnt.Diameter; string[] diameters = diameter.Split('*'); if (diameters.Length == 1) { diatemp = (double.Parse(diameter) / 2) / 1000;//单位化为米 //if (maxZ < zTop - diatemp) //{ // maxZ = zTop - diatemp;//maxZ为管线中心高 //} if (maxZ < zTop) { maxZ = zTop;//maxZ为管线顶高 } } else { if (diameters.Length > 2) { return; } diatemp = (double.Parse(diameters[1]) / 2) / 1000;//矩形截面高 //if (maxZ < zTop - diatemp) //{ // maxZ = zTop - diatemp;//同上 //} if (maxZ < zTop) { maxZ = zTop;//maxZ为管线顶高 } } } //计算管线间的相互距离,并写入IntersectPoint类 for (int i = 0; i < orderList.Count; i++) { if (i == 0) { orderList[i].Distance = orderList[i].DistanceF; } else { orderList[i].Distance = orderList[i].DistanceF - orderList[i - 1].DistanceF; } } foreach (IntersectPoint intPnt in orderList) { string diameter = intPnt.Diameter; double distanceF = intPnt.DistanceF; double diaWidth = 0.0; double diaHeight = 0.0; double dia = 0.0; double x; double y; double xline; double yline; RotateText rotate = new RotateText(); rotate.Graphics = g; StringFormat format = new StringFormat(); format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center; font = new Font("Times New Roman", 7); if (intPnt.IsCircle) { dia = double.Parse(diameter) / zoom; diaWidth = dia; diaHeight = dia; x = (intPnt.DistanceF * 1000 - dia / 2) / (xRadio) + canXOrigin; //获得管线截面外接矩形左上角的坐标x y = (maxZ - intPnt.ZPipeTop) * 1000 / yRadio + canYOrigin + 20; //获得管线截面外接矩形左上角的坐标y pen.Width = 1; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; g.DrawEllipse(pen, (float)x, (float)y, (float)(diaWidth / xRadio), (float)(diaHeight / xRadio)); pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; xline = x + (dia / 2) / (xRadio); yline = y + dia / (xRadio); g.DrawLine(pen, (int)xline, (int)yline, (int)xline, (int)(tableYOrigin + rowHeight * 4)); g.DrawString(intPnt.FcName, font, drawBrush, (float)(xline - 20), (float)(tableYOrigin - 20)); rotate.DrawString(Math.Round(intPnt.H, 3).ToString(), font, drawBrush, new PointF((float)(xline - 8), (float)(tableYOrigin + rowHeight * 0 + 15)), format, -90f); rotate.DrawString(Math.Round(intPnt.ZPipeTop - dia / 1000, 3).ToString(), font, drawBrush, new PointF((float)(xline - 8), (float)(tableYOrigin + rowHeight * 1 + 15)), format, -90f); rotate.DrawString("DN" + intPnt.Diameter, font, drawBrush, new PointF((float)(xline - 8), (float)(tableYOrigin + rowHeight * 2 + 15)), format, -90f); if (intPnt.Distance < 1.0) { rotate.DrawString(Math.Round(intPnt.Distance, 3).ToString(), font, drawBrush, new PointF((float)(x - 10), (float)(tableYOrigin + rowHeight * 3 + 25)), format, 0f); } else { rotate.DrawString(Math.Round(intPnt.Distance, 3).ToString(), font, drawBrush, new PointF((float)(x - 10), (float)(tableYOrigin + rowHeight * 3 + 15)), format, 0f); } //if ((float)intPnt.Distance * 1000 / xRadio < font.Height) //{ // rotate.DrawString(Math.Round(intPnt.Distance, 3).ToString(), font, drawBrush, new PointF((float)(x - 10), (float)(tableYOrigin + rowHeight * 3 + 20)), format, 0f); //} //else //{ // rotate.DrawString(Math.Round(intPnt.Distance, 3).ToString(), font, drawBrush, new PointF((float)(x - 10), (float)(tableYOrigin + rowHeight * 3 + 15)), format, 0f); //} //g.DrawString(Math.Round(intPnt.H, 3).ToString(), font, drawBrush, (float)(x - 40), (float)(tableYOrigin + rowHeight * 0 + 10)); //g.DrawString(Math.Round(intPnt.ZPipeTop - dia / 1000, 3).ToString(), font, drawBrush, (float)(x - 40), (float)(tableYOrigin + rowHeight * 1 + 10)); //g.DrawString("DN" + intPnt.Diameter, font, drawBrush, (float)(x - 40), (float)(tableYOrigin + rowHeight * 2 + 10)); //g.DrawString(Math.Round(intPnt.Distance, 3).ToString(), font, drawBrush, (float)(x - 40), (float)(tableYOrigin + rowHeight * 3 + 10)); } else { string[] diameters = diameter.Split('*'); if (diameters != null && diameters.Length == 2) { diaWidth = double.Parse(diameters[0]) / zoom; diaHeight = double.Parse(diameters[1]) / zoom; x = (intPnt.DistanceF * 1000 - diaWidth / 2) / xRadio + canXOrigin; //获得管线截面矩形左上角的坐标x y = (maxZ - intPnt.ZPipeTop) * 1000 / yRadio + canXOrigin + 20; //获得管线截面矩形左上角的坐标y pen.Width = 1; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; g.DrawRectangle(pen, (float)x, (float)y, (float)(diaWidth / xRadio), (float)(diaHeight / xRadio)); pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; xline = x + (diaWidth / 2) / xRadio; yline = y + diaHeight / xRadio; g.DrawLine(pen, (int)xline, (int)yline, (int)xline, (int)(tableYOrigin + rowHeight * 4)); g.DrawString(intPnt.FcName, font, drawBrush, (float)(xline - 15), (float)(tableYOrigin - 20)); rotate.DrawString(Math.Round(intPnt.H, 3).ToString(), font, drawBrush, new PointF((float)(xline - 8), (float)(tableYOrigin + rowHeight * 0 + 15)), format, -90f); rotate.DrawString(Math.Round(intPnt.ZPipeTop - dia / 1000, 3).ToString(), font, drawBrush, new PointF((float)(xline - 8), (float)(tableYOrigin + rowHeight * 1 + 15)), format, -90f); rotate.DrawString(intPnt.Diameter, font, drawBrush, new PointF((float)(xline - 8), (float)(tableYOrigin + rowHeight * 2 + 15)), format, -90f); if (intPnt.Distance < 1.0) { rotate.DrawString(Math.Round(intPnt.Distance, 3).ToString(), font, drawBrush, new PointF((float)(x - 10), (float)(tableYOrigin + rowHeight * 3 + 25)), format, 0f); } else { rotate.DrawString(Math.Round(intPnt.Distance, 3).ToString(), font, drawBrush, new PointF((float)(x - 10), (float)(tableYOrigin + rowHeight * 3 + 15)), format, 0f); } //if ((float)intPnt.Distance * 1000 / xRadio < font.Height) //{ // rotate.DrawString(Math.Round(intPnt.Distance, 3).ToString(), font, drawBrush, new PointF((float)(x - 10), (float)(tableYOrigin + rowHeight * 3 + 20)), format, 0f); //} //else //{ // rotate.DrawString(Math.Round(intPnt.Distance, 3).ToString(), font, drawBrush, new PointF((float)(x - 10), (float)(tableYOrigin + rowHeight * 3 + 15)), format, 0f); //} } } } g.DrawString(Math.Round(length, 3).ToString(), font, drawBrush, (float)canvasTotalWidth / 2 - 20, (float)(tableYOrigin + rowHeight * 4 + 10)); } catch (System.Exception ex) { } }
private void Draw(Graphics g, int winWidth, int winheight, List <IntersectPoint> listInterPnts, string mapNum, string mapName) { try { Pen pen = new Pen(Color.Black, 2); Font font = new Font("Times New Roman", 9); SolidBrush drawBrush = new SolidBrush(Color.Black); //按距离画线起点对管线交点进行排序 List <IntersectPoint> orderList = listInterPnts.OrderBy(i => i.DistanceF).ToList <IntersectPoint>(); //确定竖向比例 double minHeight = double.MaxValue; double maxHeight = double.MinValue; string road = null; foreach (IntersectPoint inpnt in orderList) { if (inpnt.H < minHeight) { minHeight = inpnt.H; } if (inpnt.H > maxHeight) { maxHeight = inpnt.H; } if (inpnt.ZPipeTop < minHeight) { minHeight = inpnt.ZPipeTop; } if (inpnt.ZPipeTop > maxHeight) { maxHeight = inpnt.ZPipeTop; } if (inpnt.Road != null) { road = inpnt.Road; } else { road = "未知"; } } //计算管线间的相互距离,并写入IntersectPoint类 for (int i = 0; i < orderList.Count; i++) { if (i == 0) { orderList[i].Distance = orderList[i].DistanceF; } else { orderList[i].Distance = orderList[i].DistanceF - orderList[i - 1].DistanceF; } } double constHeight = 20; //高程常数20m //double constwidth = 5;//管线截面两边预留长度5m double totalYSpan = maxHeight - minHeight + constHeight; //画图区域竖向总高度 double totalXSpan = orderList[orderList.Count - 1].DistanceF - orderList[0].DistanceF; //画图区域横向总长度 double paddingLeft = 30; double paddingRight = 30; double paddingBottom = 20; double paddingTop = 40; double canvasTotalWidth = winWidth; //图片横向总像素 double canvasTotalHeight = winheight; //图片纵向总像素 //绘制外图廓 double constOutlineY = 50;//外图廓据顶部边缘距离 double outlineXOrigin = paddingLeft; double outlineYOrigin = paddingTop + constOutlineY; double outlineWidth = canvasTotalWidth - paddingLeft - paddingRight; double outlineHeight = canvasTotalHeight - paddingBottom - outlineYOrigin; g.DrawRectangle(pen, (float)outlineXOrigin, (float)outlineYOrigin, (float)outlineWidth, (float)outlineHeight); Font fontTitle = new Font("宋体", 20); g.DrawString(mapName, fontTitle, drawBrush, new PointF((float)(canvasTotalWidth / 2) - 150, 20)); g.DrawString("所在道路:" + road, font, drawBrush, new PointF((float)outlineXOrigin + 10, (float)outlineYOrigin - 30)); g.DrawString("断面号:" + mapNum, font, drawBrush, new PointF((float)(canvasTotalWidth - paddingRight - 170), (float)outlineYOrigin - 30)); //绘制表格 double constTable = 30; double tableHeight = 150; int rowCount = 5; int rowHeight = (int)tableHeight / rowCount; double tableXOrigin = outlineXOrigin + constTable; double tableYOrigin = canvasTotalHeight - tableHeight - paddingBottom; double tableWidth = outlineWidth - 2 * constTable; g.DrawRectangle(pen, (int)tableXOrigin, (int)tableYOrigin, (float)tableWidth, (float)tableHeight); g.DrawString("地面高程(m)", font, drawBrush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 0 + 10); g.DrawString("管线高程(m)", font, drawBrush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 1 + 10); g.DrawString(" 规 格(mm)", font, drawBrush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 2 + 10); g.DrawString(" 间 距(m)", font, drawBrush, (float)tableXOrigin + 5, (float)tableYOrigin + rowHeight * 3 + 10); float constCol = 100;//标题栏右边线 g.DrawLine(pen, new PointF((float)tableXOrigin + constCol, (float)tableYOrigin), new PointF((float)tableXOrigin + constCol, (float)(tableYOrigin + tableHeight))); for (int i = 1; i < rowCount; i++) { pen.Width = 1; g.DrawLine(pen, (float)tableXOrigin, (float)tableYOrigin + rowHeight * i, (float)(tableXOrigin + tableWidth), (float)tableYOrigin + rowHeight * i); } //绘制画图区域 double constCan = constCol + 50; double constCanY = 80; double constCanBlank = 100;//第一根管线距左侧边线的屏幕距离 double canXOrigin = tableXOrigin + constCan; double canYOrigin = outlineYOrigin + constCanY; double canWidth = canvasTotalWidth - canXOrigin - paddingRight - constCol; //double canHeight = canvasTotalHeight - outlineYOrigin - paddingBottom - constCanY; double canHeight = canvasTotalHeight - outlineYOrigin - paddingBottom - constCanY - tableHeight; double xRadio = totalXSpan * 1000 / (canWidth - 2 * constCanBlank); double yRadio = totalYSpan * 1000 / (canHeight); //确定管线在画图区域的相对位置,转换为屏幕距离,并写入IntersectPoint类 for (int i = 0; i < orderList.Count; i++) { if (i == 0) { orderList[i].DistanceDraw = constCanBlank; } else { orderList[i].DistanceDraw = orderList[i].Distance * 1000 / xRadio + orderList[i - 1].DistanceDraw; } } //计算管线交点及地面高在画图区域的相对高程 double dH = maxHeight - minHeight; foreach (IntersectPoint intPnt in orderList) { intPnt.ZDraw = (intPnt.ZPipeTop / maxHeight) * (dH + constHeight); intPnt.HDraw = (intPnt.H / maxHeight) * (dH + constHeight); } g.DrawString("比例尺", font, drawBrush, (float)(canvasTotalWidth / 2) - 80, (float)outlineYOrigin + 40); g.DrawString("水平 1:" + Math.Ceiling(xRadio).ToString(), font, drawBrush, (float)(canvasTotalWidth / 2) - 20, (float)outlineYOrigin + 30); g.DrawString("垂直 1:" + Math.Ceiling(yRadio).ToString(), font, drawBrush, (float)(canvasTotalWidth / 2) - 20, (float)outlineYOrigin + 50); pen.Width = 2; PointF startP = new PointF((float)canXOrigin, (float)canYOrigin); PointF endP = new PointF((float)(canXOrigin + canWidth), (float)canYOrigin); g.DrawLine(pen, startP, new PointF((float)canXOrigin, (float)(canvasTotalHeight - paddingBottom))); g.DrawLine(pen, endP, new PointF((float)(canXOrigin + canWidth), (float)(canvasTotalHeight - paddingBottom))); //方向标 pen.Width = 1; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; g.DrawLine(pen, new PointF((float)(canXOrigin + canWidth - 160), (float)outlineYOrigin + 40), new PointF((float)(canXOrigin + canWidth - 80), (float)outlineYOrigin + 40)); g.DrawLine(pen, new PointF((float)(canXOrigin + canWidth - 100), (float)outlineYOrigin + 30), new PointF((float)(canXOrigin + canWidth - 80), (float)outlineYOrigin + 40)); g.DrawString("S", font, drawBrush, new PointF((float)(canXOrigin + canWidth - 120), (float)outlineYOrigin + 25)); //绘制地面线 g.DrawLine(pen, startP, new PointF((float)(orderList[0].DistanceDraw + canXOrigin), (float)((totalYSpan - orderList[0].HDraw) * 1000 / yRadio + canYOrigin)));//竖向因坐标方向与高程方向相反,需另行转化屏幕距离 g.DrawLine(pen, endP, new PointF((float)(orderList[orderList.Count - 1].DistanceDraw + canXOrigin), (float)((totalYSpan - orderList[orderList.Count - 1].HDraw) * 1000 / yRadio + canYOrigin))); double x0, y0, x1, y1; for (int i = 1; i < orderList.Count; i++) { x0 = orderList[i - 1].DistanceDraw + canXOrigin; x1 = orderList[i].DistanceDraw + canXOrigin; y0 = (totalYSpan - orderList[i - 1].HDraw) * 1000 / yRadio + canYOrigin; y1 = (totalYSpan - orderList[i].HDraw) * 1000 / yRadio + canYOrigin; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; pen.Width = 1; g.DrawLine(pen, (int)x0, (int)y0, (int)x1, (int)y1); } //绘制横断面 double zoom = 1; float constfc = 20; float constStrY = 15; float constStrX = 10; double radioTemp = xRadio > yRadio ? xRadio : yRadio; for (int i = 0; i < orderList.Count; i++) { IntersectPoint intPnt = orderList[i]; string diameter = intPnt.Diameter; double distanceDraw = intPnt.DistanceDraw; double diaWidth = 0.0; double diaHeight = 0.0; double dia = 0.0; double x; double y; double xline; double yline; RotateText rotate = new RotateText(); rotate.Graphics = g; StringFormat format = new StringFormat(); format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center; font = new Font("Times New Roman", 7); if (intPnt.IsCircle) { dia = double.Parse(diameter) / zoom; diaWidth = dia; diaHeight = dia; x = intPnt.DistanceDraw - (dia / 2) / radioTemp + canXOrigin; //获得管线截面外接矩形左上角的坐标x y = (totalYSpan - intPnt.ZDraw) * 1000 / radioTemp + canYOrigin; //获得管线截面外接矩形左上角的坐标y pen.Width = 1; pen.Color = intPnt.Color; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; g.DrawEllipse(pen, (float)x, (float)y, (float)(diaWidth / radioTemp), (float)(diaHeight / radioTemp)); pen.Color = Color.Black; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; xline = intPnt.DistanceDraw + canXOrigin; yline = y + dia / radioTemp; g.DrawLine(pen, (int)xline, (int)yline, (int)xline, (int)(tableYOrigin + rowHeight * 4)); g.DrawString(intPnt.FcName, font, drawBrush, (float)(xline - constfc), (float)(tableYOrigin - constStrY)); rotate.DrawString(Math.Round(intPnt.H, 3).ToString(), font, drawBrush, new PointF((float)(xline - constStrX), (float)(tableYOrigin + rowHeight * 0 + constStrY)), format, -90f); rotate.DrawString(Math.Round(intPnt.ZPipeTop - (dia * zoom) / 1000, 3).ToString(), font, drawBrush, new PointF((float)(xline - constStrX), (float)(tableYOrigin + rowHeight * 1 + constStrY)), format, -90f); rotate.DrawString("DN" + intPnt.Diameter, font, drawBrush, new PointF((float)(xline - constStrX), (float)(tableYOrigin + rowHeight * 2 + constStrY)), format, -90f); if (i == 0) { rotate.DrawString("", font, drawBrush, new PointF((float)(x - constStrX), (float)(tableYOrigin + rowHeight * 3 + constStrY + 10)), format, 0f); } else if (intPnt.Distance < 1.0) { rotate.DrawString(Math.Round(intPnt.Distance, 3).ToString(), font, drawBrush, new PointF((float)(x - constStrX), (float)(tableYOrigin + rowHeight * 3 + constStrY + 10)), format, 0f); } else { rotate.DrawString(Math.Round(intPnt.Distance, 3).ToString(), font, drawBrush, new PointF((float)(x - constStrX), (float)(tableYOrigin + rowHeight * 3 + constStrY)), format, 0f); } } else { string[] diameters = diameter.Split('*'); if (diameters != null && diameters.Length == 2) { diaWidth = double.Parse(diameters[0]) / zoom; diaHeight = double.Parse(diameters[1]) / zoom; x = intPnt.DistanceDraw - (diaWidth / 2) / radioTemp + canXOrigin; //获得管线截面外接矩形左上角的坐标x y = (totalYSpan - intPnt.ZDraw) * 1000 / radioTemp + canYOrigin; //获得管线截面外接矩形左上角的坐标y pen.Width = 1; pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Solid; pen.Color = intPnt.Color; g.DrawRectangle(pen, (float)x, (float)y, (float)(diaWidth / radioTemp), (float)(diaHeight / radioTemp)); pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash; pen.Color = Color.Black; xline = intPnt.DistanceDraw + canXOrigin; yline = y + diaHeight / radioTemp; g.DrawLine(pen, (int)xline, (int)yline, (int)xline, (int)(tableYOrigin + rowHeight * 4)); g.DrawString(intPnt.FcName, font, drawBrush, (float)(xline - constfc), (float)(tableYOrigin - constStrY)); rotate.DrawString(Math.Round(intPnt.H, 3).ToString(), font, drawBrush, new PointF((float)(xline - constStrX), (float)(tableYOrigin + rowHeight * 0 + constStrY)), format, -90f); rotate.DrawString(Math.Round(intPnt.ZPipeTop - (diaHeight * zoom) / 1000, 3).ToString(), font, drawBrush, new PointF((float)(xline - constStrX), (float)(tableYOrigin + rowHeight * 1 + constStrY)), format, -90f); rotate.DrawString(intPnt.Diameter, font, drawBrush, new PointF((float)(xline - constStrX), (float)(tableYOrigin + rowHeight * 2 + constStrY)), format, -90f); if (intPnt.Distance < 1.0) { rotate.DrawString(Math.Round(intPnt.Distance, 3).ToString(), font, drawBrush, new PointF((float)(x - constStrX), (float)(tableYOrigin + rowHeight * 3 + constStrY + 10)), format, 0f); } else { rotate.DrawString(Math.Round(intPnt.Distance, 3).ToString(), font, drawBrush, new PointF((float)(x - constStrX), (float)(tableYOrigin + rowHeight * 3 + constStrY)), format, 0f); } } } } g.DrawString(Math.Round(totalXSpan + 2 * constCanBlank * xRadio / 1000, 3).ToString(), font, drawBrush, (float)canvasTotalWidth / 2 - 20, (float)(tableYOrigin + rowHeight * 4 + 10)); } catch (System.Exception ex) { } }