Newer
Older
GHFX_REFACTOR / Backup / NewFunction / FrmPipelineIndented.cs
wxn on 2 Nov 2016 8 KB 提交
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 GeoScene.Engine;

namespace Cyberpipe
{
    public partial class FrmPipelineIndented : DevComponents.DotNetBar.Office2007Form
    {
        GSOGlobeControl globeControl1 = null;
        List<string> pipelineLayerNames = null;
        List<string> workWellLayerNames = null;

        GSOLayer layerInit = null;
        GSOFeatures featuresInit = null;
        GSOFeatures featuresIndented = null;

        public FrmPipelineIndented(GSOGlobeControl _globeControl, List<string> _pipelineLayerNames, List<string> _workWellLayerNames)
        {
            InitializeComponent();

            globeControl1 = _globeControl;
            pipelineLayerNames = _pipelineLayerNames;
            workWellLayerNames = _workWellLayerNames;
        }

        private void FrmPipelineIndented_Load(object sender, EventArgs e)
        {
            if (globeControl1 != null && pipelineLayerNames != null && workWellLayerNames != null)
            {
                for (int i = 0; i < pipelineLayerNames.Count; i++)
                {
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(pipelineLayerNames[i]);
                    if (layer != null && layer.Type == EnumLayerType.FeatureLayer)
                    {
                        comboBoxLayerCaption.Items.Add(layer.Caption);                       
                    }
                }
                for (int i = 0; i < workWellLayerNames.Count; i++)
                {
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(workWellLayerNames[i]);
                    if (layer != null && layer.Type == EnumLayerType.FeatureLayer)
                    {
                        comboBoxLayerWorkwellCaption.Items.Add(layer.Caption);
                    }
                }
            }
            featuresIndented = new GSOFeatures();
            featuresInit = new GSOFeatures();
        }
       
        //应用
        private void buttonApply_Click(object sender, EventArgs e)
        {
            if (comboBoxLayerCaption.SelectedItem == null)
            {
                MessageBox.Show("请选择一个管线图层!", "提示");
                return;
            }
            if (comboBoxLayerWorkwellCaption.SelectedItem == null)
            {
                MessageBox.Show("请选择一个工井图层!", "提示");
                return;
            }            
            if (textBoxAllowance.Text.Trim() == "")
            {
                MessageBox.Show("请输入容限值!", "提示");
                return;
            }
            if (textBoxValueIndented.Text.Trim() == "")
            {
                MessageBox.Show("请输入缩进距离!", "提示");
                return;
            }

            double valueAllowance = 0.0;
            if (double.TryParse(textBoxAllowance.Text.Trim(), out valueAllowance) == false)
            {
                MessageBox.Show("请输入一个正确的容限值!", "提示");
                return;
            }

            float valueIndented = 0.0f;
            if (float.TryParse(textBoxValueIndented.Text.Trim(), out valueIndented) == false)
            {
                MessageBox.Show("请输入一个正确的缩进值!", "提示");
                return;
            }
            if (valueIndented > 0.5)
            {
                MessageBox.Show("缩进值不能大于0.5米!", "提示");
                return;
            }
            string layerCaption = comboBoxLayerCaption.SelectedItem.ToString().Trim();
            string valveLayerCaption = comboBoxLayerWorkwellCaption.SelectedItem.ToString().Trim();
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layerCaption);
            GSOLayer valveLayer = globeControl1.Globe.Layers.GetLayerByCaption(valveLayerCaption);
            if (layer != null && valveLayerCaption != null)
            {
                featuresIndented.RemoveAll();               
                cancelHighLight(layer.GetAllFeatures());                
                
                for (int i = 0; i < layer.GetAllFeatures().Length; i++)
                {
                    GSOFeature feature = layer.GetAt(i);
                    if (feature != null && feature.Geometry != null && feature.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                    {
                        GSOGeoPolyline3D line = feature.Geometry as GSOGeoPolyline3D;
                        double lineLenght = line.GetSpaceLength(false, 6378137.0);
                        if (lineLenght <= valueIndented * 2)
                        {
                            continue;
                        }

                        featuresIndented.Add(feature);//缩进的管线集合
                        featuresInit.Add(feature.Clone());

                        //头缩进
                        GSOPoint3d headPoint = line[0][0];
                        GSOGeoPolyline3D newline = new GSOGeoPolyline3D();
                        GSOPoint3ds part = new GSOPoint3ds();
                        part.Add(headPoint);
                        headPoint.X = headPoint.X - 0.0000000005;
                        part.Add(headPoint);
                        newline.AddPart(part);
                        GSOGeoPolygon3D buffer = newline.CreateBuffer(valueAllowance, true, 5, true, false);
                        GSOFeatures features = valveLayer.FindFeaturesInPolygon(buffer, false);
                        if (features.Length > 0)
                        {
                            feature.HighLight = true;
                            if (line.Style != null && line.Style is GSOPipeLineStyle3D)
                            {
                                GSOPipeLineStyle3D style = line.Style as GSOPipeLineStyle3D;
                                style.HeadJointParam = new GSOPipeJointParam();
                                style.HeadJointParam.Extent = -valueIndented;
                            }
                        }

                        //尾缩进
                        GSOPoint3d tailPoint = line[line.PartCount - 1][line[line.PartCount - 1].Count - 1];
                        newline = new GSOGeoPolyline3D();
                        part = new GSOPoint3ds();
                        part.Add(tailPoint);
                        tailPoint.X = tailPoint.X - 0.0000000005;
                        part.Add(tailPoint);
                        newline.AddPart(part);
                        buffer = newline.CreateBuffer(valueAllowance, true, 5, true, false);
                        features = valveLayer.FindFeaturesInPolygon(buffer, false);
                        if (features.Length > 0)
                        {
                            feature.HighLight = true;
                            if (line.Style != null && line.Style is GSOPipeLineStyle3D)
                            {
                                GSOPipeLineStyle3D style = line.Style as GSOPipeLineStyle3D;
                                style.TailJointParam = new GSOPipeJointParam();
                                style.TailJointParam.Extent = -valueIndented;
                            }
                        }
                    }
                }
            }
            globeControl1.Globe.Refresh();
        }

        //取消高亮
        private void buttonCancelHighLight_Click(object sender, EventArgs e)
        {
            if (featuresIndented != null && featuresIndented.Length > 0)
            {
                cancelHighLight(featuresIndented);
            }
        }

        //取消
        private void buttonCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void cancelHighLight(GSOFeatures features)
        {
            if (features != null)
            {
                for (int i = 0; i < features.Length; i++)
                {
                    GSOFeature feature = features[i];
                    if (feature != null)
                    {
                        feature.HighLight = false;
                    }
                }
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
            }
        }

        private void FrmPipelineIndented_FormClosing(object sender, FormClosingEventArgs e)
        {
            buttonCancelHighLight_Click(sender, e);
        }
    }
}