Newer
Older
GHFX_REFACTOR / FrmBufferAnalysis.cs
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) continue;
                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;
            if (flayer == null) return;
            feats = polygon == null ? flayer.GetAllFeatures() : flayer.FindFeaturesInPolygon(polygon, false);
            if (feats.Length <= 0) return;
            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) return;
            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) return;
                e.Handled = b1;
            }
        }
        /// <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) return;
                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) return;
                GSOFeatures features = layer.GetFeatureByName(featureName, false);
                for (int j = 0; j < features.Length; j++)
                {
                    if (features[j].Name == featureName)
                    {
                        m_feature = features[j];
                    }
                }
            }

            else if (e.Button == MouseButtons.Right)
            {
                DataGridView.HitTestInfo hittestinfo = dataGridViewX1.HitTest(e.X, e.Y);
                if (hittestinfo.RowIndex <= -1) return;
                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.Equals("single")) return;
                if (m_feature == null) return;
                m_feature.HighLight = count % 2 != 0;
                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) return;
                    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) return;
                    GSOFeatures features = layer.GetFeatureByName(featureName, false);
                    for (int j = 0; j < features.Length; j++)
                    {
                        if (features[j].Name != featureName) continue;
                        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) return;
            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);
            }
        }
    }
}