using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using GeoScene.Globe; using GeoScene.Data; using System.Windows.Forms.DataVisualization.Charting; using System.IO; namespace Cyberpipe { public partial class FrmpipeMaterialGather :DevComponents.DotNetBar.Office2007Form { GSOGlobeControl globeControl1; List<string> pipeLayerNames; static FrmpipeMaterialGather frm; public static void ShowForm(GSOGlobeControl globeControl, List<string> pipeLayers, int visibleId) { if (frm == null) { frm = new FrmpipeMaterialGather(globeControl, pipeLayers, visibleId); frm.Show(globeControl.Parent); } else { if (frm.WindowState == FormWindowState.Minimized) { frm.WindowState = FormWindowState.Normal; } } } public FrmpipeMaterialGather(GSOGlobeControl _globeControl1, List<string> pipeLayers, int visibleId) { InitializeComponent(); globeControl1 = _globeControl1; pipeLayerNames = pipeLayers; if (visibleId == 0) { buttonX9.Visible = false; buttonX8.Visible = true; buttonX8.Location = buttonX9.Location; } if (visibleId == 1) { buttonX8.Visible = false; buttonX9.Visible = true; } } /// <summary> /// 窗体初始化事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrmpipeMaterialGather_Load(object sender, EventArgs e) { //for (int i = globeControl1.Globe.Layers.Count - 1; i >= 0; i--) //{ for (int i = 0; i < pipeLayerNames.Count; i++) { //GSOLayer layer = globeControl1.Globe.Layers[i]; clbPipeLine.Items.Add(pipeLayerNames[i]); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(pipeLayerNames[i]); if (layer.Dataset != null && layer.Dataset.IsFeatureDataset) { string name = layer.Name; if (layer.Type == EnumLayerType.FeatureLayer)//if (layer.Type == EnumLayerType.FeatureLayer && !name.Contains("\\") && layer.Caption.Contains("管线") && !layer.Caption.Contains("弯头")) { /* if (!clbPipeLine.Items.Contains(layer.Caption)) { clbPipeLine.Items.Add(layer.Caption); } */ GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatures feats = new GSOFeatures(); feats = flayer.GetAllFeatures(); for (int j = 0; j < feats.Length; j++) { if (!clbmaterials.Items.Contains(feats[j].GetFieldAsString("材质"))) { if (feats[j].GetFieldAsString("材质") == "") { if (!clbmaterials.Items.Contains("无")) { clbmaterials.Items.Add("无"); } } else { clbmaterials.Items.Add(feats[j].GetFieldAsString("材质")); } } } } } } } /// <summary> /// 球的跟踪面结束事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void globeControl1_TrackPolygonEndEvent(object sender, TrackPolygonEndEventArgs e) { if (e.Polygon != null) { GSOGeoPolygon3D polygon = e.Polygon.Clone() as GSOGeoPolygon3D; polygon.AltitudeMode = EnumAltitudeMode.RelativeToGround; GSOFeature feature = new GSOFeature(); feature.Geometry = polygon; feature.Name = "trackPolygon"; globeControl1.Globe.MemoryLayer.AddFeature(feature); globeControl1.Globe.ClearLastTrackPolygon(); globeControl1.TrackPolygonEndEvent -= new TrackPolygonEndEventHandler(globeControl1_TrackPolygonEndEvent); globeControl1.Globe.Action = EnumAction3D.ActionNull; pipeDiameterStatis(e.Polygon); } } /// <summary> /// 全选按钮事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonX1_Click(object sender, EventArgs e) { for (int i = 0; i < clbPipeLine.Items.Count; i++) { clbPipeLine.SetItemChecked(i, true); } } /// <summary> /// 反选按钮事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonX2_Click(object sender, EventArgs e) { for (int i = 0; i < this.clbPipeLine.Items.Count; i++) { if (clbPipeLine.GetItemChecked(i) == true) { this.clbPipeLine.SetItemChecked(i, false); } else { this.clbPipeLine.SetItemChecked(i, true); } } } /// <summary> /// 清空按钮事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonX3_Click(object sender, EventArgs e) { for (int i = 0; i < clbPipeLine.Items.Count; i++) { clbPipeLine.SetItemChecked(i, false); } } Dictionary<string, double> dic = new Dictionary<string, double>(); /// <summary> /// 给表格绑定数据 /// </summary> /// <param name="polygon"></param> private void pipeDiameterStatis(GSOGeoPolygon3D polygon) { try { dic = new Dictionary<string, double>(); dataGridViewX1.Rows.Clear(); if (clbPipeLine.CheckedItems.Count > 0) { for (int i = 0; i < clbPipeLine.CheckedItems.Count; i++) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(clbPipeLine.CheckedItems[i].ToString()); GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatures feats = new GSOFeatures(); if (polygon == null) feats = flayer.GetAllFeatures(); else feats = flayer.FindFeaturesInPolygon(polygon, false); List<string> lstDiameter = new List<string>(); for (int j = 0; j < clbmaterials.CheckedItems.Count; j++) { if (!lstDiameter.Contains(clbmaterials.CheckedItems[j].ToString())) { lstDiameter.Add(clbmaterials.CheckedItems[j].ToString()); } } //lstDiameter.Sort(); if (lstDiameter.Count > 0) { for (int m = 0; m < lstDiameter.Count; m++) { double totalLength = 0.00; int ncount = 0; for (int j = 0; j < feats.Length; j++) { if (lstDiameter[m] != "无") { if (feats[j].GetFieldAsString("材质") == lstDiameter[m]) { GSOGeoPolyline3D line = feats[j].Geometry as GSOGeoPolyline3D; if (line != null) { double length = line.GetSpaceLength(true, 6378137); totalLength += length; ncount += 1; } } } else { if (feats[j].GetFieldAsString("材质") == "") { GSOGeoPolyline3D line = feats[j].Geometry as GSOGeoPolyline3D; if (line != null) { double length = line.GetSpaceLength(true, 6378137); totalLength += length; ncount += 1; } } } } DataGridViewRow row = new DataGridViewRow(); int index = dataGridViewX1.Rows.Add(row); row = dataGridViewX1.Rows[index]; row.Cells["图层名称"].Value = layer.Caption; row.Cells["材质"].Value = lstDiameter[m]; row.Cells["条数"].Value = ncount; row.Cells["总长度"].Value = Math.Round(totalLength); dic.Add(layer.Caption + "," + row.Cells["材质"].Value.ToString(), ncount); } } } } else { MessageBox.Show("请选择图层!"); } showPipeWidget(); } catch (Exception ex) { MessageBox.Show(ex.Message); //LogError.PublishError(ex); } } /// <summary> /// 给图表绑定数据 /// </summary> private void showPipeWidget() { if (chart1.Series.Count > 0) { chart1.Series.Clear(); } if (chart1.Legends.Count > 0) { chart1.Legends.Clear(); } for (int i = 0; i < clbPipeLine.CheckedItems.Count; i++) { chart1.Series.Add(clbPipeLine.CheckedItems[i].ToString()); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(clbPipeLine.CheckedItems[i].ToString()); if (layer != null && layer is GSOFeatureLayer) { GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatures features = flayer.GetAllFeatures(); if (features.Length > 0) { if (features[0] != null && features[0].Geometry != null && features[0].Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOGeoPolyline3D p3d = features[0].Geometry as GSOGeoPolyline3D; if (p3d.Style != null && p3d.Style is GSOPipeLineStyle3D) { GSOPipeLineStyle3D ps3d = p3d.Style as GSOPipeLineStyle3D; chart1.Series[i].Color = ps3d.LineColor; } } } } chart1.Legends.Add(clbPipeLine.CheckedItems[i].ToString()); chart1.Legends[i].Docking = Docking.Top; chart1.Legends[clbPipeLine.CheckedItems[i].ToString()].IsTextAutoFit = true; chart1.Legends[clbPipeLine.CheckedItems[i].ToString()].LegendStyle = LegendStyle.Table; chart1.Legends[clbPipeLine.CheckedItems[i].ToString()].DockedToChartArea = "ChartArea1"; chart1.Legends[clbPipeLine.CheckedItems[i].ToString()].BackColor = Color.Transparent; chart1.ChartAreas["ChartArea1"].AxisY.IsLabelAutoFit = false; } // Set axis title chart1.ChartAreas["ChartArea1"].AxisX.Title = "材质"; chart1.ChartAreas["ChartArea1"].AxisY.Title = "管线数量"; chart1.ChartAreas["ChartArea1"].AxisX.Interval = 1; LabelStyle labeStyleAxisX = new LabelStyle(); labeStyleAxisX.Angle = -45; labeStyleAxisX.Enabled = true; chart1.ChartAreas["ChartArea1"].AxisX.LabelStyle = labeStyleAxisX; Dictionary<string, double> dic1 = new Dictionary<string, double>(); for (int j = 0; j < chart1.Series.Count; j++) { dic1 = new Dictionary<string, double>(); foreach (string key in dic.Keys) { if (key.Contains(chart1.Series[j].Name)) { dic1.Add(key.Split(',')[1].ToString(), dic[key]); } } chart1.Series[j].ChartType = SeriesChartType.Column; chart1.Series[j]["DrawingStyle"] = "Cylinder"; //chart1.Series[j].IsValueShownAsLabel = true; chart1.Series[j].Points.DataBindXY(dic1.Keys, dic1.Values); for (int m = 0; m < dic1.Values.Count; m++) { if (chart1.Series[j].Points[m].YValues[0].ToString() != "0") { chart1.Series[j].Points[m].Label = chart1.Series[j].Points[m].YValues[0].ToString(); } } } } /// <summary> /// 绘制区域分类汇总 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonX9_Click(object sender, EventArgs e) { if (clbPipeLine.CheckedItems.Count > 0) { if (clbmaterials.CheckedItems.Count > 0) { Utility.RemoveFeatureFromName(globeControl1, "trackPolygon"); globeControl1.Globe.Action = EnumAction3D.TrackPolygon; globeControl1.Globe.TrackPolygonTool.TrackMode = EnumTrackMode.SpaceTrack; globeControl1.TrackPolygonEndEvent += new TrackPolygonEndEventHandler(globeControl1_TrackPolygonEndEvent); } else { MessageBox.Show("请选择材质类型!"); } } else { MessageBox.Show("请选择图层!"); } } /// <summary> /// 窗体关闭事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrmpipeMaterialGather_FormClosing(object sender, FormClosingEventArgs e) { frm = null; Utility.RemoveFeatureFromName(globeControl1, "trackPolygon"); globeControl1.TrackPolygonEndEvent -= new TrackPolygonEndEventHandler(globeControl1_TrackPolygonEndEvent); globeControl1.Globe.Action = EnumAction3D.ActionNull; globeControl1.Globe.MemoryLayer.RemoveAllFeature(); } /// <summary> /// 导出Excel按钮事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnExport_Click(object sender, EventArgs e) { if (dataGridViewX1.Rows.Count > 0) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "Excel files (*.xls)|*.xls"; dlg.FilterIndex = 0; dlg.RestoreDirectory = true; //dlg.CreatePrompt = true; dlg.Title = "保存为Excel文件"; dlg.FileName = DateTime.Now.ToString("yyyyMMdd") + ".xls"; if (dlg.ShowDialog() == DialogResult.OK) { Stream myStream; myStream = dlg.OpenFile(); StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0)); string columnTitle = ""; try { sw.WriteLine("日期:" + DateTime.Now.ToString("yyyy-MM-dd")); //写入列标题 for (int i = 0; i < dataGridViewX1.ColumnCount; i++) { if (i > 0) { columnTitle += "\t"; } columnTitle += dataGridViewX1.Columns[i].HeaderText; } sw.WriteLine(columnTitle); //写入列内容 for (int j = 0; j < dataGridViewX1.Rows.Count; j++) { string columnValue = ""; for (int k = 0; k < dataGridViewX1.Columns.Count; k++) { if (k > 0) { columnValue += "\t"; } if (dataGridViewX1.Rows[j].Cells[k].Value == null) columnValue += ""; else columnValue += dataGridViewX1.Rows[j].Cells[k].Value.ToString().Trim(); } sw.WriteLine(columnValue); } sw.Close(); myStream.Close(); if (MessageBox.Show("导出Excel文件成功!是否打开?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { System.Diagnostics.Process.Start(dlg.FileName); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { sw.Close(); myStream.Close(); } } } else { MessageBox.Show("统计结果为空,请重新统计之后再导出Excel!", "提示"); } } /// <summary> /// 全区域分类汇总 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonX8_Click(object sender, EventArgs e) { if (clbPipeLine.CheckedItems.Count > 0) { if (clbmaterials.CheckedItems.Count > 0) { globeControl1.Globe.Action = EnumAction3D.ActionNull; pipeDiameterStatis(null); } else { MessageBox.Show("请选择材质类型!"); } } else { MessageBox.Show("请选择图层!"); } } /// <summary> /// 全选 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonX6_Click(object sender, EventArgs e) { for (int i = 0; i < clbmaterials.Items.Count; i++) { clbmaterials.SetItemChecked(i, true); } } /// <summary> /// 反选 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonX5_Click(object sender, EventArgs e) { for (int i = 0; i < this.clbmaterials.Items.Count; i++) { if (clbmaterials.GetItemChecked(i) == true) { this.clbmaterials.SetItemChecked(i, false); } else { this.clbmaterials.SetItemChecked(i, true); } } } /// <summary> /// 清空 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void buttonX4_Click(object sender, EventArgs e) { for (int i = 0; i < clbmaterials.Items.Count; i++) { clbmaterials.SetItemChecked(i, false); } } private void clbPipeLine_ItemCheck(object sender, ItemCheckEventArgs e) { if (clbPipeLine.CheckedItems.Count > 0) { for (int i = 0; i < clbPipeLine.Items.Count; i++) { if (i != e.Index) { this.clbPipeLine.SetItemCheckState(i, System.Windows.Forms.CheckState.Unchecked); } } } } } }