Newer
Older
LSPipeline / Backup / UserControls / CtrlPolylineSpaceInfo.cs
wxn on 1 Dec 2016 17 KB first
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.IO;
using GeoScene.Globe;
using GeoScene.Data;

namespace WorldGIS
{
    public partial class CtrlPolylineSpaceInfo : UserControl
    {
        public GSOGlobeControl m_GlobeControl = null;
        public GSOLayer mlayer = null;
        public GSOFeature mfeature = null;
        public GSOGeometry m_Geometry = null;
        private int m_nCurSelected = -1;
        private GSOFeature m_FeatureSelPoint = null;

        public static GSOPipeLineStyle3D m_style;
        public static GSOPipeLineStyle3D m_oldStyle;
        
        private Boolean m_bInitialized = false;
        public CtrlPolylineSpaceInfo(GSOGeometry geometry, GSOGlobeControl globeControl)
        {
            InitializeComponent();
            m_GlobeControl = globeControl;
            m_Geometry = geometry;
        }
        public CtrlPolylineSpaceInfo(GSOGeometry geometry,GSOFeature feature,GSOLayer layer,GSOGlobeControl globeControl)
        {
            InitializeComponent();
            m_GlobeControl = globeControl;
            m_Geometry = geometry;

            mlayer = layer;
            mfeature = feature;
        }

        protected override void OnHandleDestroyed(EventArgs e)
        {
            base.OnHandleDestroyed(e);
            if (m_FeatureSelPoint != null)
            {
                m_FeatureSelPoint.Delete();
                if (m_GlobeControl != null)
                {
                    m_GlobeControl.Refresh();
                }
            }
        }

