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 DevComponents.DotNetBar; using GeoScene.Globe; using GeoScene.Data; using GeoScene.Engine; namespace Cyberpipe.FormAnalysis { public partial class FormHor : Office2007Form { GSOGlobeControl globeControl1 = null; int maxPageIndex = 20; int rows = 0; public static GSODataSource ds = null; private GSOFeatures features = null; public FormHor(GSOFeatures _features, GSOGlobeControl _globeControl) { InitializeComponent(); features = _features; globeControl1 = _globeControl; } private void FormHor_Load(object sender, EventArgs e) { addFeaturesToDataGridView(features); } private void addFeaturesToDataGridView(GSOFeatures features) { DataTable dt = new DataTable(); dt.Columns.Add("审核图层"); dt.Columns.Add("编号"); for (int i = 0; i < features.Length; i++) { DataRow r = dt.NewRow(); r[0] = features[i].Dataset.Name; r[1] = features[i].Name; dt.Rows.Add(r); } dataGridViewX1.DataSource = dt; } private void buttonOK_Click(object sender, EventArgs e) { if (textBoxJJBZ.Text.Trim() == "") { MessageBox.Show("净距标准不能为空!", "提示"); return; } double dJingJuBiaoZhun = 0; if (!double.TryParse(textBoxJJBZ.Text.Trim(), out dJingJuBiaoZhun)) { MessageBox.Show("请输入正确的净距标准!", "提示"); return; } for (int i = 0; i < dataGridViewX1.Rows.Count; i++) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption( dataGridViewX1.Rows[i].Cells[0].Value.ToString()); GSOFeatures features = layer.GetFeatureByName(dataGridViewX1.Rows[i].Cells[1].Value.ToString(), true); GSOFeature selectFeature = features[0]; if (selectFeature == null) continue; HorizontalDistanceAnalysis(selectFeature, Utility.m_PipelineLayerNames, dJingJuBiaoZhun); } if (dataGridViewX1.Rows.Count == 0) { MessageBox.Show("没有不符合净距标准的管线!", "提示"); } globeControl1.Refresh(); } /// <summary> /// 计算指定feature对象与除了该feature所在图层之外的 所有管线图层中的所有feature对象 的水平距离 并记录符合要求的管线 功能 /// </summary> /// <param name="selectedFeature"></param> /// <param name="_pipelineLayerNames"></param> /// <param name="dis"></param> private void HorizontalDistanceAnalysis(GSOFeature selectedFeature, List<string> _pipelineLayerNames, double dis) { Dictionary<GSOFeature, double> featureMap = DoublePanelAnalysis.HorizontalDistanceAnalysis(globeControl1, selectedFeature, _pipelineLayerNames, dis); if (featureMap == null) { MessageBox.Show("请选择一条管线!"); return; } DataTable dt = new DataTable(); dt.Columns.Add("审核图层"); dt.Columns.Add("审核编号"); dt.Columns.Add("问题图层"); dt.Columns.Add("问题编号"); dt.Columns.Add("标准/m"); foreach (KeyValuePair<GSOFeature, double> kvp in featureMap) { GSOFeature feat2 = kvp.Key; feat2.HighLight = true; string feat2Caption = feat2.Dataset.Caption; DataRow row = dt.NewRow(); row[0] = selectedFeature.Dataset.Caption; row[1] = selectedFeature.Name; row[2] = feat2Caption; row[3] = feat2.Name; row[4] = kvp.Value.ToString("0.00"); dt.Rows.Add(row); GSOGeoPolyline3D line2 = feat2.Geometry as GSOGeoPolyline3D; if (line2 == null) continue; } dataGridViewX2.DataSource = dt; } private void dataGridViewX1_MouseDoubleClick(object sender, MouseEventArgs e) { DataGridView.HitTestInfo hittestinfo = dataGridViewX1.HitTest(e.X, e.Y); if (hittestinfo.RowIndex < 0) return; try { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["审核图层"].Value.ToString()); GSOFeatures features = layer.GetFeatureByName(dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["编号"].Value.ToString(), true); //globeControl1.Globe.JumpToFeature(features[0], 50); ClassSearchAnalysis.AddMakerToLineFeature(globeControl1, features[0]); } catch (Exception ex) { MessageBox.Show("定位失败:" + ex, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void dataGridViewX2_MouseDoubleClick(object sender, MouseEventArgs e) { DataGridView.HitTestInfo hittestinfo = dataGridViewX2.HitTest(e.X, e.Y); if (hittestinfo.RowIndex < 0) return; try { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX2.Rows[hittestinfo.RowIndex].Cells["问题图层"].Value.ToString()); GSOFeatures features = layer.GetFeatureByName(dataGridViewX2.Rows[hittestinfo.RowIndex].Cells["问题编号"].Value.ToString(), true); //globeControl1.Globe.JumpToFeature(features[0], 50); ClassSearchAnalysis.AddMakerToLineFeature(globeControl1, features[0]); } catch (Exception ex) { MessageBox.Show("定位失败:" + ex, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void buttonX1_Click(object sender, EventArgs e) { string strSaveFile = ""; SaveFileDialog savefiledialog = new SaveFileDialog(); savefiledialog.Filter = "Excel文件|*.xls,*.xlsx"; savefiledialog.AddExtension = true; savefiledialog.FileName = "水平净距审核"; if (savefiledialog.ShowDialog() == DialogResult.OK) strSaveFile = savefiledialog.FileName; else return; ExpEXCEL.ExpToExcel(dataGridViewX2, strSaveFile, "水平净距审查"); } } }