Newer
Older
EMS_SZ / 复件 MainFrm.cs
root on 21 Mar 2016 431 KB first
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;

using System.Text;
using System.Windows.Forms;
using System.IO;
using GeoScene.Globe;
using GeoScene.Data;
using GeoScene.Engine;
using System.Runtime.InteropServices;
using DevComponents.DotNetBar.Rendering;
using DevComponents.DotNetBar;
using System.Xml;
using System.Collections;
using System.Data.SqlClient;
using System.Diagnostics;
using Microsoft.Win32;
using System.Threading;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using MySql.Data.MySqlClient;
namespace Cyberpipe
{
    public partial class MainFrm : Office2007Form
    {

        TreeNode terrainManagerNode = null;
        TreeNode layerManagerNode = null;
        TreeNode myPlaceNode = null;
        bool m_bFullScreen = false;
        Rectangle m_rcOld = new Rectangle(0, 0, 0, 0);
        GeoScene.Globe.GSOGlobeControl globeControl1;
        GSOGlobeControl globeControl2;
        private GSOHudButton legend;//定义图例
        private GSOHudButton btnToolNone;
        private GSOHudButton btnToolSelect;
        System.Windows.Forms.ToolTip tooltip1;
        GSOBalloon featureTooltip;
        GSOBalloonEx balloonEx;
        GSOFeature m_feature;
        
        GSOLayer layerTemp;
       
        List<string> pipelineLayerNames = new List<string>();//线图层名称
        List<string> workwellLayerNames = new List<string>();//工井图层名称
        List<string> valueLayerNames = new List<string>();//阀门图层名称
        List<string> instrumenLayerNames = new List<string>();//附属物图层名称
        string roadLayerName = "";
        public static string currentQueryLayer;//定义当前查询的图层
        //定位和闪烁初始化定义
        int count = 0;
        private string flashflag = "single";
        //bool m_AddTunnel = false;//bool创建隧道
        public bool m_AddPipeLine = false;//bool添加管线
        bool m_bAddPipeFitting = false;//bool添加管件
        private string trackflag;//定义阀门查询个数
        //private Point m_pntRMouseDown;
        private GSOFeature m_ConnexityAnalysisFirstFeature;
        private GSOFeature m_ConnexityAnaylsisSecondFeature;
        private GSOLayer m_ConnexityAnalysisFirstLayer;
        private GSOLayer m_COnnexityAnalysisSecondLayer;
        private GSOFeatures m_ConnexityAnalyResFeatures;
        private GSOFeatures m_TraceUpDownAnalyResFeatures;
        private GSOFeatures m_AffectedPipeLines;
        private GSOFeatures m_CloseValvesAnalyResFeatures;
        private GSOFeatures m_BoosterValvesAnalyResFeatures;
        //管线间距分析
        //private GSOFeature m_DisAnalysisFirstFeature;
        //private GSOFeature m_DisAnalysisSecondFeature;
        private GSOFeature disFeature = new GSOFeature();
        private GSOFeature featureDis = new GSOFeature();
        ArrayList m_CloseValvesList = new ArrayList();//声明集合存储阀门分析的阀门Feature对象
        ArrayList m_BoosterValvesList = new ArrayList();//声明集合存储阀门分析的阀门Feature对象

        //记录沿线飞行设置
        //int m_nFlyMode = 2;
        double m_dFlyAboveLine = 1;
        double m_dFlyAlongLineSpeed = 50;
        double m_dFlyAlongLineRotateSpeed = 50;
        // 挖坑设置
        Double m_dDigPitValue = 3;
        Double m_dDigPitWidthAlongLine = 6;
        Boolean m_bDigPitByDepth = true;

        private SqlConnection connBackup = null;
        public MainFrm()
        {
            InitializeComponent();
            
            PipeSys.Attach(this.panelEx5.Controls);
            globeControl1 = PipeSys.getGlobeCtrl();
            globeControl1.Dock = DockStyle.Fill;
            this.ribbonControl1.Width = this.Width;           

            this.panelEx4.Controls.Add(splitContainer1);
            splitContainer1.Dock = DockStyle.Fill;
            
            this.panelEx4.Controls.Add(expandableSplitter2);
            expandableSplitter2.Dock = DockStyle.Bottom;
            this.panelEx4.Controls.Add(panelEx6);
            panelEx6.Dock = DockStyle.Bottom;            
            
            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = true;
            buttonItem1.Checked = true;
            controlContainerItem3.Visible = true;          
            controlContainerItem3.Control = layerTree;
            layerTree.Dock = DockStyle.Fill;
            sideBar1.ExpandedPanel = sideBarPanelItem3;
            sideBar1.Refresh();
            Refresh();

            controlContainerItem5.Control = panel1;
            panel1.Dock = DockStyle.Fill;
            panel1.Height = Screen.PrimaryScreen.WorkingArea.Height - 120;
            sideBarPanelItem4.Visible = false;
            panel5.Visible = false;
            //sideBarPanelItemSensor.Visible = false;
            panelEx3.Visible = false;

            panel2.Height = Screen.PrimaryScreen.WorkingArea.Height - 120;
            featureTooltip = new GSOBalloon(globeControl1.Handle);
            balloonEx = new GSOBalloonEx(globeControl1.Handle);
            Utility.SetBallons(featureTooltip, balloonEx);

            PipeSys.Attach(this.panelEx1.Controls);
            globeControl2 = PipeSys.getGlobeCtrl();
            globeControl2.Dock = DockStyle.Fill;
           
        }

        private void MainFrm_Load(object sender, EventArgs e)
        {
            //分辨率问题
            int SW = Screen.PrimaryScreen.Bounds.Width;
            double dsw = (double)SW;
            if (SW > 1440)
            {
                double myScreen = dsw / 1440;
                this.buttonX1.Width = (int)(this.buttonX1.Width * myScreen);
                this.buttonX2.Width = (int)(this.buttonX2.Width * myScreen);
                this.buttonX3.Width = (int)(this.buttonX3.Width * myScreen);
                this.buttonX4.Width = (int)(this.buttonX4.Width * myScreen);
                this.buttonX5.Width = (int)(this.buttonX5.Width * myScreen);
                this.buttonX6.Width = (int)(this.buttonX6.Width * myScreen);
                this.buttonX7.Width = (int)(this.buttonX8.Width * myScreen);
                this.buttonX8.Width = (int)(this.buttonX8.Width * myScreen);
                this.buttonX9.Width = (int)(this.buttonX9.Width * myScreen);
                this.buttonX12.Width = (int)(this.buttonX12.Width * myScreen);
                this.buttonX14.Width = (int)(this.buttonX14.Width * myScreen);
                this.buttonX15.Width = (int)(this.buttonX15.Width * myScreen);
                this.buttonX16.Width = (int)(this.buttonX16.Width * myScreen);

                this.labelX1.Width = (int)(this.labelX1.Width * myScreen);
                this.labelX2.Width = (int)(this.labelX2.Width * myScreen);
                this.labelX3.Width = (int)(this.labelX3.Width * myScreen);
                this.labelX4.Width = (int)(this.labelX4.Width * myScreen);
                this.labelX6.Width = (int)(this.labelX6.Width * myScreen);
                this.labelX8.Width = (int)(this.labelX8.Width * myScreen);
                this.labelX9.Width = (int)(this.labelX9.Width * myScreen);
                this.labelX12.Width = (int)(this.labelX12.Width * myScreen);
                this.labelX13.Width = (int)(this.labelX13.Width * myScreen);
                this.labelX14.Width = (int)(this.labelX14.Width * myScreen);
                this.labelX16.Width = (int)(this.labelX16.Width * myScreen);
                this.labelX17.Width = (int)(this.labelX17.Width * myScreen);
                this.labelX11.Width = (int)(this.labelX11.Width * myScreen);
                this.labelX19.Width = (int)(this.labelX19.Width * myScreen);
                //this.labelX20.Width = (int)(this.labelX20.Width * myScreen);
                this.labelX21.Width = (int)(this.labelX21.Width * myScreen);
                this.labelX22.Width = (int)(this.labelX22.Width * myScreen);
                this.labelX24.Width = (int)(this.labelX24.Width * myScreen);
            }

            btnToolNone = new GSOHudButton();
            btnToolNone.SetImage(Application.StartupPath + "\\Resource\\image\\Pan1.png");
            btnToolNone.FadeOut = false;
            btnToolNone.Align = EnumAlign.TopLeft;
            btnToolNone.SetOffset(20, 15);
            btnToolNone.Name = "0";
            btnToolNone.HeightFixed = true;
            btnToolNone.WidthFixed = true;
            globeControl1.Globe.AddHudControl(btnToolNone);
            globeControl2.Globe.AddHudControl(btnToolNone);

            btnToolSelect = new GSOHudButton();
            btnToolSelect.SetImage(Application.StartupPath + "\\Resource\\image\\select1.png");
            btnToolSelect.FadeOut = false;
            btnToolSelect.Align = EnumAlign.TopLeft;
            btnToolSelect.SetOffset(20, 50);
            //btnToolSelect.MinOpaque = 0.05f;
            btnToolSelect.Name = "1";
            //btnToolSelect.MaxOpaque = 1;
            btnToolSelect.HeightFixed = true;
            btnToolSelect.WidthFixed = true;
            globeControl1.Globe.AddHudControl(btnToolSelect);
            globeControl2.Globe.AddHudControl(btnToolSelect);


            legend = new GSOHudButton();
            legend.SetImage(Application.StartupPath + "/Resource/图例P.png");
            legend.SetOffset(0, 15);
            legend.MinOpaque = 1;
            legend.MaxOpaque = 1;
            legend.FadeOut = false;
            legend.Name = "legend";
            legend.Align = EnumAlign.BottomRight;
            globeControl1.Globe.AddHudControl(legend);
            legend.Visible = false;

            this.KeyPreview = true;
            globeControl1.Globe.UnderGroundFloor.Visible = false;
            globeControl1.Globe.LatLonGrid.Visible = false;
            globeControl1.Globe.StatusBar.SetTextVisible(EnumStatusBarText.ProCoord, false);
            globeControl1.Globe.Antialiasing = true;
            globeControl1.Globe.FeatureMouseOverEnable = true;
            globeControl1.Globe.ModelUseLighting = true;
            globeControl1.Globe.EditSnapObject = false;
            globeControl1.Globe.MaxUserBackgroundAlt = 20000;
            globeControl1.Globe.UserBackgroundColorValid = true;
            globeControl1.Globe.UserBackgroundColor = Color.White;
            globeControl1.Globe.FlyAlongLineSpeed = m_dFlyAlongLineSpeed;
            globeControl1.Globe.FlyAlongLineRotateSpeed = m_dFlyAlongLineRotateSpeed;
            globeControl1.Globe.FlyToPointSpeed = globeControl1.Globe.FlyToPointSpeed * 3;

            globeControl2.Globe.UnderGroundFloor.Visible = false;
            globeControl2.Globe.LatLonGrid.Visible = false;
            globeControl2.Globe.StatusBar.SetTextVisible(EnumStatusBarText.ProCoord, false);
            globeControl2.Globe.Antialiasing = true;
            globeControl2.Globe.FeatureMouseOverEnable = true;
            globeControl2.Globe.ModelUseLighting = true;
            globeControl2.Globe.EditSnapObject = false;
            globeControl2.Globe.MaxUserBackgroundAlt = 20000;
            globeControl2.Globe.UserBackgroundColorValid = true;
            globeControl2.Globe.UserBackgroundColor = Color.White;
            globeControl2.Globe.FlyAlongLineSpeed = m_dFlyAlongLineSpeed;
            globeControl2.Globe.FlyAlongLineRotateSpeed = m_dFlyAlongLineRotateSpeed;
            globeControl2.Globe.FlyToPointSpeed = globeControl2.Globe.FlyToPointSpeed * 3;

            // globeControl1.AfterLayerAddEvent += new AfterLayerAddEventHandler(globeControl1_AfterLayerAddEvent);
            globeControl1.HudControlMouseDownEvent += new HudControlMouseDownEventHandler(globeControl1_HudControlMouseDownEvent);

            globeControl2.HudControlMouseDownEvent += new HudControlMouseDownEventHandler(globeControl2_HudControlMouseDownEvent);
            globeControl1.HudControlMouseIntoEvent += new HudControlMouseIntoEventHandler(globeControl1_HudControlMouseIntoEvent);
            globeControl1.HudControlMouseOutEvent += new HudControlMouseOutEventHandler(globeControl1_HudControlMouseOutEvent);
            //globeControl1.MouseDown += new MouseEventHandler(globeControl1_MouseDown);
            //globeControl1.MouseMove += new MouseEventHandler(globeControl1_MouseMove);
            //globeControl1.MouseUp += new MouseEventHandler(globeControl1_MouseUp);
            globeControl1.FeatureMouseClickEvent += new FeatureMouseClickEventHandler(globeControl1_FeatureMouseClickEvent);
            globeControl1.FeatureMouseHoverEvent += new FeatureMouseHoverEventHandler(globeControl1_FeatureMouseHoverEvent);
            globeControl1.MouseDoubleClick += new MouseEventHandler(globeControl1_MouseDoubleClick);
            globeControl1.MouseClick += new MouseEventHandler(globeControl1_MouseClick);
            globeControl1.CameraBeginMoveEvent += new CameraBeginMoveEventHandler(globeControl1_CameraBeginMoveEvent);
            //globeControl1.TrackPolylineAnalysisEndEvent += new TrackPolylineAnalysisEndEventHandler(globeControl1_TrackPolylineAnalysisEndEvent);
            globeControl1.TrackPolylineEndEvent += new TrackPolylineEndEventHandler(globeControl1_TrackPolylineEndEvent);
            //globeControl1.TrackPolygonAnalysisEndEvent += new TrackPolygonAnalysisEndEventHandler(globeControl1_TrackPolygonAnalysisEndEvent);
            globeControl1.TrackPolygonEndEvent += new TrackPolygonEndEventHandler(globeControl1_TrackPolygonEndEvent);
            globeControl1.TrackRectEndEvent += new TrackRectEndEventHandler(globeControl1_TrackRectEndEvent);
            GSOSimplePolygonStyle3D trackingRectStyle = globeControl1.Globe.TrackRectTool.TrackingPolygonStyle as GSOSimplePolygonStyle3D;
            trackingRectStyle.FillColor = Color.FromArgb(0, 0, 0, 0);
            GSOSimplePolygonStyle3D trackRectStyle = globeControl1.Globe.TrackRectTool.PolygonStyle as GSOSimplePolygonStyle3D;
            trackRectStyle.FillColor = Color.FromArgb(0, 0, 0, 0);
            GSOSimpleLineStyle3D trackRectLineStyle = globeControl1.Globe.TrackRectTool.PolygonStyle.OutlineStyle as GSOSimpleLineStyle3D;
            trackRectLineStyle.LineType = EnumLineType.Solid;
            GSOSimpleLineStyle3D trackRectLineStyle1 = globeControl1.Globe.TrackRectTool.TrackingPolygonStyle.OutlineStyle as GSOSimpleLineStyle3D;
            trackRectLineStyle1.LineType = EnumLineType.Solid;
            trackRectLineStyle1.LineColor = Color.FromArgb(0, 174, 255);
            trackRectLineStyle1.LineWidth = 1;
            globeControl1.Globe.StatusBar.SetProject(Utility.projectStr);
            globeControl1.Globe.StatusBar.SetTextVisible(EnumStatusBarText.ProCoord, true);

            globeControl2.Globe.StatusBar.SetProject(Utility.projectStr);
            globeControl2.Globe.StatusBar.SetTextVisible(EnumStatusBarText.ProCoord, true);


            //双屏联动
            globeControl1.BeforeSceneRenderEvent += new BeforeSceneRenderEventHandler(globeControl1_BeforeSceneRenderEvent);
            globeControl2.BeforeSceneRenderEvent += new BeforeSceneRenderEventHandler(globeControl2_BeforeSceneRenderEvent);

            globeControl1.Globe.ConnectServer(Utility.serverip, Utility.serverport, "", ""); //加载locaServer中的数据
            globeControl2.Globe.ConnectServer(Utility.serverip, Utility.serverport, "", ""); //加载locaServer中的数据
            double x = Convert.ToDouble(Utility.Query_Fields["经纬度坐标"].ToString().Split(',')[0]);
            double y = Convert.ToDouble(Utility.Query_Fields["经纬度坐标"].ToString().Split(',')[1]);
            double z = Convert.ToDouble(Utility.Query_Fields["经纬度坐标"].ToString().Split(',')[2]);
            jumpToCameraState(x, y, z);

            Utility.dataSource = globeControl1.Globe.DataManager.OpenSqlServeDataSource(Utility.DBServer, "", Utility.dbdatabase, Utility.userID, Utility.DBPassword);           
            if (Utility.dataSource == null)
            {
                MessageBox.Show("数据库连接失败,请确认配置文件参数是否正确!");
            }

            myPlaceNode = new TreeNode();
            myPlaceNode.ImageIndex = 0;
            myPlaceNode.SelectedImageIndex = 0;
            myPlaceNode.Checked = true;
            myPlaceNode.Tag = globeControl1.Globe.MemoryLayer;
            myPlaceNode.Text = "我的地标";
            myPlaceNode.NodeFont = new Font(layerTree.Font, FontStyle.Bold);

            layerTree.Nodes.Add(myPlaceNode);
            ReadKmlToMemoryLayer(Path.GetDirectoryName(Application.ExecutablePath) + "/MyPlace.kml");

            //AddTerrains();

            //AddLayers();

            TreeNode node = new TreeNode();
            node.ImageIndex = 0;
            node.SelectedImageIndex = 0;
            node.Checked = true;
            node.Text = "标注管理";
            layerMarkerTree.Nodes.Add(node);
            string[] markerStrs = new string[9];
            markerStrs[0] = "标高标注";
            markerStrs[1] = "管径标注";
            markerStrs[2] = "埋深标注";
            markerStrs[3] = "坐标标注";
            markerStrs[4] = "坡度标注";
            markerStrs[5] = "属性标注";
            markerStrs[6] = "自定义标注";
            markerStrs[7] = "距离标注";
            markerStrs[8] = "红线工具";

            for (int i = 0; i < markerStrs.Length; i++)
            {
                if (File.Exists(Application.StartupPath + "\\标注管理\\" + markerStrs[i] + ".lgd"))
                {
                    GSOLayer l = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\标注管理\\" + markerStrs[i] + ".lgd");
                    if (l != null)
                    {
                        TreeNode node1 = new TreeNode();
                        node1.Text = l.Caption;
                        node1.ImageIndex = 0;
                        node1.SelectedImageIndex = 0;
                        node1.Checked = true;
                        node1.Tag = l;
                        layerMarkerTree.Nodes[0].Nodes.Add(node1);
                    }
                }
            }

            //传感器
            TreeNode nodeSensor = new TreeNode();
            nodeSensor.ImageIndex = 0;
            nodeSensor.SelectedImageIndex = 0;
            nodeSensor.Checked = false;
            nodeSensor.Text = "传感器管理";
            layerSensorTree.Nodes.Add(nodeSensor);//传感器            
            if (Utility.sensorMarkerLayers != null)
            {
                for (int i = 0; i < Utility.sensorMarkerLayers.Count; i++)
                {
                    MarkerLayer mLayer = Utility.sensorMarkerLayers[i];
                    if (File.Exists(Application.StartupPath + "\\传感器\\" + mLayer.layerName + ".lgd"))
                    {
                        GSOLayer l = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\传感器\\" + mLayer.layerName + ".lgd");
                        if (l != null)
                        {
                            l.Visible = false;
                            TreeNode node1 = new TreeNode();
                            node1.Text = l.Caption;
                            node1.ImageIndex = 0;
                            node1.SelectedImageIndex = 0;
                            node1.Checked = false;
                            node1.Tag = l;
                            layerSensorTree.Nodes[0].Nodes.Add(node1);
                        }
                    }
                }
            }

            layerManagerNode = new TreeNode();
            layerManagerNode.ImageIndex = 0;
            layerManagerNode.SelectedImageIndex = 0;
            layerManagerNode.Checked = true;
            layerManagerNode.Text = "本地图层";
            layerTree.Nodes.Add(layerManagerNode);

            //GSOLayer layerTunnel = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\隧道.lgd");
            //GSODataset dataset = layerTunnel.Dataset;
            //CheckDatasetGeoReference(layerTunnel.Dataset);
            //TreeNode node = new TreeNode();
            //node.Tag = layerTunnel;
            //node.Text = layerTunnel.Dataset.Caption;
            //node.ImageIndex = 0;
            //node.SelectedImageIndex = 0;
            //node.Checked = layerTunnel.Visible;
            //// 注意用insert不要用add,因为后加入的图层在上层
            ////layerManagerNode.Nodes.Add(node);
            //layerManagerNode.Nodes.Insert(0, node);

            loadTreeView(layerTree);
            sideBar1.ExpandedPanel = sideBarPanelItem3;

            comboBoxEx1.Items.Clear();
            comboBoxEx2.Items.Clear();
            comboBoxEx3.Items.Clear();
            comboBoxEx4.Items.Clear();
            for (int i = 0; i < pipelineLayerNames.Count; i++)
            {
                comboBoxEx1.Items.Add(pipelineLayerNames[i]);
                comboBoxEx2.Items.Add(pipelineLayerNames[i]);
                comboBoxEx3.Items.Add(pipelineLayerNames[i]);
                comboBoxEx4.Items.Add(pipelineLayerNames[i]);
            }
            connBackup = OledbHelper.sqlConnection();//链接数据库中的master,实现数据库文件备份
            splitContainer1.Panel2Collapsed = true;
            layerTemp = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\tempLgdData.lgd");

            buttonItem87.Checked = true;//默认地上模式            

            //insertControlToDatabase();//向数据库插入resource
            configResource();//给登录的用户配置resource           
        }
       
       
        void ReadKmlToMemoryLayer(String kmlPath)
        {
            GSODataset dataset = globeControl1.Globe.DataManager.AddFileDataset(kmlPath);
            GSOFeatureDataset fdataset = dataset as GSOFeatureDataset;
            if (fdataset != null)
            {
                GSOFeatures features = fdataset.GetAllFeatures();
                AddFeaturesNodeToMyPlace(features);
            }
        }

        void AddFeaturesNodeToMyPlace(GSOFeatures features)
        {
            if (features == null || features.Length ==0)
            {
                return;
            }

            for (Int32 i = 0; i < features.Length; i++)
            {
                GSOFeature feature = features[i];
                if (feature.Type == EnumFeatureType.FeatureFolder)
                {

                    GSOFeatureFolder featureFolder = (GSOFeatureFolder)feature;
                    AddFeaturesNodeToMyPlace(featureFolder.Features);

                }
                else
                {
                    TreeNode tempnode = new TreeNode();
                    tempnode.Text = feature.Name;
                    if (feature.Geometry != null)
                    {
                        switch (feature.Geometry.Type)
                        {
                            case EnumGeometryType.GeoPoint3D:
                            case EnumGeometryType.GeoMarker:
                                tempnode.ImageIndex = 3;
                                tempnode.SelectedImageIndex = 3;
                                break;
                            case EnumGeometryType.GeoPolyline3D:
                                tempnode.ImageIndex = 4;
                                tempnode.SelectedImageIndex = 4;
                                break;
                            case EnumGeometryType.GeoPolygon3D:
                                tempnode.ImageIndex = 5;
                                tempnode.SelectedImageIndex = 5;
                                break;
                            case EnumGeometryType.GeoModel:
                            case EnumGeometryType.GeoEntity:
                            case EnumGeometryType.GeoGroupEntity:
                            case EnumGeometryType.GeoSphereEntity:
                            case EnumGeometryType.GeoBoxEntity:
                            case EnumGeometryType.GeoEllipsoidEntity:
                            case EnumGeometryType.GeoCylinderEntity:
                            case EnumGeometryType.GeoFrustumEntity:
                            case EnumGeometryType.GeoEllipCylinderEntity:
                            case EnumGeometryType.GeoEllipFrustumEntity:
                            case EnumGeometryType.GeoRangeEllipsoidEntity:
                            case EnumGeometryType.GeoRangeEllipCylinderEntity:
                            case EnumGeometryType.GeoRangeEllipFrustumEntity:


                                tempnode.ImageIndex = 6;
                                tempnode.SelectedImageIndex = 6;
                                break;
                            case EnumGeometryType.GeoGroundOverlay:
                                tempnode.ImageIndex = 7;
                                tempnode.SelectedImageIndex = 7;
                                break;
                        }

                    }
                    GSOFeature newFeature = globeControl1.Globe.MemoryLayer.AddFeature(feature);
                    tempnode.Checked = newFeature.Visible;
                    tempnode.Tag = newFeature;
                    myPlaceNode.Nodes.Add(tempnode);
                }
            }
        }

        #region 配置用户权限
        private void insertControlToDatabase()
        {
            ArrayList listItem = new ArrayList();
            List<Resource> subListItem = new List<Resource>();
            System.Windows.Forms.Control.ControlCollection cc = ribbonControl1.Controls;
            for (int i = 0; i < cc.Count; i++)
            {
                if (cc[i].GetType() == typeof(DevComponents.DotNetBar.RibbonStrip))
                {
                    DevComponents.DotNetBar.RibbonStrip ribbonStripResource = cc[i] as DevComponents.DotNetBar.RibbonStrip;
                    for (int j = 0; j < ribbonStripResource.Items.Count; j++)
                    {
                        if (ribbonStripResource.Items[j].GetType() == typeof(DevComponents.DotNetBar.RibbonTabItem))
                        {
                            DevComponents.DotNetBar.RibbonTabItem ribbonTabItemResource = ribbonStripResource.Items[j] as DevComponents.DotNetBar.RibbonTabItem;
                            string tabItemResourceName = ribbonTabItemResource.Text;
                            listItem.Add(tabItemResourceName);

                            subListItem.Add(new Resource(tabItemResourceName, "NULL"));

                            if (ribbonTabItemResource.SubItems.Count > 0)
                            {
                                for (int k = 0; k < ribbonTabItemResource.SubItems.Count; k++)
                                {
                                    if (ribbonTabItemResource.SubItems[k].GetType() == typeof(DevComponents.DotNetBar.ButtonItem))
                                    {
                                        DevComponents.DotNetBar.ButtonItem buttonItemResource = ribbonTabItemResource.SubItems[k] as DevComponents.DotNetBar.ButtonItem;
                                        string buttonItemResourceName = buttonItemResource.Text;
                                        subListItem.Add(new Resource(buttonItemResourceName, tabItemResourceName));
                                    }
                                }
                            }
                        }
                    }
                }
                else if (cc[i].GetType() == typeof(DevComponents.DotNetBar.RibbonPanel))
                {
                    DevComponents.DotNetBar.RibbonPanel ribbonPanelResource = cc[i] as DevComponents.DotNetBar.RibbonPanel;
                    for (int j = 0; j < ribbonPanelResource.Controls.Count; j++)
                    {
                        if (ribbonPanelResource.Controls[j].GetType() == typeof(DevComponents.DotNetBar.RibbonBar))
                        {
                            DevComponents.DotNetBar.RibbonBar ribbonBarResource = ribbonPanelResource.Controls[j] as DevComponents.DotNetBar.RibbonBar;
                            for (int k = 0; k < ribbonBarResource.Items.Count; k++)
                            {
                                if (ribbonBarResource.Items[k].GetType() == typeof(DevComponents.DotNetBar.ButtonItem))
                                {
                                    DevComponents.DotNetBar.ButtonItem buttonItemResource = ribbonBarResource.Items[k] as DevComponents.DotNetBar.ButtonItem;
                                    string buttonItemResourceName = buttonItemResource.Text;
                                    subListItem.Add(new Resource(buttonItemResourceName, ribbonBarResource.Name));

                                    if (buttonItemResource.SubItems.Count > 0)
                                    {
                                        for (int m = 0; m < buttonItemResource.SubItems.Count; m++)
                                        {
                                            if (buttonItemResource.SubItems[m].GetType() == typeof(DevComponents.DotNetBar.ButtonItem))
                                            {
                                                DevComponents.DotNetBar.ButtonItem subButtonItemResource = buttonItemResource.SubItems[m] as DevComponents.DotNetBar.ButtonItem;
                                                string SubButtonItemResourceName = subButtonItemResource.Text;
                                                subListItem.Add(new Resource(SubButtonItemResourceName, buttonItemResourceName));
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    if (ribbonBarResource.Items[k].GetType() == typeof(DevComponents.DotNetBar.SliderItem))
                                    {
                                        DevComponents.DotNetBar.SliderItem sliderItemResource = ribbonBarResource.Items[k] as DevComponents.DotNetBar.SliderItem;
                                        subListItem.Add(new Resource(sliderItemResource.Text.Trim(), ribbonBarResource.Name));
                                        if (sliderItemResource.SubItems.Count > 0)
                                        {
                                            for (int m = 0; m < sliderItemResource.SubItems.Count; m++)
                                            {
                                                if (sliderItemResource.SubItems[m].GetType() == typeof(DevComponents.DotNetBar.ButtonItem))
                                                {
                                                    DevComponents.DotNetBar.ButtonItem subButtonItemResource = sliderItemResource.SubItems[m] as DevComponents.DotNetBar.ButtonItem;
                                                    string subButtonItemResourceName = subButtonItemResource.Text;
                                                    subListItem.Add(new Resource(subButtonItemResourceName, sliderItemResource.Text.Trim()));
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (subListItem.Count > 0)
            {
                foreach (Resource r in subListItem)
                {
                    string pname = getRealName(r.resourceParentName);
                    string sql = "insert into RESC(name,aid,pname) values('" + r.resourceName + "',1,'" + pname + "')";
                    int rowCount = OledbHelper.sqlExecuteNonQuery(sql);
                }
                MessageBox.Show("插入成功", "提示");
            }
        }
        private string getRealName(string name)
        {
            string realName = "";
            switch (name)
            {
                case "ribbonBar10":
                    realName = "文件";
                    break;
                case "ribbonBar21":
                    realName = "浏览";
                    break;
                case "ribbonBar4":
                    realName = "场景";
                    break;
                case "ribbonBar2":
                    realName = "查询";
                    break;
                case "ribbonBar16":
                    realName = "查询";
                    break;
                case "ribbonBar11":
                    realName = "编辑";
                    break;
                case "ribbonBar5":
                    realName = "编辑";
                    break;
                case "ribbonBar6":
                    realName = "统计";
                    break;
                case "ribbonBar8":
                    realName = "统计";
                    break;
                case "ribbonBar14":
                    realName = "量算";
                    break;
                case "ribbonBar12":
                    realName = "标注";
                    break;
                case "ribbonBar1":
                    realName = "分析";
                    break;
                case "ribbonBarJJ":
                    realName = "净距分析";
                    break;
                case "ribbonBarTP":
                    realName = "拓扑分析";
                    break;
                case "ribbonBarSY":
                    realName = "视域分析";
                    break;
                case "ribbonBarKW":
                    realName = "开挖分析";
                    break;
                case "ribbonBarQY":
                    realName = "区域分析";
                    break;
                case "ribbonBarMN":
                    realName = "模拟分析";
                    break;
                case "ribbonBarDM":
                    realName = "断面分析";
                    break;
                case "ribbonBar13":
                    realName = "数据管理";
                    break;
                case "ribbonBar3":
                    realName = "数据管理";
                    break;
                case "ribbonBar9":
                    realName = "数据管理";
                    break;
                case "ribbonBar7":
                    realName = "飞行";
                    break;
                case "ribbonBar15":
                    realName = "用户管理";
                    break;     
                default :
                    realName = name;
                    break;
            }
            return realName;
        }
        private void configResource()
        {
            if (Utility.userName != null && Utility.userName != "")
            {
                string userName = Utility.userName;
                string sql = "select RESC.name from UserStatus join Role on UserStatus.rid = Role.id join Perm on Role.pid=Perm.id join PermRESC on Perm.id=PermRESC.permid join RESC on PermRESC.rescid=RESC.id where UserStatus.username='" + userName + "'";
                DataTable dt = OledbHelper.QueryTable(sql);
                if (dt != null && dt.Rows.Count > 0)
                {
                    string[] sResourceName = new string[dt.Rows.Count];
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        sResourceName[i] = dt.Rows[i][0].ToString().Trim();                        
                    }
                    setControlVisilbe(sResourceName);
                }
            }
        }
        private bool isContainName(string[] array, string name)
        {
            bool bl = false;
            for (int i = 0; i < array.Length; i++)
            {
                if (array[i] == name)
                {
                    bl = true;
                    break;
                }
            }
            return bl;
        }
        private void setControlVisilbe(string[] resourceNames)
        {
            ArrayList listItem = new ArrayList();
            ArrayList subListItem = new ArrayList();
            System.Windows.Forms.Control.ControlCollection cc = ribbonControl1.Controls;
            for (int i = 0; i < cc.Count; i++)
            {
                if (cc[i].GetType() == typeof(DevComponents.DotNetBar.RibbonStrip))
                {
                    DevComponents.DotNetBar.RibbonStrip ribbonStripResource = cc[i] as DevComponents.DotNetBar.RibbonStrip;
                    for (int j = 0; j < ribbonStripResource.Items.Count; j++)
                    {
                        if (ribbonStripResource.Items[j].GetType() == typeof(DevComponents.DotNetBar.RibbonTabItem))
                        {
                            DevComponents.DotNetBar.RibbonTabItem ribbonTabItemResource = ribbonStripResource.Items[j] as DevComponents.DotNetBar.RibbonTabItem;
                            string tabItemResourceName = ribbonTabItemResource.Text;
                            listItem.Add(tabItemResourceName);
                            subListItem.Add(tabItemResourceName);
                            if (!isContainName(resourceNames, tabItemResourceName))
                            {
                                ribbonTabItemResource.Visible = false;
                            }
                            if (ribbonTabItemResource.SubItems.Count > 0)
                            {
                                for (int k = 0; k < ribbonTabItemResource.SubItems.Count; k++)
                                {
                                    if (ribbonTabItemResource.SubItems[k].GetType() == typeof(DevComponents.DotNetBar.ButtonItem))
                                    {
                                        DevComponents.DotNetBar.ButtonItem buttonItemResource = ribbonTabItemResource.SubItems[k] as DevComponents.DotNetBar.ButtonItem;
                                        string buttonItemResourceName = buttonItemResource.Text;
                                        subListItem.Add(buttonItemResourceName);
                                        if (!isContainName(resourceNames, buttonItemResourceName))
                                        {
                                            buttonItemResource.Visible = false;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                else if (cc[i].GetType() == typeof(DevComponents.DotNetBar.RibbonPanel))
                {
                    DevComponents.DotNetBar.RibbonPanel ribbonPanelResource = cc[i] as DevComponents.DotNetBar.RibbonPanel;
                    for (int j = 0; j < ribbonPanelResource.Controls.Count; j++)
                    {
                        if (ribbonPanelResource.Controls[j].GetType() == typeof(DevComponents.DotNetBar.RibbonBar))
                        {
                            DevComponents.DotNetBar.RibbonBar ribbonBarResource = ribbonPanelResource.Controls[j] as DevComponents.DotNetBar.RibbonBar;
                            for (int k = 0; k < ribbonBarResource.Items.Count; k++)
                            {
                                if (ribbonBarResource.Items[k].GetType() == typeof(DevComponents.DotNetBar.ButtonItem))
                                {
                                    DevComponents.DotNetBar.ButtonItem buttonItemResource = ribbonBarResource.Items[k] as DevComponents.DotNetBar.ButtonItem;
                                    string buttonItemResourceName = buttonItemResource.Text;
                                    subListItem.Add(buttonItemResourceName);
                                    if (!isContainName(resourceNames, buttonItemResourceName))
                                    {
                                        buttonItemResource.Visible = false;                                        
                                    }
                                    if (buttonItemResource.SubItems.Count > 0)
                                    {
                                        for (int m = 0; m < buttonItemResource.SubItems.Count; m++)
                                        {
                                            if (buttonItemResource.SubItems[m].GetType() == typeof(DevComponents.DotNetBar.ButtonItem))
                                            {
                                                DevComponents.DotNetBar.ButtonItem subButtonItemResource = buttonItemResource.SubItems[m] as DevComponents.DotNetBar.ButtonItem;
                                                string SubButtonItemResourceName = subButtonItemResource.Text;
                                                subListItem.Add(SubButtonItemResourceName);
                                                if (!isContainName(resourceNames, SubButtonItemResourceName))
                                                {
                                                    subButtonItemResource.Visible = false;                                                   
                                                }
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    if (ribbonBarResource.Items[k].GetType() == typeof(DevComponents.DotNetBar.SliderItem))
                                    {
                                        DevComponents.DotNetBar.SliderItem sliderItemResource = ribbonBarResource.Items[k] as DevComponents.DotNetBar.SliderItem;
                                        if (!isContainName(resourceNames, sliderItemResource.Text.Trim()))
                                        {
                                            sliderItemResource.Visible = false;                                            
                                        } 
                                       
                                        if (sliderItemResource.SubItems.Count > 0)
                                        {
                                            for (int m = 0; m < sliderItemResource.SubItems.Count; m++)
                                            {
                                                if (sliderItemResource.SubItems[m].GetType() == typeof(DevComponents.DotNetBar.ButtonItem))
                                                {
                                                    DevComponents.DotNetBar.ButtonItem subButtonItemResource = sliderItemResource.SubItems[m] as DevComponents.DotNetBar.ButtonItem;
                                                    if (!isContainName(resourceNames, subButtonItemResource.Text.Trim()))
                                                    {
                                                        subButtonItemResource.Visible = false;                                                        
                                                    }                                                    
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        #endregion

        void globeControl2_HudControlMouseDownEvent(object sender, HudControlMouseDownEventArgs e)
        {
            switch (e.HudControl.Name)
            {
                case "0":
                    globeControl2.Globe.Action = EnumAction3D.ActionNull;
                    break;
                case "1":
                    globeControl2.Globe.Action = EnumAction3D.SelectObject;
                    break;
            }
        }

        void globeControl2_BeforeSceneRenderEvent(object sender, BeforeSceneRenderEventArgs e)
        {
            if (globeControl2.Focused && buttonItem95.Checked && buttonItem95.Enabled)
            {
                GSOCameraState camera = globeControl2.Globe.CameraState;
                globeControl1.Globe.JumpToCameraState(camera);
            }
        }

        void globeControl1_BeforeSceneRenderEvent(object sender, BeforeSceneRenderEventArgs e)
        {
            if (globeControl1.Focused && buttonItem95.Checked && buttonItem95.Enabled)
            {
                GSOCameraState camera = globeControl1.Globe.CameraState;
                globeControl2.Globe.JumpToCameraState(camera);
                
            }
        }

        void globeControl1_AfterLayerAddEvent(object sender, AfterLayerAddEventArgs e)
        {
            if (e.Layer.Name != null && e.Layer.Name.Length > 5)
            {
                if (e.Layer.Name.Substring(0, 5).Equals("fttp:"))
                {
                    return;
                }
            }

            if (Path.GetExtension(e.Layer.Name).ToLower().Equals(".kml"))
            {
                AddKmlLayer(e.Layer);
            }
            else
            {
                GSODataset dataset = e.Layer.Dataset;
                CheckDatasetGeoReference(e.Layer.Dataset);
                TreeNode node = new TreeNode();
                node.Tag = e.Layer;
                node.Text = e.Layer.Dataset.Caption;
                node.ImageIndex = 0;
                node.SelectedImageIndex = 0;
                node.Checked = e.Layer.Visible;
                // 注意用insert不要用add,因为后加入的图层在上层
                //layerManagerNode.Nodes.Add(node);
                layerManagerNode.Nodes.Insert(0, node);
            }

            layerManagerNode.Expand();
            terrainManagerNode.Expand();
        }
        private void AddKmlLayer(GSOLayer layer)
        {
            if (layer != null)
            {
                TreeNode node = new TreeNode();
                node.Tag = layer;
                node.Text = layer.Caption;
                node.ImageIndex = 0;
                node.SelectedImageIndex = 0;
                node.Checked = layer.Visible;
                layerManagerNode.Nodes.Insert(0, node);
                VisitFeature3Ds(layer.GetAllFeatures(), node);
            }
        }

        private void VisitFeature3Ds(GSOFeatures feature3ds, TreeNode node)
        {
            for (int i = 0; i < feature3ds.Length; i++)
            {
                GSOFeature feature = feature3ds[i];
                if (feature.Type == EnumFeatureType.FeatureFolder)
                {
                    TreeNode tempnode = new TreeNode();
                    tempnode.Text = feature.Name;
                    tempnode.ImageIndex = 1;
                    tempnode.SelectedImageIndex = 1;
                    tempnode.Checked = node.Checked;
                    tempnode.Tag = feature;
                    node.Nodes.Add(tempnode);
                    GSOFeatureFolder featureFolder = (GSOFeatureFolder)feature;
                    VisitFeature3Ds(featureFolder.Features, tempnode);

                }
                else
                {
                    TreeNode tempnode = new TreeNode();
                    tempnode.Text = feature.Name;
                    if (feature.Geometry != null)
                    {
                        switch (feature.Geometry.Type)
                        {
                            case EnumGeometryType.GeoPoint3D:
                            case EnumGeometryType.GeoMarker:
                                tempnode.ImageIndex = 3;
                                tempnode.SelectedImageIndex = 3;
                                break;
                            case EnumGeometryType.GeoPolyline3D:
                                tempnode.ImageIndex = 4;
                                tempnode.SelectedImageIndex = 4;
                                break;
                            case EnumGeometryType.GeoPolygon3D:
                                tempnode.ImageIndex = 5;
                                tempnode.SelectedImageIndex = 5;
                                break;
                            case EnumGeometryType.GeoModel:
                            case EnumGeometryType.GeoEntity:
                            case EnumGeometryType.GeoGroupEntity:
                            case EnumGeometryType.GeoSphereEntity:
                            case EnumGeometryType.GeoBoxEntity:
                            case EnumGeometryType.GeoEllipsoidEntity:
                            case EnumGeometryType.GeoCylinderEntity:
                            case EnumGeometryType.GeoFrustumEntity:
                            case EnumGeometryType.GeoEllipCylinderEntity:
                            case EnumGeometryType.GeoEllipFrustumEntity:
                            case EnumGeometryType.GeoRangeEllipsoidEntity:
                            case EnumGeometryType.GeoRangeEllipCylinderEntity:
                            case EnumGeometryType.GeoRangeEllipFrustumEntity:
                                tempnode.ImageIndex = 6;
                                tempnode.SelectedImageIndex = 6;
                                break;
                            case EnumGeometryType.GeoGroundOverlay:
                                tempnode.ImageIndex = 7;
                                tempnode.SelectedImageIndex = 7;
                                break;
                        }

                    }

                    tempnode.Checked = node.Checked;
                    tempnode.Tag = feature;
                    node.Nodes.Add(tempnode);
                }
            }
        }
        Boolean CheckDatasetGeoReference(GSODataset dataset)
        {
            Boolean bSuccess = false;
            if (dataset.GeoReferenceType == EnumGeoReferenceType.Flat)
            {
                if (MessageBox.Show("数据没有空间参考信息,请设置空间参考信息!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) == DialogResult.OK)
                {
                    String strPath = Path.GetDirectoryName(Application.ExecutablePath) + "\\Coordinate Systems";
                    OpenFileDialog dlg = new OpenFileDialog();

                    dlg.InitialDirectory = strPath;
                    dlg.RestoreDirectory = true;

                    dlg.Filter = "投影文件|*.prj||";
                    if (dlg.ShowDialog() == DialogResult.OK)
                    {
                        bSuccess = dataset.LoadProjectionFromESRIFile(dlg.FileName);
                    }
                }
            }
            else
            {
                return true;
            }
            return bSuccess;
        }
        void globeControl1_TrackRectEndEvent(object sender, TrackRectEndEventArgs e)
        {
            if (e.Polygon != null)
            { 
                globeControl1.Globe.TrackRectTool.Clear();               
                globeControl1.ImmediatelyRefresh();
                globeControl1.SwapBuffer();
                Point pt1 = new Point(Convert.ToInt32(e.StartPos.X), Convert.ToInt32(e.StartPos.Y));
                Point pt2 = new Point(Convert.ToInt32(e.EndPos.X), Convert.ToInt32(e.EndPos.Y));
                Point pt = getUpperLeftPoint(pt1, pt2);
                Image myImg = new Bitmap(Convert.ToInt32(e.Rect.Width), Convert.ToInt32(e.Rect.Height));
                Graphics g = Graphics.FromImage(myImg);
                g.CopyFromScreen(pt, new Point(0, 0), new Size(Convert.ToInt32(e.Rect.Width), Convert.ToInt32(e.Rect.Height)));

                SaveFileDialog dlg = new SaveFileDialog();
                dlg.Filter = "输出JPEG(*.jpg)|*.jpg|输出PNG(*.png)|*.png|输出BMP(*.bmp)|*.bmp|输出BMP(*.gif)|*.gif";
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    string extension = System.IO.Path.GetExtension(dlg.FileName);//扩展名 
                    switch (extension)
                    {
                        case ".jpg":
                            myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                            break;
                        case ".png":
                            myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Png);
                            break;
                        case ".bmp":
                            myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
                            break;
                        case ".gif":
                            myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Gif);
                            break;
                        default:
                            break;
                    }
                }
                this.globeControl1.Globe.Action = EnumAction3D.ActionNull;
                this.globeControl1.Globe.MouseRoamingEnable = true;
            }
        }
        
        private void jumpToCameraState(double x, double y, double z)//定位正北正90度俯视
        {
            GSOCameraState camera = new GSOCameraState();
            camera.Latitude = y;
            camera.Longitude = x;
            camera.Distance = z;
            camera.Tilt = 0;
            camera.Heading = 0;
            globeControl1.Globe.JumpToCameraState(camera);
            globeControl2.Globe.JumpToCameraState(camera);
        }

        void globeControl1_HudControlMouseOutEvent(object sender, HudControlMouseOutEventArgs e)
        {
            if (tooltip1 != null)
            {
                tooltip1.RemoveAll();
            }
        }

        void globeControl1_HudControlMouseIntoEvent(object sender, HudControlMouseIntoEventArgs e)
        {
            GSOHudButton btn = e.HudControl as GSOHudButton;
            tooltip1 = new System.Windows.Forms.ToolTip();
            switch (e.HudControl.Name)
            {
                case "0":
                    tooltip1.SetToolTip(globeControl1, "浏览对象");
                    break;
                case "1":
                    tooltip1.SetToolTip(globeControl1, "选择对象");
                    break;
            }
        }

        void globeControl1_HudControlMouseDownEvent(object sender, HudControlMouseDownEventArgs e)
        {
            switch (e.HudControl.Name)
            {
                case "0":
                    globeControl1.Globe.Action = EnumAction3D.ActionNull;
                    break;
                case "1":
                    globeControl1.Globe.Action = EnumAction3D.SelectObject;
                    break;
            }
        }
        private void layerTree_AfterCheck(object sender, TreeViewEventArgs e)//layerTree选中后事件
        {
            if (e.Node.Tag != null)
            {
                if (e.Node.Tag.ToString().Contains("|"))
                {
                    string nodeTag = e.Node.Tag.ToString().Split('|')[1];
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(nodeTag);
                    if (layer != null)
                    {                        
                        layer.Visible = e.Node.Checked;
                        globeControl1.Globe.Refresh();
                    }
                }
                if (e.Node.Tag is GSOLayer)
                {
                    GSOLayer layer = e.Node.Tag as GSOLayer;
                    layer.Visible = e.Node.Checked;
                    globeControl1.Globe.Refresh();
                }
                if (e.Node.Tag is GSOFeature)
                {
                    if (e.Node.Nodes.Count == 0)
                    {
                        GSOFeature feat = e.Node.Tag as GSOFeature;
                        feat.Visible = e.Node.Checked;
                        globeControl1.Globe.Refresh();
                    }
                }
            }
            CheckControl(e);
        }
        //树节点选中方法
        private void CheckControl(TreeViewEventArgs e)
        {
            if (e.Action != TreeViewAction.Unknown)
            {
                if (e.Node != null && !Convert.IsDBNull(e.Node))
                {
                    CheckParentNode(e.Node);
                    if (e.Node.Nodes.Count > 0)
                    {
                        CheckAllChildNodes(e.Node, e.Node.Checked);
                    }
                }
            }

        }
        //改变所有子节点的状态
        private void CheckAllChildNodes(TreeNode pn, bool IsChecked)
        {
            foreach (TreeNode tn in pn.Nodes)
            {
                tn.Checked = IsChecked;

                if (tn.Nodes.Count > 0)
                {
                    CheckAllChildNodes(tn, IsChecked);
                }
            }
        }

        //改变父节点的选中状态,此处为所有子节点不选中时才取消父节点选中,可以根据需要修改
        private void CheckParentNode(TreeNode curNode)
        {
            bool bChecked = false;

            if (curNode.Parent != null)
            {
                foreach (TreeNode node in curNode.Parent.Nodes)
                {
                    if (node.Checked)
                    {
                        bChecked = true;
                        break;
                    }
                }

                if (bChecked)
                {
                    curNode.Parent.Checked = true;
                    CheckParentNode(curNode.Parent);
                }
                else
                {
                    curNode.Parent.Checked = false;
                    CheckParentNode(curNode.Parent);
                }
            }
        }

        private void layerTree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                layerTree.SelectedNode = e.Node;
                if (e.Node.Tag != null)
                {
                    if (e.Button == MouseButtons.Right && e.Node.Tag.ToString().Contains("|"))
                    {
                        if (e.Node.Tag.ToString().Split('|')[0] == "locaserver")
                        {
                            foreach (ToolStripItem item in layerNodeContexMenu.Items)
                            {
                                item.Visible = false;
                            }
                            return;
                        }
                        if (e.Node.Tag.ToString().Split('|')[0] == "new")
                        {
                            //FeatureAddLayerMenuItem.Enabled = true;
                            LayerEditableMenuItem.Enabled = true;
                            foreach (ToolStripItem item in layerNodeContexMenu.Items)
                            {
                                item.Visible = false;
                            }
                            //FeatureAddLayerMenuItem.Visible = true;
                            LayerSelectableMenuItem.Visible = true;
                            LayerEditableMenuItem.Visible = true;
                            RemoveLayer.Visible = true;
                            RefreshLayerFeatureListMenuItem.Visible = true;
                            SaveLayerMenuItem.Visible = true;
                        }
                       // FeatureAddLayerMenuItem.Visible = true;
                        LayerEditableMenuItem.Visible = true;
                        LayerEditableMenuItem.Visible = true;
                        SaveLayerMenuItem.Visible = true;

                        layerNodeContexMenu.Show(layerTree, e.X, e.Y);
                        layerNodeContexMenu.Tag = e.Node;
                        GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(e.Node.Tag.ToString().Split('|')[1]);
                        LayerSelectableMenuItem.Checked = layer.Selectable;
                        LayerEditableMenuItem.Checked = layer.Editable;
                        //FeatureAddLayerMenuItem.Checked = layer.IsDestLayerFeatureAdd();
                    }
                    else
                    {
                        if (e.Node.Tag is GSOLayer && e.Node.Parent != null && e.Node.Parent.Text.Trim() == "本地图层")
                        {
                            contextMenuStripDeleteLayerNode.Show(layerTree, e.X, e.Y);
                            contextMenuStripDeleteLayerNode.Tag = e.Node;
                        }
                        if (e.Node.Tag is GSOFeature && e.Node.Parent != null && e.Node.Parent.Text.Trim() == "我的地标")
                        {
                            contextMenuStripDeleteLayerNode.Show(layerTree, e.X, e.Y);
                            contextMenuStripDeleteLayerNode.Tag = e.Node;
                        }
                    }
                }
            }
        }

        private void 删除ToolStripMenuItem2_Click(object sender, EventArgs e)
        {
            TreeNode node = layerTree.SelectedNode;
            if (node != null && node.Parent != null && node.Parent.Text.Trim() == "本地图层")
            {
                if (node.Tag is GSOLayer)
                {
                    GSOLayer layer = node.Tag as GSOLayer;
                    globeControl1.Globe.Layers.Remove(layer);
                    globeControl1.Globe.Refresh();

                    node.Remove();
                }
            }
            if (node != null && node.Parent != null && node.Parent.Text.Trim() == "我的地标")
            {
                if (node.Tag is GSOFeature)
                {
                    GSOFeature f = node.Tag as GSOFeature;
                    f.Delete();
                    globeControl1.Globe.Refresh();

                    node.Remove();
                }
            }
        }
        private void layerTree_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Node.Tag != null)
            {
                if (e.Node.Tag.ToString().Contains("|"))
                {
                    string nodeTag = e.Node.Tag.ToString().Split('|')[1];
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(nodeTag);
                    if (layer != null)
                    {
                        double x = layer.LatLonBounds.Center.X;
                        double y = layer.LatLonBounds.Center.Y;
                        globeControl1.Globe.FlyToPosition(new GSOPoint3d(x, y, 0), EnumAltitudeMode.Absolute);
                    }
                }
                if (e.Node.Tag is GSOLayer)
                {
                    GSOLayer layer = e.Node.Tag as GSOLayer;
                    double x = layer.LatLonBounds.Center.X;
                    double y = layer.LatLonBounds.Center.Y;
                    globeControl1.Globe.FlyToPosition(new GSOPoint3d(x, y, 0), EnumAltitudeMode.Absolute);
                }
                if (e.Node.Tag is GSOFeature)
                {
                    if (e.Node.Nodes.Count == 0)
                    {
                        GSOFeature feat = e.Node.Tag as GSOFeature;
                        globeControl1.Globe.FlyToFeature(feat);
                    }
                }
            }
        }

        void globeControl1_CameraBeginMoveEvent(object sender, CameraBeginMoveEventArgs e)
        {
            if (featureTooltip.IsVisible())
            {
                featureTooltip.HideBalloon();
            }
            if (balloonEx.IsVisible())
            {
                balloonEx.HideBalloon();
            }
        }

        void globeControl1_TrackPolylineEndEvent(object sender, TrackPolylineEndEventArgs e)
        {
            ArrayList arraylistPoint = new ArrayList();
            ArrayList arraylistLine = new ArrayList();
            if (e.Polyline != null)
            {
                //横断面分析
                if (btnItem_HDMAnalysis.Checked || buttonItem9.Checked)
                {                    
                    if(pipelineLayerNames != null)
                    {
                        GSOGeoPolygon3D polygon = e.Polyline.CreateBuffer(0.1, true, 5, true, false);
                        for (int i = 0; i < pipelineLayerNames.Count; i++)
                        {                            
                            if (pipelineLayerNames[i] != null)
                            {
                                GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(pipelineLayerNames[i]);
                                if (layer == null)
                                {
                                    continue;
                                }
                                if (layer.Visible == false)
                                {
                                    continue;
                                }
                                GSOFeatureLayer featurelayer = layer as GSOFeatureLayer;
                                if (featurelayer != null)
                                {
                                    GSOFeatures feats = featurelayer.FindFeaturesInPolygon(polygon, false); //featurelayer.GetAllFeatures();
                                    for (int j = 0; j < feats.Length; j++)
                                    {
                                        GSOFeature feateline = feats[j];
                                        GSOGeoPolyline3D geoline = feateline.Geometry as GSOGeoPolyline3D;

                                        if (geoline != null)
                                        {
                                            if (geoline.Style != null)
                                            {
                                                if (geoline.Style.GetType() == typeof(GSOPipeLineStyle3D))
                                                {
                                                    GSOPoint3d pntIntersect1 = new GSOPoint3d();
                                                    GSOPoint3d pntIntersect2 = new GSOPoint3d();
                                                    GSOPoint3d pntProIntersect1 = new GSOPoint3d();
                                                    GSOPoint3d pntProIntersect2 = new GSOPoint3d();
                                                    // 计算两条线的距离和交点,若果失败返回-1
                                                    // 若在同一直线上,并且有交点,返回0
                                                    // 若不在同一平面,返回最近两点的距离,并且计算最近两点
                                                    double honLen;
                                                    double verLen;
                                                    double dNoIntersetStartRatio;
                                                    double dDist = globeControl1.Globe.Analysis3D.ComputeTwoGeoPolylineDistance(e.Polyline, geoline, out pntIntersect1, out pntIntersect2, out honLen, out verLen, false, false, 0);

                                                    globeControl1.Globe.Action = EnumAction3D.ActionNull;
                                                    if (dDist > -1)
                                                    {
                                                        arraylistPoint.Add(pntIntersect2);
                                                        arraylistLine.Add(feateline);
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    if (btnItem_HDMAnalysis.Checked)
                    {
                        FrmHDMAnalysis3 frm = FrmHDMAnalysis3.GetForm(arraylistPoint, arraylistLine, e.Polyline, globeControl1);
                        if (!frm.isShowFirst)
                        {
                            frm.Show(this);
                        }
                        frm.LoadChartEvent();
                    }
                    else
                    {
                        FrmRoadHDM frm = FrmRoadHDM.GetForm(arraylistPoint, arraylistLine, e.Polyline, globeControl1);
                        if (!frm.isShowFirst)
                        {
                            frm.Show(this);
                        }
                        frm.LoadChartEvent();
                    }
                    globeControl1.Globe.ClearLastTrackPolyline();
                }
                else if (BaselineProfileAnalysisMenuItem.Checked)
                {
                    FrmBaseLineProfillAnalysis dlg = new FrmBaseLineProfillAnalysis(globeControl1.Globe,e.Polyline);                    
                    dlg.Show(this);
                    globeControl1.Globe.ClearLastTrackPolyline();
                }
                else if (buttonItem28.Checked)
                {
                    GSOGeoPolygon3D resPolygon = e.Polyline.CreateBuffer(m_dDigPitWidthAlongLine, false, 0, false, false);

                    GSOGeoPit geoPit = new GSOGeoPit();
                    geoPit.PitPolygon = resPolygon;
                    if (m_bDigPitByDepth)
                    {
                        geoPit.PitDepth = m_dDigPitValue;
                        geoPit.PitDepthUsing = true;
                    }
                    else
                    {
                        geoPit.PitBottomAlt = m_dDigPitValue;
                        geoPit.PitDepthUsing = false;
                    }

                    globeControl1.Globe.AddPit("", geoPit);
                    GSOLayer layerGround = globeControl1.Globe.Layers.GetLayerByCaption(roadLayerName);// ("180fd");
                    if (layerGround != null)
                    {
                        layerGround.Visible = false;
                    }
                    // 清除当前TrackPolygonAnalysis的痕迹
                    globeControl1.Globe.ClearLastTrackPolyline();
                }
                else if (distanceMarker)
                {
                    setMarkerLayerUnVisible("距离标注");   
                    GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("距离标注");
                    if (l != null)
                    {
                        l.Visible = true;
                        if (getLabelName(l) != -1)
                        {
                            GSOGeoPolyline3D line = e.Polyline;
                            if (line.PartCount > 0)
                            {
                                double length = line.GetSpaceLength(true, 6378137);//线的长度

                                GSOGeoPoint3D pt = new GSOGeoPoint3D();
                                GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2);
                                GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1];
                                pt.X = point3d.X;
                                pt.Y = point3d.Y;
                                pt.Z = point3d.Z;
                                
                                string Twodecimalplaces = string.Format("{0:F}", length);
                                string radiusLabelName = "" + Twodecimalplaces + "米";
                                //string radiusLabelName = "" + length + "米";//标注名称
                                
                                GSOPoint2d point2d = new GSOPoint2d(0, 30);//标注位置

                                int labelText = getLabelName(l);

                                GSOFeature newFeatureLine = new GSOFeature();
                                newFeatureLine.Geometry = line;
                                newFeatureLine.Name = (labelText + 1).ToString() + "-line";
                                l.AddFeature(newFeatureLine);
                                globeControl1.Globe.ClearLastTrackPolyline();                                

                                GSOFeature newFeature = new GSOFeature();
                                newFeature = createLabel(l, newFeature, pt, radiusLabelName, (labelText + 1).ToString(), point2d);
                                l.AddFeature(newFeature);
                                
                                globeControl1.Refresh();
                            }
                        }
                    }
                }
            }
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            ActionToolMenuChecked();
        }
        void globeControl1_TrackPolylineAnalysisEndEvent(object sender, TrackPolylineEndEventArgs e)
        {
            ArrayList arraylistPoint = new ArrayList();
            ArrayList arraylistLine = new ArrayList();
            if (e.Polyline != null)
            {
                //横断面分析
                if (btnItem_HDMAnalysis.Checked || buttonItem9.Checked)
                {

                    for (int i = 0; i < globeControl1.Globe.Layers.Count; i++)
                    {
                        GSOLayer layer = globeControl1.Globe.Layers[i];
                        if (layer == null)
                        {
                            continue;
                        }
                        if (layer.Visible == false)
                        {
                            continue;
                        }
                        GSOFeatureLayer featurelayer = layer as GSOFeatureLayer;
                        if (featurelayer != null)
                        {
                            GSOFeatures feats = featurelayer.GetAllFeatures();
                            for (int j = 0; j < feats.Length; j++)
                            {
                                GSOFeature feateline = feats[j];
                                GSOGeoPolyline3D geoline = feateline.Geometry as GSOGeoPolyline3D;

                                if (geoline != null)
                                {
                                    if (geoline.Style != null)
                                    {
                                        if (geoline.Style.GetType() == typeof(GSOPipeLineStyle3D))
                                        {
                                            GSOPoint3d pntIntersect1 = new GSOPoint3d();
                                            GSOPoint3d pntIntersect2 = new GSOPoint3d();
                                            GSOPoint3d pntProIntersect1 = new GSOPoint3d();
                                            GSOPoint3d pntProIntersect2 = new GSOPoint3d();
                                            // 计算两条线的距离和交点,若果失败返回-1
                                            // 若在同一直线上,并且有交点,返回0
                                            // 若不在同一平面,返回最近两点的距离,并且计算最近两点
                                            double honLen;
                                            double verLen;
                                            double dDist = globeControl1.Globe.Analysis3D.ComputeVerticalDistance(e.Polyline, geoline, out pntIntersect1, out pntIntersect2, out pntProIntersect1, out pntProIntersect2, false);
                                            
                                            globeControl1.Globe.Action = EnumAction3D.ActionNull;
                                            if (dDist > -1)
                                            {
                                                arraylistPoint.Add(pntIntersect2); 
                                                arraylistLine.Add(feateline);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    if (btnItem_HDMAnalysis.Checked)
                    {
                        FrmHDMAnalysis3 frm = FrmHDMAnalysis3.GetForm(arraylistPoint, arraylistLine, e.Polyline, globeControl1);
                        if (!frm.isShowFirst)
                        {
                            frm.Show(this);
                        }
                        frm.LoadChartEvent();
                    }
                    else
                    {
                        FrmRoadHDM frm = FrmRoadHDM.GetForm(arraylistPoint, arraylistLine, e.Polyline, globeControl1);
                        if (!frm.isShowFirst)
                        {
                            frm.Show(this);
                        }
                        frm.LoadChartEvent();
                    }
                    globeControl1.Globe.ClearAnalysis();
                }
                else if (BaselineProfileAnalysisMenuItem.Checked)
                {
                    FrmBaseLineProfillAnalysis dlg = new FrmBaseLineProfillAnalysis(globeControl1.Globe,e.Polyline);
                    
                    dlg.Show(this);
                }
                else if (buttonItem28.Checked)
                {
                    GSOGeoPolygon3D resPolygon = e.Polyline.CreateBuffer(m_dDigPitWidthAlongLine, false, 0, false, false);

                    GSOGeoPit geoPit = new GSOGeoPit();
                    geoPit.PitPolygon = resPolygon;
                    if (m_bDigPitByDepth)
                    {
                        geoPit.PitDepth = m_dDigPitValue;
                        geoPit.PitDepthUsing = true;
                    }
                    else
                    {
                        geoPit.PitBottomAlt = m_dDigPitValue;
                        geoPit.PitDepthUsing = false;
                    }

                    globeControl1.Globe.AddPit("", geoPit);

                    // 清除当前TrackPolygonAnalysis的痕迹
                    globeControl1.Globe.ClearLastTrackPolyline();
                }
            }
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            ActionToolMenuChecked();
        }
        void globeControl1_TrackPolygonEndEvent(object sender, TrackPolygonEndEventArgs e)
        {
            if (globeControl1.Globe.Action == EnumAction3D.TrackPolygon)
            {
                switch (trackflag)
                {
                    case "valvequery":
                        workWellLen.Clear();
                        List<GSOFeatures> list = new List<GSOFeatures>();
                        for (int i = 0; i < valueLayerNames.Count; i++)
                        {
                            GSOFeatures fs = PolygonIntersectAnalysis_Well(e.Polygon, valueLayerNames[i]);
                            list.Add(fs);
                        }
                        FrmLayerSelectedQuery frm = new FrmLayerSelectedQuery(workWellLen, list, dataGridViewX1, toolStripNumbers, globeControl1, panelEx6);
                        frm.Show(this);
                        //panelEx6.Visible = true;
                        toolStripFeatureLength.Text = "";
                        globeControl1.Globe.Action = EnumAction3D.ActionNull;
                        break;
                   
                    case "pipelinespatialquery":
                        pipeLineDis.Clear();
                        List<GSOFeatures> list1 = new List<GSOFeatures>();
                        for (int i = 0; i < pipelineLayerNames.Count; i++)
                        {
                            GSOFeatures fs = PolygonIntersectAnalysis(e.Polygon, pipelineLayerNames[i]);
                            list1.Add(fs);
                        }

                        FrmAllPipelineStatis frm1 = new FrmAllPipelineStatis(0, pipeLineDis, list1, dataGridViewX1, toolStripNumbers, toolStripFeatureLength, globeControl1, panelEx6);
                        frm1.Show(this);                       
                        globeControl1.Globe.Action = EnumAction3D.ActionNull;
                        
                        break;
                    case "pipelinespatialquery1":
                        pipeLineDis.Clear();
                        List<GSOFeatures> list2 = new List<GSOFeatures>();
                        for (int i = 0; i < pipelineLayerNames.Count; i++)
                        {
                            GSOFeatures fs = PolygonIntersectAnalysis(e.Polygon, pipelineLayerNames[i]);
                            list2.Add(fs);
                        }

                        FrmAllPipelineStatis.ShowForm(1, pipeLineDis, list2, dataGridViewX1, toolStripNumbers, toolStripFeatureLength, globeControl1, panelEx6);
                      
                        globeControl1.Globe.Action = EnumAction3D.ActionNull;
                        
                        break;
                    case "workwellquery":
                        workWellLen.Clear();
                        List<GSOFeatures> listWell = new List<GSOFeatures>();
                        for (int i = 0; i < workwellLayerNames.Count; i++)
                        {
                            GSOFeatures fs = PolygonIntersectAnalysis_Well(e.Polygon, workwellLayerNames[i]);
                            listWell.Add(fs);
                        }
                    
                        FrmAllWorkWellStatis frmWell = new FrmAllWorkWellStatis(workWellLen, listWell, dataGridViewX1, toolStripNumbers, globeControl1, panelEx6);
                        frmWell.Show(this);
                   
                        globeControl1.Globe.Action = EnumAction3D.ActionNull;
                        
                        break;
                  
                    case "pit":
                        double depth;
                        FrmTackPolygonDlg dlg = new FrmTackPolygonDlg();
                        if (dlg.ShowDialog() == DialogResult.OK)
                        {
                            depth = dlg.depth;
                            GSOGeoPit geoPit = new GSOGeoPit();
                            geoPit.PitPolygon = e.Polygon;
                            geoPit.PitDepth = depth;
                            geoPit.PitDepthUsing = true;
                            globeControl1.Globe.AddPit("", geoPit);
                            GSOLayer layerGround = globeControl1.Globe.Layers.GetLayerByCaption(roadLayerName);//("180fd");
                            if (layerGround != null)
                            {
                                layerGround.Visible = false;
                            }
                        }
                        // 清除当前TrackPolygonAnalysis的痕迹
                        globeControl1.Globe.ClearLastTrackPolygon();
                        globeControl1.Globe.Action = EnumAction3D.ActionNull;
                        break;
                    case "digFillAnalysis":
                        DigFillAnalysisDlg dlg1 = new DigFillAnalysisDlg();
                        dlg1.m_globe = globeControl1.Globe;
                        dlg1.m_polygon3D = e.Polygon;
                        globeControl1.Globe.Action = EnumAction3D.ActionNull;
                        dlg1.Show(this);
                        break;
                    case "":
                        break;

                    default:
                        break;
                }
            }
        }
        void globeControl1_TrackPolygonAnalysisEndEvent(object sender, TrackPolygonEndEventArgs e)
        {
            if (globeControl1.Globe.Action == EnumAction3D.TrackPolygon)
            {
                switch (trackflag)
                {
                    case "valvequery":
                        workWellLen.Clear();
                        List<GSOFeatures> list = new List<GSOFeatures>();
                        for (int i = 0; i < valueLayerNames.Count; i++)
                        {
                            GSOFeatures fs = PolygonIntersectAnalysis_Well(e.Polygon, valueLayerNames[i]);
                            list.Add(fs);
                        }
                        FrmLayerSelectedQuery frm = new FrmLayerSelectedQuery(workWellLen, list, dataGridViewX1, toolStripNumbers, globeControl1,panelEx6);
                        frm.Show(this);
                        //panelEx6.Visible = true;
                        toolStripFeatureLength.Text = "";
                        globeControl1.Globe.Action = EnumAction3D.ActionNull;
                        break;
                 
                    case "pipelinespatialquery": 
                        pipeLineDis.Clear();
                        List<GSOFeatures> list1 = new List<GSOFeatures>();
                        for (int i = 0; i < pipelineLayerNames.Count; i++)
                        {
                            GSOFeatures fs = PolygonIntersectAnalysis(e.Polygon, pipelineLayerNames[i]);
                            list1.Add(fs);
                        }

                        FrmAllPipelineStatis frm1 = new FrmAllPipelineStatis(0,pipeLineDis, list1, dataGridViewX1, toolStripNumbers, toolStripFeatureLength, globeControl1, panelEx6);
                        frm1.Show(this);
                        //this.panelEx6.Visible = true;
                        globeControl1.Globe.Action = EnumAction3D.ActionNull;
                        //MessageBox.Show(pipe1 + pipe2 + pipe3 + pipe4 + pipe5 + pipe6, "统计");
                        break;
                    case "pipelinespatialquery1":
                        pipeLineDis.Clear();
                        List<GSOFeatures> list2 = new List<GSOFeatures>();
                        for (int i = 0; i < pipelineLayerNames.Count; i++)
                        {
                            GSOFeatures fs = PolygonIntersectAnalysis(e.Polygon, pipelineLayerNames[i]);
                            list2.Add(fs);
                        }

                        FrmAllPipelineStatis.ShowForm(1, pipeLineDis, list2, dataGridViewX1, toolStripNumbers, toolStripFeatureLength, globeControl1, panelEx6);
                       
                        globeControl1.Globe.Action = EnumAction3D.ActionNull;
                    
                        break;
                    case "workwellquery":
                        workWellLen.Clear();
                        List<GSOFeatures> listWell = new List<GSOFeatures>();
                        for (int i = 0; i < workwellLayerNames.Count; i++)
                        {
                            GSOFeatures fs = PolygonIntersectAnalysis_Well(null, workwellLayerNames[i]);
                            listWell.Add(fs);
                        }
                        
                        FrmAllWorkWellStatis frmWell = new FrmAllWorkWellStatis(workWellLen, listWell, dataGridViewX1, toolStripNumbers, globeControl1,panelEx6);
                        frmWell.Show(this);
                    
                        globeControl1.Globe.Action = EnumAction3D.ActionNull;
                        
                        break;
                    
                    case "pit":
                        double depth;
                        FrmTackPolygonDlg dlg = new FrmTackPolygonDlg();
                        if (dlg.ShowDialog() == DialogResult.OK)
                        {
                            depth = dlg.depth;
                            GSOGeoPit geoPit = new GSOGeoPit();
                            geoPit.PitPolygon = e.Polygon;
                            geoPit.PitDepth = depth;
                            geoPit.PitDepthUsing = true;
                            globeControl1.Globe.AddPit("", geoPit);
                         
                        }
                        // 清除当前TrackPolygonAnalysis的痕迹
                        globeControl1.Globe.ClearLastTrackPolygon();
                        globeControl1.Globe.Action = EnumAction3D.ActionNull;
                        break;
                    case "digFillAnalysis":
                        DigFillAnalysisDlg dlg1 = new DigFillAnalysisDlg();
                        dlg1.m_globe = globeControl1.Globe;
                        dlg1.m_polygon3D = e.Polygon;
                        globeControl1.Globe.Action = EnumAction3D.ActionNull;
                        dlg1.Show(this);
                        break;
                    case "":
                        break;

                    default:
                        break;
                }
            }
        }
        private void VerticalAnalysis(GSOFeatures feats, string caption)
        {
            for (int i = 0; i < feats.Length; i++)
            {
                int idx = dataGridViewX2.Rows.Add();
                dataGridViewX2.Rows[idx].Cells[0].Value = caption;
                dataGridViewX2.Rows[idx].Cells[1].Value = feats[i].Name;
            }
        }
        private bool ValiPort()
        {
            Ping p = new Ping();//创建Ping对象p            
            PingReply pr = p.Send(Utility.localicenseserverip);//向指定IP或者主机名的计算机发送ICMP协议的ping数据包            
            if (pr.Status == IPStatus.Success)//如果ping成功            
            {
                try
                {
                    TcpClient tcpc = new TcpClient(Utility.localicenseserverip, Utility.localicenseserverport);//对IP地址为"192.168.0.105"的计算机的1500端口提出连接申请 
                    tcpc.Close();
                    return true;
                }
                catch (Exception ex)
                {
                    LogError.PublishError(ex);
                    MessageBox.Show("端口连接错误!" + ex.Message);
                    return false;
                }
            }
            else
            {
                int times = 0;//重新连接次数;
                int count = 2;//设置尝试次数
                while (times < count)
                {
                    //Thread.Sleep(1000);//等待时间(方便测试的话,你可以改为1000)  
                    pr = p.Send(Utility.localicenseserverip);

                    if (pr.Status == IPStatus.Success)
                    {
                        try
                        {
                            TcpClient tcpc = new TcpClient(Utility.localicenseserverip, Utility.localicenseserverport);//对IP地址为"192.168.0.105"的计算机的1500端口提出连接申请 
                            tcpc.Close();
                            return true;
                        }
                        catch (Exception ex)
                        {
                            LogError.PublishError(ex);
                            MessageBox.Show("端口连接错误!" + ex.Message);
                            return false;
                        }
                    }
                    else
                    {
                        times++;
                        if (times < count)
                        {
                            continue;
                        }
                        else
                        {
                            MessageBox.Show("重新尝试连接失败");
                            return false;
                        }
                    }
                }
                return false;
            }
        }
        void globeControl1_FeatureMouseHoverEvent(object sender, FeatureMouseHoverEventArgs e)
        {
            try
            {
                if (e.Feature != null)
                {
                    if (e.Feature.GetFieldDefn("编号") != null)
                    {
                        featureTooltip.ShowBalloon((int)e.MousePos.X, (int)e.MousePos.Y, e.Feature.GetValue("编号").ToString());
                    }
                    else if (e.Feature.Name != "")
                    {
                        featureTooltip.ShowBalloon((int)e.MousePos.X, (int)e.MousePos.Y, e.Feature.Name);
                    }
                }
            }
            catch (Exception ex)
            {
                LogError.PublishError(ex);
            }
        }

        void globeControl1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (m_AddPipeLine == true && globeControl1.Globe.Action==EnumAction3D.DrawPolyline)
                {
                    GSOLayer layerDest = globeControl1.Globe.DestLayerFeatureAdd;
                    if (layerDest != null)
                    {
                        GSOFeatures features = layerDest.GetAllFeatures();
                        GSOFeature f = features[features.Length - 1];
                        GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D;
                        globeControl1.Globe.Action = EnumAction3D.ActionNull;
                        if (f != null && f.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                        {
                            FrmLineCoordinate lineCoordiante = new FrmLineCoordinate(f, globeControl1, layerDest.Caption);
                            lineCoordiante.Show(this);
                        }
                        globeControl1.Refresh();
                    }
                }
                m_AddPipeLine = false;
                if (drawRedPology == true && globeControl1.Globe.Action==EnumAction3D.DrawPolygon)
                {
                    GSOLayer layerDest = globeControl1.Globe.DestLayerFeatureAdd;
                    if (layerDest != null)
                    {
                        GSOFeatures features = layerDest.GetAllFeatures();
                        //GSOFeatures features = globeControl1.Globe.MemoryLayer.GetAllFeatures();
                        GSOFeature f = features[features.Length - 1];
                        if (f != null)
                        {
                            GSOGeoPolygon3D polygon = f.Geometry as GSOGeoPolygon3D;
                            if (polygon != null)
                            {
                                GSOSimplePolygonStyle3D geoStyle3d = new GSOSimplePolygonStyle3D();
                                f.Name = (getLabelName(layerDest)+1).ToString();
                                geoStyle3d.FillColor = Color.Red;
                                polygon.Style = geoStyle3d;
                                GSOLabel label = new GSOLabel();
                                label.Text = "此区域正在施工中!";
                                label.Style = new GSOLabelStyle();
                                label.Style.HasTracktionLine = false;
                                polygon.Label = label;

                                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                                globeControl1.Refresh();                             
                            }
                        }
                    }
                }
                drawRedPology = false;            
            }  
        }
        Dictionary<string, GSOFeature> dis_Feats = new Dictionary<string, GSOFeature>();
        void globeControl1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (globeControl1.Globe.Action == EnumAction3D.VisibilityAnalysis)
                {
                    btnSpaceVisibilityAnalysis.Checked = false;
                    return;
                }
                if (globeControl1.Globe.Action == EnumAction3D.SelectObject && trackflag == "vertical")
                {
                    if (globeControl1.Globe.SelObjectCount > 0)
                    {
                        dataGridViewX2.Rows.Clear();
                        //layerTemp.RemoveAllFeature();
                    }
                    for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++)
                    {
                        GSOLayer resLayer = null;
                        GSOFeature feat = null;
                        globeControl1.Globe.GetSelectObject(i, out feat, out resLayer);
                        // GSOFeature feat = globeControl1.Globe.GetSelectObject(i;
                        if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                        {
                            int idx = dataGridViewX2.Rows.Add();
                            dataGridViewX2.Rows[idx].Cells[0].Value = resLayer.Caption;
                            string featureName;
                            if (feat.GetFieldDefn("编号") != null)
                            {
                                featureName = feat.GetValue("编号").ToString();
                            }
                            else
                            {
                                featureName = feat.Name;
                            }
                            dataGridViewX2.Rows[idx].Cells[1].Value = featureName;
                        }
                    }

                    return;
                }
                if (globeControl1.Globe.Action == EnumAction3D.SelectObject && trackflag == "horizontal")
                {
                    if (globeControl1.Globe.SelObjectCount > 0)
                    {
                        dataGridViewX8.Rows.Clear();
                        //layerTemp.RemoveAllFeature();
                    }
                    for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++)
                    {
                        GSOLayer resLayer = null;
                        GSOFeature feat = null;
                        globeControl1.Globe.GetSelectObject(i, out feat, out resLayer);
                        // GSOFeature feat = globeControl1.Globe.GetSelectObject(i;
                        if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                        {
                            int idx = dataGridViewX8.Rows.Add();
                            dataGridViewX8.Rows[idx].Cells[0].Value = resLayer.Caption;
                            string featureName;
                            if (feat.GetFieldDefn("编号") != null)
                            {
                                featureName = feat.GetValue("编号").ToString();
                            }
                            else
                            {
                                featureName = feat.Name;
                            }
                            dataGridViewX8.Rows[idx].Cells[1].Value = featureName;
                        }
                    }
                    return;
                }
                if (globeControl1.Globe.Action == EnumAction3D.SelectObject && trackflag == "collision")
                {
                    if (globeControl1.Globe.SelObjectCount > 0)
                    {
                        dataGridViewX4.Rows.Clear();
                        //layerTemp.RemoveAllFeature();
                    }
                    for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++)
                    {
                        GSOLayer resLayer = null;
                        GSOFeature feat = null;
                        globeControl1.Globe.GetSelectObject(i, out feat, out resLayer);
                        // GSOFeature feat = globeControl1.Globe.GetSelectObject(i;
                        if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                        {
                            int idx = dataGridViewX4.Rows.Add();
                            dataGridViewX4.Rows[idx].Cells[0].Value = resLayer.Caption;
                            string featureName;
                            if (feat.GetFieldDefn("编号") != null)
                            {
                                featureName = feat.GetValue("编号").ToString();
                            }
                            else
                            {
                                featureName = feat.Name;
                            }
                            dataGridViewX4.Rows[idx].Cells[1].Value = featureName;
                           
                        }
                    }
                    return;
                }

                if (globeControl1.Globe.Action == EnumAction3D.SelectObject && trackflag == "ftAnalysis")
                {
                    if (globeControl1.Globe.SelObjectCount > 0)
                    {
                        dataGridViewX6.Rows.Clear();
                        //layerTemp.RemoveAllFeature();
                    }
                    for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++)
                    {
                        GSOLayer resLayer = null;
                        GSOFeature feat = null;
                        globeControl1.Globe.GetSelectObject(i, out feat, out resLayer);
                        // GSOFeature feat = globeControl1.Globe.GetSelectObject(i;
                        if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                        {
                            int idx = dataGridViewX6.Rows.Add();
                            dataGridViewX6.Rows[idx].Cells[0].Value = resLayer.Caption;
                            string featureName;
                            if (feat.GetFieldDefn("编号") != null)
                            {
                                featureName = feat.GetValue("编号").ToString();
                            }
                            else
                            {
                                featureName = feat.Name;
                            }
                            dataGridViewX6.Rows[idx].Cells[1].Value = featureName;
                        }
                    }
                    return;
                }
                GSOPoint3d point;
                GSOLayer templayer;
                GSOFeature feature1 = globeControl1.Globe.HitTest(e.X, e.Y, out templayer, out point, false, true, 0);
                if (point.X == 0 && point.Y == 0 && point.Z == 0)
                {
                    point = globeControl1.Globe.ScreenToScene(e.X, e.Y);
                }
                GSOGeoPoint3D pt = new GSOGeoPoint3D();
                pt.X = point.X;
                pt.Y = point.Y;
                pt.Z = point.Z;
                if (m_bAddPipeFitting == true)
                {
                    GSOLayer featureAddLayer = TreeNodeFeatureLayer();
                    if (featureAddLayer == null)
                    {
                        return;
                    }
                    FrmAddPipeFitting dlg = new FrmAddPipeFitting(globeControl1, pt, featureAddLayer);
                    dlg.ShowDialog();
                    m_bAddPipeFitting = false;
                }
                if (btnSpaceMeasureHeight.Checked && globeControl1.Globe.Action == EnumAction3D.SelectObject)
                {
                    double z = globeControl1.Globe.GetZ(point.X, point.Y);
                    double modelZ = 0;
                    if (feature1 != null)
                    {
                        modelZ = feature1.Geometry.GeoBottomCenterPoint.Z;
                    }
                    GSOGeoPolyline3D line = new GSOGeoPolyline3D();
                    GSOPoint3ds pts = new GSOPoint3ds();
                    GSOPoint3d pt1 = new GSOPoint3d();
                    pt1.X = point.X;
                    pt1.Y = point.Y;
                    pt1.Z = point.Z - z;
                    pts.Add(pt1);                    
                    pts.Add(point);
                    line.AddPart(pts);
                    GSOFeature feat = new GSOFeature();
                    line.AltitudeMode = EnumAltitudeMode.Absolute;
                    feat.Geometry = line;
                    GSOLabel label = new GSOLabel();
                    GSOLabelStyle style = new GSOLabelStyle();
                    style.OutlineColor = Color.Transparent;
                    style.HasTracktionLine = false;
                    style.BackBeginColor = Color.Transparent;
                    style.BackEndColor = Color.Transparent;
                    style.BackMidColor = Color.Transparent;
                    label.Style = style;
                    label.Text = "高度:" + (point.Z -z).ToString("0.00") + "米";
                    feat.Label = label;
                    layerTemp.AddFeature(feat);
                }
            }
            else if(e.Button == MouseButtons.Right)
            {
                if (btnSpaceMeasureHeight.Checked)
                {
                    btnSpaceMeasureHeight.Checked = false;
                }
            }
            globeControl1.Refresh();
        }
        public static bool RemoteFileExists(string fileUrl)
        {
            bool result = false;

            System.Net.WebResponse response = null;

            try
            {
                System.Net.WebRequest req = System.Net.WebRequest.Create(fileUrl);

                response = req.GetResponse();

                result = response == null ? false : true;
            }

            catch (Exception ex)
            {
                result = false;
            }

            finally
            {
                if (response != null)
                {
                    response.Close();
                }
            }
            return result;
        }

        string featureIDFieldName = "编号";
        private bool isFeatureContainsBianhao(GSOFeature feature)
        {
            bool isContains = true;
            if (feature.GetFieldDefn("编号") == null && feature.GetFieldDefn("标识器编号") != null)
            {
                isContains = false;
            }
            else if (feature.GetFieldDefn("标识器编号") == null)
            {
                featureIDFieldName = "标识器编号";
            }
            else if (feature.GetFieldDefn("编号") == null)
            {
                featureIDFieldName = "编号";
            }
            return isContains;
        }

        void  globeControl1_FeatureMouseClickEvent(object sender, FeatureMouseClickEventArgs e)
        {
            GSOFeature feature = e.Feature;
            
            string str1 = "";
            if (feature != null)
            {
                if (feature.GetFieldDefn("图片编码") != null) //
                {
                    str1 = GetBubbleInfo(feature);
                    if (RemoteFileExists(Utility.PicRootURL + feature.GetValue("图片编码").ToString()))
                    {
                        str1 += "<img width='440' height='350' src='" + Utility.PicRootURL + feature.GetValue("图片编码").ToString() + "' />";
                    }
                    else if (RemoteFileExists(Utility.PicDefaultURL))
                    {
                        str1 += "<img width='440' height='350' src='" + Utility.PicDefaultURL + "' />";
                    }
                }
                else if (feature.GetFieldDefn("编号") != null || ) //管线模型图层
                {
                    str1 = GetBubbleInfo(feature);
                }
               
                if (str1 != "")
                {
                    featureTooltip.HideBalloon();
                    balloonEx.HideBalloon();
                    balloonEx.SetSize(EnumSizeIndexEx.CONTENT_CX, 480);
                    balloonEx.SetSize(EnumSizeIndexEx.CONTENT_CY, 420);
                    balloonEx.ShowBalloon((int)e.MousePos.X, (int)e.MousePos.Y, str1);
                    return;
                }
            }
        }
        private string GetBubbleInfo(GSOFeature feature)
        {
            string str = "";
            str = "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"width:100%;background:#FFFFFF none repeat scroll 0 0;border-collapse:collapse;font-family:\"Lucida Sans Unicode\",\"Lucida Grande\",Sans-Serif;font-size:10px;text-align:center;\" >";
            //str += "<tr><th colspan=4 style=\"font-size:medium; text-align:center;border-bottom:1px solid #6678B1;color:#003399;font-weight:normal;padding:10px 8px;\">管线属性信息</th></tr>";

            //string pipetype = "";
           
            str += "<tr><th colspan=4 style=\"font-size:medium; text-align:center;border-bottom:1px solid #6678B1;color:#003399;font-weight:normal;padding:10px 8px;\">" +feature.GetFieldAsString("权属单位") +"   " + feature.GetFieldAsString("编号") + "</th></tr>";

            int rowCount = feature.GetFieldCount();// (feature.GetFieldCount() % 2 == 0) ? (feature.GetFieldCount() / 2) : (feature.GetFieldCount() / 2 + 1);

            for (int j = 0; j < rowCount; j++)
            {
                GSOFieldDefn field1 = (GSOFieldDefn)feature.GetFieldDefn(j);
                
                string name1 = "";
                string value1 = "";
                if (field1 != null)
                {
                    if (field1.Name == "图片编码")
                    {
                        j++;                        
                    }
                    if (j < rowCount)
                    {
                        field1 = (GSOFieldDefn)feature.GetFieldDefn(j);
                        name1 = field1.Name;
                        if (field1.Type == EnumFieldType.Text)
                        {
                            value1 = feature.GetFieldAsString(j);
                        }
                        else if (field1.Type == EnumFieldType.Date)
                        {
                            DateTime dd = Convert.ToDateTime(feature.GetFieldAsDataTime(j));
                            if (dd.Year <= 1)
                            {
                                value1 = "";
                            }
                            else
                            {
                                value1 = dd.ToShortDateString();
                            }
                        }
                        else
                        {
                            if (!feature.IsFieldValueNull(j))
                            {
                                value1 = feature.GetValue(j).ToString();
                            }
                        }
                    }
                }
                string name2 = "";
                string value2 = "";
                if (j + 1 < rowCount)
                {
                    GSOFieldDefn field2 = (GSOFieldDefn)feature.GetFieldDefn(j + 1); ;
                   
                    if (field2 != null)
                    {
                        if (field2.Name == "图片编码")
                        {
                            j++;                            
                        }
                        if (j + 1 < rowCount)
                        {
                            field2 = (GSOFieldDefn)feature.GetFieldDefn(j + 1);
                            name2 = field2.Name;
                            if (field2.Type == EnumFieldType.Text)
                            {
                                value2 = feature.GetFieldAsString(j + 1);
                            }
                            else if (field2.Type == EnumFieldType.Date)
                            {
                                DateTime dd = Convert.ToDateTime(feature.GetFieldAsDataTime(j + 1));

                                if (dd.Year <= 1)
                                {
                                    value2 = "";
                                }
                                else
                                {
                                    value2 = dd.ToShortDateString();
                                }
                            }
                            else
                            {
                                if (!feature.IsFieldValueNull(j + 1))
                                {
                                    value2 = feature.GetValue(j + 1).ToString();
                                }
                            }
                        }
                    }

                    j++;
                }
                str += "<tr><td width=100 style=\"font-size:10pt;border:1px solid #CCCCCC;color:#666699;padding:2px 2px; background-color:#E7F3FB\"><center>" +
                    name1 +
                    "</center></td><td width=100 style=\"font-size:10pt;border:1px solid #CCCCCC;color:#666699;padding:2px 2px;\"><center>" +
                    value1 +
                    "</center></td><td width=100 style=\"font-size:10pt;border:1px solid #CCCCCC;color:#666699;padding:2px 2px;background-color:#E7F3FB\"><center>" +
                    name2 +
                    "</center></td><td width=100 style=\"font-size:10pt;border:1px solid #CCCCCC;color:#666699;padding:2px 2px;\"><center>" +
                    value2 + "</center></td></tr>";
                
            }           
            str += "</table>";
            return str;
        }
        
        private void AddTerrains()
        {
            for (int i = 0; i < Utility.TerrainsName.Count; i++)
            {
                globeControl1.Globe.Terrains.Add(Utility.TerrainsName[i].ToString());
            }
        }

        private void AddLayers()
        {
            for (int i = 0; i < Utility.LayerNames.Count; i++)
            {
                GSODataset dataset1 = Utility.dataSource.GetDatasetByName(Utility.LayerNames[i].ToString());
                if (dataset1 == null)
                {
                    continue;
                }
                dataset1.Caption = Utility.LayerLabels[i].ToString();
                GSOLayer templayer = globeControl1.Globe.Layers.Add(dataset1);
                templayer.MaxVisibleAltitude = 10000;
            }          
        }

        string filename = Utility.filename;
        private void loadTreeView(TreeView tv)//构建图层树
        {
            try
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(filename);
                XmlNodeList Params1 = doc.SelectNodes("/Params/layers");               
                tv.ShowLines = false;               
                tv.CheckBoxes = true;
                #region 三级

                //foreach (XmlNode paramsNode in Params1) //layers
                //{
                //    foreach (XmlNode layerNode in paramsNode) //layer
                //    {
                //        TreeNode nodelayer = new TreeNode();
                //        string layerName = layerNode.Attributes["label"].Value;
                //        nodelayer.Text = layerName;

                //        if (layerNode.HasChildNodes != false)
                //        {
                //            tv.Nodes.Add(nodelayer);
                //            foreach (XmlNode layerchildNode in layerNode) //layerchild
                //            {
                //                if (layerchildNode.Name == "layerchild")
                //                {
                //                    TreeNode nodelayerchild = new TreeNode();
                //                    string layerType = layerchildNode.Attributes["type"].Value;
                //                    string layerchildName = layerchildNode.Attributes["label"].Value;
                //                    if (layerType == "locaserver")
                //                    {
                //                        string layerName1 = layerchildNode.Attributes["layer"].Value;
                //                        nodelayerchild.Text = layerchildName;
                //                        nodelayerchild.Tag = layerType + "|" + layerName1;
                //                        nodelayerchild.Checked = true;
                //                        nodelayer.Nodes.Add(nodelayerchild);

                //                    }
                //                    else
                //                    {
                //                        string layerName1 = layerchildNode.Attributes["layer"].Value;
                //                        if (layerchildNode.Attributes["isPipeLine"] != null)
                //                        {
                //                            pipelineLayerNames.Add(layerName1);
                //                        }
                //                        if (layerchildNode.Attributes["isWorkWell"] != null)
                //                        {
                //                            workwellLayerNames.Add(layerName1);
                //                        }
                //                        if (layerchildNode.Attributes["isValve"] != null)
                //                        {
                //                            valueLayerNames.Add(layerName1);
                //                        }
                //                        if (layerchildNode.Attributes["isInstrument"] != null)
                //                        {
                //                            instrumenLayerNames.Add(layerName1);
                //                        }
                //                        bool boollayer = AddLayers(layerName1, "");
                //                        nodelayerchild.Text = layerchildName;
                //                        nodelayerchild.Tag = layerType + "|" + layerName1;
                //                        nodelayerchild.Checked = boollayer;
                //                        nodelayer.Nodes.Add(nodelayerchild);
                //                    }
                //                }
                //                else if (layerchildNode.Name == "layertype")
                //                {
                //                    TreeNode nodelayerchild = new TreeNode();
                //                    string layerType = layerchildNode.Attributes["label"].Value;
                //                    nodelayerchild.Text = layerType;
                //                    nodelayerchild.Tag = layerType;
                //                    nodelayerchild.Checked = true;
                //                    nodelayer.Nodes.Add(nodelayerchild);
                //                    if (layerchildNode.HasChildNodes == true)
                //                    {
                //                        foreach (XmlNode childNodeLayer in layerchildNode)
                //                        {
                //                            TreeNode nodelayerchild1 = new TreeNode();
                //                            string layerName1 = childNodeLayer.Attributes["layer"].Value;
                //                            string layerchildName = childNodeLayer.Attributes["label"].Value;
                //                            string layerType1 = childNodeLayer.Attributes["type"].Value;
                //                            if (childNodeLayer.Attributes["isPipeLine"] != null)
                //                            {
                //                                pipelineLayerNames.Add(layerName1);
                //                            }
                //                            if (childNodeLayer.Attributes["isWorkWell"] != null)
                //                            {
                //                                workwellLayerNames.Add(layerName1);
                //                            }
                //                            if (childNodeLayer.Attributes["isValve"] != null)
                //                            {
                //                                valueLayerNames.Add(layerName1);
                //                            }
                //                            if (childNodeLayer.Attributes["isInstrument"] != null)
                //                            {
                //                                instrumenLayerNames.Add(layerName1);
                //                            }
                //                            bool boollayer = AddLayers(layerName1, "");
                //                            nodelayerchild1.Text = layerchildName;
                //                            nodelayerchild1.Tag = layerType1 + "|" + layerName1;
                //                            nodelayerchild1.Checked = boollayer;
                //                            nodelayerchild.Nodes.Add(nodelayerchild1);
                //                        }
                //                    }
                //                }

                //            }
                //        }
                //        else
                //        {
                //            tv.Nodes.Add(nodelayer);
                //        }
                //    }

                //}

                #endregion

                foreach (XmlNode paramsNode in Params1) //layers
                {
                    foreach (XmlNode layerNode in paramsNode) //layer
                    {
                        TreeNode nodelayer = new TreeNode();
                        string layerName = layerNode.Attributes["label"].Value;
                        nodelayer.Text = layerName;

                        if (layerNode.HasChildNodes != false)
                        {
                            tv.Nodes.Add(nodelayer);
                            foreach (XmlNode layerchildNode in layerNode) //layerchild
                            {
                                if (layerchildNode.Name == "layerchild")
                                {
                                    TreeNode nodelayerchild = new TreeNode();
                                    string layerType = layerchildNode.Attributes["type"].Value;
                                    string layerchildName = layerchildNode.Attributes["label"].Value;
                                    if (layerType == "locaserver")
                                    {
                                        string layerName1 = layerchildNode.Attributes["layer"].Value;
                                        if (layerchildNode.Attributes["isRoad"] != null)
                                        {
                                            roadLayerName = layerName1;
                                        }
                                        
                                        nodelayerchild.Text = layerchildName;
                                        nodelayerchild.Tag = layerType + "|" + layerName1;
                                        nodelayerchild.Checked = true;
                                        nodelayer.Nodes.Add(nodelayerchild);
                                    }
                                    else
                                    {
                                        string layerName1 = layerchildNode.Attributes["layer"].Value;
                                        if (layerchildNode.Attributes["isPipeLine"] != null)
                                        {
                                            pipelineLayerNames.Add(layerName1);
                                        }
                                        if (layerchildNode.Attributes["isWorkWell"] != null)
                                        {
                                            workwellLayerNames.Add(layerName1);
                                        }
                                        if (layerchildNode.Attributes["isValve"] != null)
                                        {
                                            valueLayerNames.Add(layerName1);
                                        }
                                        if (layerchildNode.Attributes["isInstrument"] != null)
                                        {
                                            instrumenLayerNames.Add(layerName1);
                                        }
                                        bool boollayer = AddLayers(layerName1, "");
                                        nodelayerchild.Text = layerchildName;
                                        nodelayerchild.Tag = layerType + "|" + layerName1;
                                        nodelayerchild.Checked = boollayer;
                                        nodelayer.Nodes.Add(nodelayerchild);
                                    }
                                }
                                else if (layerchildNode.Name == "layertype")
                                {
                                    TreeNode nodelayerchild = new TreeNode();
                                    string layerType = layerchildNode.Attributes["label"].Value;
                                    nodelayerchild.Text = layerType;
                                    nodelayerchild.Tag = layerType;
                                    nodelayerchild.Checked = true;
                                    nodelayer.Nodes.Add(nodelayerchild);
                                    if (layerchildNode.HasChildNodes == true)
                                    {                                        
                                        foreach (XmlNode childNodeLayer in layerchildNode)
                                        {
                                            if (childNodeLayer.HasChildNodes == true)
                                            {
                                                TreeNode nodelayerchild2 = new TreeNode();
                                                string layer = childNodeLayer.Attributes["label"].Value;
                                                nodelayerchild2.Text = layer;
                                                nodelayerchild2.Tag = layer;
                                                nodelayerchild2.Checked = true;
                                                nodelayerchild.Nodes.Add(nodelayerchild2);
                                                foreach (XmlNode n in childNodeLayer)
                                                {
                                                    TreeNode nodelayerchild1 = new TreeNode();
                                                    string layerName1 = n.Attributes["layer"].Value;
                                                    string layerchildName = n.Attributes["label"].Value;
                                                    string layerType1 = n.Attributes["type"].Value;
                                                    if (n.Attributes["isPipeLine"] != null)
                                                    {
                                                        pipelineLayerNames.Add(layerName1);
                                                    }
                                                    if (n.Attributes["isWorkWell"] != null)
                                                    {
                                                        workwellLayerNames.Add(layerName1);
                                                    }
                                                    if (n.Attributes["isValve"] != null)
                                                    {
                                                        valueLayerNames.Add(layerName1);
                                                    }
                                                    if (n.Attributes["isInstrument"] != null)
                                                    {
                                                        instrumenLayerNames.Add(layerName1);
                                                    }
                                                    bool boollayer = AddLayers(layerName1, "");
                                                    nodelayerchild1.Text = layerchildName;
                                                    nodelayerchild1.Tag = layerType1 + "|" + layerName1;
                                                    nodelayerchild1.Checked = boollayer;
                                                    nodelayerchild2.Nodes.Add(nodelayerchild1);
                                                }
                                            }
                                            else
                                            {
                                                TreeNode nodelayerchild1 = new TreeNode();
                                                string layerName1 = childNodeLayer.Attributes["layer"].Value;
                                                string layerchildName = childNodeLayer.Attributes["label"].Value;
                                                string layerType1 = childNodeLayer.Attributes["type"].Value;
                                                if (childNodeLayer.Attributes["isPipeLine"] != null)
                                                {
                                                    pipelineLayerNames.Add(layerName1);
                                                }
                                                if (childNodeLayer.Attributes["isWorkWell"] != null)
                                                {
                                                    workwellLayerNames.Add(layerName1);
                                                }
                                                if (childNodeLayer.Attributes["isValve"] != null)
                                                {
                                                    valueLayerNames.Add(layerName1);
                                                }
                                                if (childNodeLayer.Attributes["isInstrument"] != null)
                                                {
                                                    instrumenLayerNames.Add(layerName1);
                                                }
                                                bool boollayer = AddLayers(layerName1, "");
                                                nodelayerchild1.Text = layerchildName;
                                                nodelayerchild1.Tag = layerType1 + "|" + layerName1;
                                                nodelayerchild1.Checked = boollayer;
                                                nodelayerchild.Nodes.Add(nodelayerchild1);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            tv.Nodes.Add(nodelayer);
                        }
                    }
                }
                if (tv.Nodes.Count > 0)
                {
                    tv.Nodes[0].Expand();
                    if (tv.Nodes.Count > 0)
                    {
                        foreach (TreeNode node in tv.Nodes)
                        {
                            node.Expand();
                        }
                    }
                }
                //tv.ExpandAll();
                foreach (TreeNode tn in tv.Nodes)
                {
                    if (tn.Nodes.Count > 0)
                    {
                        foreach (TreeNode tnChild in tn.Nodes)
                        {
                            if (tnChild.Checked)
                                tn.Checked = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogError.PublishError(ex);
            }
        }
        private GSOLayer TreeNodeFeatureLayer()
        {
            TreeNode featureAddPipeFitTreenode = GetDestLayerFeatureAddTreeNode();
            GSOLayer featureAddLayer = globeControl1.Globe.Layers.GetLayerByCaption(featureAddPipeFitTreenode.Tag.ToString().Split('|')[1]);
            if (featureAddLayer != null)
                return featureAddLayer;
            else
                return null;
        }
        private TreeNode GetDestLayerFeatureAddTreeNode()
        {
            for (int i = 0; i < layerTree.Nodes.Count; i++)
            {
                TreeNode tempNode = layerTree.Nodes[i];
                for (int j = 0; j < tempNode.Nodes.Count; j++)
                {
                    TreeNode tempChildNode = tempNode.Nodes[j];
                    if (tempChildNode.Tag.ToString().Split('|').Length > 1)
                    {
                        GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(tempChildNode.Tag.ToString().Split('|')[1]);
                        if (layer == null)
                        {
                            continue;
                        }
                        if (tempChildNode.Tag != null && layer.IsDestLayerFeatureAdd())
                        {
                            return tempChildNode;
                        }
                    }
                    else
                    {
                        for (int m = 0; m < tempChildNode.Nodes.Count; m++)
                        {
                            TreeNode tempChildNode1 = tempChildNode.Nodes[m];
                            if (tempChildNode1.Tag.ToString().Split('|').Length > 1)
                            {
                                GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(tempChildNode1.Tag.ToString().Split('|')[1]);
                                if (layer == null)
                                {
                                    continue;
                                }
                                if (tempChildNode1.Tag != null && layer.IsDestLayerFeatureAdd())
                                {
                                    return tempChildNode1;
                                }
                            }
                            else
                            {
                                for (int n = 0; n < tempChildNode1.Nodes.Count; n++)
                                {
                                    TreeNode tempChildNode2 = tempChildNode1.Nodes[n];
                                    if (tempChildNode2.Tag.ToString().Split('|').Length > 1)
                                    {
                                        GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(tempChildNode2.Tag.ToString().Split('|')[1]);
                                        if (layer == null)
                                        {
                                            continue;
                                        }
                                        if (tempChildNode2.Tag != null && layer.IsDestLayerFeatureAdd())
                                        {
                                            return tempChildNode2;
                                        }
                                    }
                                    else
                                    {

                                    }

                                }

                            }
                            
                        }
                    }

                }

            }
            return null;
        }
        //添加图层
        private bool AddLayers(string layerName, string layerCaption)
        {
            try
            {
                GSODataset dataset1 = Utility.dataSource.GetDatasetByName(layerName);
                //dataset1.Caption = layerCaption;
                GSOLayer templayer = globeControl1.Globe.Layers.Add(dataset1);
                templayer.MaxVisibleAltitude = 1000;
                return templayer.Visible;
            }
            catch (Exception ex)
            {
                LogError.PublishError(ex);
                return false;
            }
        }
        private void buttonItem86_Click(object sender, EventArgs e)//三维导航
        {
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
        }

        
        private void buttonItem87_Click(object sender, EventArgs e)//地上模式
        {
            if (!buttonItem87.Checked)
            {
                buttonItem87.Checked = true;
                buttonItem88.Checked = false;
                buttonItem27.Checked = false;

                switch (globeControl1.Globe.CameraMode)
                {
                    case EnumCameraMode.UnderGround:
                        globeControl1.Globe.CameraMode = EnumCameraMode.Navigation;
                        GSOCameraState state = new GSOCameraState();
                        state.AltitudeMode = globeControl1.Globe.CameraState.AltitudeMode;
                        state.Altitude = globeControl1.Globe.CameraState.Altitude;
                        state.Distance = globeControl1.Globe.CameraState.Distance;
                        state.Heading = globeControl1.Globe.CameraState.Heading;
                        state.Latitude = globeControl1.Globe.CameraState.Latitude;
                        state.Longitude = globeControl1.Globe.CameraState.Longitude;
                        if (globeControl1.Globe.CameraState.Tilt < 95 && globeControl1.Globe.CameraState.Tilt > 85)
                        {
                            state.Tilt = 85;
                        }
                        else
                        {
                            state.Tilt = 180 - globeControl1.Globe.CameraState.Tilt;
                        }
                        globeControl1.Globe.JumpToCameraState(state);
                        break;
                    case EnumCameraMode.Walk:
                        globeControl1.Globe.CameraMode = EnumCameraMode.Navigation;
                        break;
                }

                globeControl1.Globe.Refresh();

            }
        }
        
        private void buttonItem88_Click(object sender, EventArgs e)//地下模式
        {
            if (!buttonItem88.Checked)
            {
                buttonItem88.Checked = true;
                buttonItem27.Checked = false;
                buttonItem87.Checked = false;

                switch (globeControl1.Globe.CameraMode)
                {
                    case EnumCameraMode.Navigation:
                    case EnumCameraMode.Walk:
                        globeControl1.Globe.CameraMode = EnumCameraMode.UnderGround;
                        GSOCameraState state = new GSOCameraState();
                        state.AltitudeMode = globeControl1.Globe.CameraState.AltitudeMode;
                        state.Altitude = globeControl1.Globe.CameraState.Altitude;
                        state.Distance = globeControl1.Globe.CameraState.Distance;
                        state.Heading = globeControl1.Globe.CameraState.Heading;
                        state.Latitude = globeControl1.Globe.CameraState.Latitude;
                        state.Longitude = globeControl1.Globe.CameraState.Longitude;
                        if (globeControl1.Globe.CameraState.Tilt < 95 && globeControl1.Globe.CameraState.Tilt > 85)
                        {
                            state.Tilt = 95;
                        }
                        else
                        {
                            state.Tilt = 180 - globeControl1.Globe.CameraState.Tilt;
                        }
                        globeControl1.Globe.JumpToCameraState(state);
                        break;
                }
                globeControl1.Globe.Refresh();
            }
        }

        private void buttonItem27_Click(object sender, EventArgs e)//行走模式
        {
            if (!buttonItem27.Checked)
            {
                buttonItem27.Checked = true;
                buttonItem87.Checked = false;
                buttonItem88.Checked = false;

                globeControl1.Globe.CameraMode = EnumCameraMode.Walk;
            }
        }

        private void sliderGroundTransSet1_ValueChanged(object sender, EventArgs e)//地面透明度设置
        {
            globeControl1.Globe.GroundOpaque = 100 - sliderGroundTransSet1.Value;
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(roadLayerName);//("180fd");
            if (layer != null)
            {
                layer.Opaque = 100 - sliderGroundTransSet1.Value;
            }
            if (buttonItem94.Checked)
            {
                layer = globeControl2.Globe.Layers.GetLayerByCaption(roadLayerName);//("180fd");
                if (layer != null)
                {
                    layer.Opaque = 100 - sliderGroundTransSet1.Value;
                }
                globeControl2.Globe.GroundOpaque = 100 - sliderGroundTransSet1.Value;
            }
        }

        private void btnlegendSet_Click(object sender, EventArgs e)//图例
        {
            btnlegendSet.Checked = !btnlegendSet.Checked;
            legend.Visible = !legend.Visible;
            globeControl1.Refresh();
        }

        private void buttonItem91_Click(object sender, EventArgs e) //快速定位
        {
            GSOCameraState cameraState = new GSOCameraState();            
            cameraState.Longitude = 120.610963;
            cameraState.Latitude = 31.187621;
            cameraState.Tilt = 0.0;
            cameraState.Distance = 300;
            cameraState.Heading = 0;
           // cameraState.AltitudeMode = EnumAltitudeMode.RelativeToGround;
            globeControl1.Globe.JumpToCameraState(cameraState);
               
        }

        private void buttonItem1_Click(object sender, EventArgs e)
        {
            buttonItem1.Checked = !buttonItem1.Checked;
            if (buttonItem1.Checked)
            {
                sideBarPanelItem3.Visible = true;
                layerTree.Visible = true;
                controlContainerItem3.Visible = true;
                sideBar1.Visible  = true;
                Refresh();
            }
            else
            {
                sideBarPanelItem3.Visible = false;
                layerTree.Visible = false;
                controlContainerItem3.Visible = false;
                if (sideBarPanelItem4.Visible == true)
                {
                    sideBar1.Visible = true;
                    controlContainerItem5.Visible = true;
                }
                else
                {
                    sideBar1.Visible = false;
                }
                Refresh();
            }
        }

        private void buttonItem89_Click(object sender, EventArgs e)//全屏
        {
            buttonItem89.Checked = !buttonItem89.Checked;
            FullScreen();
        }
  
        //全屏显示
        [DllImport("user32.dll", EntryPoint = "ShowWindow")]
        private static extern int ShowWindow(int hWnd, int _value);
        
        //任务栏
        [DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
        int widthOld = 0;
        int heightOld = 0;
        int xOld = 0;
        int yOld = 0;
        private void FullScreen()//全屏显示
        {
            if (!m_bFullScreen)
            {
                xOld = this.Location.X;
                yOld = this.Location.Y;
                widthOld = this.Width;
                heightOld = this.Height;

                this.SuspendLayout();//挂起

                this.ShowInTaskbar = true;
                this.FormBorderStyle = FormBorderStyle.Sizable;
                this.WindowState = FormWindowState.Maximized;
                //////任务栏
                IntPtr trayHwnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Shell_TrayWnd", null);
                if (trayHwnd != IntPtr.Zero)
                {
                    ShowWindow(trayHwnd.ToInt32(), 0);
                }
                
                this.Location = new Point(0, 0);
                int widthFull = Screen.PrimaryScreen.Bounds.Width;
                int heightFull = Screen.PrimaryScreen.Bounds.Height;
                SetFullScreen(widthFull, heightFull);
                this.ShowInTaskbar = false;
                this.FormBorderStyle = FormBorderStyle.None;
                this.WindowState = FormWindowState.Normal;
                
                ////hudButton
                btnToolNone.SetImage(Application.StartupPath + "\\Resource\\image\\Pan1.png");
                btnToolSelect.SetImage(Application.StartupPath + "\\Resource\\image\\select1.png");
                buttonItem89.Checked = true;
                this.sideBar1.Visible = false;
                expandableSplitter1.Expanded = false;
                expandableSplitter1.Visible = false;

                this.statusStrip1.Visible = false;
                this.expandableSplitter2.Expanded = false;
                this.expandableSplitter2.Visible = false;
                this.ribbonControl1.Visible = false;
                this.pictureBox1.Visible = false;

                this.ResumeLayout();//重新开始

                m_bFullScreen = true;
            }
            else
            {

                this.SuspendLayout();//挂起

                //////任务栏
                IntPtr trayHwnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Shell_TrayWnd", null);
                if (trayHwnd != IntPtr.Zero)
                {
                    ShowWindow(trayHwnd.ToInt32(), 1);
                }
                this.Location = new Point(xOld, yOld);
                SetFullScreen(widthOld, heightOld);
                this.ShowInTaskbar = true;
                this.FormBorderStyle = FormBorderStyle.Sizable;
                this.WindowState = FormWindowState.Normal;                

                ////hudButton
                btnToolNone.SetImage(Application.StartupPath + "\\Resource\\image\\Pan1.png");
                btnToolSelect.SetImage(Application.StartupPath + "\\Resource\\image\\select1.png");
                buttonItem89.Checked = false;
                expandableSplitter1.Expanded = true;
                expandableSplitter1.Visible = true;
                this.sideBar1.Visible = true;
                buttonItem1.Checked = true;
                this.ShowInTaskbar = true;
                this.expandableSplitter2.Visible = true;
                this.statusStrip1.Visible = true;
                this.ribbonControl1.Visible = true;
                this.pictureBox1.Visible = true;

                this.ResumeLayout();//重新开始
                m_bFullScreen = false;
            }
        }

        private void SetFullScreen(int width, int height)
        {
            this.Width = width;
            this.Height = height;
        }
        private void MainFrm_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.F5:
                    FullScreen();
                    break;
                case Keys.Escape:
                    // esc仅仅取消全屏
                    if (m_bFullScreen)
                    {
                        FullScreen();
                    }
                    break;
                default:
                    break;
            }
        }

        private Point getUpperLeftPoint(Point p1, Point p2) //输出地图
        {
            Rectangle rc = new Rectangle();
            
            p1 = this.globeControl1.PointToScreen(p1);
            p2 = this.globeControl1.PointToScreen(p2);
            // Normalize the rectangle.
            if (p1.X < p2.X)
            {
                rc.X = p1.X;
                rc.Width = p2.X - p1.X;
            }
            else
            {
                rc.X = p2.X;
                rc.Width = p1.X - p2.X;
            }
            if (p1.Y < p2.Y)
            {
                rc.Y = p1.Y;
                rc.Height = p2.Y - p1.Y;
            }
            else
            {
                rc.Y = p2.Y;
                rc.Height = p1.Y - p2.Y;
            }

            Point pt = new Point(rc.Left, rc.Top);
            return pt;
        }
        Image printImage;
        private void buttonItem13_Click(object sender, EventArgs e)//打印
        {
            Point pt1 = new Point(Convert.ToInt32(0), Convert.ToInt32(0));
            Point pt2 = new Point(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height));
            Point pt = getUpperLeftPoint(pt1, pt2);
            printImage = new Bitmap(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height));
            Graphics g = Graphics.FromImage(printImage);
            g.CopyFromScreen(pt, new Point(0, 0), new Size(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height)));

            PrintDialog pd = new PrintDialog();
            try
            {
                if (pd.ShowDialog() == DialogResult.OK) //如果确认,将会覆盖所有的打印参数设置
                {
                    //页面设置对话框(可以不使用,其实PrintDialog对话框已提供页面设置)
                    //PageSetupDialog psd = new PageSetupDialog();
                    //psd.Document = printDocument1;
                    //if ( psd.ShowDialog()==DialogResult.OK)
                    //{
                    //打印预览
                    PrintPreviewDialog ppd = new PrintPreviewDialog();
                    ppd.Document = printDocument1;
                    if (DialogResult.OK == ppd.ShowDialog())
                        printDocument1.Print(); //打印
                    //}
                }

            }
            catch
            {
                printDocument1.PrintController.OnEndPrint(printDocument1, new System.Drawing.Printing.PrintEventArgs());
            }
        }

        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            e.Graphics.DrawImage(printImage, 10, 10);
        }

        private void btnOutputJPG_Click(object sender, EventArgs e)//输出地图
        {
            //globeControl1.Globe.Action = EnumAction3D.TrackRect;  //绘制矩形模式
            //globeControl1.Globe.TrackRectTool.TrackMode = EnumTrackMode.ScreenTrack; //在屏幕上绘制
            Point pt1 = new Point(Convert.ToInt32(0), Convert.ToInt32(0));
            Point pt2 = new Point(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height));
            Point pt = getUpperLeftPoint(pt1, pt2);
            Image myImg = new Bitmap(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height));
            Graphics g = Graphics.FromImage(myImg);
            g.CopyFromScreen(pt, new Point(0, 0), new Size(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height)));

            SaveFileDialog dlg = new SaveFileDialog();
            dlg.Filter = "输出JPEG(*.jpg)|*.jpg|输出PNG(*.png)|*.png|输出BMP(*.bmp)|*.bmp|输出BMP(*.gif)|*.gif";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                string extension = System.IO.Path.GetExtension(dlg.FileName);//扩展名 
                switch (extension)
                {
                    case ".jpg":
                        myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                        break;
                    case ".png":
                        myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Png);
                        break;
                    case ".bmp":
                        myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
                        break;
                    case ".gif":
                        myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Gif);
                        break;
                    default:
                        break;
                }
            }
        }

        private void expandableSplitter1_ExpandedChanged(object sender, ExpandedChangeEventArgs e)
        {
            
        }

        private void buttonItem104_Click(object sender, EventArgs e)//管径查询
        {
            FrmDiameterQuery.ShowForm(globeControl1,pipelineLayerNames,dataGridViewX1,panelEx6,toolStripNumbers,toolStripFeatureLength);
            //frm.Show(this);                       
        }
        private void ToolStripText(string currentLayer, int dataCount)//综合管线条件查询显示结果
        {            
            if (dataCount != 0)
            {
                double featurelength = PipeLength(currentLayer, 0);// 统计管线的里程数

                toolStripNumbers.Text = " 管线类型:" + currentLayer + " | 共有:" + Convert.ToString(dataCount - 1) + "条记录";
                toolStripFeatureLength.Text = " 管线里程:" + featurelength.ToString("0.00") + " 米";
            }
            else
            {
                toolStripNumbers.Text = "管线类型: " + currentLayer + "| 共有:" + 0 + " 条记录 | ";
            }
        }
        public Double PipeLength(string currentQlayer, double totalLength)
        {
            if (dataGridViewX1.Rows.Count - 1 != 0)
            {
                for (int i = 0; i < dataGridViewX1.Rows.Count - 1; i++)
                {
                    string featureName = dataGridViewX1.Rows[i].Cells["编号"].Value.ToString().Trim();
                    //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[currentQlayer]));
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(currentQlayer);
                    GSOFeatures features = layer.GetFeatureByName(featureName, false);
                    for (int j = 0; j < features.Length; j++)
                    {
                        GSOFeature feat = features[j];
                        GSOGeoPolyline3D line = feat.Geometry as GSOGeoPolyline3D;
                        double lentgh = line.GetSpaceLength(true, 6378137);
                        totalLength += lentgh;
                    }
                }
            }
            return totalLength;
        }

        private void buttonItem105_Click(object sender, EventArgs e)//材质查询
        {
            FrmMaterialSel.ShowForm(globeControl1, pipelineLayerNames, dataGridViewX1,panelEx6,toolStripNumbers,toolStripFeatureLength);
            //frm.Show(this);
        }

        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 AllLightMenuItem_Click(object sender, EventArgs e)
        {
            flashflag = "all";
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (count < 12)
            {
                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 if (flashflag == "all")
                {
                    GSOFeatures feats = Utility.Table2Features(dataGridViewX1.DataSource as DataTable, currentQueryLayer, globeControl1);
                    if (feats.Length > 0)
                    {
                        if (count % 2 != 0)
                        {
                            for (int i = 0; i < feats.Length; i++)
                            {
                                GSOFeature tempfeat = feats[i];
                                tempfeat.HighLight = true;
                            }

                            globeControl1.Refresh();
                        }
                        else
                        {
                            for (int i = 0; i < feats.Length; i++)
                            {
                                GSOFeature tempfeat = feats[i];
                                tempfeat.HighLight = false;
                            }
                            globeControl1.Refresh();
                        }
                    }
                }

            }
            else
            {
                timer1.Stop();
                count = 0;
            }
        }

        private void dataGridViewX1_MouseClick(object sender, MouseEventArgs e)
        {
            if (m_feature != null && m_feature.HighLight == true)
            {
                m_feature.HighLight = false;
            }
            m_feature = null;
            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();
                    contextMenuStrip1.Show(dataGridViewX1, e.X, e.Y);
                    featureName = featureName.Trim();

                    //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[currentQueryLayer]));
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(currentQueryLayer);
                    if (layer == null)
                        return;
                    GSOFeatures features = layer.GetFeatureByName(featureName, false);
                    //GSOFeatures allfeatures = layer.GetAllFeatures();
                    for (int j = 0; j < features.Length; j++)
                    {
                        if (features[j].Name == featureName)
                        {
                            m_feature = features[j];
                            break;
                        }
                    }
                    //GSOFeatures feats = layer.GetAllFeatures();
                    //for (int j = 0; j < feats.Length; j++)
                    //{
                    //    if (feats[j].GetFieldAsString("编号") == featureName)
                    //    {
                    //        m_feature = feats[j];
                    //        break;
                    //    }
                    //}
                }
            }
        }

        private void dataGridViewX1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            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();
                    featureName = featureName.Trim();

                    //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[currentQueryLayer]));
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(currentQueryLayer);
                    //   GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption("reli"); 
                    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);
                                    LightMenu_Click(sender, e);
                                }
                                else
                                {
                                    globeControl1.Globe.FlyToFeature(m_feature, 0, 45, 3);
                                }
                            }
                        }                       
                    }
                }
            }
        }

        private void btnAddPipeLine_Click(object sender, EventArgs e)//添加管线
        {
            frmPipeSetEdit frm = new frmPipeSetEdit(globeControl1,pipelineLayerNames);            
            if (frm.ShowDialog() == DialogResult.OK)
            {
                m_AddPipeLine = true;
                m_bAddPipeFitting = false;                
                globeControl1.Globe.Action = EnumAction3D.DrawPolyline;
            }            
        }

        private void btnAddPipeFitting_Click(object sender, EventArgs e)//添加管件
        {
            //List<string> workwellLayerNames = new List<string>();//工井图层名称
            //List<string> valueLayerNames = new List<string>();//阀门图层名称
            //List<string> instrumenLayerNames = new List<string>();//附属物图层名称


            List<string> list = new List<string>();
            list.AddRange(workwellLayerNames);
            list.AddRange(valueLayerNames);
            list.AddRange(instrumenLayerNames);
            FrmSetGoalLayer frm = new FrmSetGoalLayer(globeControl1,list);           
            if (frm.ShowDialog() == DialogResult.OK)
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                m_bAddPipeFitting = true;
            }           
        }

        private void btnSelObj_Click(object sender, EventArgs e)//选中对象
        {
            globeControl1.Globe.Action = EnumAction3D.SelectObject;
        }

        private void btnMoveObj_Click(object sender, EventArgs e)//平移对象
        {
            globeControl1.Globe.Action = EnumAction3D.MoveObject;
        }

        private void btnElevateObj_Click(object sender, EventArgs e)//升降对象
        {
            globeControl1.Globe.Action = EnumAction3D.ElevateObject;
        }

        private void btnRotateModel_Click(object sender, EventArgs e)//旋转对象
        {
            globeControl1.Globe.Action = EnumAction3D.RotateObject;
        }

        private void btnAddLine_Click(object sender, EventArgs e)//绘制线
        {
            globeControl1.Globe.DestLayerFeatureAdd = globeControl1.Globe.MemoryLayer;
            globeControl1.Globe.Action = EnumAction3D.DrawPolyline;
        }

        private void btnAddPolygon_Click(object sender, EventArgs e)//绘制面
        {
            globeControl1.Globe.DestLayerFeatureAdd = globeControl1.Globe.MemoryLayer;
            globeControl1.Globe.Action = EnumAction3D.DrawPolygon;
        }

        private void FeatureAddLayerMenuItem_Click(object sender, EventArgs e)
        {
            if (!FeatureAddLayerMenuItem.Checked)
            {
                TreeNode node = layerNodeContexMenu.Tag as TreeNode;
                FeatureAddLayerMenuItem.Checked = true;
                GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(node.Tag.ToString().Split('|')[1]);
                //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)node.Tag);
                globeControl1.Globe.DestLayerFeatureAdd = layer;
            }
        }

        private void LayerSelectableMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode node = layerNodeContexMenu.Tag as TreeNode;
            Int32 nIndex = node.Index;
            GSOLayer layer = globeControl1.Globe.Layers[nIndex];
            LayerSelectableMenuItem.Checked = !LayerSelectableMenuItem.Checked;
            layer.Selectable = LayerSelectableMenuItem.Checked;
        }

        private void LayerEditableMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode node = layerNodeContexMenu.Tag as TreeNode;
            //GSOLayer layer = node.Tag as GSOLayer;
            //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)node.Tag);
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(node.Tag.ToString().Split('|')[1]);
            LayerEditableMenuItem.Checked = !LayerEditableMenuItem.Checked;
            layer.Editable = LayerEditableMenuItem.Checked;
        }

        private void SaveLayerMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode node = layerNodeContexMenu.Tag as TreeNode;

            Int32 nIndex = node.Index;
            string layerCaption = node.Tag.ToString().Split('|')[1];
            //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)node.Tag);
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layerCaption);
            //globeControl1.Globe.Layers[nIndex].Save();
            layer.Dataset.Save();
        }

        private void buttonItem8_Click(object sender, EventArgs e)
        {
           
        }
       
        Dictionary<string, double> pipeLineDis = new Dictionary<string, double>();
        Dictionary<string, int> workWellLen = new Dictionary<string, int>();
        private void buttonItem2_Click(object sender, EventArgs e) //全区域管线距离统计
        {
            pipeLineDis.Clear();
            List<GSOFeatures> list = new List<GSOFeatures>();
            for (int i = 0; i < pipelineLayerNames.Count; i++)
            {
                GSOFeatures fs = PolygonIntersectAnalysis(null, pipelineLayerNames[i]);
                list.Add(fs);
            }

            FrmAllPipelineStatis frm = new FrmAllPipelineStatis(0,pipeLineDis, list, dataGridViewX1, toolStripNumbers, toolStripFeatureLength, globeControl1, panelEx6);
            frm.Show(this);
            
        }
        private GSOFeatures PolygonIntersectAnalysis(GSOGeoPolygon3D polygon, string pipelinetype)//全区域管线统计
        {
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(pipelinetype);
            if (layer == null)
                return null;

            GSOFeatureLayer flayer = layer as GSOFeatureLayer;
            GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
            GSOFeatures feats = new GSOFeatures();
            if (polygon == null)
                feats = flayer.GetAllFeatures();
            else
                feats = flayer.FindFeaturesInPolygon(polygon, false);
            
            double totallength = 0.01;
            for (int i = 0; i < feats.Length; i++)
            {
                GSOFeature feat = feats[i];
                GSOGeoPolyline3D line = feat.Geometry as GSOGeoPolyline3D;
                double length = line.GetSpaceLength(true, 6378137);
                totallength += length;
                if (polygon != null)
                    feat.HighLight = true;
            }
            double toLength = Convert.ToDouble(totallength.ToString().Substring(0, totallength.ToString().IndexOf(".")));
            pipeLineDis.Add(pipelinetype, toLength);
            return feats;

            //MessageBox.Show("该范围内共有:" + feats.Length.ToString() + " 条管线\n" + "管线总里程为:" + totallength.ToString("0.00") + " 米。", pipelinetype + "统计");
        }

        private void buttonItem5_Click(object sender, EventArgs e)//绘制区域管线距离统计
        {
            trackflag = "pipelinespatialquery";
            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
        }

        private void buttonItem47_Click(object sender, EventArgs e)
        {
            globeControl1.Globe.ClearAnalysis();
            dataGridViewX1.DataSource = null;
            panelEx6.Visible = false;
            //layerTemp.RemoveAllFeature();
            for (int i = 0; i < globeControl1.Globe.Layers.Count; i++)
            {
                GSOLayer layer = globeControl1.Globe.Layers[i];
                if (layer is GSOFeatureLayer)
                {
                    GSOFeatures feats = layer.GetAllFeatures();
                    for (int j = 0; j < feats.Length; j++)
                    {
                        GSOFeature feat = feats[j];
                        feat.HighLight = false;
                    }
                }
            }
            //ClearConnexityAnalysis();//清除连通性分析
            //ClearCloseValvesAnalysis();//清除阀门分析

            ////清除管线间距分析
            //if (disFeature.ID != 0)
            //{
            //    globeControl1.Globe.MemoryLayer.RemoveFeatureByID(disFeature.ID);
            //}
            //if (featureDis.ID != 0)
            //{
            //    globeControl1.Globe.MemoryLayer.RemoveFeatureByID(featureDis.ID);
            //}
        }

        private void buttonItem6_Click(object sender, EventArgs e)//全区域阀门数量统计
        {
            workWellLen.Clear();
            List<GSOFeatures> list = new List<GSOFeatures>();
            for (int i = 0; i <  valueLayerNames.Count; i++)
            {
                GSOFeatures fs = PolygonIntersectAnalysis_Well(null, valueLayerNames[i]);
                list.Add(fs);
            }
            FrmLayerSelectedQuery frm = new FrmLayerSelectedQuery(workWellLen, list, dataGridViewX1, toolStripNumbers, globeControl1,panelEx6);
            frm.Show(this);



            //GSOFeatures feats_reli = Polygon_Contain_PointAnalysis(null, "燃气球阀V4");//已将返回的length类型修改为返回的features,数据库中不存在热力阀门表,以后会添加热力阀门表来替换dx_relifamen表
            //FrmLayerSelectedQuery frm = new FrmLayerSelectedQuery("燃气球阀V4", feats_reli, dataGridViewX1, toolStripNumbers,globeControl1);
            //frm.Show(this);
            //toolStripFeatureLength.Text = "";
            //this.panelEx6.Visible = true;
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
        }
        private void buttonItem7_Click(object sender, EventArgs e)//绘制区域阀门数量统计
        {
            trackflag = "valvequery";
            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
        }
        private GSOFeatures Polygon_Contain_PointAnalysis(GSOGeoPolygon3D polygon, string layername)//方法修改,返回类型由int类型修改为GSOFeatures
        {
            GSOFeatures feats = new GSOFeatures();
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layername);
            if (layer == null)
            {
                return feats;
            }
            GSOFeatureLayer flayer = layer as GSOFeatureLayer;
            if (flayer != null)
            {
                GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
            }

            if (polygon == null)
            {
                feats = flayer.GetAllFeatures();
            }
            else
            {
                feats = flayer.FindFeaturesInPolygon(polygon, false);
            }
            return feats;
        }

        private void toolStripDropDownButton3_Click(object sender, EventArgs e)
        {          
            if (dataGridViewX1.Rows.Count > 0)
            {
                int startIdx = toolStripNumbers.Text.IndexOf(":");
                int endIdx = toolStripNumbers.Text.IndexOf("|");
                if (endIdx == -1)
                {
                    endIdx = toolStripNumbers.Text.Trim().Length;
                }
                string stype = toolStripNumbers.Text.Substring(startIdx + 1, endIdx - startIdx - 1);
                SaveFileDialog dlg = new SaveFileDialog();
                dlg.Filter = "Excel files (*.xls)|*.xls";
                dlg.FilterIndex = 0;
                dlg.RestoreDirectory = true;
                //dlg.CreatePrompt = true;
                dlg.Title = "保存为Excel文件";
                dlg.FileName = stype + "-" + 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("内容:" + stype + "  日期:" + 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();
                    }
                }
            }
        }

        private void btnItem_HDMAnalysis_Click(object sender, EventArgs e)//横断面分析
        {
            if (!btnItem_HDMAnalysis.Checked)
            {
                trackflag = "PolylineAnalysis";
                globeControl1.Globe.Action = EnumAction3D.TrackPolyline;
                //globeControl1.Globe.TrackPolylineAnalysis.VerticalLineVisible = true;
                globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true;
                btnItem_HDMAnalysis.Checked = true;

            }
            else
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                btnItem_HDMAnalysis.Checked = false;
                //globeControl1.Globe.TrackPolylineAnalysis.VerticalLineVisible = false;
                globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = false;
            }
            ActionToolMenuChecked();
        }
        private void ActionToolMenuChecked()
        {
            if (globeControl1.Globe.Action != EnumAction3D.TrackPolyline)
            {
                btnItem_HDMAnalysis.Checked = false;
                BaselineProfileAnalysisMenuItem.Checked = false;
                buttonItem9.Checked = false;
                buttonItem28.Checked = false;
            }
            if (globeControl1.Globe.Action != EnumAction3D.NormalHit)
            {
                btnLTAnalysis.Checked = false;
                ClearConnexityAnalysis();

                btnGFFX.Checked = false;
                ClearCloseValvesAnalysis();
            }
            if (globeControl1.Globe.Action != EnumAction3D.TrackPolygon)
            {
                DigFillAnalysisMenuItem.Checked = false;
                btnPolygonDigPit.Checked = false;
            }
        }
        private void ConnexityAnalysis()
        {
            GSODataset curCAYDataset = m_ConnexityAnalysisFirstLayer.Dataset;
            string srName = curCAYDataset.Name;
            GSONetworkDataset curCAYNDataset = curCAYDataset.DataSource.GetDatasetByName(srName + "Network") as GSONetworkDataset;
            if (curCAYNDataset == null)
            {
                MessageBox.Show("该图层没有创建网络拓扑,请先创建网络拓扑信息再进行分析!", "提示");
                return;
            }

            int[] arryResID;
            curCAYNDataset.ConnexityAnalysis(m_ConnexityAnalysisFirstFeature.ID, m_ConnexityAnaylsisSecondFeature.ID, out arryResID, false, true);
            m_ConnexityAnalyResFeatures = m_ConnexityAnalysisFirstLayer.GetFeaturesByIDs(arryResID);
            if (m_ConnexityAnalyResFeatures == null || m_ConnexityAnalyResFeatures.Length < 1)
            {
                String strLine1 = "管线:" + m_ConnexityAnalysisFirstFeature.ID;
                String strLine2 = "管线:" + m_ConnexityAnaylsisSecondFeature.ID;
                MessageBox.Show(strLine1 + " 与 " + strLine2 + " 不连通", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }
            else
            {
                int nCount = m_ConnexityAnalyResFeatures.Length;
                for (int i = 0; i < nCount; i++)
                {
                    m_ConnexityAnalyResFeatures[i].HighLight = true;
                    GSOGeoPolyline3D geoline = m_ConnexityAnalyResFeatures[i].Geometry as GSOGeoPolyline3D;
                    if (geoline != null)
                    {
                        GSOLineStyle3D lineStyle = geoline.Style as GSOLineStyle3D;
                        if (lineStyle != null)
                        {
                            if (lineStyle.ArrowStyle == null)
                            {
                                lineStyle.ArrowStyle = new GSOArrowStyle();

                            }
                            lineStyle.ArrowStyle.BodyLen = 8;
                            lineStyle.ArrowVisible = true;
                            lineStyle.ArrowStyle.Play();
                        }
                    }
                }
                globeControl1.Refresh();
            }
        }
        private void ClearConnexityAnalysis()//清除连通性分析结果
        {
            if (m_ConnexityAnalysisFirstFeature != null)
            {
                m_ConnexityAnalysisFirstFeature.HighLight = false;
                m_ConnexityAnalysisFirstFeature.Label = null;
            }
            if (m_ConnexityAnaylsisSecondFeature != null)
            {
                m_ConnexityAnaylsisSecondFeature.HighLight = false;
                m_ConnexityAnaylsisSecondFeature.Label = null;
            }

            m_ConnexityAnalysisFirstFeature = null;
            m_ConnexityAnaylsisSecondFeature = null;
            m_ConnexityAnalysisFirstLayer = null;
            m_COnnexityAnalysisSecondLayer = null;

            if (m_ConnexityAnalyResFeatures != null)
            {
                int nCount = m_ConnexityAnalyResFeatures.Length;

                for (int i = 0; i < nCount; i++)
                {
                    m_ConnexityAnalyResFeatures[i].HighLight = false;
                    GSOGeoPolyline3D geoline = m_ConnexityAnalyResFeatures[i].Geometry as GSOGeoPolyline3D;
                    if (geoline != null)
                    {
                        GSOLineStyle3D lineStyle = geoline.Style as GSOLineStyle3D;
                        if (lineStyle != null)
                        {
                            lineStyle.ArrowVisible = false;
                        }
                    }
                }
                m_ConnexityAnalyResFeatures = null;

            }
        }
        private void ClearCloseValvesAnalysis()//清楚阀门分析结果
        {
            if (m_CloseValvesAnalyResFeatures != null)
            {
                for (int i = 0; i < m_CloseValvesList.Count; i++)
                {
                    GSOFeature feature = m_CloseValvesList[i] as GSOFeature;
                    feature.Label.Text = "";
                }
                globeControl1.Refresh();
                m_CloseValvesAnalyResFeatures = null;
                m_CloseValvesList = new ArrayList();
            }
        }
        private void ClearBoosterValvesAnalysis()//清楚阀门分析结果
        {
            if (m_BoosterValvesAnalyResFeatures != null)
            {
                for (int i = 0; i < m_BoosterValvesList.Count; i++)
                {
                    GSOFeature feature = m_BoosterValvesList[i] as GSOFeature;
                    feature.Label.Text = "";
                }
                globeControl1.Refresh();
                m_BoosterValvesAnalyResFeatures = null;
                m_BoosterValvesList = new ArrayList();
            }
        }

        private void buttonItem9_Click(object sender, EventArgs e)//道路断面分析
        {
            if (!buttonItem9.Checked)
            {
                trackflag = "RoadPolylineAnalysis";
                globeControl1.Globe.Action = EnumAction3D.TrackPolyline;
                globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true;
                buttonItem9.Checked = true;
            }
            else
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                buttonItem9.Checked = false;
                globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = false;
            }
            ActionToolMenuChecked();
        }

        private void btnMeasureDist_Click(object sender, EventArgs e)//水平距离量算
        {
            globeControl1.Globe.Action = EnumAction3D.MeasureDistance;
            globeControl1.Globe.DistanceRuler.SpaceMeasure = true;
            btnSpaceMeasureHeight.Checked = false;
        }

        private void btnMeasureHeight_Click(object sender, EventArgs e)//垂直距离
        {

            btnSpaceMeasureHeight.Checked = false; 
            globeControl1.Globe.Action = EnumAction3D.MeasureHeight;
            globeControl1.Globe.DistanceRuler.SpaceMeasure = false;
        }

        private void btnMeasureArea_Click(object sender, EventArgs e)//地表面积量算
        {
            btnSpaceMeasureHeight.Checked = false; 
            globeControl1.Globe.Action = EnumAction3D.MeasureArea;
            globeControl1.Globe.AreaRuler.SpaceMeasure = false;
        }

        private void btnSpaceMeasureDistance_Click(object sender, EventArgs e)//空间距离量算
        {
            btnSpaceMeasureHeight.Checked = false; 
            globeControl1.Globe.Action = EnumAction3D.MeasureDistance;
            globeControl1.Globe.DistanceRuler.SpaceMeasure = true;
        }

        private void btnSpaceMeasureHeight_Click(object sender, EventArgs e)//高度量算
        {
            //globeControl1.Globe.Action = EnumAction3D.MeasureHeight;
            //globeControl1.Globe.HeightRuler.SpaceMeasure = true;
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            btnSpaceMeasureHeight.Checked = !btnSpaceMeasureHeight.Checked;
            if (btnSpaceMeasureHeight.Checked)
            {
                globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
        }

        private void btnClearMeasure_Click(object sender, EventArgs e)
        {
            globeControl1.Globe.ClearMeasure();
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            layerTemp.RemoveAllFeature();
            btnSpaceMeasureHeight.Checked = false;
        }

        private void btnSpaceVisibilityAnalysis_Click(object sender, EventArgs e)//通视分析
        {
            if (globeControl1.Globe.Action != EnumAction3D.VisibilityAnalysis)
            {
                //btnSpaceVisibilityAnalysis.Checked = true;
                globeControl1.Globe.Action = EnumAction3D.VisibilityAnalysis;
            }
            else
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
               // SetButtonChecked();
            }
        }

        private void btnProject_Click(object sender, EventArgs e)//坐标投影
        {
            Cyberpipe.Forms.FrmProject frm = new Cyberpipe.Forms.FrmProject();
            frm.ShowDialog();
        }

        private void MainFrm_FormClosing(object sender, FormClosingEventArgs e)
        {
            globeControl1.Globe.MemoryLayer.SaveAs(Path.GetDirectoryName(Application.ExecutablePath) + "/MyPlace.kml");
            //保存标注
            //string[] markerStrs = new string[9];
            //markerStrs[0] = "标高标注";
            //markerStrs[1] = "管径标注";
            //markerStrs[2] = "埋深标注";
            //markerStrs[3] = "坐标标注";
            //markerStrs[4] = "坡度标注";
            //markerStrs[5] = "属性标注";
            //markerStrs[6] = "自定义标注";
            //markerStrs[7] = "距离标注";
            //markerStrs[8] = "红线工具";
            //for (int i = 0; i < markerStrs.Length; i++)
            //{
            //    GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(markerStrs[i]);
            //    if (l != null)
            //    {
            //        l.Save();
            //    }
            //}

            //保存传感器
            //if (Utility.sensorMarkerLayers != null)
            //{
            //    for (int i = 0; i < Utility.sensorMarkerLayers.Count; i++)
            //    {
            //        MarkerLayer mLayer = Utility.sensorMarkerLayers[i];
            //        GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(mLayer.layerName);
            //        if (l != null)
            //        {
            //            l.Save();
            //        }
            //    }
            //}      
        }

        private void buttonItem11_Click(object sender, EventArgs e)//创建拓扑
        {
            //FrmPipeSet frm = new FrmPipeSet(globeControl1, pipelineLayerNames,valueLayerNames);
            FrmGenAndFaMenTopu frm = new FrmGenAndFaMenTopu(globeControl1, pipelineLayerNames, valueLayerNames);
            frm.Show(this);
        }

        private void TraceUpMenuIte_Click(object sender, EventArgs e)//上游追踪
        {
            ClearUpDownTraceAnalysis();
            NetworkTraceUpDown(true);
        }
        private void ClearUpDownTraceAnalysis()//清除追踪结果
        {
            if (m_TraceUpDownAnalyResFeatures != null)
            {
                int nCount = m_TraceUpDownAnalyResFeatures.Length;
                for (int i = 0; i < nCount; i++)
                {
                    m_TraceUpDownAnalyResFeatures[i].HighLight = false;
                    GSOGeoPolyline3D geoline = m_TraceUpDownAnalyResFeatures[i].Geometry as GSOGeoPolyline3D;
                    if (geoline != null)
                    {
                        GSOLineStyle3D lineStyle = geoline.Style as GSOLineStyle3D;
                        if (lineStyle != null)
                        {
                            lineStyle.ArrowVisible = false;
                        }
                    }
                }
                m_TraceUpDownAnalyResFeatures = null;
            }
        }
        private void ClearAffectedPipeLine()
        {
            if (m_AffectedPipeLines != null)
            {
                int nCount = m_AffectedPipeLines.Length;
                for (int i = 0; i < nCount; i++)
                {
                    m_AffectedPipeLines[i].HighLight = false;                  
                }
                m_AffectedPipeLines = null;
            }
        }
        private void NetworkTraceUpDown(Boolean bTraceUp)//上下游追踪
        {
            if (globeControl1.Globe.SelectedObject == null)
            {
                MessageBox.Show("请点击“编辑”—“选中对象”选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            GSOFeature selLineFeature = globeControl1.Globe.SelectedObject;
            if (selLineFeature.Geometry == null || selLineFeature.Geometry.Type != EnumGeometryType.GeoPolyline3D)
            {
                MessageBox.Show("请点击“编辑”—“选中对象”选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            if (globeControl1.Globe.SelectedObjectLayer == null)
            {
                MessageBox.Show("选中管线所在图层为空!", "提示");
                return;
            }

            GSODataset curCAYDataset = globeControl1.Globe.SelectedObjectLayer.Dataset;
            if (curCAYDataset == null || curCAYDataset.DataSource == null)
            {
                MessageBox.Show("选中管线所在图层不是数据库图层!","提示");
                return;
            }

            string srName = curCAYDataset.Name;
            GSONetworkDataset curCAYNDataset = curCAYDataset.DataSource.GetDatasetByName(srName + "Network") as GSONetworkDataset;

            if (curCAYNDataset == null)
            {
                MessageBox.Show("选中管线所在图层没有创建拓扑!","提示");
                return;
            }

            int[] arryResID;
            curCAYNDataset.TraceUpDownAnalysis(selLineFeature.ID, out arryResID, bTraceUp, false, true);
            m_TraceUpDownAnalyResFeatures = globeControl1.Globe.SelectedObjectLayer.GetFeaturesByIDs(arryResID);
            if (m_TraceUpDownAnalyResFeatures == null || m_TraceUpDownAnalyResFeatures.Length < 1)
            {
                String strLine1 = "没有上游!";
                if (!bTraceUp)
                {
                    strLine1 = "没有下游!";

                }
                MessageBox.Show(strLine1);
            }
            else
            {
                int nCount = m_TraceUpDownAnalyResFeatures.Length;
                for (int i = 0; i < nCount; i++)
                {
                    m_TraceUpDownAnalyResFeatures[i].HighLight = true;
                    GSOGeoPolyline3D geoline = m_TraceUpDownAnalyResFeatures[i].Geometry as GSOGeoPolyline3D;
                    if (geoline != null)
                    {
                        GSOLineStyle3D lineStyle = geoline.Style as GSOLineStyle3D;
                        if (lineStyle != null)
                        {
                            if (lineStyle.ArrowStyle == null)
                            {
                                lineStyle.ArrowStyle = new GSOArrowStyle();
                                lineStyle.ArrowStyle.BodyWidth = 2;
                                lineStyle.ArrowStyle.BodyLen = 6;
                                lineStyle.ArrowStyle.HeadWidth = 8;
                                lineStyle.ArrowStyle.HeadLen = 10;
                                lineStyle.ArrowStyle.OutlineVisible = true;
                                lineStyle.ArrowStyle.OutlineColor = Color.Red;
                                lineStyle.ArrowStyle.Speed = lineStyle.ArrowStyle.Speed / 2;
                            }
                            lineStyle.ArrowVisible = true;
                            lineStyle.ArrowStyle.Play();
                        }
                    }
                }
                globeControl1.Refresh();
            }

        }
        private void AffectedPipeLine(Boolean bTraceUp)//上下游追踪
        {
            if (globeControl1.Globe.SelectedObject == null)
            {
                MessageBox.Show("请点击“编辑”—“选中对象”选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            GSOFeature selLineFeature = globeControl1.Globe.SelectedObject;
            if (selLineFeature.Geometry == null || selLineFeature.Geometry.Type != EnumGeometryType.GeoPolyline3D)
            {
                MessageBox.Show("请点击“编辑”—“选中对象”选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                return;
            }

            if (globeControl1.Globe.SelectedObjectLayer == null)
            {
                return;
            }

            GSODataset curCAYDataset = globeControl1.Globe.SelectedObjectLayer.Dataset;
            if (curCAYDataset == null || curCAYDataset.DataSource == null)
            {
                return;
            }

            string srName = curCAYDataset.Name;
            GSONetworkDataset curCAYNDataset = curCAYDataset.DataSource.GetDatasetByName(srName + "Network") as GSONetworkDataset;

            if (curCAYNDataset == null)
            {
                return;
            }
            int[] arryResID;
            curCAYNDataset.TraceUpDownAnalysis(selLineFeature.ID, out arryResID, bTraceUp, false, true);
            m_AffectedPipeLines = globeControl1.Globe.SelectedObjectLayer.GetFeaturesByIDs(arryResID);
            if (m_AffectedPipeLines == null || m_AffectedPipeLines.Length < 1)
            {
            }
            else
            {
                int nCount = m_AffectedPipeLines.Length;
                for (int i = 0; i < nCount; i++)
                {
                    m_AffectedPipeLines[i].HighLight = true;
                }
                globeControl1.Refresh();
            }

        } 
        private void TraceDownMenuItem_Click(object sender, EventArgs e)//下游追踪
        {
            ClearUpDownTraceAnalysis();
            NetworkTraceUpDown(false);
        }

        private void buttonItem58_Click(object sender, EventArgs e)
        {
            ClearUpDownTraceAnalysis();
        }

        private void buttonItem12_Click(object sender, EventArgs e)//显示全球
        {
            //103.0458, 37.8900, 0, 0, 0, 13726042.91, EnumAltitudeMode.Absolute
            GSOCameraState camerastate = new GSOCameraState();
            camerastate.Longitude = 103.0458;
            camerastate.Latitude = 37.8900;
            camerastate.Distance = 13726042.91;
            camerastate.Heading = -14.7191750305935;
            camerastate.Tilt = -0.121060930867518;
            camerastate.Altitude = -454.784417188726;
            camerastate.AltitudeMode = EnumAltitudeMode.Absolute;
            globeControl1.Globe.JumpToCameraState(camerastate);
        }

        private void btnDelPipeLine_Click(object sender, EventArgs e)//删除模型
        {
            if (globeControl1.Globe.SelObjectCount > 0)
            {
                for(int i = 0;i<globeControl1.Globe.SelObjectCount;i++)// for (int i = globeControl1.Globe.SelObjectCount - 1; i >= 0 ; i--)
                {
                    GSOFeature f = null;
                    GSOLayer layer = null;
                    globeControl1.Globe.GetSelectObject(i,out f,out layer);                    
                    if (f != null)
                    {
                        f.Delete();                  
                        if (layer != null)
                        {
                            globeControl1.Globe.AddToEditHistroy(layer, f, EnumEditType.Delete);
                        }
                        globeControl1.Refresh();
                    }                    
                }
            }
            else
            {
                MessageBox.Show("请选中要删除的模型!", "提示");
            }
        }

        private void buttonItem14_Click(object sender, EventArgs e)//流向分析
        {            
            FrmFlow frm = new FrmFlow(globeControl1,pipelineLayerNames);
            frm.Show(this);
            
        }
        private void Flow(object sender, string pipelineNameCN,bool bShow)//流向
        {
           
            GSOFeatureLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(pipelineNameCN) as GSOFeatureLayer;
            GSOFeatures feats = layer.GetAllFeatures();
            for (int i = 0; i < feats.Length; i++)
            {
                GSOFeature feat = feats[i];
                GSOLineStyle3D lineStyle = feat.Geometry.Style as GSOLineStyle3D;
                if (lineStyle != null)
                {
                    if (lineStyle.ArrowStyle == null)
                    {
                        lineStyle.ArrowStyle = new GSOArrowStyle();
                        lineStyle.ArrowStyle.BodyWidth = 2;
                        lineStyle.ArrowStyle.BodyLen = 6;
                        lineStyle.ArrowStyle.HeadWidth = 8;
                        lineStyle.ArrowStyle.HeadLen = 10;
                        lineStyle.ArrowStyle.OutlineVisible = true;
                        lineStyle.ArrowStyle.OutlineColor = Color.Red;
                        lineStyle.ArrowStyle.Speed = lineStyle.ArrowStyle.Speed / 2;
                        lineStyle.ArrowStyle.Play();
                    }
                    //lineStyle.ArrowVisible = !lineStyle.ArrowVisible;             
                    lineStyle.ArrowVisible = bShow;
                    layerTree.SelectedNode = null;
                }
            }
            globeControl1.Globe.Refresh();
        }

        private void buttonItem16_Click(object sender, EventArgs e)
        {
            try
            {
                TreeNode node = layerTree.SelectedNode;
                if (node == null)
                {
                    MessageBox.Show("请在左侧列表中选择管线类型!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }
                if (node.Tag != null)
                {
                    if (node.Tag.ToString().Contains("|"))
                    {
                        if (node.Tag.ToString().Split('|')[1] == "污水管线" || node.Tag.ToString().Split('|')[1] == "燃气管线v3" || node.Tag.ToString().Split('|')[1] == "雨水管线v1")
                        {
                            Flow(sender, node.Tag.ToString().Split('|')[1],false);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogError.PublishError(ex);
            }
        }

        private void btnLTAnalysis_Click(object sender, EventArgs e)//连通性分析
        {
            if (globeControl1.Globe.SelObjectCount < 2)
            {
                MessageBox.Show("请选中至少两个管线!!");
                btnLTAnalysis.Checked = false;
                return;
            }
            ClearConnexityAnalysis();
            globeControl1.Globe.GetSelectObject(0, out m_ConnexityAnalysisFirstFeature, out m_ConnexityAnalysisFirstLayer);
            globeControl1.Globe.GetSelectObject(1, out m_ConnexityAnaylsisSecondFeature, out m_COnnexityAnalysisSecondLayer);
            GSOGeoPolyline3D line1 = m_ConnexityAnalysisFirstFeature.Geometry as GSOGeoPolyline3D;
            GSOGeoPolyline3D line2 = m_ConnexityAnaylsisSecondFeature.Geometry as GSOGeoPolyline3D;
            if (line1 == null || line2 == null)
            {
                MessageBox.Show("请选择管线!!");
                btnLTAnalysis.Checked = false;
                return;
            }
            GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D;
            GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D;
            if (pipeStyle1 == null || pipeStyle2 == null)
            {
                MessageBox.Show("请选择管线!!");
                btnLTAnalysis.Checked = false;
                return;
            }
            if (!m_ConnexityAnalysisFirstLayer.IsSameInnerObject(m_COnnexityAnalysisSecondLayer))
            {
                MessageBox.Show("不在同一个图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                btnLTAnalysis.Checked = false;
                ClearConnexityAnalysis();
            }
            else
            {
                ConnexityAnalysis();
            }
        }

        private void btnGFFX_Click(object sender, EventArgs e)//关阀分析
        {
            ClearCloseValvesAnalysis();
            if (globeControl1.Globe.SelObjectCount < 1)
            {
                MessageBox.Show("请选中至少一根管线!!");
                btnGFFX.Checked = false;
                return;
            }
            GSOLayer resLayer = null;
            GSOFeature resFeature = null;
            globeControl1.Globe.GetSelectObject(0, out resFeature, out resLayer);

            GSOGeoPolyline3D line1 = resFeature.Geometry as GSOGeoPolyline3D;
            if (line1 == null)
            {
                MessageBox.Show("请选择管线!!");
                return;
            }
            GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D;
            if (pipeStyle1 == null)
            {
                MessageBox.Show("请选择管线!!");
                return;
            }
            GSOPoint3d resIntersetPoint = new GSOPoint3d();
            if (NetworkCloseValvesAnalysis(resFeature, resIntersetPoint, resLayer))
            {
                //btnGFFX.Checked = false;
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                btnGFFX.Checked = false;
            }

        }
        FrmCloseValves frm;
        private bool NetworkCloseValvesAnalysis(GSOFeature lineFeature, GSOPoint3d pntBreak, GSOLayer lineLayer)//阀门分析
        {
            if (lineLayer == null || lineFeature == null || lineFeature.Geometry == null || lineFeature.Geometry.Type != EnumGeometryType.GeoPolyline3D)
            {
                return false;
            }
            GSODataset curCAYDataset = lineLayer.Dataset;
            
            if (curCAYDataset == null || curCAYDataset.DataSource == null)
            {
                MessageBox.Show("该图层不是要素图层!", "提示");
                return false;
            }
            string srName = curCAYDataset.Name;
            GSONetworkDataset curCAYNDataset = curCAYDataset.DataSource.GetDatasetByName(srName + "Network") as GSONetworkDataset;

            if (curCAYNDataset == null)
            {
                MessageBox.Show("该图层没有创建网络拓扑,请先创建网络拓扑信息再进行分析!", "提示");
                return false;
            }
            ClearCloseValvesAnalysis();

            int[] arryResNodeID;
            int[] arryResValveID;
            curCAYNDataset.CloseValveAnalysis(lineFeature.ID, out arryResNodeID, out arryResValveID, false, true);
            //m_CloseValvesAnalyResFeatures = curCAYNDataset.NodeDataset.GetFeaturesByIDs(arryResNodeID);
            string valveName = lineLayer.Caption;
            valveName = valveName.Substring(0, valveName.IndexOf("管线"));
            GSOLayer valveLayer = globeControl1.Globe.Layers.GetLayerByCaption(valveName + "阀门井");
            if (valveLayer == null)
            {
                MessageBox.Show("和选中对象所在管线图层相关联的阀门图层不存在!", "提示");
                return false;
            }

            m_CloseValvesAnalyResFeatures = valveLayer.GetFeaturesByIDs(arryResValveID);// curCAYNDataset.NodeDataset.GetFeaturesByIDs(arryResValveID);

            if (m_CloseValvesAnalyResFeatures == null ||
                m_CloseValvesAnalyResFeatures.Length < 1)
            {
                MessageBox.Show("没有找到要关闭的阀门!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                if (frm != null)
                {
                    frm.Close();
                }
            }
            else
            { 
                int nCount = m_CloseValvesAnalyResFeatures.Length;

                if (nCount > 0)
                {
                    frm = FrmCloseValves.getForm(globeControl1, m_CloseValvesAnalyResFeatures, m_CloseValvesList);
                   
                    if (!frm.Visible)
                    {
                        frm.Show(this);
                    }
                }
            }
            return true;
        }
        FrmBoosterValvers frmbooster = null;
        private bool NetworkBoosterValvesAnalysis(GSOFeature lineFeature, GSOPoint3d pntBreak, GSOLayer lineLayer)//阀门分析
        {
            if (lineLayer == null || lineFeature == null || lineFeature.Geometry == null || lineFeature.Geometry.Type != EnumGeometryType.GeoPolyline3D)
            {
                return false;
            }
            GSODataset curCAYDataset = lineLayer.Dataset;

            if (curCAYDataset == null || curCAYDataset.DataSource == null)
            {
                return false;
            }
            string srName = curCAYDataset.Name;
            GSONetworkDataset curCAYNDataset = curCAYDataset.DataSource.GetDatasetByName(srName + "Network") as GSONetworkDataset;

            if (curCAYNDataset == null)
            {
                MessageBox.Show("该图层没有创建网络拓扑,请先创建网络拓扑信息再进行分析!", "提示");
                return false;
            }
            ClearBoosterValvesAnalysis();
            ClearAffectedPipeLine();
            
            int[] arryResNodeID;
            int[] arryResValveID;
            curCAYNDataset.CloseValveAnalysis(lineFeature.ID, out arryResNodeID, out arryResValveID, false, true);
            //m_CloseValvesAnalyResFeatures = curCAYNDataset.NodeDataset.GetFeaturesByIDs(arryResNodeID);

            //目前只有燃气管线 有阀门
            string valveName = lineLayer.Caption;
            valveName = valveName.Substring(0,valveName.IndexOf("管线"));
            GSOLayer valveLayer = globeControl1.Globe.Layers.GetLayerByCaption(valveName + "阀门井");
            if (valveLayer == null)
            {
                MessageBox.Show("和选中对象所在管线图层相关联的阀门图层不存在!", "提示");
                return false;
            }
            m_BoosterValvesAnalyResFeatures = valveLayer.GetFeaturesByIDs(arryResValveID);
            //m_BoosterValvesAnalyResFeatures = curCAYNDataset.NodeDataset.GetFeaturesByIDs(arryResValveID);

            if (m_BoosterValvesAnalyResFeatures == null ||
                m_BoosterValvesAnalyResFeatures.Length < 1)
            {
                MessageBox.Show("没有找到要关闭的阀门!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                if (frmbooster != null)
                {
                    frmbooster.Close();
                }
            }
            else
            {
                int nCount = m_BoosterValvesAnalyResFeatures.Length;
                if (nCount > 0)
                {
                    AffectedPipeLine(false);
                    frmbooster = FrmBoosterValvers.getForm(globeControl1, m_BoosterValvesAnalyResFeatures, m_BoosterValvesList, m_AffectedPipeLines);
                    frmbooster.setLstValvesName();
                    if (!frmbooster.Visible)
                    {
                        frmbooster.Show(this);
                    }
                }
            }
            return true;
        }
        private void buttonItem17_Click(object sender, EventArgs e) //清除分析结果
        {           
            globeControl1.Globe.ClearAnalysis();

            checkBoxX1.Checked = false;
            checkBoxX2.Checked = false;
            checkBoxX3.Checked = false;
            checkBoxX4.Checked = false;
            checkBoxX5.Checked = false;
            checkBoxX6.Checked = false;
            checkBoxX7.Checked = false;
            checkBoxX8.Checked = false;

            for (int i = 0; i < globeControl1.Globe.Layers.Count; i++)
            {
                GSOLayer layer = globeControl1.Globe.Layers[i];
                if (layer is GSOFeatureLayer)
                {
                    GSOFeatures feats = layer.GetAllFeatures();
                    for (int j = 0; j < feats.Length; j++)
                    {
                        GSOFeature feat = feats[j];
                        feat.HighLight = false;
                        GSOLineStyle3D lineStyle = feat.Geometry.Style as GSOLineStyle3D;
                        if (lineStyle != null)
                        {
                            lineStyle.ArrowVisible = false;
                            feat.Geometry.SetModified(true);
                        }
                    }
                }
            }
            ClearConnexityAnalysis();//清除连通性分析
            ClearCloseValvesAnalysis();//清除阀门分析

            //清除管线间距分析
            if (disFeature != null)
            {
                if (disFeature.ID != 0)
                {
                    globeControl1.Globe.MemoryLayer.RemoveFeatureByID(disFeature.ID);
                }
            }
            if (featureDis != null)
            {
                if (featureDis.ID != 0)
                {
                    globeControl1.Globe.MemoryLayer.RemoveFeatureByID(featureDis.ID);
                }
            }
            if (emitterFeature != null)
            {
                if (emitterFeature.ID != 0)
                {
                    globeControl1.Globe.MemoryLayer.RemoveFeatureByID(emitterFeature.ID);
                }
                globeControl1.Globe.UnderGroundFloor.Visible = false;
            }
            buttonX2_Click(sender, e);
            ClearUpDownTraceAnalysis();
            globeControl1.Globe.RemoveAllPits();
            //GSOLayer layerGround = globeControl1.Globe.Layers.GetLayerByCaption("180fd");
            //if (layerGround != null && (layerGround.Visible))
            //{
             //   layerGround.Visible = false;
            //}

            globeControl1.Globe.Action = EnumAction3D.ActionNull;
        }

        private void btnPipeDistance_Click(object sender, EventArgs e)//垂直净距
        {

            layerTemp.RemoveAllFeature();
            clearFeatureHighLight();
            
            globeControl1.Refresh();
            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = true;
            buttonItem1.Checked = true;
            controlContainerItem3.Visible = true;
            sideBarPanelItem4.Visible = true;
            sideBarPanelItem4.Text = "垂直净距分析";
            trackflag = "vertical";
            //globeControl1.Globe.Action = EnumAction3D.SelectObject;
            panel2.Visible = false;
            panel3.Visible = false;
            panel5.Visible = false;           
            panel4.Visible = false;
            panelEx1.Visible = false;
            controlContainerItem5.Control = panel1;
            panel1.Dock = DockStyle.Fill;
            panel1.Visible = true;
            sideBar1.ExpandedPanel = sideBarPanelItem4;
            sideBar1.Refresh();
            Refresh();
           
        }

        private void buttonItem18_Click(object sender, EventArgs e)
        {
            //globeControl1.Globe
        }

        private void checkBoxX2_CheckedChanged(object sender, EventArgs e)
        {
            clearFeatureHighLight();
            comboBoxEx1.Enabled = checkBoxX2.Checked;
            if (checkBoxX2.Checked)
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                textBoxX1.Enabled = true;
                trackflag = "";
                dataGridViewX2.Rows.Clear();
                dataGridViewX3.Rows.Clear();
               
                comboBoxEx1.SelectedIndex = -1;
                
            }
            globeControl1.Globe.ClearAnalysis();
            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }
        private void checkBoxX2_CheckedChanged_shuiping(object sender, EventArgs e)
        {
            clearFeatureHighLight();//清除高亮
            comboBoxEx4.Enabled = checkBoxX8.Checked;
            if (checkBoxX8.Checked)
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                //textBoxX5.Enabled = true;
                trackflag = "";
                dataGridViewX8.Rows.Clear();
                dataGridViewX9.Rows.Clear();
                
                comboBoxEx4.SelectedIndex = -1;
                
            }
            globeControl1.Globe.ClearAnalysis();
            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }

        private void checkBoxX1_CheckedChanged(object sender, EventArgs e)
        {
            clearFeatureHighLight();
            if (checkBoxX1.Checked)
            {
                globeControl1.Globe.ClearAnalysis();
                layerTemp.RemoveAllFeature();
                globeControl1.Refresh();
                comboBoxEx1.Enabled = false;
                dataGridViewX2.Rows.Clear();
                dataGridViewX3.Rows.Clear();
                trackflag = "vertical";
                //globeControl1.Globe.Action = EnumAction3D.TrackPolygonAnalysis;
                globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
            else
            {
                comboBoxEx1.Enabled = true;
            }
        }
        private void checkBoxX1_CheckedChanged_shuiping(object sender, EventArgs e)
        {
            clearFeatureHighLight();//清除高亮
            if (checkBoxX7.Checked)
            {
                globeControl1.Globe.ClearAnalysis();
                layerTemp.RemoveAllFeature();
                globeControl1.Refresh();
                comboBoxEx4.Enabled = false;
                dataGridViewX8.Rows.Clear();
                dataGridViewX9.Rows.Clear();
                trackflag = "horizontal";
                //globeControl1.Globe.Action = EnumAction3D.TrackPolygonAnalysis;
                globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
            else
            {
                comboBoxEx4.Enabled = true;
            }
        }
        GSOFeatures feats_vertical = new GSOFeatures();
        private void comboBoxEx1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBoxEx1.SelectedIndex > -1)
            {                
                //feats_vertical.RemoveAll();
                dataGridViewX2.Rows.Clear();
                dataGridViewX3.Rows.Clear();
                listBox1.Items.Clear();
                GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx1.SelectedItem.ToString());
                if (layer == null)
                    return;

                GSOFeatureLayer flayer = layer as GSOFeatureLayer;
                GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
                GSOFeatures feats = flayer.GetAllFeatures();
                //feats_vertical = feats;
                for (int i = 0; i < feats.Length; i++)
                {
                    int idx = dataGridViewX2.Rows.Add();
                    dataGridViewX2.Rows[idx].Cells[0].Value = comboBoxEx1.SelectedItem.ToString();
                    dataGridViewX2.Rows[idx].Cells[1].Value = feats[i].Name;
                }
            }
        }
        private void comboBoxEx1_SelectedIndexChanged_shuiping(object sender, EventArgs e)
        {
            if (comboBoxEx4.SelectedIndex > -1)
            {
                //feats_vertical.RemoveAll();
                dataGridViewX8.Rows.Clear();
                dataGridViewX9.Rows.Clear();
                listBox3.Items.Clear();
                GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx4.SelectedItem.ToString());
                if (layer == null)
                    return;

                GSOFeatureLayer flayer = layer as GSOFeatureLayer;
                GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
                GSOFeatures feats = flayer.GetAllFeatures();
                //feats_vertical = feats;
                for (int i = 0; i < feats.Length; i++)
                {
                    int idx = dataGridViewX8.Rows.Add();
                    dataGridViewX8.Rows[idx].Cells[0].Value = comboBoxEx4.SelectedItem.ToString();
                    dataGridViewX8.Rows[idx].Cells[1].Value = feats[i].Name;
                }
            }
        }

        private void buttonX1_Click(object sender, EventArgs e)
        {
            if (!checkBoxX1.Checked && !checkBoxX2.Checked)
            {
                MessageBox.Show("请确定是选择管线还是选择图层!", "提示");
                return;
            }
            if (textBoxX1.Text.Trim() == "")
            {
                MessageBox.Show("分析半径不能为空!", "提示");
                return;
            }
            double dJingJuBiaoZhun = 0;
            if (!double.TryParse(textBoxX1.Text.Trim(), out dJingJuBiaoZhun))
            {
                MessageBox.Show("请输入正确的分析半径!", "提示");
                return;
            }

            if (textBoxX2.Text.Trim() == "")
            {
                MessageBox.Show("净距标准不能为空!", "提示");
                return;
            }
            dJingJuBiaoZhun = 0;
            if (!double.TryParse(textBoxX2.Text.Trim(), out dJingJuBiaoZhun))
            {
                MessageBox.Show("请输入正确的净距标准!", "提示");
                return;
            }

            if (dataGridViewX2.Rows.Count > 0)
            {
                featCount.Clear();
                featLenth.Clear();
                listBox1.Items.Clear();
                layerTemp.RemoveAllFeature();
                polygonJingJuAnalysises.RemoveAll();
                clearFeatureHighLightIgnoreSelectObject();
                dataGridViewX3.Rows.Clear();
                if (checkBoxX1.Checked)
                {
                    for (int i = 0; i < dataGridViewX2.Rows.Count; i++)
                    {
                        GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX2.Rows[i].Cells[0].Value.ToString());
                        if (l != null)
                        {
                            GSOFeatureLayer flayer = l as GSOFeatureLayer;
                            GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
                            GSOFeatures feats = flayer.GetAllFeatures();
                            for (int j = 0; j < feats.Length; j++)
                            {
                                if (feats[j].Name == dataGridViewX2.Rows[i].Cells[1].Value.ToString())
                                {
                                    CollisionAnalysis_Selected(l.Caption,feats[j]);
                                }
                            }
                        }
                    }
                }
                else if(checkBoxX2.Checked)
                {
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx1.SelectedItem.ToString());
                    if (layer == null)
                        return;

                    GSOFeatureLayer flayer = layer as GSOFeatureLayer;
                    GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
                    GSOFeatures feats = flayer.GetAllFeatures();
                    for (int i = 0; i < feats.Length; i++)
                    {
                        CollisionAnalysis(0,layer.Caption,feats[i],Convert.ToDouble(textBoxX2.Text));
                    }
                    //listBox1.Items.Add("污水管线:" + m_WushuiCount.ToString() + "条,共" + totalLength_Wushui.ToString("0.00") + "米");
                    //listBox1.Items.Add("雨水管线:" + m_YushuiCount.ToString() + "条,共" + totalLength_Yushui.ToString("0.00") + "米");
                    //listBox1.Items.Add("燃气管线:" + m_RanqiCount.ToString() + "条,共" + totalLength_Ranqi.ToString("0.00") + "米");
                    if (featCount.Count > 0)
                    {
                        for (int i = 0; i < pipelineLayerNames.Count; i++)
                        {
                            if (featCount.ContainsKey(pipelineLayerNames[i]) && featLenth.ContainsKey(pipelineLayerNames[i]))
                            {
                                listBox1.Items.Add(pipelineLayerNames[i]  +":"+ featCount[pipelineLayerNames[i]] + "条,共" + featLenth[pipelineLayerNames[i]].ToString("0.00") + "米");
                            }
                        }
                    }
                }
                if(dataGridViewX3.Rows.Count == 0)
                {
                    MessageBox.Show("没有符合净距标准的管线!", "提示");
                }
            }
            else
            {
                MessageBox.Show("请选中要进行垂直净距分析的管线!", "提示");
                //globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
            globeControl1.Refresh();
        }
        private void buttonX1_Click_shuiping(object sender, EventArgs e)
        {
            if (!checkBoxX7.Checked && !checkBoxX8.Checked)
            {
                MessageBox.Show("请确定是选择管线还是选择图层!", "提示");
                return;
            }
            if (textBoxX4.Text.Trim() == "")
            {
                MessageBox.Show("净距标准不能为空!", "提示");
                return;
            }
            double dJingJuBiaoZhun = 0;
            if (!double.TryParse(textBoxX4.Text.Trim(), out dJingJuBiaoZhun))
            {
                MessageBox.Show("请输入正确的净距标准!", "提示");
                return;
            }
            if (dataGridViewX8.Rows.Count > 0)
            {                
                featCount.Clear();
                featLenth.Clear();
                listBox3.Items.Clear();
                layerTemp.RemoveAllFeature();
                polygonJingJuAnalysises.RemoveAll();
                clearFeatureHighLightIgnoreSelectObject();
                dataGridViewX9.Rows.Clear();
                if (checkBoxX7.Checked)
                {
                    for (int i = 0; i < dataGridViewX8.Rows.Count; i++)
                    {
                        GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX8.Rows[i].Cells[0].Value.ToString());
                        if (l != null)
                        {
                            GSOFeatureLayer flayer = l as GSOFeatureLayer;
                            GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
                            GSOFeatures feats = flayer.GetAllFeatures();
                            for (int j = 0; j < feats.Length; j++)
                            {
                                if (feats[j].Name == dataGridViewX8.Rows[i].Cells[1].Value.ToString())
                                {
                                    CollisionAnalysis_Selected_shuiping(l.Caption, feats[j]);
                                }
                            }
                        }
                    }
                }
                else if (checkBoxX8.Checked)
                {
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx4.SelectedItem.ToString());
                    if (layer == null)
                        return;

                    GSOFeatureLayer flayer = layer as GSOFeatureLayer;
                    GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
                    GSOFeatures feats = flayer.GetAllFeatures();
                    for (int i = 0; i < feats.Length; i++)
                    {
                        CollisionAnalysis_shuiping(0, layer.Caption, feats[i], Convert.ToDouble(textBoxX4.Text));
                    }
                    //listBox1.Items.Add("污水管线:" + m_WushuiCount.ToString() + "条,共" + totalLength_Wushui.ToString("0.00") + "米");
                    //listBox1.Items.Add("雨水管线:" + m_YushuiCount.ToString() + "条,共" + totalLength_Yushui.ToString("0.00") + "米");
                    //listBox1.Items.Add("燃气管线:" + m_RanqiCount.ToString() + "条,共" + totalLength_Ranqi.ToString("0.00") + "米");
                    if (featCount.Count > 0)
                    {
                        for (int i = 0; i < pipelineLayerNames.Count; i++)
                        {
                            if (featCount.ContainsKey(pipelineLayerNames[i]) && featLenth.ContainsKey(pipelineLayerNames[i]))
                            {
                                listBox3.Items.Add(pipelineLayerNames[i] + ":" + featCount[pipelineLayerNames[i]] + "条,共" + featLenth[pipelineLayerNames[i]].ToString("0.00") + "米");
                            }
                        }
                    }
                }
                if (dataGridViewX9.Rows.Count == 0)
                {
                    MessageBox.Show("没有符合净距标准的管线!", "提示");
                }
            }
            else
            {
                MessageBox.Show("请选中要进行水平净距分析的管线!", "提示");
                //globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
            globeControl1.Refresh();
        }
        Dictionary<string, int> featCount = new Dictionary<string, int>();
        Dictionary<string, double> featLenth = new Dictionary<string, double>();
        GSOFeatures polygonJingJuAnalysises = new GSOFeatures();
        private void CollisionAnalysis_Selected(string caption,GSOFeature feat)
        {
            if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D)
            {
                if (feat == null)
                {
                    MessageBox.Show("请选择一条管线!");
                    return;
                }
                GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D;
                if (line1 == null)
                {
                    MessageBox.Show("请选择一条管线!");
                    return;
                }
                GSOGeoPolygon3D polygon = line1.CreateBuffer(Convert.ToDouble(textBoxX1.Text), true, 5, true, false);
                GSOFeature new_feat = new GSOFeature();
                new_feat.Geometry = polygon;
                polygonJingJuAnalysises.Add(new_feat);
                layerTemp.AddFeature(new_feat);

                GSOPoint3d pntIntersect1 = new GSOPoint3d();
                GSOPoint3d pntIntersect2 = new GSOPoint3d();
                GSOPoint3d pntProIntersect1 = new GSOPoint3d();
                GSOPoint3d pntProIntersect2 = new GSOPoint3d();
                double pipeLength = 0;
                int pipeCount = 0;
                for (int i = 0; i < pipelineLayerNames.Count; i++)
                {
                    if (caption == pipelineLayerNames[i])
                    {
                        continue;
                    }
                    pipeLength = 0;
                    pipeCount = 0;
                    GSOFeatures feats2 = Polygon_Contain_PointAnalysis(polygon, pipelineLayerNames[i]);
                    for (int j = 0; j < feats2.Length; j++)
                    {
                        GSOFeature feat2 = feats2[j];
                        GSOGeoPolyline3D line2 = feats2[j].Geometry as GSOGeoPolyline3D;
                        if (line2 == null) continue;
                        GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D;
                        GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D;
                        if (pipeStyle1 == null || pipeStyle2 == null) continue;
                        // 计算两条线的距离和交点,若果失败返回-1
                        // 若在同一直线上,并且有交点,返回0
                        // 若不在同一平面,返回最近两点的距离,并且计算最近两点
                        double honLen;
                        double verLen;
                        double dDist =-1;
                        //globeControl1.Globe.Analysis3D.ComputeTwoGeoPolylineDistance(line1, line2, out pntIntersect1, out pntIntersect2, false);
                        
                        dDist = globeControl1.Globe.Analysis3D.ComputeVerticalDistance(line1, line2, out pntIntersect1, out pntIntersect2, out pntProIntersect1, out pntProIntersect2, false);
                        
                        dDist = dDist - pipeStyle1.Radius - pipeStyle2.Radius;
                        if (dDist<Convert.ToDouble(textBoxX2.Text))
                        {
                            #region
                            ////添加碰撞点标注
                            //GSOGeoPolyline3D disline = new GSOGeoPolyline3D();
                            //GSOPoint3ds point3ds = new GSOPoint3ds();
                            //point3ds.Add(pntProIntersect1);
                            //point3ds.Add(pntProIntersect2);
                            //disline.AddPart(point3ds);
                            //GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D(); //创建线的风格
                            ////设置透明度及颜色,FromArgb()中的四个参数分别为alpha、red、green、blue,取值范围为0到255
                            //style.LineColor = Color.GreenYellow;
                            //style.LineWidth = 3;          //设置线的宽度为3
                            //style.VertexVisible = true; 	//显示线的节点
                            //disline.Style = style;          //把风格添加到线上
                            //disline.AltitudeMode = EnumAltitudeMode.Absolute;
                            //GSOFeature f1 = new GSOFeature();
                            //f1.Geometry = disline;
                            ////disFeature.Geometry = disline;
                            //GSOGeoMarker markerDis = new GSOGeoMarker();
                            //markerDis.X = pntIntersect1.X;
                            //markerDis.Y = pntIntersect1.Y;
                            //markerDis.Z = (pntIntersect1.Z + pntIntersect2.Z) / 2;
                            //markerDis.Text = dDist.ToString("0.00") + "米";
                            //markerDis.AltitudeMode = EnumAltitudeMode.Absolute;
                            //GSOMarkerStyle3D styleMarker = new GSOMarkerStyle3D();
                            //GSOTextStyle styleText = new GSOTextStyle();
                            //styleText.IsSizeFixed = true;
                            //styleText.ForeColor = Color.White;
                            //styleText.FontSize = 20;
                            //styleMarker.TextStyle = styleText;
                            //markerDis.Style = styleMarker;

                            //GSOFeature f2 = new GSOFeature();
                            //f2.Geometry = markerDis;
                            //layerTemp.AddFeature(f1);
                            //layerTemp.AddFeature(f2);
                            #endregion

                            feats2[j].HighLight = true;
             
                            int idx = dataGridViewX3.Rows.Add();
                            dataGridViewX3.Rows[idx].Cells[0].Value = caption;
                            dataGridViewX3.Rows[idx].Cells[1].Value = feat.Name;
                            dataGridViewX3.Rows[idx].Cells[2].Value = pipelineLayerNames[i];
                            dataGridViewX3.Rows[idx].Cells[3].Value = feats2[j].Name;
                            dataGridViewX3.Rows[idx].Cells[4].Value = dDist.ToString("0.00");

                            pipeLength += line2.GetSpaceLength(true, 6378137);
                            pipeCount++;                            
                        }
                        line2.ReleaseInnerPointer();
                        feat2.ReleaseInnerPointer();
                    }
                    listBox1.Items.Add(pipelineLayerNames[i] +":" + pipeCount.ToString() + "条,共" + pipeLength.ToString("0.00") + "米");
                    feats2.ReleaseInnerPointer();
                }
                line1.ReleaseInnerPointer();
                feat.ReleaseInnerPointer();
            }
            globeControl1.Refresh();               
        }
        private void CollisionAnalysis_Selected_shuiping(string caption, GSOFeature feat)
        {
            if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D)
            {
                if (feat == null)
                {
                    MessageBox.Show("请选择一条管线!");
                    return;
                }
                GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D;
                if (line1 == null)
                {
                    MessageBox.Show("请选择一条管线!");
                    return;
                }
                GSOGeoPolygon3D polygon = line1.CreateBuffer(2 * Convert.ToDouble(textBoxX4.Text.Trim()), true, 5, true, false);
                GSOFeature new_feat = new GSOFeature();
                new_feat.Geometry = polygon;
                polygonJingJuAnalysises.Add(new_feat);
                layerTemp.AddFeature(new_feat);

                //GSOPoint3d pntIntersect1 = new GSOPoint3d();
                //GSOPoint3d pntIntersect2 = new GSOPoint3d();
                //GSOPoint3d pntProIntersect1 = new GSOPoint3d();
                //GSOPoint3d pntProIntersect2 = new GSOPoint3d();
                double pipeLength = 0;
                int pipeCount = 0;
                for (int i = 0; i < pipelineLayerNames.Count; i++)
                {
                    if (caption == pipelineLayerNames[i])
                    {
                        continue;
                    }
                    pipeLength = 0;
                    pipeCount = 0;
                    GSOFeatures feats2 = Polygon_Contain_PointAnalysis(polygon, pipelineLayerNames[i]);
                    for (int j = 0; j < feats2.Length; j++)
                    {
                        GSOFeature feat2 = feats2[j];
                        GSOGeoPolyline3D line2 = feats2[j].Geometry as GSOGeoPolyline3D;
                        if (line2 == null)
                        {
                            continue;
                        }
                        GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D;
                        GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D;
                        if (pipeStyle1 == null || pipeStyle2 == null)
                        {
                            continue;
                        }
                        // 计算两条线的距离和交点,若果失败返回-1
                        // 若在同一直线上,并且有交点,返回0
                        // 若不在同一平面,返回最近两点的距离,并且计算最近两点
                        //double honLen;
                        //double verLen;
                        //double dDist = -1;
                        //globeControl1.Globe.Analysis3D.ComputeTwoGeoPolylineDistance(line1, line2, out pntIntersect1, out pntIntersect2, false);
                        
                        //dDist = globeControl1.Globe.Analysis3D.ComputeHorizonDistance(line1, line2, out pntIntersect1, out pntIntersect2, out pntProIntersect1, out pntProIntersect2, false);
                        
                       // dDist = dDist - pipeStyle1.Radius - pipeStyle2.Radius;
                        //if (dDist < Convert.ToDouble(textBoxX4.Text))
                        {
                            #region
                            ////添加碰撞点标注
                            //GSOGeoPolyline3D disline = new GSOGeoPolyline3D();
                            //GSOPoint3ds point3ds = new GSOPoint3ds();
                            //point3ds.Add(pntProIntersect1);
                            //point3ds.Add(pntProIntersect2);
                            //disline.AddPart(point3ds);
                            //GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D(); //创建线的风格
                            ////设置透明度及颜色,FromArgb()中的四个参数分别为alpha、red、green、blue,取值范围为0到255
                            //style.LineColor = Color.GreenYellow;
                            //style.LineWidth = 3;          //设置线的宽度为3
                            //style.VertexVisible = true; 	//显示线的节点
                            //disline.Style = style;          //把风格添加到线上
                            //disline.AltitudeMode = EnumAltitudeMode.Absolute;
                            //GSOFeature f1 = new GSOFeature();
                            //f1.Geometry = disline;
                            ////disFeature.Geometry = disline;
                            //GSOGeoMarker markerDis = new GSOGeoMarker();
                            //markerDis.X = pntIntersect1.X;
                            //markerDis.Y = pntIntersect1.Y;
                            //markerDis.Z = (pntIntersect1.Z + pntIntersect2.Z) / 2;
                            //markerDis.Text = dDist.ToString("0.00") + "米";
                            //markerDis.AltitudeMode = EnumAltitudeMode.Absolute;
                            //GSOMarkerStyle3D styleMarker = new GSOMarkerStyle3D();
                            //GSOTextStyle styleText = new GSOTextStyle();
                            //styleText.IsSizeFixed = true;
                            //styleText.ForeColor = Color.White;
                            //styleText.FontSize = 20;
                            //styleMarker.TextStyle = styleText;
                            //markerDis.Style = styleMarker;

                            //GSOFeature f2 = new GSOFeature();
                            //f2.Geometry = markerDis;
                            //layerTemp.AddFeature(f1);
                            //layerTemp.AddFeature(f2);
                            #endregion

                            feats2[j].HighLight = true;

                            int idx = dataGridViewX9.Rows.Add();
                            dataGridViewX9.Rows[idx].Cells[0].Value = caption;
                            dataGridViewX9.Rows[idx].Cells[1].Value = feat.Name;
                            dataGridViewX9.Rows[idx].Cells[2].Value = pipelineLayerNames[i];
                            dataGridViewX9.Rows[idx].Cells[3].Value = feats2[j].Name;
                            dataGridViewX9.Rows[idx].Cells[4].Value = Convert.ToDouble(textBoxX4.Text.Trim()).ToString("0.00");

                            pipeLength += line2.GetSpaceLength(true, 6378137);
                            pipeCount++;
                        }
                        //line2.ReleaseInnerPointer();
                        //feat2.ReleaseInnerPointer();
                    }
                    listBox3.Items.Add(pipelineLayerNames[i] + ":" + pipeCount.ToString() + "条,共" + pipeLength.ToString("0.00") + "米");
                    //feats2.ReleaseInnerPointer();
                }
                //line1.ReleaseInnerPointer();
                //feat.ReleaseInnerPointer();
            }
            globeControl1.Refresh();
        }
        private void CollisionAnalysis(int type, string caption,GSOFeature feat, double dis)
        {//type 0 垂直净距分析 1 碰撞分析

            if (feat == null)
            {
                MessageBox.Show("请选择一条管线!");
                return;
            }
            GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D;
            if (line1 == null)
            {
                MessageBox.Show("请选择一条管线!");
                return;
            }

            double dWidth = 0.1;
            if (type != 1)
            { 
                dWidth = Convert.ToDouble(textBoxX1.Text);
            }
            GSOGeoPolygon3D polygon = line1.CreateBuffer(dWidth, true, 5, true, false);
            if (type != 1)
            {                
                GSOFeature new_feat = new GSOFeature();
                new_feat.Geometry = polygon;
                polygonJingJuAnalysises.Add(new_feat);
                layerTemp.AddFeature(new_feat);
            }
            GSOFeatures feats = new GSOFeatures();
            GSOPoint3d pntIntersect1 = new GSOPoint3d();
            GSOPoint3d pntIntersect2 = new GSOPoint3d();
            GSOPoint3d pntProIntersect1 = new GSOPoint3d();
            GSOPoint3d pntProIntersect2 = new GSOPoint3d();
            for (int l2 = 0; l2 < pipelineLayerNames.Count; l2++)
            {
                if (caption == pipelineLayerNames[l2])
                {
                    continue;
                }
                GSOLayer layer2 = globeControl1.Globe.Layers.GetLayerByCaption(pipelineLayerNames[l2]);
                if (layer2 != null)
                {                    
                    GSOFeatureLayer flayer2 = layer2 as GSOFeatureLayer;
                    GSOFeatureDataset fdataset2 = flayer2.Dataset as GSOFeatureDataset;
                    GSOFeatures feats2 = Polygon_Contain_PointAnalysis(polygon, pipelineLayerNames[l2]);
                    for (int j = 0; j < feats2.Length; j++)
                    {
                        GSOFeature feat2 = feats2[j];
                        GSOGeoPolyline3D line2 = feats2[j].Geometry as GSOGeoPolyline3D;
                        if (line2 == null) continue;
                        GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D;
                        GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D;
                        if (pipeStyle1 == null || pipeStyle2 == null) continue;
                        // 计算两条线的距离和交点,若果失败返回-1
                        // 若在同一直线上,并且有交点,返回0
                        // 若不在同一平面,返回最近两点的距离,并且计算最近两点
                        
                        double dDist = -1;                        
                        dDist = globeControl1.Globe.Analysis3D.ComputeVerticalDistance(line1, line2, out pntIntersect1, out pntIntersect2, out pntProIntersect1, out pntProIntersect2, false);
                        
                        //if (dDist > 0)
                        {
                            dDist = dDist - pipeStyle1.Radius - pipeStyle2.Radius;
                            if (dDist < dis)
                            {
                                feat2.HighLight = true;
                                int idx = -1;
                                if (type == 0)
                                {
                                    idx = dataGridViewX3.Rows.Add();
                                    dataGridViewX3.Rows[idx].Cells[0].Value = caption;
                                    dataGridViewX3.Rows[idx].Cells[1].Value = feat.Name;
                                    dataGridViewX3.Rows[idx].Cells[2].Value = layer2.Caption;
                                    dataGridViewX3.Rows[idx].Cells[3].Value = feats2[j].Name;
                                    dataGridViewX3.Rows[idx].Cells[4].Value = dDist.ToString("0.00");
                                }
                                else if (type == 1)
                                {
                                    idx = dataGridViewX5.Rows.Add();
                                    dataGridViewX5.Rows[idx].Cells[0].Value = dataGridViewX4.Rows[0].Cells[0].Value.ToString();
                                    dataGridViewX5.Rows[idx].Cells[1].Value = feat.Name;
                                    dataGridViewX5.Rows[idx].Cells[2].Value = layer2.Caption;
                                    dataGridViewX5.Rows[idx].Cells[3].Value = feats2[j].Name;
                                }

                                if (featCount.ContainsKey(layer2.Caption))
                                {

                                    featCount[layer2.Caption] = featCount[layer2.Caption] + 1;
                                }
                                else
                                {
                                    featCount.Add(layer2.Caption, 1);
                                }
                                if (featLenth.ContainsKey(layer2.Caption))
                                {
                                    featLenth[layer2.Caption] = featLenth[layer2.Caption] + line2.GetSpaceLength(true, 6378137);
                                }
                                else
                                {
                                    featLenth.Add(layer2.Caption, line2.GetSpaceLength(true, 6378137));
                                }
                            }
                        }

                        line2.ReleaseInnerPointer();
                        feat2.ReleaseInnerPointer();
                    }
                    feats2.ReleaseInnerPointer();
                }
            }
            line1.ReleaseInnerPointer();
            feat.ReleaseInnerPointer();

        }
        private void CollisionAnalysis_shuiping(int type, string caption, GSOFeature feat, double dis)
        {
            if (feat == null)
            {
                MessageBox.Show("请选择一条管线!");
                return;
            }
            GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D;
            if (line1 == null)
            {
                MessageBox.Show("请选择一条管线!");
                return;
            }
            GSOGeoPolygon3D polygon = line1.CreateBuffer(Convert.ToDouble(textBoxX4.Text.Trim()), true, 5, true, false);
            GSOFeature new_feat = new GSOFeature();
            new_feat.Geometry = polygon;
            polygonJingJuAnalysises.Add(new_feat);
            layerTemp.AddFeature(new_feat);

            GSOFeatures feats = new GSOFeatures();
           
            for (int l2 = 0; l2 < pipelineLayerNames.Count; l2++)
            {
                if (caption == pipelineLayerNames[l2])
                {
                    continue;
                }
                GSOLayer layer2 = globeControl1.Globe.Layers.GetLayerByCaption(pipelineLayerNames[l2]);
                if (layer2 != null)
                {
                    GSOFeatureLayer flayer2 = layer2 as GSOFeatureLayer;
                    GSOFeatureDataset fdataset2 = flayer2.Dataset as GSOFeatureDataset;
                    GSOFeatures feats2 = Polygon_Contain_PointAnalysis(polygon, pipelineLayerNames[l2]);
                    for (int j = 0; j < feats2.Length; j++)
                    {
                        GSOFeature feat2 = feats2[j];
                        GSOGeoPolyline3D line2 = feats2[j].Geometry as GSOGeoPolyline3D;
                        if (line2 == null) continue;
                        GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D;
                        GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D;
                        if (pipeStyle1 == null || pipeStyle2 == null)
                        {
                            continue;
                        }
                        feat2.HighLight = true;
                        int idx = -1;
                        if (type == 0)
                        {
                            idx = dataGridViewX9.Rows.Add();
                            dataGridViewX9.Rows[idx].Cells[0].Value = caption;
                            dataGridViewX9.Rows[idx].Cells[1].Value = feat.Name;
                            dataGridViewX9.Rows[idx].Cells[2].Value = layer2.Caption;
                            dataGridViewX9.Rows[idx].Cells[3].Value = feats2[j].Name;
                            dataGridViewX9.Rows[idx].Cells[4].Value = Convert.ToDouble(textBoxX4.Text.Trim()).ToString("0.00");
                        }
                        else if (type == 1)
                        {
                            idx = dataGridViewX5.Rows.Add();
                            dataGridViewX5.Rows[idx].Cells[0].Value = dataGridViewX4.Rows[0].Cells[0].Value.ToString();
                            dataGridViewX5.Rows[idx].Cells[1].Value = feat.Name;
                            dataGridViewX5.Rows[idx].Cells[2].Value = layer2.Caption;
                            dataGridViewX5.Rows[idx].Cells[3].Value = feats2[j].Name;
                        }

                        if (featCount.ContainsKey(layer2.Caption))
                        {
                            featCount[layer2.Caption] = featCount[layer2.Caption] + 1;
                        }
                        else
                        {
                            featCount.Add(layer2.Caption, 1);
                        }
                        if (featLenth.ContainsKey(layer2.Caption))
                        {
                            featLenth[layer2.Caption] = featLenth[layer2.Caption] + line2.GetSpaceLength(true, 6378137);
                        }
                        else
                        {
                            featLenth.Add(layer2.Caption, line2.GetSpaceLength(true, 6378137));
                        }
                    }
                }
            }         

        }
        #region
        //private void CollisionAnalysis(int type, GSOFeature feat, double dis)
        //{//type 0 垂直净距分析 1 碰撞分析

        //    feats_wushui = new GSOFeatures();
        //    feats_ranqi = new GSOFeatures();
        //    feats_yushui = new GSOFeatures();
        //    if (feat == null)
        //    {
        //        MessageBox.Show("请选择一条管线!");
        //        return;
        //    }
        //    GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D;
        //    if (line1 == null)
        //    {
        //        MessageBox.Show("请选择一条管线!");
        //        return;
        //    }
        //    GSOPoint3d pntIntersect1 = new GSOPoint3d();
        //    GSOPoint3d pntIntersect2 = new GSOPoint3d();
        //    for (int l2 = 0; l2 < globeControl1.Globe.Layers.Count; l2++)
        //    {
        //        GSOLayer layer2 = globeControl1.Globe.Layers[l2];
        //        if (layer2.Caption.Contains("污水管线") || layer2.Caption.Contains("雨水管线v1") || layer2.Caption.Contains("燃气管线v3"))
        //        {
        //            GSOFeatureLayer flayer2 = layer2 as GSOFeatureLayer;
        //            GSOFeatureDataset fdataset2 = flayer2.Dataset as GSOFeatureDataset;
        //            GSOFeatures feats2 = flayer2.GetAllFeatures();
        //            for (int j = 0; j < feats2.Length; j++)
        //            {
        //                GSOFeature feat2 = feats2[j];

        //                GSOGeoPolyline3D line2 = feats2[j].Geometry as GSOGeoPolyline3D;
        //                if (line2 == null) continue;
        //                GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D;
        //                GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D;
        //                if (pipeStyle1 == null || pipeStyle2 == null) continue;
        //                // 计算两条线的距离和交点,若果失败返回-1
        //                // 若在同一直线上,并且有交点,返回0
        //                // 若不在同一平面,返回最近两点的距离,并且计算最近两点
        //                double dDist = globeControl1.Globe.Analysis3D.ComputeTwoGeoPolylineDistance(line1, line2, out pntIntersect1, out pntIntersect2, false);
        //                if (dDist > -1)
        //                {
        //                    if (dDist != 0)
        //                    {
        //                        dDist = dDist - pipeStyle1.Radius - pipeStyle2.Radius;
        //                        if (dDist < dis)
        //                        {
        //                            //添加碰撞点标注
        //                            GSOGeoPolyline3D disline = new GSOGeoPolyline3D();
        //                            GSOPoint3ds point3ds = new GSOPoint3ds();
        //                            point3ds.Add(pntProIntersect1);
        //                            point3ds.Add(pntProIntersect2);
        //                            disline.AddPart(point3ds);
        //                            GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D(); //创建线的风格
        //                            //设置透明度及颜色,FromArgb()中的四个参数分别为alpha、red、green、blue,取值范围为0到255
        //                            style.LineColor = Color.GreenYellow;
        //                            style.LineWidth = 3;          //设置线的宽度为3
        //                            style.VertexVisible = true; 	//显示线的节点
        //                            disline.Style = style;          //把风格添加到线上
        //                            disline.AltitudeMode = EnumAltitudeMode.Absolute;
        //                            GSOFeature f1 = new GSOFeature();
        //                            f1.Geometry = disline;
        //                            //disFeature.Geometry = disline;
        //                            GSOGeoMarker markerDis = new GSOGeoMarker();
        //                            markerDis.X = pntIntersect1.X;
        //                            markerDis.Y = pntIntersect1.Y;
        //                            markerDis.Z = (pntIntersect1.Z + pntIntersect2.Z) / 2;
        //                            markerDis.Text = dDist.ToString().Substring(0, dDist.ToString().IndexOf(".") + 3) + "米";
        //                            markerDis.AltitudeMode = EnumAltitudeMode.Absolute;
        //                            GSOMarkerStyle3D styleMarker = new GSOMarkerStyle3D();
        //                            GSOTextStyle styleText = new GSOTextStyle();
        //                            styleText.IsSizeFixed = true;
        //                            styleText.ForeColor = Color.White;
        //                            styleText.FontSize = 20;
        //                            styleMarker.TextStyle = styleText;
        //                            markerDis.Style = styleMarker;

        //                            GSOFeature f2 = new GSOFeature();
        //                            f2.Geometry = markerDis;
        //                            layerTemp.AddFeature(f1);
        //                            layerTemp.AddFeature(f2);

        //                            int idx = -1;
        //                            switch (layer2.Caption)
        //                            {
        //                                case "污水管线":
        //                                    feats_wushui.Add(feats2[j]);
        //                                    if (type == 0)
        //                                    {
        //                                        idx = dataGridViewX3.Rows.Add();
        //                                        dataGridViewX3.Rows[idx].Cells[0].Value = "污水管线";
        //                                        dataGridViewX3.Rows[idx].Cells[1].Value = feats2[j].Name;
        //                                        dataGridViewX3.Rows[idx].Cells[2].Value = dDist;
        //                                    }
        //                                    else if (type == 1)
        //                                    {
        //                                        idx = dataGridViewX5.Rows.Add();
        //                                        dataGridViewX5.Rows[idx].Cells[0].Value = "污水管线";
        //                                        dataGridViewX5.Rows[idx].Cells[1].Value = feats2[j].Name;
        //                                    }
        //                                    totalLength_Wushui += line2.GetSpaceLength(true, 6378137);
        //                                    m_WushuiCount++;
        //                                    //pnts_wushui.Add(pntIntersect1);
        //                                    break;
        //                                case "雨水管线v1":
        //                                    feats_yushui.Add(feats2[j]);
        //                                    if (type == 0)
        //                                    {
        //                                        idx = dataGridViewX3.Rows.Add();
        //                                        dataGridViewX3.Rows[idx].Cells[0].Value = "雨水管线v1";
        //                                        dataGridViewX3.Rows[idx].Cells[1].Value = feats2[j].Name;
        //                                        dataGridViewX3.Rows[idx].Cells[2].Value = dDist;
        //                                    }
        //                                    else if (type == 1)
        //                                    {
        //                                        idx = dataGridViewX5.Rows.Add();
        //                                        dataGridViewX5.Rows[idx].Cells[0].Value = "雨水管线v1";
        //                                        dataGridViewX5.Rows[idx].Cells[1].Value = feats2[j].Name;
        //                                    }
        //                                    totalLength_Yushui += line2.GetSpaceLength(true, 6378137);
        //                                    m_YushuiCount++;
        //                                    //pnts_yushui.Add(pntIntersect1);
        //                                    break;
        //                                case "燃气管线v3":
        //                                    feats_ranqi.Add(feats2[j]);
        //                                    if (type == 0)
        //                                    {
        //                                        idx = dataGridViewX3.Rows.Add();
        //                                        dataGridViewX3.Rows[idx].Cells[0].Value = "燃气管线v3";
        //                                        dataGridViewX3.Rows[idx].Cells[1].Value = feats2[j].Name;
        //                                        dataGridViewX3.Rows[idx].Cells[2].Value = dDist;
        //                                    }
        //                                    else if (type == 1)
        //                                    {
        //                                        idx = dataGridViewX5.Rows.Add();
        //                                        dataGridViewX5.Rows[idx].Cells[0].Value = "燃气管线v3";
        //                                        dataGridViewX5.Rows[idx].Cells[1].Value = feats2[j].Name;
        //                                    }
        //                                    totalLength_Ranqi += line2.GetSpaceLength(true, 6378137);
        //                                    m_RanqiCount++;
        //                                    // pnts_ranqi.Add(pntIntersect1);
        //                                    break;
        //                            }
        //                        }
        //                    }
        //                }

        //                line2.ReleaseInnerPointer();
        //                feat2.ReleaseInnerPointer();
        //            }
        //            feats2.ReleaseInnerPointer();
        //        }
        //    }
        //    line1.ReleaseInnerPointer();
        //    feat.ReleaseInnerPointer();
        //    //if (feats_wushui.Length + feats_yushui.Length + feats_ranqi.Length <= 0)
        //    //{
        //    //    MessageBox.Show("没有找到碰撞的管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        //    //    //if (frmCollisionAnalysis != null)
        //    //    //{
        //    //    //    frmCollisionAnalysis.Close();
        //    //    //}
        //    //}
        //    //else
        //    //{

        //    //}
        //}
        #endregion
        private void buttonItem21_Click(object sender, EventArgs e)
        {
            GSOFeature f = globeControl1.Globe.SelectedObject;
            if (f != null && f.Geometry.Type == EnumGeometryType.GeoPolyline3D)
            {
                GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D;
                GSOGeoPolygon3D polygon = line.CreateBuffer(10, true, 5, true, false);
                GSOFeature feature = new GSOFeature();
                feature.Geometry = polygon;
                
                globeControl1.Globe.MemoryLayer.AddFeature(feature);
            }
        }

        private void dataGridViewX3_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                DataGridView.HitTestInfo hittestinfo = dataGridViewX3.HitTest(e.X, e.Y);
                if (hittestinfo.RowIndex > -1)
                {
                    string featureName = dataGridViewX3.Rows[hittestinfo.RowIndex].Cells[1].Value.ToString();
                    featureName = featureName.Trim();

                    //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[currentQueryLayer]));
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX3.Rows[hittestinfo.RowIndex].Cells["图层"].Value.ToString());
                    //   GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption("reli"); 
                    if (layer != null)
                    {
                        GSOFeatures features = layer.GetFeatureByName(featureName, false);
                        for (int j = 0; j < features.Length; j++)
                        {
                            if (features[j].GetFieldDefn("编号") != null && features[j].GetValue("编号").ToString() == 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.JumpToPosition(point3d, EnumAltitudeMode.Absolute,5);
                                }
                                else
                                {
                                    globeControl1.Globe.JumpToFeature(m_feature, 5);
                                }
                                break;
                            }
                            else 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.JumpToPosition(point3d, EnumAltitudeMode.Absolute, 5);
                                }
                                else
                                {
                                    globeControl1.Globe.JumpToFeature(m_feature, 5);
                                }
                                break;
                            }
                        }
                    }
                }
            }
        }
        private void dataGridViewX3_MouseDoubleClick_shuiping(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                DataGridView.HitTestInfo hittestinfo = dataGridViewX9.HitTest(e.X, e.Y);
                if (hittestinfo.RowIndex > -1)
                {
                    string featureName = dataGridViewX9.Rows[hittestinfo.RowIndex].Cells[1].Value.ToString();
                    featureName = featureName.Trim();

                    //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[currentQueryLayer]));
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX9.Rows[hittestinfo.RowIndex].Cells[0].Value.ToString());
                    //   GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption("reli"); 
                    if (layer != null)
                    {
                        GSOFeatures features = layer.GetFeatureByName(featureName, false);
                        for (int j = 0; j < features.Length; j++)
                        {
                            if (features[j].GetFieldDefn("编号") != null && features[j].GetValue("编号").ToString() == 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.JumpToPosition(point3d, EnumAltitudeMode.Absolute, 5);
                                }
                                else
                                {
                                    globeControl1.Globe.JumpToFeature(m_feature, 5);
                                }
                                break;
                            }
                            else 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.JumpToPosition(point3d, EnumAltitudeMode.Absolute, 5);
                                }
                                else
                                {
                                    globeControl1.Globe.JumpToFeature(m_feature, 5);
                                }
                                break;
                            }
                        }
                    }
                }
            }
        }

        private void buttonX2_Click(object sender, EventArgs e)
        {
            trackflag = "";
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            
            listBox1.Items.Clear();
           
            checkBoxX1.Checked = false;
            checkBoxX2.Checked = false;
            comboBoxEx1.SelectedIndex = -1;
            comboBoxEx1.Enabled = false;
            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
            dataGridViewX2.Rows.Clear();
            dataGridViewX3.Rows.Clear();
        }
        private void buttonX2_Click_shuiping(object sender, EventArgs e)
        {
            trackflag = "";
            globeControl1.Globe.Action = EnumAction3D.ActionNull;

            listBox3.Items.Clear();

            checkBoxX7.Checked = false;
            checkBoxX8.Checked = false;
            comboBoxEx4.SelectedIndex = -1;
            comboBoxEx4.Enabled = false;
            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
            dataGridViewX8.Rows.Clear();
            dataGridViewX9.Rows.Clear();
        }

        private void textBoxX1_KeyPress(object sender, KeyPressEventArgs e)
        {
            //if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8)
            //{
            //    e.Handled = true;//屏蔽
            //}

            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;
                    }
                }
            }
        }
        private void buttonX3_Click_pengZhuang(object sender, EventArgs e)
        {
            for (int i = 0; i < polygonJingJuAnalysises.Length; i++)
            {
                polygonJingJuAnalysises[i].Delete();
            }
            globeControl1.Globe.Refresh();
        }
        private void buttonX3_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < polygonJingJuAnalysises.Length; i++)
            {
                polygonJingJuAnalysises[i].Delete();
            }
            globeControl1.Globe.Refresh();

            //trackflag = "";
           
            //globeControl1.Globe.Action = EnumAction3D.ActionNull; 
            //sideBarPanelItem4.Visible = false;
            //panel2.Visible = false;
            //checkBoxX1.Checked = false;
            //checkBoxX2.Checked = false;
            //comboBoxEx1.SelectedIndex = -1;
            //dataGridViewX2.Rows.Clear();
            //dataGridViewX3.Rows.Clear();
            //if (buttonItem1.Checked)
            //{
            //    sideBar1.ExpandedPanel = sideBarPanelItem3;
            //}
            //else
            //{
            //    sideBar1.Visible = false;
            //}
            
            //Refresh();
        }

        private void BaselineProfileAnalysisMenuItem_Click(object sender, EventArgs e)//基线剖面分析
        {
            if (!BaselineProfileAnalysisMenuItem.Checked)
            {
                globeControl1.Globe.Action = EnumAction3D.TrackPolyline;
                //globeControl1.Globe.TrackPolylineAnalysis.VerticalLineVisible = true;
                globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true;
                BaselineProfileAnalysisMenuItem.Checked = true;

            }
            else
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                BaselineProfileAnalysisMenuItem.Checked = false;
                //globeControl1.Globe.TrackPolylineAnalysis.VerticalLineVisible = false;
                globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = false;
            }
            ActionToolMenuChecked();
        }

        private void btnPolygonDigPit_Click(object sender, EventArgs e)//多边形挖坑
        {
            trackflag = "pit";
            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
        }

        private void buttonItem3_Click(object sender, EventArgs e)
        {
            globeControl1.Globe.RemoveAllPits();
        }

        private void DigFillAnalysisMenuItem_Click(object sender, EventArgs e)//挖方量分析
        {

            trackflag = "digFillAnalysis";
            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
            ActionToolMenuChecked();
        }

        private void btnItemHelp_Click(object sender, EventArgs e)
        {

        }

        private void buttonX4_Click(object sender, EventArgs e)
        {
            if (dataGridViewX3.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
                    {
                        string strList = "";
                        for (int i = 0; i < listBox1.Items.Count; i++)
                        {
                            strList += listBox1.Items[i].ToString()+ @"/";
                        }
                        sw.WriteLine("内容:垂直净距分析  日期:" + DateTime.Now.ToString("yyyy-MM-dd") +" 结果:"+strList);

                        //写入列标题   
                        for (int i = 0; i < dataGridViewX3.ColumnCount; i++)
                        {
                            if (i > 0)
                            {
                                columnTitle += "\t";
                            }
                            columnTitle += dataGridViewX3.Columns[i].HeaderText;
                        }
                        sw.WriteLine(columnTitle);

                        //写入列内容   
                        for (int j = 0; j < dataGridViewX3.Rows.Count; j++)
                        {
                            string columnValue = "";
                            for (int k = 0; k < dataGridViewX3.Columns.Count; k++)
                            {
                                if (k > 0)
                                {
                                    columnValue += "\t";
                                }
                                if (dataGridViewX3.Rows[j].Cells[k].Value == null)
                                    columnValue += "";
                                else
                                    columnValue += dataGridViewX3.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();
                    }
                }
            }
        }
        private void buttonX4_Click_shuiping(object sender, EventArgs e)
        {
            if (dataGridViewX9.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
                    {
                        string strList = "";
                        for (int i = 0; i < listBox3.Items.Count; i++)
                        {
                            strList += listBox3.Items[i].ToString() + @"/";
                        }
                        sw.WriteLine("内容:垂直净距分析  日期:" + DateTime.Now.ToString("yyyy-MM-dd") + " 结果:" + strList);

                        //写入列标题   
                        for (int i = 0; i < dataGridViewX9.ColumnCount; i++)
                        {
                            if (i > 0)
                            {
                                columnTitle += "\t";
                            }
                            columnTitle += dataGridViewX9.Columns[i].HeaderText;
                        }
                        sw.WriteLine(columnTitle);

                        //写入列内容   
                        for (int j = 0; j < dataGridViewX9.Rows.Count; j++)
                        {
                            string columnValue = "";
                            for (int k = 0; k < dataGridViewX9.Columns.Count; k++)
                            {
                                if (k > 0)
                                {
                                    columnValue += "\t";
                                }
                                if (dataGridViewX9.Rows[j].Cells[k].Value == null)
                                    columnValue += "";
                                else
                                    columnValue += dataGridViewX9.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();
                    }
                }
            }
        }
        
        private eOffice2007ColorScheme scheme = eOffice2007ColorScheme.VistaGlass;
        private void command1_Executed(object sender, EventArgs e)
        {
            ICommandSource source = sender as ICommandSource;
            if (source.CommandParameter is string)
            {
                eOffice2007ColorScheme colorScheme = (eOffice2007ColorScheme)Enum.Parse(typeof(eOffice2007ColorScheme), source.CommandParameter.ToString());
                ribbonControl1.Office2007ColorTable = colorScheme;

            }
        }  
        

        private void ribbonTabItem2_Click(object sender, EventArgs e)
        {

        }

        private void ribbonTabItem13_Click(object sender, EventArgs e)
        {

        }

        private void ribbonTabItem12_Click(object sender, EventArgs e)
        {

        }

        private void LaunchRibbonDialog(object sender, System.EventArgs e)
        {
            MessageBoxEx.Show("Start <i>Ribbon Dialog</i> with more options here...", "Ribbon Demo", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        

        private void buttonItem102_Click(object sender, EventArgs e)//坐标查询
        {
            FrmSetLatLonPos.ShowForm(globeControl1);
            //frm.Show(this);
        }

        private void buttonItem28_Click(object sender, EventArgs e)//沿线挖坑
        {
            if (!buttonItem28.Checked)
            {
                FrmDigPitSetting dlg = new FrmDigPitSetting(m_dDigPitValue, m_bDigPitByDepth, m_dDigPitWidthAlongLine);
                if (dlg.ShowDialog() == DialogResult.OK)
                {
                    m_dDigPitValue = dlg.m_dDigPitValue;
                    m_bDigPitByDepth = dlg.m_bDigPitByDepth;
                    m_dDigPitWidthAlongLine = dlg.m_dDigPitWidthAlongLine;
                    trackflag = "LineDigPit";
                    globeControl1.Globe.Action = EnumAction3D.TrackPolyline;
                    //globeControl1.Globe.TrackPolylineAnalysis.VerticalLineVisible = true;
                    globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true;
                    buttonItem28.Checked = true;
                }              

            }
            else
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                buttonItem28.Checked = false;
                globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = false;
                //globeControl1.Globe.TrackPolylineAnalysis.VerticalLineVisible = false;
            }
            ActionToolMenuChecked();
        }

        private void buttonItem29_Click(object sender, EventArgs e)//可视域分析
        {
            globeControl1.Globe.Action = EnumAction3D.ViewshedAnalysis;
        }

        private void buttonItem30_Click(object sender, EventArgs e)//可视包络分析
        {
            globeControl1.Globe.Action = EnumAction3D.ViewEnvelopeAnalysis;
        }

        private void buttonItem32_Click(object sender, EventArgs e)
        {
            buttonItem32.Checked = !buttonItem32.Checked;
            ribbonBarJJ.Visible = buttonItem32.Checked;
            ribbonBarJJ.Location = new Point(0, 0);
            //if (buttonItem32.Checked || buttonItem33.Checked || buttonItem34.Checked || buttonItem35.Checked || buttonItem49.Checked)
            //{
            //    ribbonBar1.Visible = true;
            //}
            //else
            //{
            //    ribbonBar1.Visible = false;
            //}
        }

        private void buttonItem33_Click(object sender, EventArgs e)
        {
            buttonItem33.Checked = !buttonItem33.Checked;
            ribbonBarDM.Visible = buttonItem33.Checked;
            ribbonBarDM.Location = new Point(0, 0);
            //if (buttonItem32.Checked || buttonItem33.Checked || buttonItem34.Checked || buttonItem35.Checked || buttonItem49.Checked)
            //{
            //    ribbonBar1.Visible = true;
            //}
            //else
            //{
            //    ribbonBar1.Visible = false;
            //}
        }

        

        private void buttonItem35_Click(object sender, EventArgs e)
        {
            buttonItem35.Checked = !buttonItem35.Checked;
            ribbonBarKW.Visible = buttonItem35.Checked;
            ribbonBarKW.Location = new Point(0, 0);
            //if (buttonItem32.Checked || buttonItem33.Checked || buttonItem34.Checked || buttonItem35.Checked || buttonItem49.Checked)
            //{
            //    ribbonBar1.Visible = true;
            //}
            //else
            //{
            //    ribbonBar1.Visible = false;
            //}
        }

        private void buttonItem49_Click(object sender, EventArgs e)
        {
            buttonItem49.Checked = !buttonItem49.Checked;
            ribbonBarSY.Visible = buttonItem49.Checked;
            ribbonBarSY.Location = new Point(0, 0);
            //if (buttonItem32.Checked || buttonItem33.Checked || buttonItem34.Checked || buttonItem35.Checked || buttonItem49.Checked)
            //{
            //    ribbonBar1.Visible = true;
            //}
            //else
            //{
            //    ribbonBar1.Visible = false;
            //}
        }

        private void buttonItem34_Click(object sender, EventArgs e)
        {
            buttonItem34.Checked = !buttonItem34.Checked;
            ribbonBarTP.Visible = buttonItem34.Checked;
            ribbonBarTP.Location = new Point(0, 0);
            //if (buttonItem32.Checked || buttonItem33.Checked || buttonItem34.Checked || buttonItem35.Checked || buttonItem34.Checked)
            //{
            //    ribbonBar1.Visible = true;
            //}
            //else
            //{
            //    ribbonBar1.Visible = false;
            //}
        }

        private void buttonItem17_Click_1(object sender, EventArgs e)//大气层
        {
            globeControl1.Globe.Atmosphere.Visible = !globeControl1.Globe.Atmosphere.Visible;
            buttonItem17.Checked = globeControl1.Globe.Atmosphere.Visible;
            globeControl1.Refresh();
        }

        private void buttonItem20_Click(object sender, EventArgs e)//经纬网
        {
            globeControl1.Globe.LatLonGrid.Visible = !globeControl1.Globe.LatLonGrid.Visible;
            buttonItem20.Checked = globeControl1.Globe.LatLonGrid.Visible;
            globeControl1.Globe.Refresh();
        }

        private void buttonItem21_Click_1(object sender, EventArgs e)//状态条
        {
            globeControl1.Globe.StatusBar.Visible = !globeControl1.Globe.StatusBar.Visible;
            buttonItem21.Checked = globeControl1.Globe.StatusBar.Visible;
            //btnToolNone.Visible = true;
            //btnToolSelect.Visible = true;
            globeControl1.Globe.Refresh();
        }

        private void buttonItem22_Click(object sender, EventArgs e)//大理石表面
        {
            globeControl1.Globe.MarbleVisible = !globeControl1.Globe.MarbleVisible;
            buttonItem22.Checked = globeControl1.Globe.MarbleVisible;
        }

        private void buttonItem25_Click(object sender, EventArgs e)
        {
            if (globeControl1.Globe.Atmosphere.Visible)
            {
                globeControl1.Globe.Atmosphere.ShaderUsing = !globeControl1.Globe.Atmosphere.ShaderUsing;
                buttonItem25.Checked = !buttonItem25.Checked;
                globeControl1.Refresh();
            }
            else
            {
                MessageBox.Show("请先设置大气层可见!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
            }
        }

        private void buttonItem24_Click(object sender, EventArgs e)
        {
            globeControl1.Globe.Antialiasing = !globeControl1.Globe.Antialiasing;
            buttonItem24.Checked = globeControl1.Globe.Antialiasing;
            globeControl1.Refresh();
        }

        private void buttonItem52_Click(object sender, EventArgs e)
        {
            FrmSceneLightSet dlg = new FrmSceneLightSet();
            dlg.light = globeControl1.Globe.SceneLight;
            dlg.globeControl = globeControl1;
            if (dlg.ShowDialog() == DialogResult.OK)
            {

            }
        }

        private void buttonItem53_Click(object sender, EventArgs e)//模型点模式
        {
            globeControl1.Globe.ModelRenderDetail = EnumRenderDetail.Points;
            buttonItem53.Checked = true;
            buttonItem54.Checked = false;
            buttonItem55.Checked = false;
            buttonItem58.Checked = false;
            globeControl1.Refresh();
        }

        private void buttonItem54_Click(object sender, EventArgs e)//模型实体模式
        {
            globeControl1.Globe.ModelRenderDetail = EnumRenderDetail.Solid;
            buttonItem54.Checked = true;
            buttonItem53.Checked = false;
            buttonItem55.Checked = false;
            buttonItem58.Checked = false;
            globeControl1.Refresh();
        }

        private void buttonItem55_Click(object sender, EventArgs e)//模型纹理模式
        {
            globeControl1.Globe.ModelRenderDetail = EnumRenderDetail.Texture;
            buttonItem54.Checked = false;
            buttonItem53.Checked = false;
            buttonItem55.Checked = true;
            buttonItem58.Checked = false;
            globeControl1.Refresh();
        }

        private void buttonItem58_Click_1(object sender, EventArgs e)//模型线框模式
        {
            globeControl1.Globe.ModelRenderDetail = EnumRenderDetail.WireFrame;
            buttonItem54.Checked = false;
            buttonItem53.Checked = false;
            buttonItem55.Checked = false;
            buttonItem58.Checked = true;
            globeControl1.Refresh();
        }

        private void buttonItem60_Click(object sender, EventArgs e)
        {
            globeControl1.Globe.UsingFBO = !globeControl1.Globe.UsingFBO;
            buttonItem60.Checked = globeControl1.Globe.UsingFBO;
            globeControl1.Refresh();
        }

        private void buttonItem61_Click(object sender, EventArgs e)
        {
            globeControl1.Globe.UsingVBO = !globeControl1.Globe.UsingVBO;
            buttonItem61.Checked = globeControl1.Globe.UsingVBO;
            globeControl1.Refresh();
        }

        private void buttonItem92_Click(object sender, EventArgs e)//飞行到目标点
        {            
               //{
               //    //for (int i = 0; i <Utility.dataSource.DatasetCount; i++)
               //    //{
               //    //    GSODataset dataset = Utility.dataSource.GetDatasetAt(i);
               //    //    if (dataset != null && dataset.Name == "大兴热力管线" || dataset.Name == "大兴热力工井" || dataset.Name == "大兴热力阀门")
               //    //    {
               //    //        dataset.Caption = dataset.Name;
               //    //        GSOLayer layer = globeControl1.Globe.Layers.Add(dataset);
               //    //        //layer.MaxVisibleAltitude = 7000;
               //    //        //listLayerCaption.Add(layer.Caption);
               //    //    }
               //    //}
               //}
               //globeControl1.Globe.FlyToPosition(new GSOPoint3d(116.281704, 39.746679, 0), EnumAltitudeMode.RelativeToGround);
            FrmSetFlytoPos.ShowForm(globeControl1);
           
        }

        private void buttonItem56_Click(object sender, EventArgs e)//绕中心点飞行
        {
            globeControl1.Globe.FlyAroundCenter(10000, EnumFlyRepeatValueType.MiliSeconds);
            globeControl1.Globe.CurFlyID = 1;
        }

        private void buttonItem57_Click(object sender, EventArgs e)//绕眼睛飞行
        {
            globeControl1.Globe.FlyAroundEye(720, EnumFlyRepeatValueType.Degrees);
            globeControl1.Globe.CurFlyID = 2;
        }

        private void buttonItem15_Click(object sender, EventArgs e)//自定义飞行
        {
            GSOGeoPolyline3D line = getSelectObject();
            if (line == null)
            {
                MessageBox.Show("请先选中一条线!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
                globeControl1.Globe.Action = EnumAction3D.SelectObject;
                return;
            }
            FrmFlySetDlg dlg = new FrmFlySetDlg();
            dlg.dFlyAboveLine = m_dFlyAboveLine;
            dlg.dFlyAloneLineSpeed = m_dFlyAlongLineSpeed;
            dlg.dFlyAloneLineRotateSpeed = m_dFlyAlongLineRotateSpeed;
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                m_dFlyAboveLine = dlg.dFlyAboveLine;
                m_dFlyAlongLineSpeed = dlg.dFlyAloneLineSpeed;
                m_dFlyAlongLineRotateSpeed = dlg.dFlyAloneLineRotateSpeed;
                globeControl1.Globe.FlyAlongLineSpeed = m_dFlyAlongLineSpeed;
                globeControl1.Globe.FlyAlongLineRotateSpeed = m_dFlyAlongLineRotateSpeed;
                globeControl1.Globe.FlyEyeAlongWithLine(line, m_dFlyAboveLine, 85, true, 0, false);
            }
        }
        private GSOGeoPolyline3D getSelectObject()
        {
            GSOGeoPolyline3D line = null;
            GSOFeature f = globeControl1.Globe.SelectedObject;
            if (f != null && f.Geometry != null)
            {
                line = f.Geometry as GSOGeoPolyline3D;
            }
            return line;
        }

        private void btnAddData_Click(object sender, EventArgs e)
        {
            AddLayerData();
        }
        private void AddLayerData()
        {
            OpenFileDialog dlg = new OpenFileDialog();
            //dlg.Filter = "支持格式(*.lrp,*.tif,*.tiff,*.img,*.asc,*.raw,*.dem,*.adf,*.idr,* .sid,*.ecw,*.e00,*.ers,*.hdr,*.grd,*.lrc,*.git,*.gtt,*.kml,*.lgd,*.shp,*.dxf,*.mif,*.tab,*.dgn,*.vec,*.gml,*.gft)|*.lrp;*.tif;*.tiff;*.img;*.asc;*.raw;*.dem;*.adf;*.idr;*.sid;*.ecw;*.e00;*.ers;*hdr;*.grd;*.lrc;*.git;*.gtt;*.kml;*.lgd;*.shp;*.dxf;*.mif;*.tab;*.dgn;*.vec;*.gml;*.gft|栅格数据(*.lrp)|*.lrp|栅格缓存(*.lrc)|*.lrc|KML数据(*.kml)|*.kml|矢量数据(*.lgd)|*.lgd|矢量缓存(*.gft)|*.gft|其它格式(*.*)|*.*||";
            dlg.Filter = "支持格式(*.lrp,*.tif,*.tiff,*.img,*.lrc,*.git,*.gtt,*.kml,*.lgd,*.shp,*.gft)|*.lrp;*.tif;*.tiff;*.img;*.lrc;*.git;*.gtt;*.kml;*.lgd;*.shp;*.gft|栅格数据(*.lrp)|*.lrp|栅格缓存(*.lrc)|*.lrc|KML数据(*.kml)|*.kml|矢量数据(*.lgd)|*.lgd|矢量缓存(*.gft)|*.gft|其它格式(*.*)|*.*||";
            dlg.Multiselect = true;
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                for (int i = 0; i < dlg.FileNames.Length; i++)
                {
                    AddLayerData(dlg.FileNames[i]);
                }
                layerManagerNode.Expand();
            }
        }
        private object AddLayerData(string strDataPath)
        {
            object objRes = null;
            if (Path.GetExtension(strDataPath).ToLower().Equals(".kml"))
            {
                GSOLayer layer = globeControl1.Globe.Layers.Add(strDataPath);
                objRes = layer;
                if (layer != null)
                {
                    GSODataset dataset = layer.Dataset;
                    CheckDatasetGeoReference(layer.Dataset);
                    TreeNode node = new TreeNode();
                    node.Tag = layer;
                    node.Text = layer.Dataset.Caption;
                    node.ImageIndex = 0;
                    node.SelectedImageIndex = 0;
                    node.Checked = layer.Visible;
                    // 注意用insert不要用add,因为后加入的图层在上层
                    //layerManagerNode.Nodes.Add(node);
                    layerManagerNode.Nodes.Insert(0, node);
                }
            }
            else if (GSOUtility.IsDatasetSupportTerrain(strDataPath))
            {
                GSOTerrain terrain = globeControl1.Globe.Terrains.Add(strDataPath);
                objRes = terrain;
                if (terrain != null)
                {
                    TreeNode node = new TreeNode();
                    node.Tag = terrain;
                    node.Text = terrain.Caption;
                    node.ImageIndex = 0;
                    node.SelectedImageIndex = 0;
                    node.Checked = terrain.Visible;
                    // 注意用insert不要用add,因为后加入的图层在上层
                    // terrainManagerNode.Nodes.Add(node);
                    layerManagerNode.Nodes.Insert(0, node);
                }
            }
            else
            {
                GSOLayer layer = globeControl1.Globe.Layers.Add(strDataPath);
                objRes = layer;
                if (layer != null)
                {
                    GSODataset dataset = layer.Dataset;
                    CheckDatasetGeoReference(layer.Dataset);
                    TreeNode node = new TreeNode();
                    node.Tag = layer;
                    node.Text = layer.Dataset.Caption;
                    node.ImageIndex = 0;
                    node.SelectedImageIndex = 0;
                    node.Checked = layer.Visible;
                    // 注意用insert不要用add,因为后加入的图层在上层
                    //layerManagerNode.Nodes.Add(node);
                    layerManagerNode.Nodes.Insert(0, node);
                }
            }

            //RefreshDataTree();
            return objRes;

        }
        private void RefreshDataTree()
        {
            layerTree.Nodes[0].Nodes.Clear();
            Int32 nCount = globeControl1.Globe.DataManager.DataSourceCount;
            Int32 i = 0;
            for (i = 0; i < nCount; i++)
            {
                GSODataSource dataSpace = globeControl1.Globe.DataManager[i];
                TreeNode node = new TreeNode();
                node.Text = dataSpace.Name;
                node.ImageIndex = 0;
                node.SelectedImageIndex = 0;
                node.Checked = true;
                node.Tag = dataSpace;
                Int32 nDatasetCount = dataSpace.DatasetCount;
                for (Int32 j = 0; j < nDatasetCount; j++)
                {
                    GSODataset dataset = dataSpace[j];
                    TreeNode subNode = new TreeNode();
                    subNode.Text = dataset.Name;
                    subNode.ImageIndex = 0;
                    subNode.SelectedImageIndex = 0;
                    subNode.Checked = true;
                    subNode.Tag = dataset;
                    node.Nodes.Add(subNode);
                }
                layerTree.Nodes[0].Nodes.Add(node);
            }
        }

        private void buttonItem90_Click(object sender, EventArgs e)//关键字查询
        {            
            FrmKeywordQuery.ShowForm(globeControl1, pipelineLayerNames, dataGridViewX1, panelEx6, toolStripNumbers, toolStripFeatureLength);           
        }

        private void buttonItem103_Click(object sender, EventArgs e)//附属物查询
        {
            FrmFittingQuery.ShowForm(globeControl1, instrumenLayerNames, dataGridViewX1, panelEx6, toolStripNumbers, toolStripFeatureLength);            
        }

        private void buttonItem106_Click(object sender, EventArgs e)//基本查询
        {
            FrmBasicQuery.ShowForm(globeControl1,dataGridViewX1,panelEx6, toolStripNumbers, toolStripFeatureLength);            
        }

        private void buttonItem107_Click(object sender, EventArgs e)//复合查询
        {
            if (dataGridViewX1.DataSource != null)
            {
                dataGridViewX1.DataSource = null;
                toolStripNumbers.Text = " 管线类型: " + currentQueryLayer + "|| 共有:" + 0 + " 条记录 || ";
            }
            List<string> newLayer = new List<string>();
            foreach (TreeNode node in layerTree.Nodes)
            {
                if (node.Text == "新添加图层")
                {
                    foreach (TreeNode nodeChild in node.Nodes)
                    {
                        if (nodeChild.Tag.ToString().Split('|')[1].ToString().Contains("管线"))
                        {
                            if (isornotFeatureDataset(nodeChild.Tag.ToString().Split('|')[1].ToString()))
                            {
                                newLayer.Add(nodeChild.Tag.ToString().Split('|')[1].ToString());
                            }
                        }
                    }

                }
            }
            FrmQuerySQL.ShowForm(globeControl1, dataGridViewX1,"admin", newLayer);
            
        }
        GSOFeatureDataset FdataSet;
        GSODataset dataSet;
        private bool isornotFeatureDataset(string layerName)
        {
            GSOLayer m_layer = globeControl1.Globe.Layers.GetLayerByCaption(layerName);//获取当前选择的layer图层
            if (m_layer == null)
                return false;
            GSOFeatureLayer flayer = m_layer as GSOFeatureLayer;
            dataSet = m_layer.Dataset as GSODataset;
            FdataSet = dataSet as GSOFeatureDataset;
            FdataSet.Open();
            if (FdataSet.FieldCount > 0)
                return true;
            else
                return false;
        }

        private void buttonItem59_Click(object sender, EventArgs e)//井盖全区域
        {
            workWellLen.Clear();
            List<GSOFeatures> list = new List<GSOFeatures>();
            for (int i = 0; i < workwellLayerNames.Count; i++)
            {
                GSOFeatures fs = PolygonIntersectAnalysis_Well(null, workwellLayerNames[i]);
                list.Add(fs);
            }
            
            FrmAllWorkWellStatis frm = new FrmAllWorkWellStatis(workWellLen, list, dataGridViewX1, toolStripNumbers, globeControl1,panelEx6);
            frm.Show(this);
            
        }
        private GSOFeatures feats_wushui_well;
        private GSOFeatures feats_yushuib_well;
        private GSOFeatures feats_yushuij_well;
        private GSOFeatures feats_ranqi_well;
        private GSOFeatures PolygonIntersectAnalysis_Well(GSOGeoPolygon3D polygon, string pipelinetype)//全区域管线统计
        {
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(pipelinetype);
            if (layer == null)
                return null;

            GSOFeatureLayer flayer = layer as GSOFeatureLayer;
            GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
            GSOFeatures feats;
            if (polygon == null)
            {
                feats = flayer.GetAllFeatures();
            }
            else
            {
                feats = flayer.FindFeaturesInPolygon(polygon, false);
            }
           
            workWellLen.Add(pipelinetype, feats.Length);
            return feats;
           
        }
        private void buttonItem62_Click(object sender, EventArgs e)
        {
            trackflag = "workwellquery";
            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
        }

        private void checkBoxX3_CheckedChanged(object sender, EventArgs e)
        {
            clearFeatureHighLight();
            if (checkBoxX3.Checked)
            {
                globeControl1.Globe.ClearAnalysis();
                layerTemp.RemoveAllFeature();
                globeControl1.Refresh();
                comboBoxEx2.Enabled = false;
                dataGridViewX4.Rows.Clear();
                dataGridViewX5.Rows.Clear();
                trackflag = "collision";
                globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
            else
            {
                comboBoxEx2.Enabled = true;
            }
        }

        private void checkBoxX4_CheckedChanged(object sender, EventArgs e)
        {
            clearFeatureHighLight();
            comboBoxEx2.Enabled = checkBoxX4.Checked;
            if (checkBoxX4.Checked)
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                trackflag = "";
                dataGridViewX4.Rows.Clear();
                dataGridViewX5.Rows.Clear();
                
                comboBoxEx2.SelectedIndex = -1;
                
            }
            globeControl1.Globe.ClearAnalysis();
            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }

        private void comboBoxEx2_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBoxEx2.SelectedIndex > -1)
            {
                listBox2.Items.Clear();
                dataGridViewX4.Rows.Clear();
                dataGridViewX5.Rows.Clear();
                GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx2.SelectedItem.ToString());
                if (layer == null)
                    return;

                GSOFeatureLayer flayer = layer as GSOFeatureLayer;
                GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
                GSOFeatures feats = flayer.GetAllFeatures();
                for (int i = 0; i < feats.Length; i++)
                {
                    int idx = dataGridViewX4.Rows.Add();
                    dataGridViewX4.Rows[idx].Cells[0].Value = comboBoxEx2.SelectedItem.ToString();
                    dataGridViewX4.Rows[idx].Cells[1].Value = feats[i].Name;
                }
            }
        }

        private void clearFeatureHighLight()
        {
            for (int i = 0; i < globeControl1.Globe.Layers.Count; i++)
            {
                GSOLayer layer = globeControl1.Globe.Layers[i];
                if (layer is GSOFeatureLayer)
                {
                    GSOFeatures feats = layer.GetAllFeatures();
                    for (int j = 0; j < feats.Length; j++)
                    {
                        GSOFeature feat = feats[j];
                        feat.HighLight = false;
                        GSOLineStyle3D lineStyle = feat.Geometry.Style as GSOLineStyle3D;
                        if (lineStyle != null)
                        {
                            lineStyle.ArrowVisible = false;
                            feat.Geometry.SetModified(true);
                        }
                    }
                }
            }
            if (globeControl1.Globe.Action == EnumAction3D.SelectObject)
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
        }
        private void clearFeatureHighLightIgnoreSelectObject()
        {
            for (int i = 0; i < globeControl1.Globe.Layers.Count; i++)
            {
                GSOLayer layer = globeControl1.Globe.Layers[i];
                if (layer is GSOFeatureLayer)
                {
                    GSOFeatures feats = layer.GetAllFeatures();
                    for (int j = 0; j < feats.Length; j++)
                    {
                        GSOFeature feat = feats[j];
                        feat.HighLight = false;
                        GSOLineStyle3D lineStyle = feat.Geometry.Style as GSOLineStyle3D;
                        if (lineStyle != null)
                        {
                            lineStyle.ArrowVisible = false;
                            feat.Geometry.SetModified(true);
                        }
                    }
                }
            }           
        }
        private void buttonItem63_Click(object sender, EventArgs e)//碰撞分析
        {
            layerTemp.RemoveAllFeature();
            clearFeatureHighLight();
            globeControl1.Refresh();

            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = true;
            buttonItem1.Checked = true;
            controlContainerItem3.Visible = true;
            sideBarPanelItem4.Visible = true;
            sideBarPanelItem4.Text = "碰撞分析";
            trackflag = "collision";
            //globeControl1.Globe.Action = EnumAction3D.SelectObject;
            panel1.Visible = false;
            panel3.Visible = false;
            panel4.Visible = false;
            panel5.Visible = false;
            panelEx1.Visible = false;
            controlContainerItem5.Control = panel2;
            panel2.Dock = DockStyle.Fill;
            panel2.Visible = true;
            sideBar1.ExpandedPanel = sideBarPanelItem4;
            sideBar1.Refresh();
            Refresh();
        }

        private void buttonX7_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < polygonJingJuAnalysises.Length; i++)
            {
                polygonJingJuAnalysises[i].Delete();
            }
            globeControl1.Globe.Refresh();
            //trackflag = "";
          
            //globeControl1.Globe.Action = EnumAction3D.ActionNull;
            //sideBarPanelItem4.Visible = false;
            //panel2.Visible = false;
            //checkBoxX3.Checked = false;
            //checkBoxX4.Checked = false;
            //comboBoxEx2.SelectedIndex = -1;
            //dataGridViewX4.Rows.Clear();
            //dataGridViewX5.Rows.Clear();
            //if (buttonItem1.Checked)
            //{
            //    sideBar1.ExpandedPanel = sideBarPanelItem3;
            //}
            //else
            //{
            //    sideBar1.Visible = false;
            //}

            //Refresh();
        }

        private void buttonX5_Click(object sender, EventArgs e)//碰撞分析
        {
            if (!checkBoxX3.Checked && !checkBoxX4.Checked)
            {
                MessageBox.Show("请确定是选择管线还是选择图层!", "提示");
                return;
            }
            if (dataGridViewX4.Rows.Count > 0)
            {
                featLenth.Clear();
                featCount.Clear();
                listBox2.Items.Clear();
                layerTemp.RemoveAllFeature();
                polygonJingJuAnalysises.RemoveAll();
                dataGridViewX5.Rows.Clear();
                clearFeatureHighLightIgnoreSelectObject();
                if (checkBoxX3.Checked)
                {
                    for (int i = 0; i < dataGridViewX4.Rows.Count; i++)
                    {
                        GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX4.Rows[i].Cells[0].Value.ToString());
                        if (l != null)
                        {
                            GSOFeatureLayer flayer = l as GSOFeatureLayer;
                            GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
                            GSOFeatures feats = flayer.GetAllFeatures();
                            for (int j = 0; j < feats.Length; j++)
                            {
                                if (feats[j].Name == dataGridViewX4.Rows[i].Cells[1].Value.ToString())
                                {
                                    CollisionAnalysis(1, l.Caption, feats[j], 0);
                                }
                            }
                        }
                    }
                }
                else if (checkBoxX4.Checked)
                {
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx2.SelectedItem.ToString());
                    if (layer == null)
                        return;

                    GSOFeatureLayer flayer = layer as GSOFeatureLayer;
                    GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
                    GSOFeatures feats = flayer.GetAllFeatures();
                    for (int i = 0; i < feats.Length; i++)
                    {
                        CollisionAnalysis(1, layer.Caption, feats[i], 0);
                    }
                }

                if (featCount.Count > 0)
                {
                    for (int i = 0; i < pipelineLayerNames.Count; i++)
                    {
                        if (featCount.ContainsKey(pipelineLayerNames[i]) && featLenth.ContainsKey(pipelineLayerNames[i]))
                        {
                            listBox2.Items.Add(pipelineLayerNames[i] + ":" + featCount[pipelineLayerNames[i]] + "条,共" + featLenth[pipelineLayerNames[i]].ToString("0.00") + "米");
                        }
                    }
                }
                if (dataGridViewX5.Rows.Count == 0)
                {
                    MessageBox.Show("没有发生碰撞的管线!", "提示");
                }                
            }
            else
            {
                MessageBox.Show("请选中要进行碰撞分析的管线!", "提示");
                //globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
            globeControl1.Refresh();
            
        }

        private void buttonX8_Click(object sender, EventArgs e)
        {
            trackflag = "";
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            

            listBox2.Items.Clear();
            
            checkBoxX3.Checked = false;
            checkBoxX4.Checked = false;
            comboBoxEx2.SelectedIndex = -1;
            comboBoxEx2.Enabled = false;
            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
            dataGridViewX4.Rows.Clear();
            dataGridViewX5.Rows.Clear();
        }

        private void buttonX6_Click(object sender, EventArgs e)
        {
            if (dataGridViewX5.Rows.Count > 0)
            {
                SaveFileDialog dlg = new SaveFileDialog();
                dlg.Filter = "Excel files (*.xls)|*.xls";
                dlg.FilterIndex = 0;
                dlg.RestoreDirectory = 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
                    {
                        string strList = "";
                        for (int i = 0; i < listBox2.Items.Count; i++)
                        {
                            strList += listBox2.Items[i].ToString() + @"/";
                        }
                        sw.WriteLine("内容:碰撞分析结果  日期:" + DateTime.Now.ToString("yyyy-MM-dd") + " 结果:" + strList);

                        //写入列标题   
                        for (int i = 0; i < dataGridViewX5.ColumnCount; i++)
                        {
                            if (i > 0)
                            {
                                columnTitle += "\t";
                            }
                            columnTitle += dataGridViewX5.Columns[i].HeaderText;
                        }
                        sw.WriteLine(columnTitle);

                        //写入列内容   
                        for (int j = 0; j < dataGridViewX5.Rows.Count; j++)
                        {
                            string columnValue = "";
                            for (int k = 0; k < dataGridViewX5.Columns.Count; k++)
                            {
                                if (k > 0)
                                {
                                    columnValue += "\t";
                                }
                                if (dataGridViewX5.Rows[j].Cells[k].Value == null)
                                    columnValue += "";
                                else
                                    columnValue += dataGridViewX5.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();
                    }
                }
            }
        }

        private void panel5_VisibleChanged(object sender, EventArgs e)
        {
            //if (panel5.Visible == false)
            //{
            //    trackflag = "";

            //    listBox3.Items.Clear();

            //    checkBoxX7.Checked = false;
            //    checkBoxX8.Checked = false;
            //    comboBoxEx4.SelectedIndex = -1;
            //    comboBoxEx4.Enabled = false;
            //    dataGridViewX8.Rows.Clear();
            //    dataGridViewX9.Rows.Clear();
            //}
        }
        private void panel1_VisibleChanged(object sender, EventArgs e)
        {
            //if (panel1.Visible == false)
            //{
            //    trackflag = "";
               
            //    listBox1.Items.Clear();
               
            //    checkBoxX1.Checked = false;
            //    checkBoxX2.Checked = false;
            //    comboBoxEx1.SelectedIndex = -1;
            //    comboBoxEx1.Enabled = false;
            //    dataGridViewX2.Rows.Clear();
            //    dataGridViewX3.Rows.Clear();
            //}
        }

        private void panel2_VisibleChanged(object sender, EventArgs e)
        {
            if (panel2.Visible == false)
            {
                //trackflag = "";
                
                //listBox2.Items.Clear();
                
                //checkBoxX3.Checked = false;
                //checkBoxX4.Checked = false;
                //comboBoxEx2.SelectedIndex = -1;
                //comboBoxEx2.Enabled = false;
                //dataGridViewX4.Rows.Clear();
                //dataGridViewX5.Rows.Clear();
            }
        }

        private void btnExportCAD_Click(object sender, EventArgs e)
        {
            FrmExportCADS frm = new FrmExportCADS(globeControl1);
            frm.ShowDialog();
            //try
            //{
            //    TreeNode node = layerTree.SelectedNode;
            //    if (node == null)
            //    {
            //        MessageBox.Show("请选择要导出的管线类型!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            //        return;
            //    }
            //    if (node.Tag != null)
            //    {
            //        if (node.Tag.ToString().Contains("|"))
            //        {
            //            if (node.Tag.ToString().Split('|')[1].Contains("管线"))
            //            {
            //                try
            //                {
            //                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(node.Tag.ToString().Split('|')[1]);
            //                    layer.Dataset.ImportProjectionRefFromProj4("+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=499885 +y_0=6 +ellps=krass +units=m +no_defs");
            //                    SaveFileDialog dlg = new SaveFileDialog();
            //                    dlg.Filter = "*.dxf|*.dxf";
            //                    if (dlg.ShowDialog() == DialogResult.OK)
            //                    {
            //                        if (layer.GetAllFeatures().Length <= 0)
            //                        {
            //                            MessageBox.Show("要导出的图层为空", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            //                            return;
            //                        }
            //                        if (layer.GetAllFeatures().Length > 0)
            //                        {
            //                            layer.SaveAs(dlg.FileName);
            //                            MessageBox.Show("导出CAD完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            //                        }
            //                    }
            //                }
            //                catch (Exception ex)
            //                {
            //                    LogError.PublishError(ex);
            //                }
            //            }
            //            else
            //            {
            //                MessageBox.Show("请选择要导出的管线类型!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            //                return;
            //            }
            //        }
            //        else
            //        {
            //            MessageBox.Show("请选择要导出的管线类型!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            //            return;
            //        }
            //    }
            //}
            //catch (Exception ex)
            //{
            //    MessageBox.Show(ex.Message);
            //    LogError.PublishError(ex);
            //}
        }
        private Boolean MerageToFile(GSOFeatures features, String strDestFile, String strProj4)//图层追加
        {

            if (features == null)
            {
                return false;
            }
            Boolean bSuccess = false;

            string strDir = GSOUtility.GetFileDir(strDestFile);
            string strLPRJFile = GSOUtility.ChangeExt(strDestFile, ".lprj");
            string strExt = GSOUtility.GetFileExt(strDestFile);

            // 如果投影文件存在,投影以投影文件为准
            if (File.Exists(strLPRJFile))
            {
                // 如果是dxf,则这样处理
                if (strExt.ToLower() == ".dxf")
                {
                    string strTempSrcFile = strDir + "srcFeatures_dxftmp" + strExt;
                    globeControl1.Globe.DataManager.SaveFeatureData(features, strTempSrcFile, strLPRJFile, 4);
                    bSuccess = GSOUtility.MergeTwoDXFFileFeatures(strDestFile, strTempSrcFile);
                    File.Delete(strTempSrcFile);
                }
                else
                {
                    GSOFeatures srcFeatures = globeControl1.Globe.DataManager.ReadFeatureData(strDestFile);
                    int nCount = features.Length;
                    int i = 0;
                    for (i = 0; i < nCount; i++)
                    {
                        srcFeatures.Add(features[i]);
                    }
                    bSuccess = globeControl1.Globe.DataManager.SaveFeatureData(srcFeatures, strDestFile, strLPRJFile, 4);
                }
            }
            else
            {
                // 如果是dxf,则这样处理
                if (strExt.ToLower() == ".dxf")
                {
                    string strTempSrcFile = strDir + "srcFeatures_dxftmp" + strExt;
                    globeControl1.Globe.DataManager.SaveFeatureData(features, strTempSrcFile, strProj4, 0);
                    bSuccess = GSOUtility.MergeTwoDXFFileFeatures(strDestFile, strTempSrcFile);
                    File.Delete(strTempSrcFile);
                }
                else
                {
                    GSOFeatures srcFeatures = globeControl1.Globe.DataManager.ReadFeatureData(strDestFile);
                    int nCount = features.Length;
                    int i = 0;
                    for (i = 0; i < nCount; i++)
                    {
                        srcFeatures.Add(features[i]);
                    }
                    bSuccess = globeControl1.Globe.DataManager.SaveFeatureData(srcFeatures, strDestFile, strProj4, 0);
                }

            }
            return bSuccess;

        }

        private void buttonItem64_Click(object sender, EventArgs e)
        {
            //Point pt1 = new Point(Convert.ToInt32(e.StartPos.X), Convert.ToInt32(e.StartPos.Y));
            //Point pt2 = new Point(Convert.ToInt32(e.EndPos.X), Convert.ToInt32(e.EndPos.Y));
            //Point pt = getUpperLeftPoint(pt1, pt2);
            //Image myImg = new Bitmap(Convert.ToInt32(e.Rect.Width), Convert.ToInt32(e.Rect.Height));
            //Graphics g = Graphics.FromImage(myImg);
            //g.CopyFromScreen(pt, new Point(0, 0), new Size(Convert.ToInt32(e.Rect.Width), Convert.ToInt32(e.Rect.Height)));

            //SaveFileDialog dlg = new SaveFileDialog();
            //dlg.Filter = "输出JPEG(*.jpg)|*.jpg|输出PNG(*.png)|*.png|输出BMP(*.bmp)|*.bmp|输出BMP(*.gif)|*.gif";
            //if (dlg.ShowDialog() == DialogResult.OK)
            //{
            //    string extension = System.IO.Path.GetExtension(dlg.FileName);//扩展名 
            //    switch (extension)
            //    {
            //        case ".jpg":
            //            myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
            //            break;
            //        case ".png":
            //            myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Png);
            //            break;
            //        case ".bmp":
            //            myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
            //            break;
            //        case ".gif":
            //            myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Gif);
            //            break;
            //        default:
            //            break;
            //    }
            //}
        }

        private void buttonItem50_Click(object sender, EventArgs e)
        {
            buttonItem50.Checked = !buttonItem50.Checked;
            ribbonBarQY.Visible = buttonItem50.Checked;
            ribbonBarQY.Location = new Point(0, 0);
        }
        int openFrmNum = 0;
        public static GeoScene.Engine.GSODataSource ds = null;
        private void buttonItem71_Click(object sender, EventArgs e)//连接数据库
        {
             FrmDatabaseParaSetting frm = new FrmDatabaseParaSetting(globeControl1);
             if (frm.ShowDialog() == DialogResult.OK)
             {
                 ds = FrmDatabaseParaSetting.ds;
                 if (ds != null)
                 {
                     ds.IsCloseSaved = false;
                 }
                 switch (openFrmNum)
                 {
                     case 1:
                         openFrmNum = 0;
                         buttonItem65_Click(sender, e);
                         break;
                     case 2:
                         openFrmNum = 0;
                         buttonItem66_Click(sender, e);
                         break;
                     case 3:
                         openFrmNum = 0;
                         buttonItem67_Click(sender, e);
                         break;
                     case 4:
                         openFrmNum = 0;
                         buttonItem79_Click(sender, e);
                         break;
                 }
             }
        }
        private void buttonItem80_Click(object sender, EventArgs e)//数据验证
        {
            FrmValiData frm = new FrmValiData(globeControl1);
            frm.ShowDialog();
        }
        private void buttonItem65_Click(object sender, EventArgs e)//工井入库
        {
            if (ds == null)
            {
                openFrmNum = 1;
                MessageBox.Show("请先连接数据库", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                buttonItem71_Click(sender, e);
                return;
            }
            FrmAddWellShp frm = new FrmAddWellShp(globeControl1, ds);
            frm.ShowDialog();
        }

        private void buttonItem66_Click(object sender, EventArgs e)//雨水篦水井入库
        {
            if (ds == null)
            {
                openFrmNum = 2;
                MessageBox.Show("请先连接数据库", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                buttonItem71_Click(sender, e);
                return;
            }
            FrmAddYuBiZiShp yubi = new FrmAddYuBiZiShp(globeControl1, ds);
            yubi.ShowDialog();
        }

        private void buttonItem67_Click(object sender, EventArgs e)//阀门入库
        {
            if (ds == null)
            {
                openFrmNum = 3;
                MessageBox.Show("请先连接数据库", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                buttonItem71_Click(sender, e);
                return;
            }
            FrmAddValve frm = new FrmAddValve(globeControl1, ds);
            frm.ShowDialog();
        }
        private void buttonItem79_Click(object sender, EventArgs e)//管线入库
        {
            if (ds == null)
            {
                openFrmNum = 4;
                MessageBox.Show("请先连接数据库", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                buttonItem71_Click(sender, e);
                return;
            }
            Cyberpipe.Forms.FrmPipelineModelDB frm = new Cyberpipe.Forms.FrmPipelineModelDB(globeControl1, ds);
            frm.ShowDialog();
        }
        private void btnBackDatabase_Click(object sender, EventArgs e)//数据库备份
        {
            if (MessageBox.Show("是否确定要备份数据库文件", "信息", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                try
                {
                    DateTime currentTime = DateTime.Now;
                    //string Dtime = currentTime.ToShortDateString().ToString("yyyy-MM-dd");
                    string Dtime = currentTime.GetDateTimeFormats('D')[0].ToString();
                    string Htime = DateTime.Now.ToString("HH时mm分ss秒").Trim();
                    string fileName = Dtime + "(" + Htime + ")";
                    string pathName = "";
                    string sql = "select filename from master..sysdatabases where name='" + Utility.dbdatabase + "'";
                    DataTable dt = OledbHelper.ExecuteDataTable(sql);
                    if (dt != null && dt.Rows.Count > 0)
                    {
                        pathName = dt.Rows[0][0].ToString().Trim();
                        int count = pathName.LastIndexOf("\\") == -1 ? pathName.LastIndexOf("/") : pathName.LastIndexOf("\\");
                        pathName = pathName.Substring(0, count);
                    }
                    pathName += "\\管网数据库" + fileName + ".bak";

                    SqlCommand cmdBK = new SqlCommand();
                    cmdBK.CommandType = CommandType.Text;
                    cmdBK.Connection = connBackup;
                    cmdBK.CommandText = @"backup database " + Utility.dbdatabase + " to disk='" + pathName + "' with init";

                    connBackup.Open();
                    cmdBK.ExecuteNonQuery();
                    MessageBox.Show("数据库文件备份成功", "提示");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    LogError.PublishError(ex);
                }
                finally
                {
                    connBackup.Close();                   
                }
            }

        }

        private void buttonItem68_Click(object sender, EventArgs e)//缓冲分析
        {
            GSOFeature feat = globeControl1.Globe.SelectedObject;
            if (feat == null)
            {
                MessageBox.Show("请选择一条管线!");
                buttonItem97.Checked = false;
                return;
            }
            GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D;
            if (line1 == null)
            {
                MessageBox.Show("请选择一条管线!");
                buttonItem97.Checked = false;
                return;
            }

            FrmBufferAnalysis frm = new FrmBufferAnalysis(globeControl1, line1,layerTemp);
            frm.ShowDialog();
        }

        private void buttonItem70_Click(object sender, EventArgs e)//爆管分析
        {
            ClearCloseValvesAnalysis();
            if (globeControl1.Globe.SelObjectCount < 1)
            {
                MessageBox.Show("请选中至少一个管线!!");                
                return;
            }
            GSOLayer resLayer = null;
            GSOFeature resFeature = null;
            globeControl1.Globe.GetSelectObject(0, out resFeature, out resLayer);
           
            GSOGeoPolyline3D line1 = resFeature.Geometry as GSOGeoPolyline3D;
            if (line1 == null)
            {
                MessageBox.Show("请选择管线!!");
                return;
            }
            GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D;
            if (pipeStyle1 == null)
            {
                MessageBox.Show("请选择管线!!");
                return;
            }
            if (emitterFeature != null)
            {
                globeControl1.Globe.MemoryLayer.RemoveFeatureByID(emitterFeature.ID);
            }

            GSOPoint3d pt = new GSOPoint3d();
            double length = line1.GetSpaceLength(true, 6378137);//线的长度
            GSOGeoPolyline3D lineLine = line1.GetSegment(0, length / 2);
            GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1];
            pt.X = point3d.X;
            pt.Y = point3d.Y;
            pt.Z = point3d.Z ;
           
            pt.Z += pipeStyle1.Radius * 2;

            globeControl1.Globe.UnderGroundFloor.Visible = true;
            if (resLayer.Caption.Contains("气"))
            {
                AddFire(pt.X, pt.Y, pt.Z);
            }
            else if (resLayer.Caption.Contains("给水"))
            {
                AddFountain(pt.X, pt.Y, pt.Z);
            }
            else if (resLayer.Caption.Contains("热力"))
            {
                AddFountain(pt.X, pt.Y, pt.Z);
            }
            GSOPoint3d resIntersetPoint = new GSOPoint3d();
            if (NetworkBoosterValvesAnalysis(resFeature, resIntersetPoint, resLayer))
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
            }
        }
        GSOFeature emitterFeature;
        // 添加火苗
        private GSOFeature AddFire(double x, double y, double z)
        {
            string strResPath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource";
            //  烟火粒子示例,由三个发射器构成
            GSOGeoParticle geoParticle = new GSOGeoParticle();
            geoParticle.SetPosition(x, y, z); // 添加到这个经纬度位置
            geoParticle.AltitudeMode = EnumAltitudeMode.RelativeToGround;

            GSORingParticleEmitter emitter = new GSORingParticleEmitter();
            emitter.TexturePath = strResPath + "/ParticleImage/flare1.png";//烟1111111111111

            emitter.SetSizeFix(1, 1);
            emitter.VelFix = 1;
            emitter.VelRnd = 5;

            emitter.AngleXYFix = 0;
            emitter.AngleXYRnd = 180;

            emitter.AngleXZFix = 90;
            emitter.AngleXZRnd = 0;

            emitter.LifeFix = 0.5f;
            emitter.LifeRnd = 0.0f;

            emitter.RotFix = 0;
            emitter.RotRnd = 0;

            emitter.RotVelFix = 0;
            emitter.RotVelRnd = 0;

            emitter.EmitPerSec = 100;
            emitter.IsLumAdded = true;

            // 采用线性插值生成粒子的初始颜色
            emitter.ColorRndStart = Color.White;
            emitter.ColorRndEnd = Color.Red;


            GSOColorParticleEffector effector2 = new GSOColorParticleEffector();
            effector2.SetColorChanged(0, -1, -1, 0);
            effector2.StartTime = 0.0f;
            effector2.EndTime = -1.0f;
            emitter.AddEffector(effector2);

            // 将三个发射器添加到粒子对象中
            geoParticle.AddEmitter(emitter);

            geoParticle.Play();

            emitterFeature = new GSOFeature();

            emitterFeature.Geometry = geoParticle;

            globeControl1.Globe.MemoryLayer.AddFeature(emitterFeature);
            return emitterFeature;
        }
        // 添加喷泉
        private GSOFeature AddFountain(double x, double y, double z)
        {
            string strResPath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource";

            GSOGeoParticle geoParticle = new GSOGeoParticle();
            geoParticle.SetPosition( x,  y,  z); // 添加到这个经纬度位置
            geoParticle.AltitudeMode = EnumAltitudeMode.RelativeToGround;

            GSOPointParticleEmitter emitter = new GSOPointParticleEmitter();
            emitter.TexturePath = strResPath + "/ParticleImage/test.png";

            emitter.SetSizeFix(0.5f, 2);
            emitter.VelFix = 10;
            emitter.VelRnd = 2;

            emitter.GravityAcc = 9.8f;
            emitter.AngleXYFix = 0;
            emitter.AngleXYRnd = 180;

            emitter.AngleXZFix = 88;
            emitter.AngleXZRnd = 2;

            //emitter.InnerRadius = 0;
            // emitter.OuterRadius = 0.03f;

            emitter.LifeFix = 5.0f;
            emitter.LifeRnd = 1.0f;

            emitter.RotFix = 0;
            emitter.RotRnd = 0;

            emitter.RotVelFix = 0;
            emitter.RotVelRnd = 0;

            emitter.EmitPerSec = 1000;
            emitter.ColorRndStart = Color.FromArgb(33, 255, 255, 255);
            emitter.ColorRndEnd = Color.FromArgb(11, 255, 255, 255);
            emitter.IsLumAdded = false;

            // 将三个发射器添加到粒子对象中
            geoParticle.AddEmitter(emitter);

            geoParticle.Play();
            emitterFeature = new GSOFeature();

            emitterFeature.Geometry = geoParticle;

            globeControl1.Globe.MemoryLayer.AddFeature(emitterFeature);
            //globeControl1.Globe.FlyToFeature(emitterFeature);

            return emitterFeature;
        }    
        
        

        private void buttonItem69_Click(object sender, EventArgs e)//附属物分析
        {
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            FrmAccessoryAnalysis dlg = new FrmAccessoryAnalysis(globeControl1, layerTemp);
            dlg.Show(this);
        }

        private void 管径分段统计_Click(object sender, EventArgs e)
        {
            //Frmpipediameterstatis.ShowForm(globeControl1,pipelineLayerNames);
            //frm.Show(this);
        }

        private void buttonItem93_Click(object sender, EventArgs e)//埋深分段统计
        {
            //FrmpipeDeepstatis.ShowForm(globeControl1,pipelineLayerNames);
            //frm.Show(this);
        }

        private void ribbonTabItem5_Click(object sender, EventArgs e)
        {

        }

        private void buttonItem109_Click(object sender, EventArgs e)//管径分类汇总
        {
            //FrmpipeDiametergather.ShowForm(globeControl1,pipelineLayerNames);
            //frm.Show(this);
        }

        private void buttonItem110_Click(object sender, EventArgs e)//材质分类汇总
        {
            //FrmpipeMaterialGather.ShowForm(globeControl1, pipelineLayerNames);
            //frm.Show(this);
        }

        private void buttonItem97_Click(object sender, EventArgs e)//附属物分类汇总
        {
            //FrmAccessoriesgather.ShowForm(globeControl1,instrumenLayerNames);
            //frm.Show(this);
        }
        GSOFeature startFeature;
        GSOFeature endFeature;
        private void buttonItem72_Click(object sender, EventArgs e)//标高标注
        {
            GSOFeature resFeature = null;
            GSOGeoPolyline3D selLine = isSelectedPipeLine(out resFeature);
            if (selLine != null)
            {
                if (selLine[0].Count > 1)
                {
                    setMarkerLayerUnVisible("标高标注");
                    GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("标高标注");
                    l.Visible = true;
                    GSOGeoPoint3D startPoint = new GSOGeoPoint3D();
                    startPoint.X = selLine[0][0].X;
                    startPoint.Y = selLine[0][0].Y;
                    startPoint.Z = selLine[0][0].Z;
                    string startLabelName = "起点标高:" + resFeature.GetFieldAsString("起始地面高程") + "米";
                    
                    startFeature = new GSOFeature();
                    GSOPoint2d point2d = new GSOPoint2d(0, 80);
                    if (getLabelName(l) != -1)
                    {
                        startFeature = createLabel(l,startFeature, startPoint, startLabelName, (getLabelName(l)+1).ToString(), point2d);

                    l.AddFeature(startFeature);
                    }
                   

                    GSOGeoPoint3D endPoint = new GSOGeoPoint3D();
                    endPoint.X = selLine[0][selLine[0].Count - 1].X;
                    endPoint.Y = selLine[0][selLine[0].Count - 1].Y;
                    endPoint.Z = selLine[0][selLine[0].Count - 1].Z;
                    string endLabelName = "终点标高:" + resFeature.GetFieldAsString("终止地面高程") + "米";
                    endFeature = new GSOFeature();
                    if (getLabelName(l) != -1)
                    {
                        endFeature = createLabel(l,endFeature, endPoint, endLabelName, (getLabelName(l) + 1).ToString(), point2d);
                        l.AddFeature(endFeature);
                    }
                    globeControl1.Refresh();
                }
            }
            else
            {
                MessageBox.Show("请选中一根管线","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);
            }
        }//标高标注

        public int getLabelName(GSOLayer layer)
        {
            int nid = -1;
            if (layer.GetAllFeatures().Length > 0)
            {
                string id = layer.GetAllFeatures()[layer.GetAllFeatures().Length - 1].Name;

                int.TryParse(id, out nid);
            }
            else
            {
                nid = 0;
            }
            return nid;
        }

        public void setMarkerLayerUnVisible(string layerName)
        {
            string[] markerStrs = new string[9];
            markerStrs[0] = "标高标注";
            markerStrs[1] = "管径标注";
            markerStrs[2] = "埋深标注";
            markerStrs[3] = "坐标标注";
            markerStrs[4] = "坡度标注";
            markerStrs[5] = "属性标注";
            markerStrs[6] = "自定义标注";
            markerStrs[7] = "距离标注";
            markerStrs[8] = "红线工具";

            for (int i = 0; i < markerStrs.Length; i++)
            {
                GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(markerStrs[i]);
                if (l != null)
                {
                    if (markerStrs[i] != layerName)
                    {
                        l.Visible = false;
                        if (layerMarkerTree.Nodes[0].Nodes.Count > i)
                        {
                            layerMarkerTree.Nodes[0].Nodes[i].Checked = false;
                        }
                    }
                    else
                    {
                        l.Visible = true;
                        if (layerMarkerTree.Nodes[0].Nodes.Count > i)
                        {
                            layerMarkerTree.Nodes[0].Nodes[i].Checked = true;
                        }
                    }
                }
            }

        }

        /// <summary>
        /// 获取选中管线
        /// </summary>
        /// <param name="resFeature">被选中管线所在的feature图层</param>
        /// <returns>返回一根线</returns>
        private GSOGeoPolyline3D isSelectedPipeLine(out GSOFeature resFeature)
        {
            resFeature = null;
            if (globeControl1.Globe.SelObjectCount < 1)
            {
                return null;
            }
            GSOLayer resLayer = null;
            globeControl1.Globe.GetSelectObject(0, out resFeature, out resLayer);
            GSOGeoPolyline3D line1 = resFeature.Geometry as GSOGeoPolyline3D;
            if (line1 == null)
            {
                return null;
            }
            GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D;
            if (pipeStyle1 == null)
            {
                return null;
            }
            return line1;
        }

        /// <summary>
        /// 创建label要素
        /// </summary>
        /// <param name="feature">添加label要素的feature</param>
        /// <param name="point">feature的位置</param>
        /// <param name="labelName">label要素名字</param>
        /// <param name="featureName">feature名字</param>
        /// <param name="point2d">label要素距离点的位置</param>
        /// <returns></returns>
        private GSOFeature createLabel(GSOLayer layer,GSOFeature feature, GSOGeoPoint3D point, string labelName, string featureName, GSOPoint2d point2d)
        {
            for (int i = layer.GetAllFeatures().Length - 1; i >= 0; i--)
            {
                GSOFeature gfeat = layer.GetAt(i);
                if (gfeat != null && gfeat.Geometry != null && gfeat.Geometry.Type == EnumGeometryType.GeoPoint3D)
                {
                    GSOGeoPoint3D pointItem = gfeat.Geometry as GSOGeoPoint3D;
                    if (pointItem.X == point.X && pointItem.Y == point.Y && pointItem.Z == point.Z)
                    {
                        layer.RemoveAt(i);
                        break;
                    }
                }
            }
            point.AltitudeMode = EnumAltitudeMode.RelativeToGround;
            feature.Geometry = point;
            feature.Name = featureName;
            GSOLabel newLabel = new GSOLabel();
            newLabel.Text = labelName;
            newLabel.Style = new GSOLabelStyle();
            newLabel.Style.Opaque = 0.8;
            newLabel.Style.OutlineColor = Color.Gray;
            newLabel.Style.TractionLineEndPos = point2d;
            newLabel.Style.OutlineWidth = 1;
            newLabel.Style.TracktionLineWidth = 1;
            newLabel.Style.TractionLineColor = Color.Green;

            Color color1 = Color.FromArgb(60, 187, 206, 230);
            Color color2 = Color.FromArgb(150, 187, 200, 250);
            newLabel.Style.BackBeginColor = color1;
            newLabel.Style.BackEndColor = color2;

            feature.Label = newLabel;
            return feature;
        }

        GSOFeature radiusMarkerFeature;
        private void buttonItem73_Click(object sender, EventArgs e)//管径标注
        {
            GSOFeature resFeature = null;
            GSOGeoPolyline3D selLine = isSelectedPipeLine(out resFeature);
            if (selLine != null)
            {
                if (selLine[0].Count > 1)
                {
                    setMarkerLayerUnVisible("管径标注");
                    GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("管径标注");
                    if (l == null)
                    {
                        l = globeControl1.Globe.MemoryLayer;
                    }
                    l.Visible = true;
                  
                    GSOGeoPoint3D pt = new GSOGeoPoint3D();
                    GSOPoint3d point3d = selLine.GeoCenterPoint;
                    pt.X = point3d.X;
                    pt.Y = point3d.Y;
                    pt.Z = point3d.Z;

                    string radiusLabelName = "管径:" + resFeature.GetFieldAsFloat("管径_毫米") + "毫米";
                    radiusMarkerFeature = new GSOFeature();
                    GSOPoint2d point2d = new GSOPoint2d(0, 50);
                    if (l != null)
                    {
                        if (getLabelName(l) != -1)
                        {
                            radiusMarkerFeature = createLabel(l,radiusMarkerFeature, pt, radiusLabelName, (getLabelName(l)+1).ToString(), point2d);

                            l.AddFeature(radiusMarkerFeature);
                        }
                    }
                    globeControl1.Refresh();                    
                }
            }
            else
            {
                MessageBox.Show("请选中一根管线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        GSOFeature startDeepFeature;
        GSOFeature endDeepFeature;
        private void buttonItem74_Click(object sender, EventArgs e)//埋深标注
        {
            GSOFeature resFeature = null;
            GSOGeoPolyline3D selLine = isSelectedPipeLine(out resFeature);
            if (selLine != null)
            {
                if (selLine[0].Count > 1)
                {
                    setMarkerLayerUnVisible("埋深标注");
                    GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("埋深标注");
                    l.Visible = true;
                    GSOGeoPoint3D startPoint = new GSOGeoPoint3D();
                    startPoint.X = selLine[0][0].X;
                    startPoint.Y = selLine[0][0].Y;
                    startPoint.Z = selLine[0][0].Z;
                    string startLabelName = "起点埋深:" + resFeature.GetFieldAsString("起始埋深") + "米";
                    GSOPoint2d point2d = new GSOPoint2d(0, 60);
                    if (l != null)
                    {
                        if (getLabelName(l) != -1)
                        {
                            startDeepFeature = new GSOFeature();
                           
                            startDeepFeature = createLabel(l,startDeepFeature, startPoint, startLabelName, (getLabelName(l)+1).ToString(), point2d);
                            l.AddFeature(startDeepFeature);
                        }
                    }
                    GSOGeoPoint3D endPoint = new GSOGeoPoint3D();
                    endPoint.X = selLine[0][selLine[0].Count - 1].X;
                    endPoint.Y = selLine[0][selLine[0].Count - 1].Y;
                    endPoint.Z = selLine[0][selLine[0].Count - 1].Z;
                    string endLabelName = "终点埋深:" + resFeature.GetFieldAsString("终止埋深") + "米";
                    if (l != null)
                    {
                        if (getLabelName(l) != -1)
                        {
                            endDeepFeature = new GSOFeature();
                            endDeepFeature = createLabel(l,endDeepFeature, endPoint, endLabelName, (getLabelName(l) + 1).ToString(), point2d);
                            l.AddFeature(endDeepFeature);
                        }
                    }
                    globeControl1.Refresh();
                }
            }
            else
            {
                MessageBox.Show("请选中一根管线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        bool distanceMarker = false;
        private void buttonItem75_Click(object sender, EventArgs e)//距离标注
        {
            globeControl1.Globe.Action = EnumAction3D.TrackPolyline;
            //globeControl1.Globe.DistanceRuler.MeasureMode = EnumDistanceMeasureMode.HVSLineMeasure;
            distanceMarker = true;
        }
        GSOFeature startXYFeature;
        GSOFeature endXYFeature;
        private void buttonItem76_Click(object sender, EventArgs e)//坐标标注
        {
            GSOFeature resFeature = null;
            GSOGeoPolyline3D selLine = isSelectedPipeLine(out resFeature);
            if (selLine != null)
            {
                if (selLine[0].Count > 1)
                {
                    setMarkerLayerUnVisible("坐标标注");
                    GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("坐标标注");
                    l.Visible = true;
                    GSOGeoPoint3D startPoint = new GSOGeoPoint3D();
                    startPoint.X = selLine[0][0].X;
                    startPoint.Y = selLine[0][0].Y;
                    startPoint.Z = selLine[0][0].Z;
                    string startLabelName = "起点坐标:(" + selLine[0][0].X.ToString("0.00") + "," + selLine[0][0].Y.ToString("0.00") + "," + selLine[0][0].Z.ToString("0.00") + ")";
                    GSOPoint2d point2d = new GSOPoint2d(0, 100);
                    if (l != null)
                    {
                        if (getLabelName(l) != -1)
                        {
                            startXYFeature = new GSOFeature();
                            
                            startXYFeature = createLabel(l,startXYFeature, startPoint, startLabelName, (getLabelName(l) + 1).ToString(), point2d);
                            l.AddFeature(startXYFeature);
                        }
                    }
                    GSOGeoPoint3D endPoint = new GSOGeoPoint3D();
                    endPoint.X = selLine[0][selLine[0].Count - 1].X;
                    endPoint.Y = selLine[0][selLine[0].Count - 1].Y;
                    endPoint.Z = selLine[0][selLine[0].Count - 1].Z;
                    string endLabelName = "终点坐标:(" + selLine[0][selLine[0].Count - 1].X.ToString("0.00") + "," + selLine[0][selLine[0].Count - 1].Y.ToString("0.00") + "," + selLine[0][selLine[0].Count - 1].Z.ToString("0.00") + ")";
                    if (l != null)
                    {
                        if (getLabelName(l) != -1)
                        {
                            endXYFeature = new GSOFeature();
                            endXYFeature = createLabel(l,endXYFeature, endPoint, endLabelName, (getLabelName(l) + 1).ToString(), point2d);
                            l.AddFeature(endXYFeature);
                        }
                    }
                    globeControl1.Refresh();
                    

                }
            }
            else
            {
                MessageBox.Show("请选中一根管线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void buttonItem77_Click(object sender, EventArgs e)
        {           
            buttonItem77.Checked = !buttonItem77.Checked;
            buttonItem139.Checked = false;
            string[] markerStrs = new string[9];
            markerStrs[0] = "标高标注";
            markerStrs[1] = "管径标注";
            markerStrs[2] = "埋深标注";
            markerStrs[3] = "坐标标注";
            markerStrs[4] = "坡度标注";
            markerStrs[5] = "属性标注";
            markerStrs[6] = "自定义标注";
            markerStrs[7] = "距离标注";
            markerStrs[8] = "红线工具";
            
            if (buttonItem77.Checked)
            {
                sideBar1.Visible = true;
                sideBarPanelItem3.Visible = true;
                buttonItem1.Checked = true;
                controlContainerItem3.Visible = true;
                sideBarPanelItem4.Visible = true;
                sideBarPanelItem4.Text = "标注管理";
                panel2.Visible = false;
                panel1.Visible = false;
                panel4.Visible = false;
                panel5.Visible = false;
                controlContainerItem5.Control = panel3;
                panel3.Dock = DockStyle.Fill;
                panel3.Visible = true;
                sideBar1.ExpandedPanel = sideBarPanelItem4;
                sideBar1.Refresh();
                Refresh();              
            }
            else
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                sideBarPanelItem4.Visible = false;
                panel3.Visible = false;
                
                if (buttonItem1.Checked)
                {
                    sideBar1.ExpandedPanel = sideBarPanelItem3;
                }
                else
                {
                    sideBar1.Visible = false;
                }
                //for (int i = 0; i < markerStrs.Length; i++)
                //{
                //    // GSOLayer l = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\标注管理\\" + markerStrs[i] + ".lgd");
                //    GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(markerStrs[i]);
                //    l.Visible = false;

                //}
                Refresh();
            }
        }
        private bool drawRedPology = false;
        private void buttonItem36_Click(object sender, EventArgs e)//红线工具
        {
            setMarkerLayerUnVisible("红线工具");
            GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("红线工具");
            if (l != null)
            {
                l.Visible = true;
                globeControl1.Globe.DestLayerFeatureAdd = l;
                l.Editable = true;
                globeControl1.Globe.Action = EnumAction3D.DrawPolygon;
                drawRedPology = true;
            }
        }

       
        private void buttonItem4_Click(object sender, EventArgs e)
        {

        }

        private void buttonItem101_Click(object sender, EventArgs e)//空间查询
        {
            trackflag = "pipelinespatialquery1";
            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
        }

        private void buttonItem64_Click_1(object sender, EventArgs e)//地表距离
        {
            btnSpaceMeasureHeight.Checked = false; 
            globeControl1.Globe.Action = EnumAction3D.MeasureDistance;
            globeControl1.Globe.DistanceRuler.SpaceMeasure = false;
        }

        private void buttonItem78_Click(object sender, EventArgs e)//水平面积量算
        {
            btnSpaceMeasureHeight.Checked = false; 
            globeControl1.Globe.Action = EnumAction3D.MeasureArea;
            globeControl1.Globe.AreaRuler.SpaceMeasure = true;
        }

        private void buttonItem82_Click(object sender, EventArgs e)//纵断面分析
        {
            if (globeControl1.Globe.SelObjectCount >= 1)
            {
                //if (isInterlinked())
                GSOFeatures selectFeatures = new GSOFeatures();
                for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++)
                {
                    GSOFeature feature = null;
                    GSOLayer layer = null;
                    globeControl1.Globe.GetSelectObject(i, out feature, out layer);
                    if (feature != null && feature.Geometry != null && feature.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                    {
                        selectFeatures.Add(feature);
                    }
                }
                if (selectFeatures.Length < 1)
                {
                    MessageBox.Show("请选择一条或者多条管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
                List<GSOFeature> listFeature = new List<GSOFeature>();
                if (selectFeatures.Length == 1)
                {
                    listFeature.Add(selectFeatures[0]);
                }
                else
                {
                    #region  求多条管线纵断面
                    //求多条管线纵断面 1,2,3
                    //1 判断管线是否相连、且没有分叉
                    for (int i = 0; i < selectFeatures.Length; i++)
                    {
                        GSOGeoPolyline3D line = selectFeatures[i].Geometry as GSOGeoPolyline3D;
                        bool isConnect = false;
                        int[] valueCount = new int[2];
                        valueCount[0] = 0;
                        valueCount[1] = 0;

                        if (line != null && line.PartCount > 0)
                        {
                            for (int j = 0; j < selectFeatures.Length; j++)
                            {
                                if (i == j)
                                {
                                    continue;
                                }
                                GSOGeoPolyline3D newLine = selectFeatures[j].Geometry as GSOGeoPolyline3D;
                                if (newLine != null && newLine.PartCount > 0)
                                {
                                    int minValueIndex = 0;
                                    double limitValue = 1.0;
                                    double[] value = new double[4];
                                    value[0] = getDistance(line[line.PartCount - 1][line[line.PartCount - 1].Count - 1], newLine[0][0]);
                                    value[1] = getDistance(line[line.PartCount - 1][line[line.PartCount - 1].Count - 1], newLine[newLine.PartCount - 1][newLine[newLine.PartCount - 1].Count - 1]);
                                    value[2] = getDistance(line[0][0], newLine[0][0]);
                                    value[3] = getDistance(line[0][0], newLine[newLine.PartCount - 1][newLine[newLine.PartCount - 1].Count - 1]);
                                    double minValue = value[0];
                                    for (int m = 1; m < value.Length; m++)
                                    {
                                        if (minValue > value[m])
                                        {
                                            minValue = value[m];
                                            minValueIndex = m;
                                        }
                                    }
                                    if (minValue < limitValue)
                                    {
                                        isConnect = true;
                                        if (minValueIndex > 1)
                                        {
                                            valueCount[1]++;
                                        }
                                        else
                                        {
                                            valueCount[0]++;
                                        }
                                    }
                                }
                            }
                            if (!isConnect || valueCount[0] > 1 || valueCount[1] > 1)
                            {
                                MessageBox.Show("请选择相连接的一条线上的管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                return;
                            }
                        }
                    }
                    //2 记录每一条相连接的管线的起点和终点,并添加到一条管线中
                    for (int p = 0; p < selectFeatures.Length; p++)
                    {
                        GSOGeoPolyline3D line = selectFeatures[p].Geometry as GSOGeoPolyline3D;
                        if (line != null && line.PartCount > 0)
                        {
                            for (int n = 0; n < selectFeatures.Length; n++)
                            {
                                if (p == n)
                                {
                                    continue;
                                }
                                GSOGeoPolyline3D newLine = selectFeatures[n].Geometry as GSOGeoPolyline3D;
                                if (newLine != null && newLine.PartCount > 0)
                                {
                                    int minValueIndex = 0;
                                    double limitValue = 1.0;
                                    double[] value = new double[4];
                                    value[0] = getDistance(line[line.PartCount - 1][line[line.PartCount - 1].Count - 1], newLine[0][0]);
                                    value[1] = getDistance(line[line.PartCount - 1][line[line.PartCount - 1].Count - 1], newLine[newLine.PartCount - 1][newLine[newLine.PartCount - 1].Count - 1]);
                                    value[2] = getDistance(line[0][0], newLine[0][0]);
                                    value[3] = getDistance(line[0][0], newLine[newLine.PartCount - 1][newLine[newLine.PartCount - 1].Count - 1]);
                                    double minValue = value[0];
                                    for (int m = 1; m < value.Length; m++)
                                    {
                                        if (minValue > value[m])
                                        {
                                            minValue = value[m];
                                            minValueIndex = m;
                                        }
                                    }
                                    if (minValue < limitValue)
                                    {
                                        GSOFeature featureFromAllSelectedObj = new GSOFeature();
                                        GSOGeoPolyline3D lineFromAllSelectedObj = new GSOGeoPolyline3D();
                                        switch (minValueIndex)
                                        {
                                            case 0:
                                                GSOPoint3ds linePart = new GSOPoint3ds();
                                                for (int i = 0; i < line.PartCount; i++)
                                                {
                                                    for (int j = 0; j < line[i].Count; j++)
                                                    {
                                                        linePart.Add(line[i][j]);
                                                    }
                                                }
                                                for (int i = 0; i < newLine.PartCount; i++)
                                                {
                                                    for (int j = 0; j < newLine[i].Count; j++)
                                                    {
                                                        linePart.Add(newLine[i][j]);
                                                    }
                                                }
                                                lineFromAllSelectedObj.AddPart(linePart);
                                                break;
                                            case 1:
                                                linePart = new GSOPoint3ds();
                                                for (int i = 0; i < line.PartCount; i++)
                                                {
                                                    for (int j = 0; j < line[i].Count; j++)
                                                    {
                                                        linePart.Add(line[i][j]);
                                                    }
                                                }
                                                for (int i = newLine.PartCount - 1; i >= 0; i--)
                                                {
                                                    for (int j = newLine[i].Count - 1; j >= 0; j--)
                                                    {
                                                        linePart.Add(newLine[i][j]);
                                                    }
                                                }
                                                lineFromAllSelectedObj.AddPart(linePart);
                                                break;
                                            case 2:
                                                linePart = new GSOPoint3ds();
                                                for (int i = line.PartCount - 1; i >= 0; i--)
                                                {
                                                    for (int j = line[i].Count - 1; j >= 0; j--)
                                                    {
                                                        linePart.Add(line[i][j]);
                                                    }
                                                }
                                                for (int i = 0; i < newLine.PartCount; i++)
                                                {
                                                    for (int j = 0; j < newLine[i].Count; j++)
                                                    {
                                                        linePart.Add(newLine[i][j]);
                                                    }
                                                }
                                                lineFromAllSelectedObj.AddPart(linePart);
                                                break;
                                            case 3:
                                                linePart = new GSOPoint3ds();
                                                for (int i = line.PartCount - 1; i >= 0; i--)
                                                {
                                                    for (int j = line[i].Count - 1; j >= 0; j--)
                                                    {
                                                        linePart.Add(line[i][j]);
                                                    }
                                                }
                                                for (int i = newLine.PartCount - 1; i >= 0; i--)
                                                {
                                                    for (int j = newLine[i].Count - 1; j >= 0; j--)
                                                    {
                                                        linePart.Add(newLine[i][j]);
                                                    }
                                                }
                                                lineFromAllSelectedObj.AddPart(linePart);
                                                break;
                                        }

                                        featureFromAllSelectedObj.Geometry = lineFromAllSelectedObj;

                                        selectFeatures.Remove(n);
                                        selectFeatures.Remove(p);
                                        selectFeatures.Add(featureFromAllSelectedObj);
                                        p--;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    //3 将合并之后的管线添加到集合中
                    for (int h = 0; h < selectFeatures.Length; h++)
                    {
                        listFeature.Add(selectFeatures[h]);
                    }
                    #endregion

                    #region 求两条管线纵断面
                    ////求两条管线纵断面
                    //GSOFeature featureFromAllSelectedObj = new GSOFeature();
                    //GSOGeoPolyline3D lineFromAllSelectedObj = new GSOGeoPolyline3D();
                    //GSOGeoPolyline3D line = selectFeatures[0].Geometry as GSOGeoPolyline3D;
                    //GSOGeoPolyline3D newLine = selectFeatures[1].Geometry as GSOGeoPolyline3D;
                    //if (line != null && line.PartCount > 0 && newLine != null && newLine.PartCount > 0)
                    //{
                    //    double limitValue = 1.0;
                    //    double[] value = new double[4];
                    //    value[0] = getDistance(line[line.PartCount - 1][line[line.PartCount - 1].Count - 1], newLine[0][0]);
                    //    value[1] = getDistance(line[line.PartCount - 1][line[line.PartCount - 1].Count - 1], newLine[newLine.PartCount - 1][newLine[newLine.PartCount - 1].Count - 1]);
                    //    value[2] = getDistance(line[0][0], newLine[0][0]);
                    //    value[3] = getDistance(line[0][0], newLine[newLine.PartCount - 1][newLine[newLine.PartCount - 1].Count - 1]);
                    //    double minValue = value[0];
                    //    int minValueIndex = 0;
                    //    for (int m = 1; m < value.Length; m++)
                    //    {
                    //        if (minValue > value[m])
                    //        {
                    //            minValue = value[m];
                    //            minValueIndex = m;
                    //        }
                    //    }
                    //    if (minValue < limitValue)
                    //    {
                    //        switch (minValueIndex)
                    //        {
                    //            case 0:
                    //                GSOPoint3ds linePart = new GSOPoint3ds();
                    //                for (int i = 0; i < line.PartCount; i++)
                    //                {
                    //                    for (int j = 0; j < line[i].Count; j++)
                    //                    {
                    //                        linePart.Add(line[i][j]);
                    //                    }
                    //                }
                    //                for (int i = 0; i < newLine.PartCount; i++)
                    //                {
                    //                    for (int j = 0; j < newLine[i].Count; j++)
                    //                    {
                    //                        linePart.Add(newLine[i][j]);
                    //                    }
                    //                }
                    //                lineFromAllSelectedObj.AddPart(linePart);
                    //                break;
                    //            case 1:
                    //                linePart = new GSOPoint3ds();
                    //                for (int i = 0; i < line.PartCount; i++)
                    //                {
                    //                    for (int j = 0; j < line[i].Count; j++)
                    //                    {
                    //                        linePart.Add(line[i][j]);
                    //                    }
                    //                }
                    //                for (int i = newLine.PartCount - 1; i >= 0; i--)
                    //                {
                    //                    for (int j = newLine[i].Count - 1; j >= 0; j--)
                    //                    {
                    //                        linePart.Add(newLine[i][j]);
                    //                    }
                    //                }
                    //                lineFromAllSelectedObj.AddPart(linePart);
                    //                break;
                    //            case 2:
                    //                linePart = new GSOPoint3ds();
                    //                for (int i = line.PartCount - 1; i >= 0; i--)
                    //                {
                    //                    for (int j = line[i].Count - 1; j >= 0; j--)
                    //                    {
                    //                        linePart.Add(line[i][j]);
                    //                    }
                    //                }
                    //                for (int i = 0; i < newLine.PartCount; i++)
                    //                {
                    //                    for (int j = 0; j < newLine[i].Count; j++)
                    //                    {
                    //                        linePart.Add(newLine[i][j]);
                    //                    }
                    //                }
                    //                lineFromAllSelectedObj.AddPart(linePart);
                    //                break;
                    //            case 3:
                    //                linePart = new GSOPoint3ds();
                    //                for (int i = line.PartCount - 1; i >= 0; i--)
                    //                {
                    //                    for (int j = line[i].Count - 1; j >= 0; j--)
                    //                    {
                    //                        linePart.Add(line[i][j]);
                    //                    }
                    //                }
                    //                for (int i = newLine.PartCount - 1; i >= 0; i--)
                    //                {
                    //                    for (int j = newLine[i].Count - 1; j >= 0; j--)
                    //                    {
                    //                        linePart.Add(newLine[i][j]);
                    //                    }
                    //                }
                    //                lineFromAllSelectedObj.AddPart(linePart);
                    //                break;
                    //        }
                    //        if (lineFromAllSelectedObj.PartCount > 0)
                    //        {
                    //            featureFromAllSelectedObj.Geometry = lineFromAllSelectedObj;
                    //            listFeature.Add(featureFromAllSelectedObj);
                    //        }
                    //    }
                    //    else
                    //    {
                    //        MessageBox.Show("请选择两条相连接的管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    //    }
                    //}
                    //else
                    //{
                    //    MessageBox.Show("请选择两条管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    //}                
                    #endregion
                }
                //将选中的管线展示在窗体中
                if (listFeature.Count > 0)
                {
                    FrmProfileAnalysis frm = new FrmProfileAnalysis(globeControl1, listFeature);
                    frm.Show(this);
                }
                else
                {
                    MessageBox.Show("请选择相连接的管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                MessageBox.Show("请选择一条或者多条管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private double getDistance(GSOPoint3d point1, GSOPoint3d point2)
        {
            GSOGeoPolyline3D lineline = new GSOGeoPolyline3D();
            GSOPoint3ds point3ds = new GSOPoint3ds();
            point3ds.Add(point1);
            point3ds.Add(point2);
            lineline.AddPart(point3ds);

            double distance = lineline.GetSpaceLength(true, 6378137.0);
            return distance;
        }

        public bool isInterlinked()
        {
            if (globeControl1.Globe.SelObjectCount < 2)
            {
                MessageBox.Show("请选中至少两个管线!!");
                btnLTAnalysis.Checked = false;
                return false;
            }
            ClearConnexityAnalysis();
            globeControl1.Globe.GetSelectObject(0, out m_ConnexityAnalysisFirstFeature, out m_ConnexityAnalysisFirstLayer);
            globeControl1.Globe.GetSelectObject(1, out m_ConnexityAnaylsisSecondFeature, out m_COnnexityAnalysisSecondLayer);
            GSOGeoPolyline3D line1 = m_ConnexityAnalysisFirstFeature.Geometry as GSOGeoPolyline3D;
            GSOGeoPolyline3D line2 = m_ConnexityAnaylsisSecondFeature.Geometry as GSOGeoPolyline3D;
            if (line1 == null || line2 == null)
            {
                MessageBox.Show("请选择管线!!");
                return false;
            }
            GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D;
            GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D;
            if (pipeStyle1 == null || pipeStyle2 == null)
            {
                MessageBox.Show("请选择管线!!");
                return false;
            }
            if (!m_ConnexityAnalysisFirstLayer.IsSameInnerObject(m_COnnexityAnalysisSecondLayer))
            {
                MessageBox.Show("不在同一个图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                ClearConnexityAnalysis();
                return false;
            }
            else
            {
                GSODataset curCAYDataset = m_ConnexityAnalysisFirstLayer.Dataset;
                string srName = curCAYDataset.Name;
                GSONetworkDataset curCAYNDataset = curCAYDataset.DataSource.GetDatasetByName(srName + "Network") as GSONetworkDataset;
                if (curCAYNDataset == null)
                {
                    MessageBox.Show("该图层没有创建网络拓扑,请先创建网络拓扑信息再进行分析!", "提示");
                    return false;
                }

                int[] arryResID;
                curCAYNDataset.ConnexityAnalysis(m_ConnexityAnalysisFirstFeature.ID, m_ConnexityAnaylsisSecondFeature.ID, out arryResID, false, true);
                m_ConnexityAnalyResFeatures = m_ConnexityAnalysisFirstLayer.GetFeaturesByIDs(arryResID);
                if (m_ConnexityAnalyResFeatures == null || m_ConnexityAnalyResFeatures.Length < 1)
                {
                    String strLine1 = "管线:" + m_ConnexityAnalysisFirstFeature.ID;
                    String strLine2 = "管线:" + m_ConnexityAnaylsisSecondFeature.ID;
                    MessageBox.Show("请选择两条相通的管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }

        private void buttonItem81_Click(object sender, EventArgs e)//坡度标注
        {
            GSOFeature resFeature = null;
            GSOGeoPolyline3D selLine = isSelectedPipeLine(out resFeature);
            if (selLine != null)
            {
                if (selLine[0].Count > 1)
                {
                    setMarkerLayerUnVisible("坡度标注");
                    GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("坡度标注");
                    if (l != null)
                    {
                        l.Visible = true;
                        GSOGeoPoint3D pt = new GSOGeoPoint3D();
                        GSOPoint3d point3d = selLine.GeoCenterPoint;
                        pt.X = point3d.X;
                        pt.Y = point3d.Y;
                        pt.Z = point3d.Z;

                        if (getLabelName(l) != -1)
                        {
                            GSOPoint3ds pts = new GSOPoint3ds();
                            pts.Add(selLine[0][0]);
                            pts.Add(selLine[0][1]);
                            GSOGeoPolyline3D newLine = new GSOGeoPolyline3D();
                            newLine.AddPart(pts);
                            double newFeatLen = newLine.GetSpaceLength(true, 6378137.0);
                            double z = selLine[0][1].Z - selLine[0][0].Z;

                            double i = Convert.ToDouble(z / newFeatLen);

                            double a = Math.Atan(i) * 180 / Math.PI;
                            string radiusLabelName = "坡度:" + resFeature.GetFieldAsFloat("管径_毫米");
                            radiusMarkerFeature = new GSOFeature();
                            GSOPoint2d point2d = new GSOPoint2d(0, 70);
                            radiusMarkerFeature = createLabel(l, radiusMarkerFeature, pt, "坡度:" + i.ToString("0.0000") + "度   坡角:" + a.ToString("0.0000") + "度", (getLabelName(l) + 1).ToString(), point2d);
                            l.AddFeature(radiusMarkerFeature);
                            globeControl1.Refresh();
                        }                 
                    }
                }
            }
            else
            {
                MessageBox.Show("请选中一根管线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void buttonItem83_Click(object sender, EventArgs e)//属性标注
        {
            if (globeControl1.Globe.SelectedObject != null)
            {
                GSOFeature f = globeControl1.Globe.SelectedObject;
                if (f.Geometry.Type != EnumGeometryType.GeoPolyline3D)
                {
                    MessageBox.Show("请选择一条管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
                GSOLayer l = globeControl1.Globe.SelectedObjectLayer;
                if (l.Type == EnumLayerType.FeatureLayer)
                {
                    GSOFeatureDataset fDataset = l.Dataset as GSOFeatureDataset;
                    if (fDataset != null)
                    {
                        FrmPropertiesMarker frm = new FrmPropertiesMarker(globeControl1, l, f);
                        if (frm.ShowDialog() == DialogResult.OK)
                        {
                            setMarkerLayerUnVisible("属性标注");
                            l = globeControl1.Globe.Layers.GetLayerByCaption("属性标注");
                            if (l != null)
                            {
                                l.Visible = true;
                                if (getLabelName(l) != -1)
                                {
                                    GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D;
                                    if (line.PartCount > 0)
                                    {
                                        GSOGeoPoint3D pt = new GSOGeoPoint3D();
                                        GSOPoint3d point3d = line.GeoCenterPoint;
                                        pt.X = point3d.X;
                                        pt.Y = point3d.Y;
                                        pt.Z = point3d.Z;
                                        string radiusLabelName = frm.labelText;
                                        GSOFeature newF = new GSOFeature();
                                        GSOPoint2d point2d = new GSOPoint2d(0, 110);
                                        newF = createLabel(l,newF, pt, radiusLabelName, (getLabelName(l) + 1).ToString(), point2d);                                        
                                        l.AddFeature(newF);
                                        globeControl1.Refresh();
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("请选择一条管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void buttonItem84_Click(object sender, EventArgs e)//自定义标注
        {
            if (globeControl1.Globe.SelObjectCount == 1 && globeControl1.Globe.SelectedObject.Geometry != null && globeControl1.Globe.SelectedObject.Geometry.Type == EnumGeometryType.GeoPolyline3D)
            {
                GSOFeature f = globeControl1.Globe.SelectedObject;
                FrmCustomLabel frm = new FrmCustomLabel(globeControl1, globeControl1.Globe.SelectedObjectLayer, f);
                if (frm.ShowDialog() == DialogResult.OK)
                {
                    setMarkerLayerUnVisible("自定义标注");
                    GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("自定义标注");
                    if (l != null)
                    {
                        l.Visible = true;
                        if (getLabelName(l) != -1)
                        {
                            GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D;
                            if (line.PartCount > 0)
                            {
                                GSOGeoPoint3D pt = new GSOGeoPoint3D();
                                GSOPoint3d point3d = line.GeoCenterPoint;
                                
                                pt.X = point3d.X;
                                pt.Y = point3d.Y;
                                pt.Z = point3d.Z;
                                string radiusLabelName = frm.labelText;
                                GSOFeature newF = new GSOFeature();
                                GSOPoint2d point2d = new GSOPoint2d(0, 90);
                                newF = createLabel(l,newF, pt, radiusLabelName, (getLabelName(l) + 1).ToString(), point2d);                                
                                l.AddFeature(newF);
                                globeControl1.Refresh();
                            }
                        }
                    }
                }

            }
            else
            {
                MessageBox.Show("请选择一条管线!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
            }
        }

        private void layerMarkerTree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                if (e.Node.Text == "标注管理" || e.Node.Text == "传感器管理")
                {
                    return;                   
                }
                else if (e.Node.Parent.Text == "标注管理")
                {
                    layerMarkerTree.SelectedNode = e.Node;
                    contextMenuStrip2.Show(layerMarkerTree, e.X, e.Y);
                    contextMenuStrip2.Tag = e.Node;
                }
                else if (e.Node.Parent.Text == "传感器管理")
                {
                    layerSensorTree.SelectedNode = e.Node;
                    contextMenuStrip2.Show(layerSensorTree, e.X, e.Y);
                    contextMenuStrip2.Tag = e.Node;
                }
                else 
                {
                    if (e.Node.Tag is GSOFeature)
                    {
                        if (e.Node.Parent.Parent.Text == "标注管理")
                        {
                            layerMarkerTree.SelectedNode = e.Node;
                            contextMenuStrip3.Show(layerMarkerTree, e.X, e.Y);
                            contextMenuStrip3.Tag = e.Node;
                        }
                        else if (e.Node.Parent.Parent.Text == "传感器管理")
                        {
                            layerSensorTree.SelectedNode = e.Node;
                            contextMenuStrip3.Show(layerSensorTree, e.X, e.Y);
                            contextMenuStrip3.Tag = e.Node;
                        }                        
                    }
                }
            }
        }

        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            TreeNode node = contextMenuStrip2.Tag as TreeNode;
            TreeNode parentNode = node.Parent;
            Int32 nIndex = node.Index;

            if (parentNode.Text == "标注管理" || parentNode.Text == "传感器管理")
            {
                RefreshTreeNodeLayerFeatureList(node);
            }

        }
        private void RefreshTreeNodeLayerFeatureList(TreeNode layerTreeNode)
        {
            layerTreeNode.Nodes.Clear();
            GSOLayer layer = (GSOLayer)layerTreeNode.Tag;
            // 只将类型为内存数据集的图层列出,如果是其它类型的数据集可能数据量太大,没发显示在树控件中
            if (layer.Dataset is GSOFeatureDataset)
            {
                VisitFeature3Ds(layer.GetAllFeatures(), layerTreeNode);
            }
        }

        private void toolStripMenuItem2_Click(object sender, EventArgs e)
        {            
            TreeNode node = contextMenuStrip3.Tag as TreeNode;
            GSOFeature feature3d = node.Tag as GSOFeature;
            if (node == null)
            {
                return;
            }
            if (feature3d != null)
            {
                feature3d.Delete();
                globeControl1.Globe.Refresh();
                node.Remove();
            }
        }

        private void layerMarkerTree_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action != TreeViewAction.Unknown)
            {
                CheckTreeNode(e.Node, e.Node.Checked);
            }
        }
        private void CheckTreeNode(TreeNode node, Boolean bChecked)
        {
            CheckChildTreeNode(node, bChecked);

            // 对于kml图层,如果当前处理的节点是true,那么要把所有的祖宗节点置为true
            // 只有所有节点都未false,那么这个节点才为false
            // CheckFatherTreeNode(node, bChecked);
            globeControl1.Globe.Refresh();

        }
        private void CheckChildTreeNode(TreeNode node, Boolean bChecked)
        {


            if (node == null)
            {
                return;
            }
            if (node.Tag != null)
            {
                if (node.Tag.GetType() == typeof(GSOFeatureFolder) ||
                    node.Tag.GetType() == typeof(GSOFeature))
                {

                    //((GSOFeature)node.Tag).Visible = bChecked;

                    // 注意不可调用上面的那个方法,因为上面的那个本身也是递归的
                    // CheckChildTreeNode 是个递归的过程,所以只需要设置调用SetVisibleDirectly
                    // 直接设置Feature自己的可见性即可
                    ((GSOFeature)node.Tag).SetVisibleDirectly(bChecked);

                    // 注意不可以在这里调用Refresh,Refresh是强制刷新,在这里调用会
                    // 极大地影响速度,不过可以调用globeControl1.SetNeedRefresh()
                    // 来标记是否需要刷新
                    //globeControl1.Refresh();


                }
                else
                {
                    GSOLayer curLayer = node.Tag as GSOLayer;
                    GSOTerrain curTerrain = node.Tag as GSOTerrain;
                    if (curLayer != null)
                    {
                        curLayer.Visible = bChecked;
                    }
                    else if (curTerrain != null)
                    {
                        curTerrain.Visible = bChecked;

                    }
                }
            }
            // 递归处理子节点
            for (int i = 0; i < node.Nodes.Count; i++)
            {
                node.Nodes[i].Checked = bChecked;
                CheckChildTreeNode(node.Nodes[i], bChecked);

            }
        }

        private void 删除ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            TreeNode node = contextMenuStrip2.Tag as TreeNode;
            GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(node.Text);
            if (l != null)
            {
                l.RemoveAllFeature();
                node.Nodes.Clear();
                globeControl1.Refresh();
            }
        }

        private void buttonItem83_Click_1(object sender, EventArgs e)//水平净距
        {
            layerTemp.RemoveAllFeature();
            clearFeatureHighLight();
            globeControl1.Refresh();
            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = true;
            buttonItem1.Checked = true;
            controlContainerItem3.Visible = true;
            sideBarPanelItem4.Visible = true;
            sideBarPanelItem4.Text = "水平净距分析";
            trackflag = "horizontal";
            //globeControl1.Globe.Action = EnumAction3D.SelectObject;
            panel1.Visible = false;
            panel2.Visible = false;
            panel3.Visible = false;
            panelEx1.Visible = false;
            panel4.Visible = false;
            controlContainerItem5.Control = panel5;
            panel5.Dock = DockStyle.Fill;
            panel5.Visible = true;
            sideBar1.ExpandedPanel = sideBarPanelItem4;
            sideBar1.Refresh();
            Refresh();
        }

        private void buttonItem85_Click(object sender, EventArgs e)//覆土分析
        {
            layerTemp.RemoveAllFeature();
            clearFeatureHighLight();
            globeControl1.Refresh();
            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = true;
            buttonItem1.Checked = true;
            controlContainerItem3.Visible = true;
            sideBarPanelItem4.Visible = true;
            sideBarPanelItem4.Text = "覆土分析";
            trackflag = "ftAnalysis";
            //globeControl1.Globe.Action = EnumAction3D.SelectObject;
            panel1.Visible = false;
            panel3.Visible = false;
            panel2.Visible = false;
            panel5.Visible = false;
            panelEx1.Visible = false;
            controlContainerItem5.Control = panel4; 
            panel4.Visible = true;
            panel4.Dock = DockStyle.Fill;
            sideBar1.ExpandedPanel = sideBarPanelItem4;
            sideBar1.Refresh();
            Refresh();
        }

        private void checkBoxX5_CheckedChanged(object sender, EventArgs e)
        {
            clearFeatureHighLight();
            if (checkBoxX5.Checked)
            {
                globeControl1.Globe.ClearAnalysis();
                layerTemp.RemoveAllFeature();
                globeControl1.Refresh();
                comboBoxEx3.Enabled = false;
                dataGridViewX6.Rows.Clear();
                dataGridViewX7.Rows.Clear();
                trackflag = "ftAnalysis";
                //globeControl1.Globe.Action = EnumAction3D.TrackPolygonAnalysis;
                globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
            else
            {
                comboBoxEx3.Enabled = true;
            }
        }

        private void checkBoxX6_CheckedChanged(object sender, EventArgs e)
        {
            clearFeatureHighLight();
            comboBoxEx3.Enabled = checkBoxX6.Checked;
            if (checkBoxX6.Checked)
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                textBoxX1.Enabled = true;
                trackflag = "";
                dataGridViewX6.Rows.Clear();
                dataGridViewX7.Rows.Clear();
               
                comboBoxEx3.SelectedIndex = -1;
                
            }
            globeControl1.Globe.ClearAnalysis();
            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }

        private void comboBoxEx3_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBoxEx3.SelectedIndex > -1)
            {
                //feats_vertical.RemoveAll();
                dataGridViewX6.Rows.Clear();
                dataGridViewX7.Rows.Clear();
                
                GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx3.SelectedItem.ToString());
                if (layer == null)
                    return;

                GSOFeatureLayer flayer = layer as GSOFeatureLayer;
                GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
                GSOFeatures feats = flayer.GetAllFeatures();
                //feats_vertical = feats;
                for (int i = 0; i < feats.Length; i++)
                {
                    int idx = dataGridViewX6.Rows.Add();
                    dataGridViewX6.Rows[idx].Cells[0].Value = comboBoxEx3.SelectedItem.ToString();
                    dataGridViewX6.Rows[idx].Cells[1].Value = feats[i].Name;
                }
            }
        }

        private void buttonX9_Click(object sender, EventArgs e)//开始分析 覆土分析
        {
            if (!checkBoxX5.Checked && !checkBoxX6.Checked)
            {
                MessageBox.Show("请确定是选择管线还是选择图层!", "提示");
                return;
            }
            if (textBoxX3.Text.Trim() == "")
            {
                MessageBox.Show("覆土深度不能为空!", "提示");
                return;
            }
            double dFuTuShenDu = 0;
            if (!double.TryParse(textBoxX3.Text.Trim(), out dFuTuShenDu))
            {
                MessageBox.Show("请输入正确的覆土深度!", "提示");
                return;
            }           
            
            if (dataGridViewX6.Rows.Count > 0)
            {               
                layerTemp.RemoveAllFeature();
                dataGridViewX7.Rows.Clear();
                clearFeatureHighLightIgnoreSelectObject();
                if (checkBoxX5.Checked)
                {
                    for (int i = 0; i < dataGridViewX6.Rows.Count; i++)
                    {
                        GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX6.Rows[i].Cells[0].Value.ToString());
                        if (l != null)
                        {
                            GSOFeatureLayer flayer = l as GSOFeatureLayer;
                            GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
                            GSOFeatures feats = flayer.GetAllFeatures();
                            for (int j = 0; j < feats.Length; j++)
                            {
                                string featureName = "";
                                if(feats[j].GetFieldDefn("编号") !=null) 
                                {
                                    featureName = feats[j].GetValue("编号").ToString();
                                }
                                else
                                {
                                    featureName = feats[j].Name;
                                }
                                if (featureName == dataGridViewX6.Rows[i].Cells[1].Value.ToString())
                                {
                                   // CollisionAnalysis_Selected(feats[j]);
                                    GSOFeature f = feats[j];
                                    GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D;
                                    if(line ==null) continue;
                                    GSOPipeLineStyle3D style = line.Style as GSOPipeLineStyle3D;
                                    if (style == null) continue;
                                    if (line.PartCount > 0)
                                    {
                                        GSOPoint3ds pts = line[0];
                                        for (int m = 0; m < pts.Count; m++)
                                        {
                                            if (Math.Abs(pts[m].Z + (style.Radius / 1000)) < Convert.ToDouble(textBoxX3.Text.Trim()))
                                            {
                                                f.HighLight = true;
                                               int idx = dataGridViewX7.Rows.Add();
                                               dataGridViewX7.Rows[idx].Cells[0].Value = l.Caption;
                                               dataGridViewX7.Rows[idx].Cells[1].Value = featureName;
                                               dataGridViewX7.Rows[idx].Cells[2].Value = Math.Abs((pts[m].Z + (style.Radius / 1000))).ToString();
                                               break;
                                            }
                                        }
                                    }                                    
                                }
                            }
                        }
                    }
                }
                else if (checkBoxX6.Checked)
                {
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx3.SelectedItem.ToString());
                    if (layer == null)
                        return;

                    GSOFeatureLayer flayer = layer as GSOFeatureLayer;
                    GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset;
                    GSOFeatures feats = flayer.GetAllFeatures();
                    for (int i = 0; i < feats.Length; i++)
                    {
                        GSOFeature f = feats[i];
                        string featureName = "";
                        if (feats[i].GetFieldDefn("编号") != null)
                        {
                            featureName = feats[i].GetValue("编号").ToString();
                        }
                        else
                        {
                            featureName = feats[i].Name;
                        }
                        GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D;
                        if (line == null) continue;
                        GSOPipeLineStyle3D style = line.Style as GSOPipeLineStyle3D;
                        if (style == null) continue;
                        if (line.PartCount > 0)
                        {
                            GSOPoint3ds pts = line[0];
                            for (int m = 0; m < pts.Count; m++)
                            {
                                if (Math.Abs(pts[m].Z + (style.Radius / 1000)) < Convert.ToDouble(textBoxX3.Text.Trim()))
                                {
                                    f.HighLight = true;
                                    int idx = dataGridViewX7.Rows.Add();
                                    dataGridViewX7.Rows[idx].Cells[0].Value = layer.Caption;
                                    dataGridViewX7.Rows[idx].Cells[1].Value = featureName;
                                    dataGridViewX7.Rows[idx].Cells[2].Value = Math.Abs((pts[m].Z + (style.Radius / 1000))).ToString();
                                    break;
                                }
                            }
                        }
                    }
                }
                globeControl1.Refresh();
                if (dataGridViewX7.Rows.Count == 0)
                {
                    MessageBox.Show("所有管线满足覆土净距标准!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }            
            else
            {
                MessageBox.Show("请选中要进行覆土分析的管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                //globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
            
        }

        private void dataGridViewX7_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                DataGridView.HitTestInfo hittestinfo = dataGridViewX7.HitTest(e.X, e.Y);
                if (hittestinfo.RowIndex > -1)
                {
                    string featureName = dataGridViewX7.Rows[hittestinfo.RowIndex].Cells[1].Value.ToString();
                    featureName = featureName.Trim();

                    //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[currentQueryLayer]));
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX7.Rows[hittestinfo.RowIndex].Cells[0].Value.ToString());
                    //   GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption("reli"); 
                    if (layer != null)
                    {
                        GSOFeatures features = layer.GetFeatureByName(featureName, false);
                        for (int j = 0; j < features.Length; j++)
                        {
                            if (features[j].GetFieldDefn("编号") != null && features[j].GetValue("编号").ToString() == 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.JumpToPosition(point3d, EnumAltitudeMode.Absolute, 5);
                                }
                                else
                                {
                                    globeControl1.Globe.JumpToFeature(m_feature, 5);
                                }
                                break;
                            }
                            else 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.JumpToPosition(point3d, EnumAltitudeMode.Absolute, 5);
                                }
                                else
                                {
                                    globeControl1.Globe.JumpToFeature(m_feature, 5);
                                }
                                break;
                            }
                        }
                    }
                }
            }
        }

        private void buttonX10_Click(object sender, EventArgs e)
        {
            if (dataGridViewX7.Rows.Count > 0)
            {
                SaveFileDialog dlg = new SaveFileDialog();
                dlg.Filter = "Excel files (*.xls)|*.xls";
                dlg.FilterIndex = 0;
                dlg.RestoreDirectory = 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 < dataGridViewX7.ColumnCount; i++)
                        {
                            if (i > 0)
                            {
                                columnTitle += "\t";
                            }
                            columnTitle += dataGridViewX7.Columns[i].HeaderText;
                        }
                        sw.WriteLine(columnTitle);

                        //写入列内容   
                        for (int j = 0; j < dataGridViewX7.Rows.Count; j++)
                        {
                            string columnValue = "";
                            for (int k = 0; k < dataGridViewX7.Columns.Count; k++)
                            {
                                if (k > 0)
                                {
                                    columnValue += "\t";
                                }
                                if (dataGridViewX7.Rows[j].Cells[k].Value == null)
                                    columnValue += "";
                                else
                                    columnValue += dataGridViewX7.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();
                    }
                }
            }
        }

        private void buttonX11_Click(object sender, EventArgs e)
        {
            trackflag = "";
           
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            sideBarPanelItem4.Visible = false;
            panel4.Visible = false;
            checkBoxX5.Checked = false;
            checkBoxX6.Checked = false;
            comboBoxEx3.SelectedIndex = -1;
            dataGridViewX6.Rows.Clear();
            dataGridViewX7.Rows.Clear();
            if (buttonItem1.Checked)
            {
                sideBar1.ExpandedPanel = sideBarPanelItem3;
            }
            else
            {
                sideBar1.Visible = false;
            }
            Refresh();
        }

        private void buttonItem94_Click(object sender, EventArgs e)//双屏对比
        {
            buttonItem94.Checked = !buttonItem94.Checked;
            splitContainer1.Panel2Collapsed = !buttonItem94.Checked;
            if (buttonItem94.Checked)
            {
                buttonItem95.Enabled = true;
                buttonItem96.Enabled = true;
                sideBar1.Visible = false;
                buttonItem1.Checked = false;
                for (int i = globeControl2.Globe.Layers.Count - 1; i >= 0 ; i--)
                {
                    GSOLayer layer = globeControl2.Globe.Layers[i];
                    if (!layer.Name.Contains("fttp:"))
                    {
                        globeControl2.Globe.Layers.Remove(layer);
                    }
                }
                //globeControl2.Globe.Layers.RemoveAll();
                FrmDataBaseOpt frm = new FrmDataBaseOpt(globeControl2);
                frm.Show(this);
            }
            else
            {
                buttonItem95.Enabled = false;
                buttonItem96.Enabled = false;
                sideBar1.Visible = true;
                buttonItem1.Checked = true;
                sideBarPanelItem3.Visible = true;
                layerTree.Visible = true;
                controlContainerItem3.Visible = true;
                Refresh();
            }
        }

        private void buttonItem51_Click(object sender, EventArgs e)
        {
            buttonItem51.Checked = !buttonItem51.Checked;
            ribbonBarMN.Visible = buttonItem51.Checked;
            ribbonBarMN.Location = new Point(0, 0);
        }

        private void buttonItem96_Click(object sender, EventArgs e)//双屏设置
        {
            FrmLayerControl frm = new FrmLayerControl(layerTree,globeControl1,globeControl2);
            frm.Show(this);
        }

        private void buttonItem95_Click(object sender, EventArgs e)//双屏联动
        {
            buttonItem95.Checked = !buttonItem95.Checked;
        }

        private void buttonItem108_Click(object sender, EventArgs e)//添加用户仓库
        {
            FrmUserRepo frm = new FrmUserRepo(-1);
            frm.ShowDialog();
        }

        private void buttonItem111_Click(object sender, EventArgs e)//用户仓库管理
        {
            FrmUserRepoMgr frm = new FrmUserRepoMgr();
            frm.ShowDialog();
        }

        private void buttonItem112_Click(object sender, EventArgs e)//添加分系统
        {
            FrmAPP frm = new FrmAPP(-1);
            frm.ShowDialog();
        }

        private void buttonItem113_Click(object sender, EventArgs e)//分系统管理
        {
            FrmAPPMgr frm = new FrmAPPMgr();
            frm.ShowDialog();
        }

        private void buttonItem114_Click(object sender, EventArgs e)//添加操作
        {
            FrmOper frm = new FrmOper(-1);
            frm.ShowDialog();
        }

        private void buttonItem115_Click(object sender, EventArgs e)//操作管理
        {
            FrmOperMgr frm = new FrmOperMgr();
            frm.ShowDialog();
        }

        private void buttonItem116_Click(object sender, EventArgs e)//添加资源
        {
            FrmRESC frm = new FrmRESC(-1);
            frm.ShowDialog();
        }

        private void buttonItem117_Click(object sender, EventArgs e)//资源管理
        {
            FrmRESCMgr frm = new FrmRESCMgr();
            frm.ShowDialog();
        }

        private void buttonItem118_Click(object sender, EventArgs e)//添加权限
        {
            FrmPerm frm = new FrmPerm(-1);
            frm.ShowDialog();
        }

        private void buttonItem119_Click(object sender, EventArgs e)//权限管理
        {
            FrmPermMgr frm = new FrmPermMgr();
            frm.ShowDialog();
        }

        private void buttonItem120_Click(object sender, EventArgs e)//添加访问控制
        {
            FrmAccess frm = new FrmAccess(-1);
            frm.ShowDialog();
        }

        private void buttonItem121_Click(object sender, EventArgs e)//访问控制管理
        {
            FrmAccessMgr frm = new FrmAccessMgr();
            frm.ShowDialog();
        }

        private void buttonItem122_Click(object sender, EventArgs e)//部门类型管理
        {
            FrmRegionTypeMgr frm = new FrmRegionTypeMgr();
            frm.ShowDialog();
        }

        private void buttonItem127_Click(object sender, EventArgs e)//添加用户
        {
            FrmUserAdd frm = new FrmUserAdd(-1);
            frm.ShowDialog();
        }

        private void buttonItem128_Click_1(object sender, EventArgs e)//用户信息管理
        {
            FrmUserManager frm = new FrmUserManager();
            frm.ShowDialog();
        }

        private void 添加角色_Click(object sender, EventArgs e)//添加角色
        {
            FrmRole frm = new FrmRole(-1);
            frm.ShowDialog();
        }

        private void 角色管理_Click(object sender, EventArgs e)//所有角色管理
        {
            FrmRoleMgr frm = new FrmRoleMgr();
            frm.ShowDialog();
        }

        private void buttonItem133_Click(object sender, EventArgs e)//部门角色管理
        {
            FrmRegionRoleMgr frm = new FrmRegionRoleMgr();
            frm.ShowDialog();
        }

        private void buttonItem130_Click(object sender, EventArgs e)//部门管理
        {
            FrmRegionMgr frm = new FrmRegionMgr();
            frm.ShowDialog();
        }

        private void buttonItem131_Click_1(object sender, EventArgs e)//传感器信息查询
        {
            GSOFeature selectedFeature = globeControl1.Globe.SelectedObject;
            if (selectedFeature == null)
            {
                MessageBox.Show("请选择一个传感器对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                if (selectedFeature.Geometry != null && selectedFeature.Geometry.Type == EnumGeometryType.GeoModel)
                {
                    GSOLayer layer = globeControl1.Globe.SelectedObjectLayer;
                    string tabelName = getTableName(layer.Caption);
                    string eqtID = selectedFeature.Description.Trim();
                    if (tabelName != "" && eqtID != "")
                    {
                        string fields = getFields(tabelName);
                        if (fields != "")
                        {
                            string sql = "select " + fields + " from " + Utility.sensorDatabase + "." + tabelName + " where EqtID=" + eqtID + " order by RecordDate desc limit 1;";
                            DataTable dt = MySqlHelper.queryDataTable(sql);
                            if (dt != null && dt.Rows.Count > 0)
                            {
                                FrmQueryMessage.ShowForm(this, dt, layer.Caption);
                                //queryMessage.Show(this);
                            }
                            else
                            {
                                MessageBox.Show("没有查询到相关信息!", "提示");
                            }
                        }
                        else
                        {
                            MessageBox.Show("配置文件 \"sensorConfig.xml\" 有误!", "提示");
                        }
                    }
                    else
                    {
                        MessageBox.Show("请选择一个传感器对象!", "提示");
                    }
                }
                else
                {
                    MessageBox.Show("请选择一个传感器对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }
        private string getTableName(string name)
        {
            string tabelName = "";
            if (Utility.sensorMarkerLayers != null)
            {
                for (int i = 0; i < Utility.sensorMarkerLayers.Count; i++)
                {
                    MarkerLayer mLayer = Utility.sensorMarkerLayers[i];
                    if (mLayer.layerName == name)
                    {
                        tabelName = mLayer.tableName;
                        break;
                    }
                }
            }
            return tabelName;
        }
        private string getFields(string tabelName)
        {
            string fields = "";
            if (Utility.sensorMarkerLayers != null)
            {
                for (int i = 0; i < Utility.sensorMarkerLayers.Count; i++)
                {
                    MarkerLayer mLayer = Utility.sensorMarkerLayers[i];
                    if (mLayer.tableName.Trim() == tabelName.Trim())
                    {                        
                        if (mLayer.fields != null)
                        {
                            foreach (string key in mLayer.fields.Keys)
                            {
                                string value = mLayer.fields[key];
                                fields += tabelName.Trim() + "." +key + " as " + value + ",";
                            }
                            fields = fields.Remove(fields.Length - 1);
                        }
                        break;
                    }
                }
            }
            return fields;
        }


        private void buttonItem132_Click(object sender, EventArgs e)//历史曲线查询
        {
            GSOFeature selectedFeature = globeControl1.Globe.SelectedObject;
            if (selectedFeature == null)
            {
                MessageBox.Show("请选择一个对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                if (selectedFeature.Geometry != null && selectedFeature.Geometry.Type == EnumGeometryType.GeoModel)
                {
                    GSOLayer layer = globeControl1.Globe.SelectedObjectLayer;
                    string tabelName = getTableName(layer.Caption);
                    string eqtID = selectedFeature.Description;
                    if (tabelName != "" && eqtID != "")
                    {
                        FrmQueryHistory.ShowForm(this, tabelName, eqtID);                        
                    }
                    else
                    {
                        MessageBox.Show("请选择一个传感器对象!", "提示");
                    }
                }
                else
                {
                    MessageBox.Show("请选择一个传感器对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }      
        }


        //定时检查传感器的状态
        public System.Windows.Forms.Timer timerOfSensor = null;
        public int alarmValueLiuLiang = 0;
        public int alarmValueYaLi = 0;
        public int alarmValueYeTi = 0;
        public int alarmValueZaoSheng = 0;
        private void buttonItem134_Click(object sender, EventArgs e)//传感器在线报警
        {
            if (timerOfSensor == null)
            {
                timerOfSensor = new System.Windows.Forms.Timer();
                timerOfSensor.Interval = 30000;
                timerOfSensor.Tick += new EventHandler(timerOfSensor_Tick);
            }
            FrmQuerySensorAlarm.ShowForm(this);            
        }
        private void timerOfSensor_Tick(Object sender, EventArgs e)//定时器
        {
            checkSensor();           
        }
        private void checkSensor()
        {            
            if (Utility.sensorMarkerLayers != null)
            {
                for (int i = 0; i < Utility.sensorMarkerLayers.Count; i++)
                {
                    MarkerLayer mLayer = Utility.sensorMarkerLayers[i];
                    if (mLayer.alarmValue > 0)
                    {
                        string sql = "select *,max(CollectTime) from " + Utility.sensorDatabase + "." + mLayer.tableName + " group by EqtID;";// "select * from " + Utility.sensorDatabase + "." + mLayer.tableName + " order by  CollectTime desc limit 1;";
                        DataTable dt = MySqlHelper.queryDataTable(sql);
                        if (dt != null && dt.Rows.Count > 0)
                        {
                            for (int j = 0; j < dt.Rows.Count; j++)
                            {
                                try
                                {
                                    string EqtID = dt.Rows[j]["EqtID"].ToString().Trim();
                                    string RecordDateDATE = dt.Rows[j]["RecordDate"].ToString().Trim();
                                    string RecordTimeTIME = dt.Rows[j]["RecordTime"].ToString().Trim();
                                    string CollectTime = dt.Rows[j]["CollectTime"].ToString().Trim();
                                    string CollectValue = "";
                                    if (mLayer.tableName == "Data_3a")
                                    {
                                        CollectValue = dt.Rows[j]["InstantValue"].ToString().Trim();
                                    }
                                    else
                                    {
                                        CollectValue = dt.Rows[j]["CollectValue"].ToString().Trim();
                                    }
                                    int value = 0;
                                    if (int.TryParse(CollectValue, out value))
                                    {
                                        if (value > mLayer.alarmValue)
                                        {
                                            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(mLayer.layerName);
                                            if (layer != null)
                                            {
                                                for (int m = 0; m < layer.GetAllFeatures().Length; m++)
                                                {
                                                    GSOFeature f = layer.GetAt(m);
                                                    if (f != null && f.Description.Trim() == EqtID)
                                                    {
                                                        f.HighLight = true;
                                                        globeControl1.Globe.Refresh();
                                                        LogError.PublishAlarmMessage(f.Name, EqtID, CollectValue, CollectTime);
                                                        break;
                                                    }
                                                }                                                
                                            }
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    continue;
                                }                                
                            }
                        }
                    }
                }
            } 
        }


        

        private void buttonItem135_Click(object sender, EventArgs e)//日志管理
        {
            FrmLogManager frm = new FrmLogManager();
            frm.ShowDialog();
        }

        private void buttonItem136_Click(object sender, EventArgs e)//用户角色管理
        {
            FrmUserRoleMgr frm = new FrmUserRoleMgr();
            frm.ShowDialog();
        }

       
        private void buttonItem137_Click(object sender, EventArgs e)
        {
            globeControl1.Globe.ClearAnalysis();
            string[] markerStrs = new string[9];
            markerStrs[0] = "标高标注";
            markerStrs[1] = "管径标注";
            markerStrs[2] = "埋深标注";
            markerStrs[3] = "坐标标注";
            markerStrs[4] = "坡度标注";
            markerStrs[5] = "属性标注";
            markerStrs[6] = "自定义标注";
            markerStrs[7] = "距离标注";
            markerStrs[8] = "红线工具";
            for (int i = 0; i < markerStrs.Length; i++)
            {
                GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(markerStrs[i]);
                l.RemoveAllFeature();
            }
            globeControl1.Refresh();
        }

        private void buttonItem138_Click(object sender, EventArgs e)//沿线运动
        {
            if (globeControl1.Globe.SelectedObject == null)
            {
                MessageBox.Show("请先选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            GSOFeature lineFeature = globeControl1.Globe.SelectedObject;
            if (lineFeature.Geometry == null || lineFeature.Geometry.Type != EnumGeometryType.GeoPolyline3D)
            {
                MessageBox.Show("请先选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "*.3ds|*.3ds|*.gcm|*.gcm|*.gse|*.gse|*.obj|*.obj||";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                GSOGeoModel model = new GSOGeoModel();
                model.FilePath = dlg.FileName;

                GSOGeoDynamicRoute dynamicRoute = new GSOGeoDynamicRoute();
                dynamicRoute.ActorGeometry = model;

                GSORoute route = new GSORoute();
                GSOGeoPolyline3D geoline = (GSOGeoPolyline3D)lineFeature.Geometry;
                for (int i = 0; i < geoline[0].Count; i++)
                {
                    route.Add(geoline[0][i]);
                }
                route.CircleRoute = false;
                route.Speed = 30;
                route.RotateSpeed = 50;
                route.AltitudeMode = geoline.AltitudeMode;
                dynamicRoute.Route = route;

                GSOFeature feature = new GSOFeature();

                dynamicRoute.Play();
                feature.Geometry = dynamicRoute;

                //GSOLabel gsoLabel = new GSOLabel();
                //gsoLabel.Text = "模型测试";
                //feature.Label = gsoLabel;
                globeControl1.Globe.MinModelVisibleSize = 0;

                globeControl1.Globe.MemoryLayer.AddFeature(feature);
                globeControl1.Globe.Refresh();
            }
        }

        private void buttonItem99_Click(object sender, EventArgs e)//回退
        {
            globeControl1.Globe.UnDoEdit();
        }

        private void buttonItem100_Click(object sender, EventArgs e)//前进
        {
            globeControl1.Globe.ReDoEdit();
        }
        //水平净距
        private void textBoxX4_TextChanged(object sender, EventArgs e)
        {
            string valueJingJu = textBoxX4.Text.Trim();
            if(valueJingJu != "")
            {
                double value = 0;
                bool bl = double.TryParse(valueJingJu,out value);
                if(bl)
                {
                    labelX24.Text = "水平净距小于" + value.ToString() +"米的管线有:";
                }
            }
        }
        //垂直净距
        private void textBoxX2_TextChanged(object sender, EventArgs e)
        {
            string valueJingJu = textBoxX2.Text.Trim();
            if (valueJingJu != "")
            {
                double value = 0;
                bool bl = double.TryParse(valueJingJu, out value);
                if (bl)
                {
                    labelX23.Text = "垂直净距小于" + value.ToString() + "米的管线有:";
                }
            }
        }
        //覆土分析
        private void textBoxX3_TextChanged(object sender, EventArgs e)
        {
            string valueJingJu = textBoxX3.Text.Trim();
            if (valueJingJu != "")
            {
                double value = 0;
                bool bl = double.TryParse(valueJingJu, out value);
                if (bl)
                {
                    labelX17.Text = "覆土深度小于" + value.ToString() + "米的管线有:";
                }
            }            
        }
        //管径统计
        private void buttonItem全区域_Click(object sender, EventArgs e)
        {
            Frmpipediameterstatis.ShowForm(globeControl1, pipelineLayerNames,0);
        }

        private void buttonItem绘制区域_Click(object sender, EventArgs e)
        {
            Frmpipediameterstatis.ShowForm(globeControl1, pipelineLayerNames,1);
        }

        private void buttonItem埋深全区域_Click(object sender, EventArgs e)
        {
            FrmpipeDeepstatis.ShowForm(globeControl1, pipelineLayerNames,0);
        }

        private void buttonItem埋深绘制区域_Click(object sender, EventArgs e)
        {
            FrmpipeDeepstatis.ShowForm(globeControl1, pipelineLayerNames,1);
        }

        private void buttonItem附属物全区域_Click(object sender, EventArgs e)
        {
            FrmAccessoriesgather.ShowForm(globeControl1, instrumenLayerNames,0);
        }

        private void buttonItem附属物绘制区域_Click(object sender, EventArgs e)
        {
            FrmAccessoriesgather.ShowForm(globeControl1, instrumenLayerNames,1);
        }

        private void buttonItem管径分类全区域_Click(object sender, EventArgs e)
        {
            FrmpipeDiametergather.ShowForm(globeControl1, pipelineLayerNames,0);
        }

        private void buttonItem管径分类绘制区域_Click(object sender, EventArgs e)
        {
            FrmpipeDiametergather.ShowForm(globeControl1, pipelineLayerNames,1);
        }

        private void buttonItem材质全区域_Click(object sender, EventArgs e)
        {
            FrmpipeMaterialGather.ShowForm(globeControl1, pipelineLayerNames,0);
        }

        private void buttonItem材质绘制区域_Click(object sender, EventArgs e)
        {
            FrmpipeMaterialGather.ShowForm(globeControl1, pipelineLayerNames,1);
        }

        private void buttonItemSensor全区域查询_Click(object sender, EventArgs e)
        {
            FrmAccessoriesSensor.ShowForm(globeControl1, instrumenLayerNames, 0);
        }

        private void buttonItemSensor绘制区域查询_Click(object sender, EventArgs e)//传感器绘制区域查询
        {
            FrmAccessoriesSensor.ShowForm(globeControl1, instrumenLayerNames, 1);
        }
        private void buttonItem139_Click(object sender, EventArgs e)//传感器管理
        {
            buttonItem139.Checked = !buttonItem139.Checked;
            buttonItem77.Checked = false;
            if (buttonItem139.Checked)
            {
                sideBar1.Visible = true;
                sideBarPanelItem3.Visible = true;
                buttonItem1.Checked = true;
                controlContainerItem3.Visible = true;
                sideBarPanelItem4.Visible = true;
                sideBarPanelItem4.Text = "传感器管理";
                panel2.Visible = false;
                panel1.Visible = false;
                panel4.Visible = false;
                panel5.Visible = false;
                panel3.Visible = false;
                controlContainerItem5.Control = panelEx3;
                panelEx3.Dock = DockStyle.Fill;
                panelEx3.Visible = true;
                sideBar1.ExpandedPanel = sideBarPanelItem4;
                sideBar1.Refresh();
                Refresh();
            }
            else
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                sideBarPanelItem4.Visible = false;
                panelEx3.Visible = false;

                if (buttonItem1.Checked)
                {
                    sideBar1.ExpandedPanel = sideBarPanelItem3;
                }
                else
                {
                    sideBar1.Visible = false;
                }

                Refresh();
            }
        }

        private void buttonX7_Click_1(object sender, EventArgs e)
        {
            trackflag = "";

            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            sideBarPanelItem4.Visible = false;
            panel2.Visible = false;
            checkBoxX3.Checked = false;
            checkBoxX4.Checked = false;
            comboBoxEx2.SelectedIndex = -1;
            dataGridViewX4.Rows.Clear();
            dataGridViewX5.Rows.Clear();
            if (buttonItem1.Checked)
            {
                sideBar1.ExpandedPanel = sideBarPanelItem3;
            }
            else
            {
                sideBar1.Visible = false;
            }
            Refresh();
        }

        private void buttonX16_Click(object sender, EventArgs e)
        {
            trackflag = "";
            globeControl1.Globe.Action = EnumAction3D.ActionNull;

            //listBox1.Items.Clear();

            checkBoxX5.Checked = false;
            checkBoxX6.Checked = false;
            comboBoxEx3.SelectedIndex = -1;
            comboBoxEx3.Enabled = false;
            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
            dataGridViewX6.Rows.Clear();
            dataGridViewX7.Rows.Clear();
        }       
    }
}