        private GSOPoint3ds GetCurNodes()
        {
            GSOPoint3ds nodes = null;
            if (m_Geometry.Type == EnumGeometryType.GeoPolyline3D)
            {

                GSOGeoPolyline3D geoPolyline3D = m_Geometry as GSOGeoPolyline3D;
                if (geoPolyline3D.PartCount > 0)
                {
                    //一条线由多条子线组成,目前就显示第一条子线的节点内容把
                    nodes = geoPolyline3D[0];
                }
            }
            else if (m_Geometry.Type == EnumGeometryType.GeoPolygon3D ||
                m_Geometry.Type == EnumGeometryType.GeoWater)
            {
                GSOGeoPolygon3D geoPolygon3D = m_Geometry as GSOGeoPolygon3D;
                if (geoPolygon3D.PartCount > 0)
                {
                    nodes = geoPolygon3D[0];
                }
            }
            return nodes;
        }
        private void UpdateNodeViewList()
        {

            GSOPoint3ds nodes = GetCurNodes();
           
            if (nodes!=null)
            {
                listViewNodeList.Items.Clear();
                for (int i = 0; i < nodes.Count; i++)
                {
                    ListViewItem item = new ListViewItem();
                    item.SubItems[0].Text = i.ToString();
                    item.SubItems.Add(nodes[i].X.ToString());
                    item.SubItems.Add(nodes[i].Y.ToString());
                    item.SubItems.Add(nodes[i].Z.ToString());
                    listViewNodeList.Items.Add(item);
                }
                labelNumPoints.Text = "节点共" + listViewNodeList.Items.Count.ToString() + "个";
            }
           
        }
        private void CtrlPolylineSpaceInfo_Load(object sender, EventArgs e)
        {
           

            if (m_Geometry!=null)
            {
                UpdateNodeViewList();

                textBoxZ.Maximum = decimal.MaxValue;
                textBoxZ.Minimum = decimal.MinValue;
                textBoxAllZAdded.Maximum = decimal.MaxValue;
                textBoxAllZAdded.Minimum = decimal.MinValue;

                // 高度模式
                switch (m_Geometry.AltitudeMode)
                {
                    case EnumAltitudeMode.Absolute:
                        comboBoxAltMode.SelectedIndex = 0;
                        break;
                    case EnumAltitudeMode.ClampToGround:
                        comboBoxAltMode.SelectedIndex = 1;
                        break;
                    case EnumAltitudeMode.RelativeToGround:
                        comboBoxAltMode.SelectedIndex = 2;
                        break;
                }
                 
            }

        }
        private void CheckSelFeaturePoint()
        {
            if (m_nCurSelected >= 0 && m_nCurSelected < listViewNodeList.Items.Count)
            {
                GSOGeoPoint3D geoPoint3D = null;
                if (m_FeatureSelPoint == null || m_FeatureSelPoint.IsDeleted)
                {
                    m_FeatureSelPoint = new GSOFeature();
                    geoPoint3D = new GSOGeoMarker();
                    GSOMarkerStyle3D style = new GSOMarkerStyle3D();
                    style.IconPath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource/CrossIcon.png";
                    geoPoint3D.Style = style;
                   
                    m_FeatureSelPoint.Geometry = geoPoint3D;
                    if (m_GlobeControl!=null)
                    {
                        m_GlobeControl.Globe.MemoryLayer.AddFeature(m_FeatureSelPoint);
                        m_GlobeControl.Refresh();
                    }
                }
                /*
                else
                {
                    geoPoint3D = m_FeatureSelPoint.Geometry as GSOGeoPoint3D;
                }
                */

                 
                geoPoint3D = m_FeatureSelPoint.Geometry as GSOGeoPoint3D;
                geoPoint3D.AltitudeMode = m_Geometry.AltitudeMode;  
                
                try
                {
                    ListViewItem itemSel = listViewNodeList.Items[m_nCurSelected];
                    geoPoint3D.X = Double.Parse(itemSel.SubItems[1].Text);
                    geoPoint3D.Y = Double.Parse(itemSel.SubItems[2].Text);
                    geoPoint3D.Z = Double.Parse(itemSel.SubItems[3].Text);
                }
                catch (System.Exception exp)
                {
                    Log.PublishTxt(exp);
                }
                if (m_GlobeControl != null)
                {
                    m_GlobeControl.Refresh();
                }

            }


        }
        private void CheckOldAndSetCurSelItem(int nCurItemIndex)
        {
            if (m_nCurSelected != nCurItemIndex)
            {
                if (m_nCurSelected > -1 && m_nCurSelected < listViewNodeList.Items.Count)
                {
                    ListViewItem itemOldSel = listViewNodeList.Items[m_nCurSelected];
                    itemOldSel.ForeColor = Color.Black;
                    itemOldSel.BackColor = SystemColors.Window;

                }

                m_nCurSelected = nCurItemIndex;
            }
        }
        private void SelectItem(int nItemIndex)
        {
            if (nItemIndex < 0)
            {
                return;
            }
            int nRealIndex = nItemIndex;

            if (nRealIndex > listViewNodeList.Items.Count-1)
            {
                nRealIndex = listViewNodeList.Items.Count - 1;
            }

            CheckOldAndSetCurSelItem(nRealIndex);
            CheckSelFeaturePoint();
           
            ListViewItem item = listViewNodeList.Items[nRealIndex];
            item.Selected = true;
            item.BackColor = SystemColors.Highlight;
            item.ForeColor = Color.White;
            listViewNodeList.SelectedIndices.Clear();
            listViewNodeList.SelectedIndices.Add(nRealIndex);//**真正让其选择

        }
        private void listViewNodeList_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listViewNodeList.SelectedItems.Count>0)
            {
                ListViewItem item = listViewNodeList.SelectedItems[0];
                if (item != null)
                {
                    CheckOldAndSetCurSelItem(item.Index);
                    CheckSelFeaturePoint();
                    textBoxX.Text = item.SubItems[1].Text;
                    textBoxY.Text = item.SubItems[2].Text;
                    try
                    {
                        textBoxZ.Value = decimal.Parse(item.SubItems[3].Text);
                    }
                    catch (Exception exp)
                    {
                        Log.PublishTxt(exp);
                        MessageBox.Show(exp.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                }
            }
           
        }

        private void comboBoxAltMode_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (m_Geometry != null)
            {
                m_GlobeControl.Globe.AddToEditHistroy(mlayer, mfeature, EnumEditType.Modify);

                switch (comboBoxAltMode.SelectedIndex)
                {
                    case 0:
                        m_Geometry.AltitudeMode = EnumAltitudeMode.Absolute;
                        break;
                    case 1:
                        m_Geometry.AltitudeMode = EnumAltitudeMode.ClampToGround;
                        break;
                    case 2:
                        m_Geometry.AltitudeMode = EnumAltitudeMode.RelativeToGround;
                        break;
                }
                CheckSelFeaturePoint();
                if (m_GlobeControl != null)
                {
                    m_GlobeControl.Refresh();
                }
                
            }
        }

