Newer
Older
EMS_SZ / FrmHDMAnalysis3.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using System.Collections;
using GeoScene.Globe;
using GeoScene.Data;
using System.Windows.Forms.DataVisualization.Charting;
using System.Linq;

namespace Cyberpipe
{
    public partial class FrmHDMAnalysis3 : Office2007Form
    {
        private ArrayList listPoint = new ArrayList();
        private ArrayList listFeat = new ArrayList();
        GSOGeoPolyline3D line = new GSOGeoPolyline3D(); //创建线对象

        private static FrmHDMAnalysis3 allPipelineAnalysis = null;
        public bool isShowFirst = false;

        static ArrayList list = new ArrayList();
        static DataTable table = new DataTable();
        GSOGlobeControl globeControl1;
        object[,] sortIndex;
        GSOLayer layerTemp;
        private int curAxisXSize = 0;

        List<int> zList = new List<int>();

        private FrmHDMAnalysis3()
        {

        }

        public static FrmHDMAnalysis3 GetForm(ArrayList arraylistP, ArrayList arraylistF, GSOGeoPolyline3D _line, GSOGlobeControl _ctl)
        {
            if (allPipelineAnalysis == null)
            {
                allPipelineAnalysis = new FrmHDMAnalysis3(arraylistP, arraylistF, _line, _ctl);
            }
            else
            {
                allPipelineAnalysis.listPoint = arraylistP;
                allPipelineAnalysis.listFeat = arraylistF;
                allPipelineAnalysis.line = _line;
                allPipelineAnalysis.globeControl1 = _ctl;
                list = new ArrayList();
            }
            return allPipelineAnalysis;
        }

        public FrmHDMAnalysis3(ArrayList arraylistP, ArrayList arraylistF, GSOGeoPolyline3D _line, GSOGlobeControl _ctl)
        {
            InitializeComponent();
            listPoint = arraylistP;
            listFeat = arraylistF;
            line = _line;
            globeControl1 = _ctl;

            for (int i = 0; i < listPoint.Count; i++)
            {
                GSOPoint3d geoPoint = (GSOPoint3d)listPoint[i];

                zList.Add(Convert.ToInt32(Math.Ceiling(geoPoint.Z)));
            }

        }

        double A_x, A_y, B_x, B_y;//定义坐标点,用来就横断面的长度
        /// <summary>
        /// 窗体初始化事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Frm_HDMAnalysis_Load(object sender, EventArgs e)
        {
            layerTemp = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\tempLgdExport.lgd");
            //chart1.ChartAreas[0].BackImage = Application.StartupPath + "\\Resource\\pipelineBackGround副本.png";
        }
        /// <summary>
        /// 窗体第一次显示事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void Frm_HDMAnalysis2_Shown(object sender, EventArgs e)
        {
            isShowFirst = true;
        }

