Newer
Older
EMS_SZ / FrmpipeDeepstatis.cs
root on 29 Apr 2016 24 KB new ku
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.Data;
using GeoScene.Globe;
using System.Windows.Forms.DataVisualization.Charting;
using System.IO;

namespace Cyberpipe
{
    public partial class FrmpipeDeepstatis :DevComponents.DotNetBar.Office2007Form
    {
        GSOGlobeControl globeControl1;
        List<string> pipeLayerNames;

        static FrmpipeDeepstatis frm;
        public static void ShowForm(GSOGlobeControl globeControl, List<string> pipeLayers, int visibleId)
        {
            if (frm == null)
            {
                frm = new FrmpipeDeepstatis(globeControl, pipeLayers, visibleId);
                frm.Show(globeControl.Parent);
            }
            else
            {
                if (frm.WindowState == FormWindowState.Minimized)
                {
                    frm.WindowState = FormWindowState.Normal;
                }
            }
        }

        public FrmpipeDeepstatis(GSOGlobeControl globeControl, List<string> pipeLayers, int visibleId)
        {
            InitializeComponent();
            globeControl1 = globeControl;
            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 buttonX5_Click(object sender, EventArgs e)
        {
            if (dataGridViewX2.SelectedCells.Count > 0)
            {
                DataGridViewRow row = dataGridViewX2.Rows[dataGridViewX2.SelectedCells[0].RowIndex];
                if (lstpipeRadius.SelectedItem != null)
                {
                    if (row.Cells["上限"].Value == null)
                    {
                        row.Cells["下限"].Value = lstpipeRadius.SelectedItem.ToString();
                    }
                    else
                    {
                        double downRadius = Convert.ToDouble(lstpipeRadius.SelectedItem.ToString());
                        double upRadius = Convert.ToDouble(row.Cells["上限"].Value);
                        if (upRadius >= downRadius)
                        {
                            row.Cells["下限"].Value = downRadius.ToString();
                        }
                    }
                }
            }
        }

        private void buttonX4_Click(object sender, EventArgs e)
        {
            if (dataGridViewX2.SelectedCells.Count > 0)
            {
                DataGridViewRow row = dataGridViewX2.Rows[dataGridViewX2.SelectedCells[0].RowIndex];
                if (lstpipeRadius.SelectedItem != null)
                {
                    if (row.Cells["下限"].Value != null && row.Cells["下限"].Value.ToString() != "")
                    {
                        double downRadius = Convert.ToDouble(row.Cells["下限"].Value);
                        double upRadius = Convert.ToDouble(lstpipeRadius.SelectedItem.ToString());
                        if (upRadius >= downRadius)
                        {
                            row.Cells["上限"].Value = upRadius.ToString();
                        }
                    }
                    else
                    {
                        row.Cells["上限"].Value = lstpipeRadius.SelectedItem.ToString();
                    }
                }
            }
        }
        /// <summary>
        /// 添加行按钮事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX6_Click(object sender, EventArgs e)
        {
            DataGridViewRow row = new DataGridViewRow();
            int rowIndex = dataGridViewX2.Rows.Add(row);
            dataGridViewX2.Rows[rowIndex].Selected = true;
        }
        /// <summary>
        /// 删除行按钮事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX7_Click(object sender, EventArgs e)
        {
            if (dataGridViewX2.SelectedCells.Count > 0)
            {
                DataGridViewRow row = dataGridViewX2.Rows[dataGridViewX2.SelectedCells[0].RowIndex];
                dataGridViewX2.Rows.Remove(row);
            }
        }
        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)
                {
                    if (dataGridViewX2.Rows.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);
                            for (int j = 0; j < dataGridViewX2.Rows.Count; j++)
                            {
                                double totalLength = 0.00;
                                int ncount = 0;
                                for (int m = 0; m < feats.Length; m++)
                                {
                                    GSOFeature feat = feats[m];
                                    float radius = feat.GetFieldAsFloat("起始埋深");
                                    bool upCompare = true;
                                    bool downCompare = true;
                                    if (dataGridViewX2.Rows[j].Cells["下限"].Value != null || dataGridViewX2.Rows[j].Cells["上限"].Value != null)
                                    {
                                        if (dataGridViewX2.Rows[j].Cells["下限"].Value != null)
                                        {
                                            if (dataGridViewX2.Rows[j].Cells["下限"].Value.ToString() != "")
                                            {
                                                if (radius >= Convert.ToDouble(dataGridViewX2.Rows[j].Cells["下限"].Value))
                                                {
                                                    downCompare = true;
                                                }
                                                else
                                                    downCompare = false;
                                            }
                                        }
                                        if (dataGridViewX2.Rows[j].Cells["上限"].Value != null)
                                        {
                                            if (dataGridViewX2.Rows[j].Cells["上限"].Value.ToString() != "")
                                            {
                                                if (radius <= Convert.ToDouble(dataGridViewX2.Rows[j].Cells["上限"].Value))
                                                {
                                                    upCompare = true;
                                                }
                                                else
                                                    upCompare = false;
                                            }
                                        }
                                        if (upCompare && downCompare)
                                        {
                                            GSOGeoPolyline3D line = feat.Geometry as GSOGeoPolyline3D;
                                            double length = line.GetSpaceLength(true, 6378137);
                                            totalLength += length;
                                            ncount += 1;
                                        }
                                    }
                                }
                                if (dataGridViewX2.Rows[j].Cells["下限"].Value != null || dataGridViewX2.Rows[j].Cells["上限"].Value != null)
                                {
                                    DataGridViewRow row = new DataGridViewRow();
                                    int index = dataGridViewX1.Rows.Add(row);
                                    row = dataGridViewX1.Rows[index];
                                    row.Cells["图层名称"].Value = layer.Caption;
                                    row.Cells["埋深范围"].Value = dataGridViewX2.Rows[j].Cells["下限"].Value + "-" + dataGridViewX2.Rows[j].Cells["上限"].Value;
                                    row.Cells["条数"].Value = ncount;
                                    row.Cells["总长度"].Value =Math.Round(totalLength,2);                                    

                                    dic.Add(layer.Caption + "," + row.Cells["埋深范围"].Value.ToString()+","+row.Cells["总长度"].Value.ToString(), ncount);                                    
                                }
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("请添加分段!");
                    }
                }
                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>();
            List<string> dicLength = new List<string>();
            for (int j = 0; j < chart1.Series.Count; j++)
            {
                dic1 = new Dictionary<string, double>();
                dicLength = new List<string>();
                foreach (string key in dic.Keys)
                {
                    if (key.Contains(chart1.Series[j].Name))
                    {
                        dic1.Add(key.Split(',')[1].ToString(), dic[key]);
                        dicLength.Add(key.Split(',')[2].ToString());
                    }
                }
                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();
                        
                    }
                    if (dicLength[m] != "0")
                    {
                        chart1.Series[j].Points[m].ToolTip ="长度:"+dicLength[m];
                    }                   
                }                
            }
        }
        /// <summary>
        /// 窗体初始化事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmpipeDeepstatis_Load(object sender, EventArgs e)
        {            
            for (int i = 0; i < pipeLayerNames.Count; i++)
            {
                clbPipeLine.Items.Add(pipeLayerNames[i]);
            }            
        }        
       
        /// <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);
            }
        }
        /// <summary>
        /// 全区域分段统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX8_Click(object sender, EventArgs e)
        {
            if (clbPipeLine.CheckedItems.Count > 0)
            {
                if (dataGridViewX2.Rows.Count > 0)
                {
                    pipeDiameterStatis(null);
                }
                else
                {
                    MessageBox.Show("请添加分段");
                }
            }
            else
            {
                MessageBox.Show("请选择图层");
            }            
        }
        /// <summary>
        /// 绘制区域分段统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX9_Click(object sender, EventArgs e)
        {
            if (clbPipeLine.CheckedItems.Count > 0)
            {
                if (dataGridViewX2.Rows.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>
        /// 导出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!", "提示");
            }
        }
        TextBox control; 
        private void dataGridViewX2_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            if (e.Control.GetType().BaseType.Name == "TextBox")
            {
                control = new TextBox();
                control = (TextBox)e.Control;
                control.KeyPress += new KeyPressEventHandler(control_KeyPress);
            }
        }
        /// <summary>
        /// 键盘按键按下事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void control_KeyPress(object sender, KeyPressEventArgs e)
        {
            TextBox text = sender as TextBox;
            if ((e.KeyChar < 48 || e.KeyChar > 57) && (e.KeyChar != 8) && (int)e.KeyChar != 46)
            {
                e.Handled = true;
            }
            if ((int)e.KeyChar == 46)                           //小数点
            {
                if (text.Text.Length <= 0)
                    e.Handled = true;   //小数点不能在第一位
                else                                             //处理不规则的小数点
                {
                    float f;
                    float oldf;
                    bool b1 = false, b2 = false;
                    b1 = float.TryParse(text.Text, out oldf);
                    b2 = float.TryParse(text.Text + e.KeyChar.ToString(), out f);
                    if (b2 == false)
                    {
                        if (b1 == true)
                            e.Handled = true;
                        else
                            e.Handled = false;
                    }
                }
            }
        }
        /// <summary>
        /// 窗体关闭按钮事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmpipeDeepstatis_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();
        }
    }
}