        private void buttonMoveAllZ_Click(object sender, EventArgs e)
        {
            if (m_Geometry != null)
            {
                double dZAdded =0;
                try
                {
                    m_GlobeControl.Globe.AddToEditHistroy(mlayer, mfeature, EnumEditType.Modify);

                    dZAdded = Convert.ToDouble(textBoxAllZAdded.Value.ToString());
                    m_Geometry.MoveZ(dZAdded);

                    // 这个比较慢先暂时不用
                    //UpdateNodeViewList();
                    for (int i = 0; i < listViewNodeList.Items.Count; i++)
                    {
                        ListViewItem item = listViewNodeList.Items[i];
                        item.SubItems[3].Text = (Double.Parse(item.SubItems[3].Text) + dZAdded).ToString();
                    }
                    SelectItem(m_nCurSelected);
                    if (m_GlobeControl!=null)
                    {
                        m_GlobeControl.Refresh();
                    }

                    
                }
                catch (System.Exception exp)
                {
                    Log.PublishTxt(exp);
                    //MessageBox.Show(exp.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                    
                    
            }
        }
       
        private void buttonAddNode_Click(object sender, EventArgs e)
        {
            
                GSOPoint3ds nodes = GetCurNodes();
                if (nodes!=null)
                {
                    m_GlobeControl.Globe.AddToEditHistroy(mlayer, mfeature, EnumEditType.Modify);

                    GSOPoint3d newPoint = new GSOPoint3d();
                    try
                    {
                        newPoint.X = Double.Parse(textBoxX.Text);
                        newPoint.Y = Double.Parse(textBoxY.Text);
                        newPoint.Z = Double.Parse(textBoxZ.Value.ToString());

                    }
                    catch (System.Exception exp)
                    {
                        Log.PublishTxt(exp);
                        //MessageBox.Show(exp.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                    /*
                    ListViewItem item = new ListViewItem();
                    item.SubItems.Add(textBoxX.Text);
                    item.SubItems.Add(textBoxY.Text);
                    item.SubItems.Add(textBoxZ.Text);
                    listViewNodeList.Items.Add(item);
                    */

                    nodes.Add(newPoint);
                    SetCurNodes(nodes);
                    UpdateNodeViewList();
                    // 选中最后一个
                    SelectItem(listViewNodeList.Items.Count - 1);
                    if (m_GlobeControl != null)
                    {
                        m_GlobeControl.Refresh();
                    }
                }
           
            
            
        }
        private void buttonInsertNode_Click(object sender, EventArgs e)
        {
           

                if (listViewNodeList.SelectedIndices.Count > 0)
                {
                    int nSelIndex = listViewNodeList.SelectedIndices[0];
                    GSOPoint3ds nodes = GetCurNodes();

                    if (nodes != null && nodes.Count > nSelIndex)
                    {
                        
                        m_GlobeControl.Globe.AddToEditHistroy(mlayer, mfeature, EnumEditType.Modify);

                        GSOPoint3d newPoint = new GSOPoint3d();
                        try
                        {
                            newPoint.X = Double.Parse(textBoxX.Text);
                            newPoint.Y = Double.Parse(textBoxY.Text);
                            newPoint.Z = Double.Parse(textBoxZ.Value.ToString());
                        }
                        catch (System.Exception exp)
                        {
                            Log.PublishTxt(exp);
                        }


                        nodes.Insert(nSelIndex, newPoint);

                        /*
                        ListViewItem item = new ListViewItem();
                        item.SubItems.Add(textBoxX.Text);
                        item.SubItems.Add(textBoxY.Text);
                        item.SubItems.Add(textBoxZ.Text);
                        listViewNodeList.Items.Insert(nSelIndex,item);
                        */
                        SetCurNodes(nodes);

                        UpdateNodeViewList();
                        // 选中刚才的那个索引
                        SelectItem(m_nCurSelected);
                        if (m_GlobeControl != null)
                        {
                            m_GlobeControl.Refresh();
                        }                       
                    }
                }
        }

        private void buttonModify_Click(object sender, EventArgs e)
        {
          
  
                if (listViewNodeList.SelectedIndices.Count>0)
                {
                    int nSelIndex = listViewNodeList.SelectedIndices[0];
                    GSOPoint3ds nodes = GetCurNodes();
                    if (nodes != null && nodes.Count > nSelIndex)
                    {
                        m_GlobeControl.Globe.AddToEditHistroy(mlayer, mfeature, EnumEditType.Modify);

                        GSOPoint3d newPoint = new GSOPoint3d();
                        try
                        {
                            newPoint.X = Double.Parse(textBoxX.Text);
                            newPoint.Y = Double.Parse(textBoxY.Text);
                            newPoint.Z = Double.Parse(textBoxZ.Value.ToString());
                        }
                        catch (System.Exception exp)
                        {
                            Log.PublishTxt(exp);
                        }

                        nodes[nSelIndex] = newPoint;

                        SetCurNodes(nodes);

                        ListViewItem item = listViewNodeList.Items[nSelIndex];
                        item.SubItems[1].Text = textBoxX.Text;
                        item.SubItems[2].Text = textBoxY.Text;
                        item.SubItems[3].Text = textBoxZ.Value.ToString();

                        // 选中刚才的那个索引

                        SelectItem(m_nCurSelected);

                        if (m_GlobeControl != null)
                        {
                            m_GlobeControl.Refresh();
                        }                        
                    }
                }
        }

        private void SetCurNodes(GSOPoint3ds nodes)
        {

            if (m_Geometry.Type == EnumGeometryType.GeoPolyline3D)
            {

                GSOGeoPolyline3D geoPolyline3D = m_Geometry as GSOGeoPolyline3D;
                if (geoPolyline3D.PartCount > 0)
                {
                    //一条线由多条子线组成,目前就显示第一条子线的节点内容把
                    geoPolyline3D[0] = nodes;
                }
            }
            else if (m_Geometry.Type == EnumGeometryType.GeoPolygon3D ||
              m_Geometry.Type == EnumGeometryType.GeoWater)
            {
                GSOGeoPolygon3D geoPolygon3D = m_Geometry as GSOGeoPolygon3D;
                if (geoPolygon3D.PartCount > 0)
                {
                    geoPolygon3D[0] = nodes;
                }
            }

        }

        private void buttonDelNode_Click(object sender, EventArgs e)
        {
            if (listViewNodeList.SelectedIndices.Count>0)
            {
                int nSelIndex = listViewNodeList.SelectedIndices[0];
                GSOPoint3ds nodes = GetCurNodes();
                if (nodes != null && nodes.Count > nSelIndex)
                {
                    m_GlobeControl.Globe.AddToEditHistroy(mlayer, mfeature, EnumEditType.Modify);

                    nodes.Remove(nSelIndex);
                    SetCurNodes(nodes);
                    UpdateNodeViewList();
                    // 选中刚才的那个索引
                    SelectItem(m_nCurSelected);
                    
                    
                    if (m_GlobeControl != null)
                    {
                        m_GlobeControl.Refresh();
                    }  
                }
            }           
        }
       
        // 下面两个消息确保listview失去交点的时候选中的对象不消失
        private void listViewNodeList_Validated(object sender, EventArgs e)
        {
            SelectItem(m_nCurSelected);            
        }       
    }
}