        public void LoadChartEvent()
        {
            try
            {
                Shown += new EventHandler(Frm_HDMAnalysis2_Shown);

                chart1.Series["管线"].ChartType = SeriesChartType.Point;

                chart1.Series["管线"]["DrawingStyle"] = "Cylinder";
                chart1.Series["管线"].MarkerStyle = MarkerStyle.Circle; //点的类型     

                chart1.Series["管线"].MarkerBorderColor = Color.Black;  //点的边框颜色
                chart1.ChartAreas[0].AxisX.Minimum = 0;              //x轴的起始点大小
                ChartYDraw(zList.Min() - 1, zList.Max());

                chart1.ChartAreas[0].AxisX.Title = "距离 (米)";
                chart1.ChartAreas[0].AxisY.Title = "埋深 (米)";


                chart1.ChartAreas[0].CursorX.IsUserEnabled = true;
                chart1.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
                chart1.ChartAreas[0].AxisX.ScaleView.Zoomable = false;
                chart1.ChartAreas[0].AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.All;//启用X轴滚动条按钮


                chart1.ChartAreas[0].AxisY2.Title = "高程 (米)";
                double[] depths = new double[listFeat.Count];
                for (int i = 0; i < listFeat.Count; i++)
                {
                    GSOFeature f = listFeat[i] as GSOFeature;
                    double depth = f.GetFieldAsDouble("起始埋深");
                    depths[i] = depth;
                }
                double max_Depth = depths[0];
                for (int i = 0; i < listFeat.Count; i++)
                {
                    if (max_Depth < depths[i])
                    {
                        max_Depth = depths[i];
                    }
                }

                chart1.ChartAreas[0].AxisY2.CustomLabels.Clear();
                chart1.ChartAreas[0].AxisY2.CustomLabels.Add(-5.4d, -5.6d, (max_Depth - 5.5).ToString("0.0"));
                chart1.ChartAreas[0].AxisY2.CustomLabels.Add(-4.9d, -5.1d, (max_Depth - 5).ToString("0.0"));
                chart1.ChartAreas[0].AxisY2.CustomLabels.Add(-4.4d, -4.6d, (max_Depth - 4.5).ToString("0.0"));
                chart1.ChartAreas[0].AxisY2.CustomLabels.Add(-3.9d, -4.1d, (max_Depth - 4).ToString("0.0"));
                chart1.ChartAreas[0].AxisY2.CustomLabels.Add(-3.4d, -3.6d, (max_Depth - 3.5).ToString("0.0"));
                chart1.ChartAreas[0].AxisY2.CustomLabels.Add(-2.9d, -3.1d, (max_Depth - 3).ToString("0.0"));
                chart1.ChartAreas[0].AxisY2.CustomLabels.Add(-2.4d, -2.6d, (max_Depth - 2.5).ToString("0.0"));
                chart1.ChartAreas[0].AxisY2.CustomLabels.Add(-1.9d, -2.1d, (max_Depth - 2).ToString("0.0"));
                chart1.ChartAreas[0].AxisY2.CustomLabels.Add(-1.4d, -1.6d, (max_Depth - 1.5).ToString("0.0"));
                chart1.ChartAreas[0].AxisY2.CustomLabels.Add(-0.9d, -1.1d, (max_Depth - 1).ToString("0.0"));
                chart1.ChartAreas[0].AxisY2.CustomLabels.Add(-0.4d, -0.6d, (max_Depth - 0.5).ToString("0.0"));
                chart1.ChartAreas[0].AxisY2.CustomLabels.Add(-0.1d, 0.1d, max_Depth.ToString("0.0"));

                if (line.PartCount > 0)
                {
                    GSOPoint3ds nodes = line[0];
                    if (nodes.Count > 0)
                    {
                        GSOPoint3d node = nodes[0];
                        A_x = node.X;
                        A_y = node.Y;
                    }
                }

                DrawCurveGraph(A_x, A_y);
            }
            catch (Exception ex)
            {
                //LogError.PublishError(ex);
            }
        }

