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);
                }
            });
        }
Exemplo n.º 2
0
        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)
            {
            }
        }
Exemplo n.º 3
0
        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
            {
            }
        }
Exemplo n.º 4
0
        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)
            {
            }
        }
Exemplo n.º 5
0
        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)
            {
            }
        }