Newer
Older
GHFX_REFACTOR / FrmBufferAnalysis.cs
wxn on 9 Nov 2016 14 KB 冗余代码整理
using System;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using GeoScene.Data;
using GeoScene.Engine;
using GeoScene.Globe;

namespace Cyberpipe
{
    public partial class FrmBufferAnalysis :Office2007Form
    {
        GSOGlobeControl globeControl1;
        GSOGeoPolyline3D line;
        GSOLayer layerTemp;

        public FrmBufferAnalysis(GSOGlobeControl _globeControl1, GSOGeoPolyline3D line1, GSOLayer layerTemp1)
        {
            InitializeComponent();
            globeControl1 = _globeControl1;
            line = line1;
            layerTemp = layerTemp1;
        }
        /// <summary>
        /// 窗体初始化事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmBufferAnalysis_Load(object sender, EventArgs e)
        {
            for (int i = globeControl1.Globe.Layers.Count - 1; i >= 0; i--)
            {
                GSOLayer layer = globeControl1.Globe.Layers[i];
                if (layer.Dataset != null && layer.Dataset.IsFeatureDataset)
                {
                    string name = layer.Name;
                    if (layer.Type == EnumLayerType.FeatureLayer && !name.Contains("\\"))
                    {
                        clbLayers.Items.Add(layer.Caption);
                    }
                }
            }
        }
        GSOFeature new_feat;
        GSOGeoPolygon3D resPolygon;
        /// <summary>
        /// 半径文本框内容改变事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtRadius_TextChanged(object sender, EventArgs e)
        {
            dataGridViewX1.Rows.Clear();
            if (txtRadius.Text == "")
            {
                return;
            }
            double radius = 0.0;
            if (double.TryParse(txtRadius.Text, out radius) == false)
            {
                MessageBox.Show("请输入正确的缓冲半径!", "提示");
                txtRadius.Text = "";
                return;
            }
            if (new_feat !=null)
            {
                layerTemp.RemoveFeatureByID(new_feat.ID);
            }
            new_feat = new GSOFeature();
            resPolygon = line.CreateBuffer(radius * 2, true, 0, false, false);
            resPolygon.AltitudeMode = EnumAltitudeMode.RelativeToGround;
            
            new_feat.Geometry = resPolygon;
            layerTemp.AddFeature(new_feat);
           
            globeControl1.Refresh();
        }
        /// <summary>
        /// 确定按钮事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnEnter_Click(object sender, EventArgs e)
        {
            dataGridViewX1.Rows.Clear();
            if (txtRadius.Text == "")
            {
                MessageBox.Show("请输入缓冲半径!", "提示");
            }
            else
            {
                if (clbLayers.CheckedItems.Count > 0)
                {
                    for (int i = 0; i < clbLayers.CheckedItems.Count; i++)
                    {
                        string layerName = clbLayers.CheckedItems[i].ToString();
                        Polygon_Contain_PointAnalysis(resPolygon, layerName);
                    }
                }
                else {
                    MessageBox.Show("请选择图层信息!", "提示");
                }
            }
            

        }
        /// <summary>
        /// 查询指定名称的图层在指定面中的所有要素
        /// </summary>
        /// <param name="polygon"></param>
        /// <param name="layername"></param>
        private void Polygon_Contain_PointAnalysis(GSOGeoPolygon3D polygon, string layername)
        {
            GSOFeatures feats = new GSOFeatures();
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layername);
           
            GSOFeatureLayer flayer = layer as GSOFeatureLayer;
            GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;