        /// <summary>
        /// 创建图表
        /// </summary>
        /// <param name="a_x"></param>
        /// <param name="a_y"></param>
        private void DrawCurveGraph(double a_x, double a_y)
        {

            // 遍历线,求距离
            table = new DataTable();
            //showTable.Columns.Clear();
            list.Clear();
            chart1.Series["管线"].Points.Clear();
            chart1.ChartAreas[0].AxisX.Maximum = Math.Round(line.GetSpaceLength(true, 6378137), 2);
            table.Columns.Add("编号", typeof(string));
            table.Columns.Add("管线类型", typeof(string));
            table.Columns.Add("管线编码", typeof(string));
            table.Columns.Add("管径_毫米", typeof(string));
            table.Columns.Add("材质", typeof(string));
            table.Columns.Add("管线埋深", typeof(string));

            sortIndex = new object[listPoint.Count, 2];
            for (int i = 0; i <= listPoint.Count; i++)
            {
                if (i == listPoint.Count)
                {
                    double maxNum = 0.0;
                    for (int j = 0; j < listPoint.Count; j++)
                    {
                        if (maxNum < Convert.ToDouble(sortIndex[j, 0]))
                        {
                            maxNum = Convert.ToDouble(sortIndex[j, 0]);
                        }
                    }
                    chart1.Series["管线"].Points.AddXY(maxNum + 2, 0);
                    chart1.Series["管线"].Points[i].MarkerBorderWidth = 0;//边框的宽度
                    chart1.Series["管线"].Points[i].MarkerColor = Color.Transparent;
                    chart1.Series["管线"].Points[i].MarkerSize = 0;
                    continue;
                }
                GSOPoint3d geoPoint = (GSOPoint3d)listPoint[i];
                GSOFeature feature = listFeat[i] as GSOFeature;
                //坐标投影
                int id = GSOProjectManager.AddProject(Utility.projectStr);

                GSOPoint2d a_Point = GSOProjectManager.Forward(new GSOPoint2d(a_x, a_y), id);//user画的线的起始点

                GSOPoint2d pt2d = new GSOPoint2d(geoPoint.X, geoPoint.Y);
                GSOPoint2d result = GSOProjectManager.Forward(pt2d, id);
                B_x = result.X;
                B_y = result.Y;

                double x = Math.Abs(B_x - a_Point.X);
                double y = Math.Abs(B_y - a_Point.Y);
                double Dis = 0.0;
                Dis = Math.Round(Math.Sqrt(x * x + y * y), 2);
                list.Add(geoPoint.Z);
                sortIndex[i, 0] = Dis;
                sortIndex[i, 1] = i;

                chart1.Series["管线"].Points.AddXY(Dis, geoPoint.Z);//绑定数据


                //录视频
                //double z = geoPoint.Z-458;
                //chart1.Series["管线"].Points.AddXY(Dis, z);


                string pipeType = feature.Dataset == null ? "" : feature.Dataset.Caption;
                string number = Convert.ToString(i + 1);

                string material = feature.GetFieldAsString("材质");
                string diameter = feature.GetFieldAsString("管径_毫米");
                string value = "";
                try
                {//解决有的数字太小,转换不成功的问题
                    value = Convert.ToDecimal(list[i].ToString()).ToString("f2");
                }
                catch (Exception e)
                {
                    value = "0.00";
                }
                table.Rows.Add(new object[] { number, pipeType, feature.Name.ToString(), diameter, material, value });//list[i].ToString().Substring(0,list[i].ToString().IndexOf('.')+3) }

                //chart1.Series["管线"].Points[i].Label = number;//管线的标签
                chart1.Series["管线"].Points[i].LegendText = number;
                if (feature.Geometry.Style.GetType() == typeof(GSOPipeLineStyle3D))
                {
                    GSOPipeLineStyle3D style = (GSOPipeLineStyle3D)feature.Geometry.Style;
                    chart1.Series["管线"].Points[i].MarkerBorderColor = style.LineColor;//点的填充色
                }
                else
                {
                    chart1.Series["管线"].Points[i].MarkerBorderColor = Color.Black;
                }

                chart1.Series["管线"].Points[i].MarkerBorderWidth = 3;//边框的宽度
                chart1.Series["管线"].Points[i].MarkerColor = Color.Transparent;
                curAxisXSize = (int)chart1.ChartAreas[0].AxisX.Maximum + 1;

                int markerSize = ComputeMarkerSize(feature.GetFieldAsDouble("管径_毫米"));
                chart1.Series["管线"].Points[i].MarkerSize = markerSize;//点的大小
                // chart1.Series["管线"].Points[i].MarkerSize = Convert.ToInt32(Math.Floor((feature.GetFieldAsDouble("管径_毫米") / 0.35 + chart1.Series["管线"].Points[i].MarkerBorderWidth) / 100.0));//点的大小

            }

            string htmlCode = "<html><head><style>#hor-minimalist-b " +
                        "{-moz-background-clip:border;" +
                                "-moz-background-inline-policy:continuous;" +
                                    "-moz-background-origin:padding;" +
                                    "background:#FFFFFF none repeat scroll 0 0;" +
                                    "border-collapse:collapse;" +
                                    "font-family:'Lucida Sans Unicode','Lucida Grande',Sans-Serif;" +
                                   " font-size:12px;" +
                                   " margin:10px;" +
                                   " text-align:left;" +
                                   " width:80%;" +
                                   " }" +
                                   " #hor-minimalist-b th {" +
                                   " border-bottom:2px solid #6678B1;" +
                                   " color:#003399;" +
                                   " font-size:12px;" +
                                "font-weight:normal;" +
                                  "  padding:10px 8px;" +
                                   " }" +
                                  "  #hor-minimalist-b td {" +
                                   " border-bottom:1px solid #CCCCCC;" +
                                   " font-size:12px;" +
                                   " color:#666699;" +
                                "padding:6px 8px;}" +
                                "#hor-minimalist-b tbody tr:hover td {" +
                                "color:#000099;}" +
                                "</style></head>" +
                        "<body style='border:none;' ><table align='center' summary='Employee Pay Sheet' id='hor-minimalist-b'><thead><tr><th scope='col'>管线类型</th><th scope='col'>管线编码</th><th scope='col'>管径_毫米</th>" +
                                        "<th scope='col'>材质</th><th scope='col'>管线高程</th></tr></thead>" +
                                        "<tbody><tr><td>" +
                                        "</td><td>" +
                                        "</td><td>" +
                                        "</td><td>" +
                                        "</td><td>" +
                                        "</td></tr></tbody></table></body><ml>";
            webBrowser1.DocumentText = htmlCode;

        }

        private void ChartYDraw(double minY, double maxY)
        {
            chart1.ChartAreas[0].AxisY.Minimum = minY;
            chart1.ChartAreas[0].AxisY.Maximum = maxY;
        }

