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