            if (polygon == null)
                feats = flayer.GetAllFeatures();
            else
                feats = flayer.FindFeaturesInPolygon(polygon, false);
            if (feats.Length > 0)
            {
                for (int i=0;i<feats.Length;i++)
                {
                    string featNum = feats[i].GetFieldAsString("编号");
                    DataGridViewRow row = new DataGridViewRow();
                    int index = dataGridViewX1.Rows.Add(row);
                    row = dataGridViewX1.Rows[index];
                    row.Cells["编号"].Value = featNum;
                    row.Cells["图层名称"].Value = layername;
                }
            }
        }
        /// <summary>
        /// 半径文本框的键盘按键按下事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtRadius_KeyPress(object sender, KeyPressEventArgs e)
        {
            TextBox text = sender as TextBox;
            if ((e.KeyChar < 48 || e.KeyChar > 57) && (e.KeyChar != 8) && e.KeyChar != 46)
            {
                e.Handled = true;
            }
            if (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, out f);
                    if (b2 == false)
                    {
                        if (b1)
                            e.Handled = true;
                        else
                            e.Handled = false;
                    }
                }
            }
        }
        /// <summary>
        /// 窗体关闭事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmBufferAnalysis_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (new_feat != null)
            {
                layerTemp.RemoveFeatureByID(new_feat.ID);
            }
        }
        
        GSOFeature m_feature;
        /// <summary>
        /// 表格单击事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridViewX1_MouseClick(object sender, MouseEventArgs e)
        {
            if (m_feature != null && m_feature.HighLight)
            {
                m_feature.HighLight = false;
            }
            m_feature = null;
            if (e.Button == MouseButtons.Left)
            {

                DataGridView.HitTestInfo hittestinfo = dataGridViewX1.HitTest(e.X, e.Y);
                //idx = hittestinfo.RowIndex;
                if (hittestinfo.RowIndex > -1)
                {
                    string featureName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["编号"].Value.ToString().Trim();
                    string layerName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["图层名称"].Value.ToString().Trim();

                    //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[layerName]));
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layerName);
                    if (layer != null)
                    {
                        GSOFeatures features = layer.GetFeatureByName(featureName, false);
                        for (int j = 0; j < features.Length; j++)
                        {
                            if (features[j].Name == featureName)
                            {
                                m_feature = features[j];
                            }
                        }
                    }
                }

            }

            if (e.Button == MouseButtons.Right)
            {
                DataGridView.HitTestInfo hittestinfo = dataGridViewX1.HitTest(e.X, e.Y);
                if (hittestinfo.RowIndex > -1)
                {
                    string featureName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["编号"].Value.ToString();
                    string layerName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["图层名称"].Value.ToString().Trim();
                    contextMenuStrip1.Show(dataGridViewX1, e.X, e.Y);
                    featureName = featureName.Trim();

                    //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[layerName]));
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layerName);
                    if (layer == null)
                        return;
                    GSOFeatures features = layer.GetFeatureByName(featureName, false);

                    for (int j = 0; j < features.Length; j++)
                    {
                        if (features[j].Name == featureName)
                        {
                            m_feature = features[j];
                            break;
                        }
                    }
                }
            }
        }
        int count;
        private string flashflag = "single";
        /// <summary>
        /// 定时器事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (count < 40)
            {
                count++;
                if (flashflag == "single")
                {
                    if (m_feature != null)
                    {
                        if (count % 2 != 0)
                        {
                            m_feature.HighLight = true;
                            globeControl1.Refresh();
                        }
                        else
                        {
                            m_feature.HighLight = false;
                            globeControl1.Refresh();
                        }
                    }
                }
            }
            else
            {
                timer1.Stop();
                count = 0;
            }
        }
        /// <summary>
        /// 表格双击事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridViewX1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            try
            {
                if (e.Button == MouseButtons.Left)
                {
                    DataGridView.HitTestInfo hittestinfo = dataGridViewX1.HitTest(e.X, e.Y);
                    if (hittestinfo.RowIndex > -1)
                    {
                        string featureName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["编号"].Value.ToString().Trim();
                        string layerName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["图层名称"].Value.ToString().Trim();

                        //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[layerName]));
                        GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layerName);
                        if (layer != null)
                        {
                            GSOFeatures features = layer.GetFeatureByName(featureName, false);
                            for (int j = 0; j < features.Length; j++)
                            {
                                if (features[j].Name == featureName)
                                {
                                    m_feature = features[j];
                                    if (m_feature.Geometry != null && m_feature.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                                    {
                                        GSOGeoPolyline3D line = m_feature.Geometry as GSOGeoPolyline3D;
                                        double length = line.GetSpaceLength(true, 6378137);
                                        GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2);
                                        GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1];

                                        globeControl1.Globe.FlyToPosition(point3d, EnumAltitudeMode.Absolute,0,45,5);
                                    }
                                    else
                                    {
                                        globeControl1.Globe.FlyToFeature(m_feature, 0, 45, 3);
                                    }
                                    LightMenu_Click(sender, e);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                LogError.PublishError(ex);
            }
        }

        private void FlyToMenu_Click(object sender, EventArgs e)
        {
            if (m_feature != null)
            {
                if (m_feature.Geometry != null && m_feature.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                {
                    GSOGeoPolyline3D line = m_feature.Geometry as GSOGeoPolyline3D;
                    double length = line.GetSpaceLength(true, 6378137);
                    GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2);
                    GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1];

                    globeControl1.Globe.FlyToPosition(point3d, EnumAltitudeMode.Absolute, 0, 45, 5);
                }
                else
                {
                    globeControl1.Globe.FlyToFeature(m_feature, 0, 45, 3);
                }
                LightMenu_Click(sender, e);
            }
        }

        private void LightMenu_Click(object sender, EventArgs e)
        {
            flashflag = "single";
            timer1.Start();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void buttonXSelectAll_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < clbLayers.Items.Count; i++)
            {
                clbLayers.SetItemChecked(i, true);
            }
        }
    }
}