        /// <summary>
        /// 图表的鼠标单击事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void chart1_MouseClick(object sender, MouseEventArgs e)
        {
            HitTestResult result = chart1.HitTest(e.X, e.Y, true);
            if (result.PointIndex >= 0)
            {
                DataPoint p = (DataPoint)result.Object;
                if (p == null)
                {
                    return;
                }
                string number = p.LegendText;
                //MessageBox.Show(number);
                int indexInTableRows = 0;
                bool isInt = int.TryParse(number, out indexInTableRows);
                if (isInt)
                {
                    DataRow row = table.Rows[indexInTableRows - 1];
                    //showTable.Rows.Clear();
                    //showTable.Rows.Add(new object[] { row[0], row[1], row[2], row[3], row[4], row[5] });
                    string htmlCode = "<html><head><style>#hor-minimalist-b " +
                        "{-moz-background-clip:border;" +
                                "-moz-background-inline-policy:continuous;" +
                                    "-moz-background-origin:padding;" +
                                    "background:#FFFFFF none repeat scroll 0 0;" +
                                    "border-collapse:collapse;" +
                                    "font-family:'Lucida Sans Unicode','Lucida Grande',Sans-Serif;" +
                                   " font-size:12px;" +
                                   " margin:10px;" +
                                   " text-align:left;" +
                                   " width:80%;" +
                                   " }" +
                                   " #hor-minimalist-b th {" +
                                   " border-bottom:2px solid #6678B1;" +
                                   " color:#003399;" +
                                   " font-size:12px;" +
                                "font-weight:normal;" +
                                  "  padding:10px 8px;" +
                                   " }" +
                                  "  #hor-minimalist-b td {" +
                                   " border-bottom:1px solid #CCCCCC;" +
                                   " font-size:12px;" +
                                   " color:#666699;" +
                                "padding:6px 8px;}" +
                                "#hor-minimalist-b tbody tr:hover td {" +
                                "color:#000099;}" +
                                "</style></head>" +
                        "<body style='border:none;' ><table align='center' summary='Employee Pay Sheet' id='hor-minimalist-b'><thead><tr><th scope='col'>管线类型</th><th scope='col'>管线编码</th><th scope='col'>管径_毫米</th>" +
                                        "<th scope='col'>材质</th><th scope='col'>管线高程</th></tr></thead>" +
                                        "<tbody><tr><td>" + row[1] +
                                        "</td><td>" + row[2] +
                                        "</td><td>" + row[3] +
                                        "</td><td>" + row[4] +
                                        "</td><td>" + row[5] +
                                        "</td></tr></tbody></table></body></html>";
                    webBrowser1.DocumentText = htmlCode;
                }
            }
        }
        /// <summary>
        /// 窗体关闭事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Frm_HDMAnalysis3_FormClosing(object sender, FormClosingEventArgs e)
        {
            allPipelineAnalysis = null;
            globeControl1.Globe.MemoryLayer.RemoveAllFeature();
        }

        /// <summary>
        /// 图表的鼠标移动事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void chart1_MouseMove(object sender, MouseEventArgs e)
        {
            HitTestResult result = chart1.HitTest(e.X, e.Y, true);
            //Cursor cr = this.Cursor;
            Cursor = result.PointIndex >= 0 ? Cursors.Hand : Cursors.Default;
        }
        /// <summary>
        /// 导出CAD按钮事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnExportCAD_Click(object sender, EventArgs e)
        {
            //globeControl1.Globe.MemoryLayer.RemoveAllFeature();
            layerTemp.RemoveAllFeature();
            for (int i = 0; i < listPoint.Count; i++)
            {
                GSOPoint3d geoPoint = (GSOPoint3d)listPoint[i];
                GSOFeature feature = listFeat[i] as GSOFeature;
                if (feature != null)
                {
                    if (feature.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                    {
                        GSOPipeLineStyle3D style = feature.Geometry.Style as GSOPipeLineStyle3D;
                        double r = style.Radius;
                        ExportCAD(double.Parse(sortIndex[i, 0].ToString()), geoPoint.Z, r);
                    }
                }
            }
            layerTemp.Dataset.ImportProjectionRefFromProj4("");
            SaveFileDialog dlg = new SaveFileDialog();
            dlg.Filter = "*.dxf|*.dxf";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                layerTemp.SaveAs(dlg.FileName);
                MessageBox.Show("导出CAD完成!", "提示");
            }
            layerTemp.RemoveAllFeature();
        }
        private void Export(GSOPoint3d _pnt, double r)
        {
            GSOPoint3ds pnts = new GSOPoint3ds();
            GSOPoint3d pnt = new GSOPoint3d();
            pnt.X = _pnt.X;
            pnt.Y = _pnt.Y;
            pnt.Z = _pnt.Z;
            pnts.Add(pnt);
            pnt.X = _pnt.X;
            pnt.Y = _pnt.Y - 0.0000000005;
            pnt.Z = _pnt.Z;
            pnts.Add(pnt);
            GSOGeoPolyline3D line = new GSOGeoPolyline3D();
            line.AddPart(pnts);
            GSOGeoPolygon3D polygon = line.CreateBuffer(r * 2, true, 5, true, false);
            GSOPoint3ds points = polygon[0];
            GSOGeoPolyline3D newLine = new GSOGeoPolyline3D();
            newLine.AddPart(points);
            newLine.AltitudeMode = EnumAltitudeMode.RelativeToGround;
            GSOFeature newFeature = new GSOFeature();
            newFeature.Geometry = newLine;
            globeControl1.Globe.MemoryLayer.AddFeature(newFeature);
        }

        private void ExportCAD(double a, double b, double r)
        {
            GSOPoint3ds pnts = new GSOPoint3ds();
            for (int i = 0; i <= 64; i++)
            {
                double x = a + r * Math.Cos(i * 5.625 * Math.PI / 180);
                double y = b - r * Math.Sin(i * 5.625 * Math.PI / 180);
                GSOPoint2d pt2d = new GSOPoint2d(x, y);
                GSOPoint3d pnt = new GSOPoint3d();
                pnt.X = pt2d.X;
                pnt.Y = pt2d.Y;
                pnt.Z = 0;
                pnts.Add(pnt);
            }
            GSOGeoPolyline3D line = new GSOGeoPolyline3D();
            line.AddPart(pnts);
            GSOFeature f = new GSOFeature();
            f.Geometry = line;
            f.Geometry.LatLonCoord = false;
            f.Visible = false;
            layerTemp.AddFeature(f);
        }
        //局部放大
        private void chart1_SelectionRangeChanged(object sender, CursorEventArgs e)
        {
            if (chart1.Series[0].Points.Count == 0)
                return;
            double startPosition = 0.0;
            double endPosition = 0.0;
            double myInterval = 0.0;
            startPosition = e.NewSelectionStart;
            endPosition = e.NewSelectionEnd;
            myInterval = Math.Abs(startPosition - endPosition);
            if (myInterval.Equals(0.0))
                return;

            //X轴视图起点
            chart1.ChartAreas[0].AxisX.ScaleView.Position = Math.Min(startPosition, endPosition);
            //X轴视图长度
            chart1.ChartAreas[0].AxisX.ScaleView.Size = myInterval;
            //X轴间隔
            chart1.ChartAreas[0].AxisX.Interval = myInterval < 11.0 ? 1 : Math.Floor(myInterval / 10);

            curAxisXSize = (int)myInterval;
            for (int i = 0; i < chart1.Series[0].Points.Count; i++)
            {
                DataPoint p = chart1.Series[0].Points[i];
                if (p == null)
                {
                    continue;
                }
                string number = p.LegendText;
                int indexInTableRows = 0;
                bool isInt = int.TryParse(number, out indexInTableRows);
                if (!isInt) continue;
                DataRow row = table.Rows[indexInTableRows - 1];
                double diameter = Double.Parse(row[3].ToString());
                int markerSize = ComputeMarkerSize(diameter);
                chart1.Series[0].Points[i].MarkerSize = markerSize;//点的大小
            }



        }
        //恢复大小
        private void chart1_AxisScrollBarClicked(object sender, ScrollBarEventArgs e)
        {
            if (e.ButtonType == ScrollBarButtonType.ZoomReset)
            {
                chart1.ChartAreas[0].AxisX.Interval = 0;
            }
            curAxisXSize = (int)chart1.ChartAreas[0].AxisX.Maximum;
            for (int i = 0; i < listPoint.Count; i++)
            {
                GSOFeature feature = listFeat[i] as GSOFeature;
                if (feature == null) continue;
                double diameter = feature.GetFieldAsDouble("管径_毫米");
                int markerSize = ComputeMarkerSize(diameter);
                chart1.Series["管线"].Points[i].MarkerSize = markerSize;//点的大小
            }
        }

        private int ComputeMarkerSize(double diameter)
        {
            int scope = curAxisXSize < 50 ? 50 : curAxisXSize;
            int markerSize =
                Convert.ToInt32(
                    Math.Floor(diameter / (0.35 * scope)));
            markerSize = markerSize < 5 ? 5 : markerSize;
            return markerSize;
        }
    }
}