Newer
Older
GHFX_REFACTOR / MainFrm.cs
wxn on 11 Nov 2016 365 KB 清除分析整理
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.OracleClient;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.IO;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.Xml;
using Cyberpipe.Forms;
using DevComponents.DotNetBar;
using GeoScene.Data;
using GeoScene.Engine;
using GeoScene.Globe;
using Timer = System.Windows.Forms.Timer;
using ToolTip = System.Windows.Forms.ToolTip;

namespace Cyberpipe
{
    public partial class MainFrm : Office2007Form
    {
        TreeNode layerManagerNode;
        bool m_bFullScreen;
       
        GSOGlobeControl globeControl1;
        GSOGlobeControl globeControl2;
        private GSOHudButton legend;//定义图例
        private GSOHudButton btnToolNone;
        private GSOHudButton btnToolSelect;
        ToolTip tooltip1;

        GSOBalloon featureTooltip;
        GSOBalloonEx balloonEx;

        GSOBalloon featureTooltip2;
        GSOBalloonEx balloonEx2;

        GSOLayer layerTemp;
        GSOLayer layerTemp2;
        FrmRedlineResult frmredResult = null;
        FrmMnModify frmModify;
        public bool frmRedlineResult = false;
        public bool boolfrmShResult;
        public bool boolfrmModify;

        public static string m_CurrentQueryLayer;//定义当前查询的图层
        //定位和闪烁初始化定义

        public bool m_AddPipeLine;//bool添加管线
        bool m_isDrawTunnel;//bool创建隧道
        bool m_isDrawCitySevenLine;
        private bool m_isDrawRedPology; //红线工具

        private string trackflag;//定义阀门查询个数

        //记录沿线飞行设置
        //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;
        //选择管线
        int selectState;
        //private OracleConnection connBackup = null;

        //数据集合
        public static GSODataSource ds;
        public static GSODataSource shds;
        //审核layer
        string shlayername = "";
        string redlinelayername = "";
        string newlayername = ""; //导入新layer图层
        //一键审核问题layer
        public ArrayList shresultLists = new ArrayList();
        int optiValue = 50;
        //红线审核
        GSOLayer layerRedRegion;
        public string redLayer = null;
        //GSOLayer redLayer1 = null;
        bool redSH;
        string redDt = "红线";
        //双屏对比
        //bool zhanshi=false;
        Thread t = null;
        private GSOHudButton legendSC;//定义图例
        private GSOHudButton legendSG;//定义图例
        //管纵图
        private GSOHudButton lendendGZ50;
        private GSOHudButton lendendGZ36;
        private GSOHudButton lendendGZ42;
        private GSOHudButton lendendGZ24_1;
        private GSOHudButton lendendGZ24_2;
        private GSOHudButton lendendGZ24_3;
        private GSOHudButton lendendGZ26;

        GSOGeoPoint3D bsqPT;

        FrmYJSHTC frmSh;//一键审核窗口全局变量wxl
        FrmWait frmWait;//一键审核等待窗口
        //FrmWait frmWait2 = null;//文档操作等待窗口

        float mouseDownX1, mouseDownY1;
        float mouseDownX2, mouseDownY2;
        /// <summary>
        /// 
        /// </summary>
        public MainFrm()
        {
            InitializeComponent();

            PipeSys.Attach(panelEx5.Controls);
            globeControl1 = PipeSys.getGlobeCtrl();
            globeControl1.Dock = DockStyle.Fill;
            ribbonControl1.Width = Width;

            panelEx4.Controls.Add(splitContainer1);
            splitContainer1.Dock = DockStyle.Fill;

            panelEx4.Controls.Add(expandableSplitter2);
            expandableSplitter2.Dock = DockStyle.Bottom;
            expandableSplitter2.Expanded = false;
            panelEx4.Controls.Add(panelOfTable);
            panelOfTable.Dock = DockStyle.Bottom;

            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = 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;
            panelEx3.Visible = false;
            panelSpacingAnalysis.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(panelEx1.Controls);
            globeControl2 = PipeSys.getGlobeCtrl();
            globeControl2.Dock = DockStyle.Fill;

            featureTooltip2 = new GSOBalloon(globeControl2.Handle);
            balloonEx2 = new GSOBalloonEx(globeControl2.Handle);
            Utility.SetBallons(featureTooltip, balloonEx);

            panelOfTable.Height = 200;

            RigthMenuSet();

            MenuSet();
           
        }
        /// <summary>
        /// 右屏中添加管纵图片
        /// </summary>
        private void AddGZ()
        {

            lendendGZ50 = new GSOHudButton();
            lendendGZ50.SetImage(Application.StartupPath + "/Resource/管纵/50.png");
            lendendGZ50.SetOffset(0, 0);
            lendendGZ50.MinOpaque = 1;
            lendendGZ50.MaxOpaque = 1;
            lendendGZ50.FadeOut = false;
            lendendGZ50.Name = "lendendGZ50";
            lendendGZ50.Align = EnumAlign.BottomRight;
            globeControl2.Globe.AddHudControl(lendendGZ50);
            lendendGZ50.Visible = false;

            lendendGZ36 = new GSOHudButton();
            lendendGZ36.SetImage(Application.StartupPath + "/Resource/管纵/36.png");
            lendendGZ36.SetOffset(0, 0);
            lendendGZ36.MinOpaque = 1;
            lendendGZ36.MaxOpaque = 1;
            lendendGZ36.FadeOut = false;
            lendendGZ36.Name = "lendendGZ36";
            lendendGZ36.Align = EnumAlign.BottomRight;
            globeControl2.Globe.AddHudControl(lendendGZ36);
            lendendGZ36.Visible = false;

            lendendGZ42 = new GSOHudButton();
            lendendGZ42.SetImage(Application.StartupPath + "/Resource/管纵/42.png");
            lendendGZ42.SetOffset(0, 0);
            lendendGZ42.MinOpaque = 1;
            lendendGZ42.MaxOpaque = 1;
            lendendGZ42.FadeOut = false;
            lendendGZ42.Name = "lendendGZ42";
            lendendGZ42.Align = EnumAlign.BottomRight;
            globeControl2.Globe.AddHudControl(lendendGZ42);
            lendendGZ42.Visible = false;

            lendendGZ24_1 = new GSOHudButton();
            lendendGZ24_1.SetImage(Application.StartupPath + "/Resource/管纵/24_1.png");
            lendendGZ24_1.SetOffset(0, 0);
            lendendGZ24_1.MinOpaque = 1;
            lendendGZ24_1.MaxOpaque = 1;
            lendendGZ24_1.FadeOut = false;
            lendendGZ24_1.Name = "lendendGZ24_1";
            lendendGZ24_1.Align = EnumAlign.BottomRight;
            globeControl2.Globe.AddHudControl(lendendGZ24_1);
            lendendGZ24_1.Visible = false;

            lendendGZ24_2 = new GSOHudButton();
            lendendGZ24_2.SetImage(Application.StartupPath + "/Resource/管纵/24_2.png");
            lendendGZ24_2.SetOffset(0, 0);
            lendendGZ24_2.MinOpaque = 1;
            lendendGZ24_2.MaxOpaque = 1;
            lendendGZ24_2.FadeOut = false;
            lendendGZ24_2.Name = "lendendGZ24_2";
            lendendGZ24_2.Align = EnumAlign.BottomRight;
            globeControl2.Globe.AddHudControl(lendendGZ24_2);
            lendendGZ24_2.Visible = false;

            lendendGZ24_3 = new GSOHudButton();
            lendendGZ24_3.SetImage(Application.StartupPath + "/Resource/管纵/24_3.png");
            lendendGZ24_3.SetOffset(0, 0);
            lendendGZ24_3.MinOpaque = 1;
            lendendGZ24_3.MaxOpaque = 1;
            lendendGZ24_3.FadeOut = false;
            lendendGZ24_3.Name = "lendendGZ24_3";
            lendendGZ24_3.Align = EnumAlign.BottomRight;
            globeControl2.Globe.AddHudControl(lendendGZ24_3);
            lendendGZ24_3.Visible = false;

            lendendGZ26 = new GSOHudButton();
            lendendGZ26.SetImage(Application.StartupPath + "/Resource/管纵/26.png");
            lendendGZ26.SetOffset(0, 0);
            lendendGZ26.MinOpaque = 1;
            lendendGZ26.MaxOpaque = 1;
            lendendGZ26.FadeOut = false;
            lendendGZ26.Name = "lendendGZ26";
            lendendGZ26.Align = EnumAlign.BottomRight;
            globeControl2.Globe.AddHudControl(lendendGZ26);
            lendendGZ26.Visible = false;

        }

        public void RigthMenuSet()
        {
            if (Utility.userRole.IndexOf("清除分析") < 0)
            {
                toolRightMenu.Items.Remove(清除分析ToolStripMenuItem);
            }

            #region 区域分析
            if (Utility.userRole.IndexOf("区域分析") < 0)
            {
                toolRightMenu.Items.Remove(区域分析ToolStripMenuItem);
            }
            else
            {
                if (Utility.userRole.IndexOf("缓冲区分析") < 0)
                {
                    区域分析ToolStripMenuItem.DropDownItems.Remove(缓冲区分析ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("附属物分析") < 0)
                {
                    区域分析ToolStripMenuItem.DropDownItems.Remove(附属物分析ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("无源淹没分析") < 0)
                {
                    区域分析ToolStripMenuItem.DropDownItems.Remove(无源淹没分析ToolStripMenuItem);
                }
            }
            #endregion

            #region 视域分析
            if (Utility.userRole.IndexOf("视域分析") < 0)
            {
                toolRightMenu.Items.Remove(视域分析ToolStripMenuItem);
            }
            else
            {
                if (Utility.userRole.IndexOf("通视分析") < 0)
                {
                    视域分析ToolStripMenuItem.DropDownItems.Remove(通视分析ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("可视域分析") < 0)
                {
                    视域分析ToolStripMenuItem.DropDownItems.Remove(可视域分析ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("可视包络分析") < 0)
                {
                    视域分析ToolStripMenuItem.DropDownItems.Remove(可视包络分析ToolStripMenuItem);
                }
            }
            #endregion

            #region 开发分析
            if (Utility.userRole.IndexOf("开挖分析") < 0)
            {
                toolRightMenu.Items.Remove(开挖分析ToolStripMenuItem);
            }
            else
            {
                if (Utility.userRole.IndexOf("多边形开挖") < 0)
                {
                    开挖分析ToolStripMenuItem.DropDownItems.Remove(多边形开挖ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("挖方量分析") < 0)
                {
                    开挖分析ToolStripMenuItem.DropDownItems.Remove(挖方量分析ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("沿线开挖") < 0)
                {
                    开挖分析ToolStripMenuItem.DropDownItems.Remove(沿线开挖ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("创建隧道") < 0)
                {
                    开挖分析ToolStripMenuItem.DropDownItems.Remove(创建隧道ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("隐藏隧道") < 0)
                {
                    开挖分析ToolStripMenuItem.DropDownItems.Remove(隐藏隧道ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("删除隧道") < 0)
                {
                    开挖分析ToolStripMenuItem.DropDownItems.Remove(删除隧道ToolStripMenuItem);
                }
            }
            #endregion

            #region 拓扑分析
            if (Utility.userRole.IndexOf("拓扑分析") < 0)
            {
                toolRightMenu.Items.Remove(拓扑分析ToolStripMenuItem);
            }
            else
            {
                if (Utility.userRole.IndexOf("创建拓扑") < 0)
                {
                    拓扑分析ToolStripMenuItem.DropDownItems.Remove(创建拓扑ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("上游分析") < 0)
                {
                    拓扑分析ToolStripMenuItem.DropDownItems.Remove(上游分析ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("下游分析") < 0)
                {
                    拓扑分析ToolStripMenuItem.DropDownItems.Remove(下游分析ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("流向分析") < 0)
                {
                    拓扑分析ToolStripMenuItem.DropDownItems.Remove(流向分析ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("关阀分析") < 0)
                {
                    拓扑分析ToolStripMenuItem.DropDownItems.Remove(关阀分析ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("连通分析") < 0)
                {
                    拓扑分析ToolStripMenuItem.DropDownItems.Remove(连通分析ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("爆管分析") < 0)
                {
                    拓扑分析ToolStripMenuItem.DropDownItems.Remove(爆管分析ToolStripMenuItem);
                }
            }
            #endregion

            #region 断面分析
            if (Utility.userRole.IndexOf("断面分析") < 0)
            {
                toolRightMenu.Items.Remove(断面分析ToolStripMenuItem);
            }
            else
            {
                if (Utility.userRole.IndexOf("横断面分析") < 0)
                {
                    断面分析ToolStripMenuItem.DropDownItems.Remove(横断面分析ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("纵断面分析") < 0)
                {
                    断面分析ToolStripMenuItem.DropDownItems.Remove(纵断面分析ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("道路断面分析") < 0)
                {
                    断面分析ToolStripMenuItem.DropDownItems.Remove(道路断面分析ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("基线剖面分析") < 0)
                {
                    断面分析ToolStripMenuItem.DropDownItems.Remove(基线剖面分析ToolStripMenuItem);
                }
            }
            #endregion

            #region 绘制区域统计
            if (Utility.userRole.IndexOf("绘制区域统计") < 0)
            {
                toolRightMenu.Items.Remove(绘制区域统计ToolStripMenuItem);
            }
            else
            {
                if (Utility.userRole.IndexOf("绘制区域管线长度统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(管线长度统计ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("绘制区域阀门数量统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(阀门数量统计ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("绘制区域井盖数量统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(井盖数量统计ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("绘制区域管径分段统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(管径分段统计ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("绘制区域埋深分段统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(埋深分段统计ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("绘制区域管径分类统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(管径分类统计ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("绘制区域材质分类统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(材质分类统计ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("绘制区域附属物分类统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(附属物分类统计ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("绘制区域标识器分类统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(标识器分类统计ToolStripMenuItem1);
                }

            }
            #endregion

            #region 全区域统计
            if (Utility.userRole.IndexOf("全区域统计") < 0)
            {
                toolRightMenu.Items.Remove(全区域统计ToolStripMenuItem);
            }
            else
            {
                if (Utility.userRole.IndexOf("全区域管线长度统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(管线长度统计ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("全区域阀门数量统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(阀门数量统计ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("全区域井盖数量统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(井盖数量统计ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("全区域管径分段统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(管径分段统计ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("全区域埋深分段统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(埋深分段统计ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("全区域管径分类统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(管径分类统计ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("全区域材质分类统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(材质分类统计ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("全区域附属物分类统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(附属物分类统计ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("全区域标识器分类统计") < 0)
                {
                    绘制区域统计ToolStripMenuItem.DropDownItems.Remove(标识器分类统计ToolStripMenuItem);
                }

            }
            #endregion

            #region 查询
            if (Utility.userRole.IndexOf("查询") < 0)
            {
                toolRightMenu.Items.Remove(查询ToolStripMenuItem);
            }
            else
            {
                if (Utility.userRole.IndexOf("空间查询") < 0)
                {
                    查询ToolStripMenuItem.DropDownItems.Remove(空间查询ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("编号查询") < 0)
                {
                    查询ToolStripMenuItem.DropDownItems.Remove(编号查询ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("坐标查询") < 0)
                {
                    查询ToolStripMenuItem.DropDownItems.Remove(坐标查询ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("管径查询") < 0)
                {
                    查询ToolStripMenuItem.DropDownItems.Remove(管径查询ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("材质查询") < 0)
                {
                    查询ToolStripMenuItem.DropDownItems.Remove(材质查询ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("基本查询") < 0)
                {
                    查询ToolStripMenuItem.DropDownItems.Remove(基本查询ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("复合查询") < 0)
                {
                    查询ToolStripMenuItem.DropDownItems.Remove(复合查询ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("关联查询") < 0)
                {
                    查询ToolStripMenuItem.DropDownItems.Remove(关联查询ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("关键字查询") < 0)
                {
                    查询ToolStripMenuItem.DropDownItems.Remove(关键字查询ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("附属物查询") < 0)
                {
                    查询ToolStripMenuItem.DropDownItems.Remove(附属物查询ToolStripMenuItem);
                }
            }
            #endregion

            #region 标注
            if (Utility.userRole.IndexOf("标注") < 0)
            {
                toolRightMenu.Items.Remove(标注ToolStripMenuItem);
            }
            else
            {
                if (Utility.userRole.IndexOf("标高标注") < 0)
                {
                    标注ToolStripMenuItem.DropDownItems.Remove(标高标注ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("管径标注") < 0)
                {
                    标注ToolStripMenuItem.DropDownItems.Remove(管径标注ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("埋深标注") < 0)
                {
                    标注ToolStripMenuItem.DropDownItems.Remove(埋深标注ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("坐标标注") < 0)
                {
                    标注ToolStripMenuItem.DropDownItems.Remove(坐标标注ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("距离标注") < 0)
                {
                    标注ToolStripMenuItem.DropDownItems.Remove(距离标注ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("自定义标注") < 0)
                {
                    标注ToolStripMenuItem.DropDownItems.Remove(自定义标注ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("扯旗标注") < 0)
                {
                    标注ToolStripMenuItem.DropDownItems.Remove(扯旗标注ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("坡度标注") < 0)
                {
                    标注ToolStripMenuItem.DropDownItems.Remove(坡度标注ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("属性标注") < 0)
                {
                    标注ToolStripMenuItem.DropDownItems.Remove(属性标注ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("标注管理") < 0)
                {
                    标注ToolStripMenuItem.DropDownItems.Remove(标注管理ToolStripMenuItem);
                }
            }
            #endregion

            #region 飞行
            if (Utility.userRole.IndexOf("飞行") < 0)
            {
                toolRightMenu.Items.Remove(飞行ToolStripMenuItem);
            }
            else
            {
                if (Utility.userRole.IndexOf("自定义飞行") < 0)
                {
                    飞行ToolStripMenuItem.DropDownItems.Remove(自定义飞行ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("飞行到目标点") < 0)
                {
                    飞行ToolStripMenuItem.DropDownItems.Remove(飞行到目标点ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("绕中心点飞行") < 0)
                {
                    飞行ToolStripMenuItem.DropDownItems.Remove(绕中心点飞行ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("绕眼睛飞行") < 0)
                {
                    飞行ToolStripMenuItem.DropDownItems.Remove(绕眼睛飞行ToolStripMenuItem);
                }
            }
            #endregion

            #region 编辑
            if (Utility.userRole.IndexOf("编辑") < 0)
            {
                toolRightMenu.Items.Remove(编辑ToolStripMenuItem);
            }
            else
            {
                if (Utility.userRole.IndexOf("平移对象") < 0)
                {
                    编辑ToolStripMenuItem.DropDownItems.Remove(平移对象ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("升降对象") < 0)
                {
                    编辑ToolStripMenuItem.DropDownItems.Remove(升降对象ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("旋转对象") < 0)
                {
                    编辑ToolStripMenuItem.DropDownItems.Remove(旋转对象ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("连接管段") < 0)
                {
                    编辑ToolStripMenuItem.DropDownItems.Remove(连接管段ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("导出文件") < 0)
                {
                    编辑ToolStripMenuItem.DropDownItems.Remove(导出文件ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("前进") < 0)
                {
                    编辑ToolStripMenuItem.DropDownItems.Remove(前进ToolStripMenuItem);
                }
                if (Utility.userRole.IndexOf("后退") < 0)
                {
                    编辑ToolStripMenuItem.DropDownItems.Remove(删除模型ToolStripMenuItem);
                }
            }
            #endregion

            #region 量算
            if (Utility.userRole.IndexOf("量算") < 0)
            {
                toolRightMenu.Items.Remove(量算ToolStripMenuItem);
            }
            else
            {
                if (Utility.userRole.IndexOf("水平距离") < 0)
                {
                    量算ToolStripMenuItem.DropDownItems.Remove(水平距离ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("垂直距离") < 0)
                {
                    量算ToolStripMenuItem.DropDownItems.Remove(垂直距离ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("空间距离") < 0)
                {
                    量算ToolStripMenuItem.DropDownItems.Remove(空间距离ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("地表距离") < 0)
                {
                    量算ToolStripMenuItem.DropDownItems.Remove(地表距离ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("高度量算") < 0)
                {
                    量算ToolStripMenuItem.DropDownItems.Remove(高度量算ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("水平面积") < 0)
                {
                    量算ToolStripMenuItem.DropDownItems.Remove(水平面积ToolStripMenuItem1);
                }
                if (Utility.userRole.IndexOf("地表面积") < 0)
                {
                    量算ToolStripMenuItem.DropDownItems.Remove(地表面积ToolStripMenuItem1);
                }
            }
            #endregion
        }

        public void MenuSet()
        {

            #region 权限管理
            if (Utility.userRole.IndexOf("权限管理") < 0)
            {
                ribbonControl1.Items.Remove(ribbonTabItem2);
            }
            else
            {

                if (Utility.userRole.IndexOf("用户管理") < 0)
                {
                    btn_user_info.Visible = false;
                }
                if (Utility.userRole.IndexOf("角色管理") < 0)
                {
                    btn_role_info.Visible = false;
                }
                if (Utility.userRole.IndexOf("资源管理") < 0)
                {
                    btn_resc_info.Visible = false;
                }
                if (Utility.userRole.IndexOf("角色授权") < 0)
                {
                    btn_role_resc.Visible = false;
                }
                if (Utility.userRole.IndexOf("用户授权") < 0)
                {
                    btn_user_role.Visible = false;
                }
                if (Utility.userRole.IndexOf("密码修改") < 0)
                {
                    btn_password_edit.Visible = false;
                }

            }
            #endregion

            #region 基础工具
            if (Utility.userRole.IndexOf("基础工具") < 0)
            {
                ribbonControl1.Items.Remove(ribbonTabItem1);
            }
            else
            {
                if (Utility.userRole.IndexOf("地上模式") < 0)
                {
                    buttonItem87.Visible = false;
                }
                if (Utility.userRole.IndexOf("地下模式") < 0)
                {
                    buttonItem88.Visible = false;
                }
                if (Utility.userRole.IndexOf("行走模式") < 0)
                {
                    buttonItem27.Visible = false;
                }
                if (Utility.userRole.IndexOf("透明度设置") < 0)
                {
                    sliderGroundTransSet1.Visible = false;
                }
                if (Utility.userRole.IndexOf("快速定位") < 0)
                {
                    buttonItem91.Visible = false;
                }
                if (Utility.userRole.IndexOf("图层管理") < 0)
                {
                    buttonItem1.Visible = false;
                }
                if (Utility.userRole.IndexOf("图例管理") < 0)
                {
                    btnlegendSet.Visible = false;
                }
                if (Utility.userRole.IndexOf("全屏显示") < 0)
                {
                    buttonItem89.Visible = false;
                }
                if (Utility.userRole.IndexOf("导出图片") < 0)
                {
                    btnOutputJPG.Visible = false;
                }

            }
            #endregion

            #region 一键审核
            if (Utility.userRole.IndexOf("一键审核") < 0)
            {
                ribbonControl1.Items.Remove(ribbonTabItem11);
            }
            #endregion

            #region 红线审核
            if (Utility.userRole.IndexOf("红线审核") < 0)
            {
                ribbonControl1.Items.Remove(ribbonTabItem6);
            }
            #endregion

            #region 双屏对比
            if (Utility.userRole.IndexOf("双屏对比") < 0)
            {
                ribbonControl1.Items.Remove(ribbonTabItem9);
            }
            #endregion

            #region 文档管理
            if (Utility.userRole.IndexOf("文档管理") < 0)
            {
                ribbonControl1.Items.Remove(ribbonTabItem4);
            }
            #endregion

            #region 基础管理
            if (Utility.userRole.IndexOf("基础管理") < 0)
            {
                ribbonControl1.Items.Remove(ribbonTabItem14);
            }
            else
            {
                if (Utility.userRole.IndexOf("专题图审批") < 0)
                {
                    buttonItemZTT3_2.Visible = false;
                }
                if (Utility.userRole.IndexOf("打印审批") < 0)
                {
                    buttonItemZTT4_2.Visible = false;
                }
                if (Utility.userRole.IndexOf("拷贝审批") < 0)
                {
                    buttonItemZTT5_2.Visible = false;
                }
            }

            #endregion

            if (ribbonControl1.Items.Count <= 0)
            {
                ribbonControl1.Visible = false;
            }
        }

        #region Fan Zhang 重构现有代码
        //初始化控件布局
        private void initLayout()
        {
            int SW = Screen.PrimaryScreen.Bounds.Width;
            double dsw = SW;
            if (SW > 1440)
            {
                double myScreen = dsw / 1440;
                buttonX1.Width = (int)(buttonX1.Width * myScreen);
                buttonX2.Width = (int)(buttonX2.Width * myScreen);
                buttonX4.Width = (int)(buttonX4.Width * myScreen);
                buttonX5.Width = (int)(buttonX5.Width * myScreen);
                buttonX6.Width = (int)(buttonX6.Width * myScreen);
                buttonX7.Width = (int)(buttonX8.Width * myScreen);
                buttonX8.Width = (int)(buttonX8.Width * myScreen);
                buttonX9.Width = (int)(buttonX9.Width * myScreen);
                buttonX12.Width = (int)(buttonX12.Width * myScreen);
                buttonX14.Width = (int)(buttonX14.Width * myScreen);
                buttonX15.Width = (int)(buttonX15.Width * myScreen);
                buttonX16.Width = (int)(buttonX16.Width * myScreen);
                buttonX17.Width = (int)(buttonX17.Width * myScreen);

                labelX1.Width = (int)(labelX1.Width * myScreen);
                labelX2.Width = (int)(labelX2.Width * myScreen);
                labelX3.Width = (int)(labelX3.Width * myScreen);
                labelX6.Width = (int)(labelX6.Width * myScreen);
                labelX8.Width = (int)(labelX8.Width * myScreen);
                labelX9.Width = (int)(labelX9.Width * myScreen);
                labelX12.Width = (int)(labelX12.Width * myScreen);
                labelX13.Width = (int)(labelX13.Width * myScreen);
                labelX14.Width = (int)(labelX14.Width * myScreen);
                labelX16.Width = (int)(labelX16.Width * myScreen);
                labelX17.Width = (int)(labelX17.Width * myScreen);
                labelX11.Width = (int)(labelX11.Width * myScreen);
                labelX19.Width = (int)(labelX19.Width * myScreen);
                labelX21.Width = (int)(labelX21.Width * myScreen);
                labelX22.Width = (int)(labelX22.Width * myScreen);
                labelX24.Width = (int)(labelX24.Width * myScreen);
            }
            sideBar1.Visible = false;
            sideBar1.ExpandedPanel = sideBarPanelItem3;

            comboBoxEx1.Items.Clear();
            comboBoxEx2.Items.Clear();
            comboBoxEx3.Items.Clear();
            comboBoxEx4.Items.Clear();
            comboBoxLayer.Items.Clear();
            foreach (string t1 in Utility.m_PipelineLayerNames)
            {
                comboBoxEx1.Items.Add(t1);
                comboBoxEx2.Items.Add(t1);
                comboBoxEx3.Items.Add(t1);
                comboBoxEx4.Items.Add(t1);
                comboBoxLayer.Items.Add(t1);
            }

            splitContainer1.Panel2Collapsed = true;

            buttonItem87.Checked = true;//默认地上模式
            ribbonTabItem1.Select(); //初始化状态为浏览

            sideBarPanelItem3.Visible = false;
            layerTree.Visible = false;
            controlContainerItem3.Visible = false;
            if (sideBarPanelItem4.Visible)
            {
                sideBar1.Visible = true;
                controlContainerItem5.Visible = true;
            }
            else
            {
                sideBar1.Visible = false;
            }
            Refresh();
            sliderGroundTransSet1.Value = optiValue;
            sliderItem1.Value = optiValue;
            sliderItem2.Value = optiValue;
            sliderItem3.Value = optiValue;

        }

        //初始化地球控件
        private void initGlobalControl()
        {
            //选择
            btnToolSelect = new GSOHudButton();
            btnToolSelect.SetImage(Application.StartupPath + "\\Resource\\image\\select1.png");
            btnToolSelect.FadeOut = false;
            btnToolSelect.Align = EnumAlign.TopLeft;
            btnToolSelect.SetOffset(20, 50);
            btnToolSelect.Name = "1";
            btnToolSelect.HeightFixed = true;
            btnToolSelect.WidthFixed = true;
            globeControl1.Globe.AddHudControl(btnToolSelect);
            globeControl2.Globe.AddHudControl(btnToolSelect);

            //浏览
            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);

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

            //实测
            legendSC = new GSOHudButton();
            legendSC.SetImage(Application.StartupPath + "/Resource/sc.jpg");
            legendSC.SetOffset(0, 15);
            legendSC.MinOpaque = 1;
            legendSC.MaxOpaque = 1;
            legendSC.FadeOut = false;
            legendSC.Name = "legendSC";
            legendSC.Align = EnumAlign.BottomRight;
            globeControl1.Globe.AddHudControl(legendSC);
            legendSC.Visible = false;

            //施工
            legendSG = new GSOHudButton();
            legendSG.SetImage(Application.StartupPath + "/Resource/sg.jpg");
            legendSG.SetOffset(0, 15);
            legendSG.MinOpaque = 1;
            legendSG.MaxOpaque = 1;
            legendSG.FadeOut = false;
            legendSG.Name = "legendSG";
            legendSG.Align = EnumAlign.BottomRight;
            globeControl2.Globe.AddHudControl(legendSG);
            legendSG.Visible = false;

            //管纵
            AddGZ();

            globeControl1.Globe.UnderGroundFloor.Visible = false;
            globeControl1.Globe.OverviewControl.Visible = false;
            globeControl1.Globe.ScalerControl.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;
            globeControl1.Globe.EditSnapObject = true;
            globeControl1.Globe.IsReleaseMemOutOfView = true;
            globeControl1.Globe.ControlPanel.Visible = true;

            globeControl2.Globe.UnderGroundFloor.Visible = false;
            globeControl2.Globe.OverviewControl.Visible = false;
            globeControl2.Globe.ScalerControl.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;
            globeControl2.Globe.EditSnapObject = true;
            globeControl2.Globe.IsReleaseMemOutOfView = true;
            globeControl2.Globe.ControlPanel.Visible = false;

            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);

            //添加临时图层
            layerTemp = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\tempLgdData.lgd");
            layerTemp2 = globeControl2.Globe.Layers.Add(Application.StartupPath + "\\tempLgdData2.lgd");
            if (layerTemp != null)
            {
                layerTemp.MaxVisibleAltitude = 1000;
            }

            //添加城市7线图层
            globeControl1.Globe.Layers.Add(Application.StartupPath + "/城市七线/城市红线.lgd");
            globeControl1.Globe.Layers.Add(Application.StartupPath + "/城市七线/城市橙线.lgd");
            globeControl1.Globe.Layers.Add(Application.StartupPath + "/城市七线/城市黄线.lgd");
            globeControl1.Globe.Layers.Add(Application.StartupPath + "/城市七线/城市绿线.lgd");
            globeControl1.Globe.Layers.Add(Application.StartupPath + "/城市七线/城市蓝线.lgd");
            globeControl1.Globe.Layers.Add(Application.StartupPath + "/城市七线/城市紫线.lgd");
            globeControl1.Globe.Layers.Add(Application.StartupPath + "/城市七线/城市黑线.lgd");
            globeControl1.Globe.Layers.Add(Application.StartupPath + "/隧道.lgd");

            //注册对应事件
            registerEvent();
        }

        //注册地球事件
        private bool registerEvent()
        {
            if (globeControl1 == null || globeControl2 == null)
            {
                return false;
            }
            globeControl1.HudControlMouseDownEvent += globeControl1_HudControlMouseDownEvent;
            globeControl2.HudControlMouseDownEvent += globeControl2_HudControlMouseDownEvent;

            globeControl1.HudControlMouseIntoEvent += globeControl1_HudControlMouseIntoEvent;
            globeControl1.HudControlMouseOutEvent += globeControl1_HudControlMouseOutEvent;

            globeControl1.AfterNetLayerAddEvent += globeControl1_AfterNetLayerAddEvent;

            globeControl1.FeatureMouseClickEvent += globeControl1_FeatureMouseClickEvent;
            globeControl1.FeatureMouseHoverEvent += globeControl1_FeatureMouseHoverEvent;

            globeControl2.FeatureMouseClickEvent += globeControl2_FeatureMouseClickEvent;
            globeControl2.CameraBeginMoveEvent += globeControl2_CameraBeginMoveEvent;

            globeControl1.MouseDoubleClick += globeControl1_MouseDoubleClick;
            globeControl1.MouseClick += globeControl1_MouseClick;
            globeControl1.MouseDown += globeControl1_MouseDown;

            globeControl2.MouseClick += globeControl2_MouseClick;
            globeControl2.MouseDown += globeControl2_MouseDown;

            globeControl1.MouseWheel += globeControl1_MouseWheel;
            globeControl2.MouseWheel += globeControl2_MouseWheel;

            globeControl1.CameraBeginMoveEvent += globeControl1_CameraBeginMoveEvent;

            globeControl1.TrackPolylineEndEvent += globeControl1_TrackPolylineEndEvent;
            globeControl1.TrackPolygonEndEvent += globeControl1_TrackPolygonEndEvent;
            globeControl1.TrackRectEndEvent += globeControl1_TrackRectEndEvent;

            return true;
        }

        //加载两个地球数据
        private void loadData()
        {
            Thread t1 = new Thread(doLoadDataForGlobalControl1);
            t1.IsBackground = true;
            t1.Start();


        }

        //delegate void LoadDataForGlobalControl();

        private void connectServer()
        {
            globeControl1.Globe.ConnectServer(Utility.serverip, Utility.serverport, "", ""); //加载locaServer中的数据
            globeControl2.Globe.ConnectServer(Utility.serverip, Utility.serverport, "", ""); //加载locaServer中的数据
            //初始化TreeView   
            // 勾选实测图层
            foreach (TreeNode tn in layerTree.Nodes)
            {
                if (tn.Nodes.Count <= 0) continue;
                if (tn.Text != "实测数据") continue;
                tn.Checked = true;
                foreach (TreeNode tnChild in tn.Nodes)
                {
                    tnChild.Checked = true;
                    foreach (TreeNode tnGrandChild in tnChild.Nodes)
                    {
                        tnGrandChild.Checked = true;
                    }
                }
            }
        }

        private void doLoadDataForGlobalControl1()
        {
            try
            {

                globeControl1.Globe.Layers.MoveDown(10000);
                //加载实测管线数据
                Utility.dataSource = globeControl1.Globe.DataManager.OpenOracleDataSource(Utility.DBServer.Trim() + "/" + Utility.dbdatabase.Trim(), "", "", Utility.userID, Utility.DBPassword);

                if (Utility.dataSource != null)
                {
                    for (int j = 0; j < Utility.dataSource.DatasetCount; j++)
                    {
                        GSODataset dataset = Utility.dataSource.GetDatasetAt(j);
                        if (dataset != null && Utility.dictionaryNetLayerNameAndCaption.ContainsKey(dataset.Caption))
                        {
                            dataset.Caption = dataset.Name;
                            globeControl1.Globe.Layers.Add(dataset);
                        }
                    }
                }
                //隐藏红线图层
                globeControl1.Globe.Layers.GetLayerByCaption("红线").Visible = false;

                //globleControl1中加载规划数据
                GSODataSource ghDS = globeControl1.Globe.DataManager.OpenOracleDataSource(Utility.ghdbip + "/" + Utility.ghdbname, "", "", Utility.ghdbuser, Utility.ghdbpwd);
                if (ghDS != null)
                {
                    for (int j = 0; j < ghDS.DatasetCount; j++)
                    {
                        GSODataset dataset = ghDS.GetDatasetAt(j);
                        if (dataset != null && Utility.dictionaryNetLayerNameAndCaption.ContainsKey(dataset.Caption))
                        {
                            dataset.Caption = dataset.Name;
                            globeControl1.Globe.Layers.Add(dataset);
                            globeControl1.Globe.Layers[0].Visible = false;
                        }
                    }
                }

                //globeControl1,globeControl2中加载施工数据
                GSODataSource sgDS = globeControl1.Globe.DataManager.OpenOracleDataSource(Utility.sgdbip + "/" + Utility.sgdbname, "", "", Utility.sgdbuser, Utility.sgdbpwd);
                if (sgDS != null)
                {
                    for (int m = 0; m < sgDS.DatasetCount; m++)
                    {
                        GSODataset dataset = sgDS.GetDatasetAt(m);
                        if (dataset != null && !dataset.Caption.Contains("SH") && Utility.dictionaryNetLayerNameAndCaption.ContainsKey(dataset.Caption))
                        {
                            dataset.Caption = dataset.Name;
                            globeControl1.Globe.Layers.Add(dataset);
                            globeControl1.Globe.Layers[0].Visible = false;

                            globeControl2.Globe.Layers.Add(dataset);
                            globeControl2.Globe.Layers[0].Visible = true;
                        }
                    }
                }

//                LoadDataForGlobalControl ss = connectServer;
//                ss();
               
                this.Invoke((EventHandler) delegate
                {
                    connectServer();
                });
                

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void initLayerTree()
        {
            //加载临时图层节点
            layerManagerNode = new TreeNode();
            layerManagerNode.ImageIndex = 0;
            layerManagerNode.SelectedImageIndex = 0;
            layerManagerNode.Checked = true;
            layerManagerNode.Text = "临时图层";
            layerTree.Nodes.Add(layerManagerNode);

            XmlDocument doc = new XmlDocument();
            doc.Load(Utility.filename);
            XmlNodeList xmlLayerNodes = doc.SelectNodes("//layer");

            foreach (XmlNode xmlLayerNode in xmlLayerNodes)
            {

                //TODO LIST:创建一级TreeNode(实测、规划、施工)
                TreeNode nodelayer = new TreeNode();
                string layerName = xmlLayerNode.Attributes["label"].Value;
                nodelayer.Text = layerName;
                nodelayer.Checked = false;
                layerTree.Nodes.Add(nodelayer);

                XmlNodeList xmlChildLayerNodes = xmlLayerNode.ChildNodes;
                foreach (XmlNode xmlChildLayerNode in xmlChildLayerNodes)
                {
                    //TODO LIST:创建二级TreeNode节点
                    TreeNode secondLevelNode = new TreeNode();
                    string layerType = xmlChildLayerNode.Attributes["label"].Value;
                    secondLevelNode.Text = layerType;

                    if (xmlChildLayerNode.Attributes["type"] != null)
                    {   //道路图层特殊处理
                        string type = xmlChildLayerNode.Attributes["type"].Value;
                        secondLevelNode.Tag = type + "|" + layerType;
                    }
                    else
                    {
                        secondLevelNode.Tag = layerType;
                    }
                    secondLevelNode.Checked = false;
                    nodelayer.Nodes.Add(secondLevelNode);

                    XmlNodeList xmlActitualLayerNodes = xmlChildLayerNode.ChildNodes;

                    foreach (XmlNode xmlActitualLayerNode in xmlActitualLayerNodes)
                    {
                        //TODO LIST:创建三级图层节点
                        TreeNode layerNode = new TreeNode();
                        string actutallylayerType = xmlActitualLayerNode.Attributes["type"].Value;
                        string actutallylayerName = xmlActitualLayerNode.Attributes["layer"].Value;
                        string actutallyLabelName = xmlActitualLayerNode.Attributes["label"].Value;

                        layerNode.Text = actutallyLabelName;
                        layerNode.Tag = layerType + "|" + actutallyLabelName;
                        layerNode.Checked = false;
                        secondLevelNode.Nodes.Add(layerNode);
                    }

                }

            }

        }

        private void initMarkerTree()
        {
            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")) continue;
                GSOLayer markerLayer = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\标注管理\\" + markerStrs[i] + ".lgd");
                if (markerLayer == null) continue;
                TreeNode node1 = new TreeNode();
                node1.Text = markerLayer.Caption;
                node1.ImageIndex = 0;
                node1.SelectedImageIndex = 0;
                node1.Checked = markerLayer.Visible;
                node1.Tag = markerLayer;
                layerMarkerTree.Nodes[0].Nodes.Add(node1);
            }
        }

        private void MainFrm_Load(object sender, EventArgs e)
        {
            initGlobalControl();
            //initGlobalMap();
            initLayerTree();
            initMarkerTree();
            initLayout();
            loadData();


            double x = Convert.ToDouble(Utility.Query_Roads["绿岛"].ToString().Split(',')[0]);
            double y = Convert.ToDouble(Utility.Query_Roads["绿岛"].ToString().Split(',')[1]);
            double z = Convert.ToDouble(Utility.Query_Roads["绿岛"].ToString().Split(',')[2]);
            jumpToCameraState(x, y, z);

        }

        #endregion

        //Dictionary<string, string> Utility.dictionaryNetLayerNameAndCaption = new Dictionary<string, string>();
        void globeControl1_AfterNetLayerAddEvent(object sender, AfterNetLayerAddEventArgs e)
        {
            if (e.Layer != null && Utility.dictionaryNetLayerNameAndCaption.ContainsKey(e.Layer.Caption))
            {
                e.Layer.Caption = Utility.dictionaryNetLayerNameAndCaption[e.Layer.Caption];
            }
        }

        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)
            {
                GSOCameraState camera = globeControl2.Globe.CameraState;
                globeControl1.Globe.JumpToCameraState(camera);
            }
        }

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

        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 ? feature.Visible : false;
                    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 ? feature.Visible : false;
                    tempnode.Tag = feature;
                    node.Nodes.Add(tempnode);
                }
            }
        }

        /// <summary>
        /// 检查数据集是否有坐标系信息
        /// </summary>
        /// <param name="dataset"></param>
        /// <returns></returns>
        Boolean CheckDatasetGeoReference(GSODataset dataset, string strDataPath)
        {
           
            if (dataset.GeoReferenceType != EnumGeoReferenceType.Flat) return true;
            Boolean bSuccess = false;
            if (MessageBox.Show("数据没有空间参考信息,请设置空间参考信息!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) !=
                DialogResult.OK) return bSuccess;
            String strPath = Application.StartupPath + "\\Coordinate Systems";
            OpenFileDialog dlg = new OpenFileDialog();

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

            dlg.Filter = "投影文件|*.prj||";
            if (dlg.ShowDialog() != DialogResult.OK) return bSuccess;
            string lprjStr = GSODataEngineUtility.ConvertEsriPrjFileToProj4(dlg.FileName);
            string lprjFileContent = "<Projects><Project><Index>0</Index><Type>prj4</Type><Param>" + lprjStr +
                                     "</Param></Project></Projects>";

            bSuccess = dataset.LoadProjectionFromESRIFile(dlg.FileName);

            string lprjFileName = strDataPath.Substring(0, strDataPath.LastIndexOf(".")) + ".lprj";
            StreamWriter writer = new StreamWriter(lprjFileName, false);
            writer.Write(lprjFileContent);
            writer.Close();

            return bSuccess;
        }

        /// <summary>
        /// 矩形拉框结束事件处理函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void globeControl1_TrackRectEndEvent(object sender, TrackRectEndEventArgs e)
        {
            if (e.Polygon == null) return;
            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));

            int mapWidth = 0;
            int mapHeight = 0;
            Point pt = getUpperLeftPoint(pt1, pt2, out mapWidth, out mapHeight);
            int rightBottomX = pt.X + mapWidth;
            int rightBottomY = pt.Y + mapHeight;
            Image myImg = new Bitmap(mapWidth, mapHeight);
            Graphics g = Graphics.FromImage(myImg);
            g.CopyFromScreen(pt, new Point(0, 0), new Size(rightBottomX, rightBottomY));

            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 = Path.GetExtension(dlg.FileName);//扩展名 
                switch (extension)
                {
                    case ".jpg":
                        myImg.Save(dlg.FileName, ImageFormat.Jpeg);
                        break;
                    case ".png":
                        myImg.Save(dlg.FileName, ImageFormat.Png);
                        break;
                    case ".bmp":
                        myImg.Save(dlg.FileName, ImageFormat.Bmp);
                        break;
                    case ".gif":
                        myImg.Save(dlg.FileName, ImageFormat.Gif);
                        break;
                    default:
                        break;
                }
            }
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            globeControl1.Globe.MouseRoamingEnable = true;
        }
        /// <summary>
        /// 定位正北正90度俯视
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="z"></param>
        private void jumpToCameraState(double x, double y, double z)
        {
            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 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;
            }
        }
        /// <summary>
        /// layerTree选中后事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void layerTree_AfterCheck(object sender, TreeViewEventArgs 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)
                    {
                        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);
        }
        /// <summary>
        /// 树节点选中方法
        /// </summary>
        /// <param name="e"></param>
        private void CheckControl(TreeViewEventArgs e)
        {
            if (e.Action == TreeViewAction.Unknown||e.Node == null || Convert.IsDBNull(e.Node)) return;
            CheckParentNode(e.Node);
            if (e.Node.Nodes.Count > 0)
            {
                CheckAllChildNodes(e.Node, e.Node.Checked);
            }
        }
        /// <summary>
        /// 改变所有子节点的状态
        /// </summary>
        /// <param name="pn"></param>
        /// <param name="IsChecked"></param>
        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) return;
            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) return;
            layerTree.SelectedNode = e.Node;
            if (e.Node.Tag == null) return;
            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")
                {
                    LayerEditableMenuItem.Enabled = true;
                    foreach (ToolStripItem item in layerNodeContexMenu.Items)
                    {
                        item.Visible = false;
                    }
                    //LayerSelectableMenuItem.Visible = true;
                    //LayerEditableMenuItem.Visible = true;
                    RemoveLayer.Visible = true;
                    RefreshLayerFeatureListMenuItem.Visible = true;
                    //SaveLayerMenuItem.Visible = true;
                    //LayerFlyMenuItem.Visible = true;
                }

                LayerSelectableMenuItem.Visible = true;
                LayerEditableMenuItem.Visible = true;
                SaveLayerMenuItem.Visible = true;
                LayerFlyMenuItem.Visible = true;
                导出CADToolStripMenuItem1.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]);
                if (layer != null)
                {
                    LayerSelectableMenuItem.Checked = layer.Selectable;
                    LayerEditableMenuItem.Checked = layer.Editable;
                }
            }
            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;
                }
                else 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;
                }
            }
        }

        /// <summary>
        /// 删除临时添加的本地数据图层
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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;

                    for (int i = globeControl1.Globe.Layers.Count - 1; i >= 0; i--)
                    {
                        if (globeControl1.Globe.Layers[i].Caption == layer.Caption)
                        {
                            globeControl1.Globe.Layers.Remove(globeControl1.Globe.Layers[i]);
                        }
                    }

                    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 可编辑ToolStripMenuItem_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;

                    可编辑ToolStripMenuItem.Checked = !可编辑ToolStripMenuItem.Checked;
                    layer.Editable = 可编辑ToolStripMenuItem.Checked;
                }
            }
        }

        private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //TreeNode node = layerNodeContexMenu.Tag as TreeNode;
            TreeNode node = contextMenuStripDeleteLayerNode.Tag as TreeNode;

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

        private void 定位ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode node = layerTree.SelectedNode;

            if (node == null) return;
            if (node.Parent.Text.Trim() == "临时图层")
            {
                GSOLayer lsLayer = globeControl1.Globe.Layers.GetLayerByCaption(node.Text);
                double x = lsLayer.LatLonBounds.Center.X;
                double y = lsLayer.LatLonBounds.Center.Y;
                if (x == 0 && y == 0)
                {
                    x = lsLayer.Bounds.Center.X;
                    y = lsLayer.Bounds.Center.Y;
                }

                globeControl1.Globe.FlyToPosition(new GSOPoint3d(x, y, 10), EnumAltitudeMode.Absolute);
            }
            else
            {
                GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(node.Tag.ToString().Split('|')[1]);

                if (layer == null) return;
                if (layer.Caption == "红线")
                {
                    globeControl1.Globe.FlyToPosition(new GSOPoint3d(120.610963, 31.188121, 50), EnumAltitudeMode.Absolute, -4, 50, 1000);
                    globeControl1.Globe.FlyToPointSpeed = 10000000;
                    globeControl1.Globe.Action = EnumAction3D.SelectObject;

                    GSOLayer redLayer = globeControl1.Globe.Layers.GetLayerByCaption("红线");
                    if (redLayer != null)
                    {
                        redLayer.Visible = true;
                    }
                    globeControl1.Refresh();
                }
                else
                {
                    double x = layer.LatLonBounds.Center.X;
                    double y = layer.LatLonBounds.Center.Y;
                    globeControl1.Globe.FlyToPosition(new GSOPoint3d(x, y, 100), EnumAltitudeMode.Absolute);
                }
            }
        }

        private void layerTree_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (layerTree.SelectedNode == null) return;
            if (layerTree.SelectedNode.Tag.ToString().Contains("|"))
            {
                string nodeTag = layerTree.SelectedNode.Tag.ToString().Split('|')[1];
                GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(nodeTag);
                if (layer != null)
                {
                    if (layer.Caption == "红线")
                    {
                        globeControl1.Globe.FlyToPosition(new GSOPoint3d(120.610963, 31.188121, 50), EnumAltitudeMode.Absolute, -4, 50, 1000);
                        globeControl1.Globe.FlyToPointSpeed = 10000000;
                        globeControl1.Globe.Action = EnumAction3D.SelectObject;

                        GSOLayer redLayer = globeControl1.Globe.Layers.GetLayerByCaption("红线");
                        if (redLayer != null)
                        {
                            redLayer.Visible = true;
                        }
                        globeControl1.Refresh();
                    }
                    else
                    {
                        double x = layer.LatLonBounds.Center.X;
                        double y = layer.LatLonBounds.Center.Y;
                        globeControl1.Globe.FlyToPosition(new GSOPoint3d(x, y, 0), EnumAltitudeMode.Absolute);
                    }
                }
            }
            if (layerTree.SelectedNode.Tag is GSOLayer)
            {
                GSOLayer layer = layerTree.SelectedNode.Tag as GSOLayer;
                if (layer.GetAllFeatures().Length > 0)
                {
                    GSOFeature feature = layer.GetAt(0);
                    if (feature != null && feature.Geometry != null)
                    {
                        globeControl1.Globe.FlyToPosition(feature.Geometry.GeoCenterPoint, EnumAltitudeMode.Absolute);//, 0, 0, 1000);
                    }
                    else
                    {
                        globeControl1.Globe.FlyToFeature(feature);
                    }
                }
            } else if (layerTree.SelectedNode.Tag is GSOFeature)
            {
                GSOFeature feature = layerTree.SelectedNode.Tag as GSOFeature;
                if (feature.Geometry != null)
                {
                    globeControl1.Globe.FlyToPosition(feature.Geometry.GeoCenterPoint, EnumAltitudeMode.Absolute, 0, 0, 10);
                }
                else
                {
                    globeControl1.Globe.FlyToFeature(feature);
                }
            }
        }

        /// <summary>
        /// 在三维场景移动时,隐藏气泡globeControl1
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void globeControl1_CameraBeginMoveEvent(object sender, CameraBeginMoveEventArgs e)
        {
            if (featureTooltip.IsVisible())
            {
                featureTooltip.HideBalloon();
            }
            if (balloonEx.IsVisible())
            {
                balloonEx.HideBalloon();
            }
        }

        /// <summary>
        /// 在三维场景移动时,隐藏气泡globeControl2
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void globeControl2_CameraBeginMoveEvent(object sender, CameraBeginMoveEventArgs e)
        {
            if (featureTooltip2.IsVisible())
            {
                featureTooltip2.HideBalloon();
            }
            if (balloonEx2.IsVisible())
            {
                balloonEx2.HideBalloon();
            }
        }

        void globeControl1_MouseWheel(object sender, MouseEventArgs e)
        {
            if (globeControl1.Globe.CameraState.Distance > 20000000)
            {
                GSOCameraState cameraState = globeControl1.Globe.CameraState;
                cameraState.Distance = 20000000;
                globeControl1.Globe.CameraState = cameraState;
                globeControl1.Globe.Refresh();
            }
        }
        void globeControl2_MouseWheel(object sender, MouseEventArgs e)
        {
            if (globeControl2.Globe.CameraState.Distance > 20000000)
            {
                GSOCameraState cameraState = globeControl2.Globe.CameraState;
                cameraState.Distance = 20000000;
                globeControl2.Globe.CameraState = cameraState;
                globeControl2.Globe.Refresh();
            }
        }

        #region Fan 横断面
        /// <summary>
        /// 横断面分析、基线剖面分析、道路断面分析等
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static EnumTrackPolylineEndMode trackPolylineEndMode;

        void globeControl1_TrackPolylineEndEvent(object sender, TrackPolylineEndEventArgs e)
        {
            //横断面分析、道路横断面分析
            if (trackPolylineEndMode == EnumTrackPolylineEndMode.HDM_Analysis ||
                trackPolylineEndMode == EnumTrackPolylineEndMode.DLDM_Analysis)
            {
                Dictionary<GSOFeature, HDMCoordinate> hdmDic = SectionAnalysisTool.HDMAnalysis(globeControl1,
                    e.Polyline, Utility.m_PipelineLayerNames);
                FrmHDMAnalysis3 frm = new FrmHDMAnalysis3(hdmDic, globeControl1,
                    trackPolylineEndMode);
                frm.Show(this);
            }
            //基线剖面分析
            else if (trackPolylineEndMode == EnumTrackPolylineEndMode.JXPM_Analysis)
            {
                FrmBaseLineProfillAnalysis dlg = new FrmBaseLineProfillAnalysis(globeControl1.Globe, e.Polyline);
                dlg.Show(this);
                globeControl1.Globe.ClearLastTrackPolyline();
                /*
                FrmRoadHDM f = new FrmRoadHDM();
                f.Show()
                 * **/
            }
            trackPolylineEndMode = EnumTrackPolylineEndMode.Default_Analysis;
        }
        #endregion

        /// <summary>
        /// 根据范围统计阀门、管线、工井等,  开挖分析,  挖方量分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void globeControl1_TrackPolygonEndEvent(object sender, TrackPolygonEndEventArgs e)
        {
            if (globeControl1.Globe.Action != EnumAction3D.TrackPolygon || e.Polygon == null) return;
            GSOGeoPolygon3D polygon = e.Polygon;

            switch (trackflag)
            {
                case "valvequery":
                    FrmValveStatistics frm = new FrmValveStatistics(globeControl1, polygon, InitDataGridViewX1);
                    frm.Show(this);
                    globeControl1.Globe.Action = EnumAction3D.ActionNull;
                    break;

                case "PipelineDistanceStatistics":

                    FrmAllPipelineStatis frm1 = new FrmAllPipelineStatis(globeControl1, polygon, InitDataGridViewX1, Utility.m_PipelineLayerNames);
                    frm1.Show(this);
                    globeControl1.Globe.Action = EnumAction3D.ActionNull;

                    break;
                case "PipelineSpatialQuery":

                    FrmAllPipelineStatis.ShowForm(globeControl1, polygon, InitDataGridViewX1, Utility.m_PipelineLayerNames);
                    globeControl1.Globe.ClearAnalysis();
                    globeControl1.Globe.Action = EnumAction3D.ActionNull;

                    break;
                case "workwellquery":
                    FrmAllWorkWellStatis frmWell = new FrmAllWorkWellStatis(globeControl1, polygon, InitDataGridViewX1);
                    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 = polygon;
                        geoPit.PitDepth = depth;
                        geoPit.PitDepthUsing = true;
                        globeControl1.Globe.AddPit("", geoPit);
                        GSOLayer layerGround = globeControl1.Globe.Layers.GetLayerByCaption(Utility.roadLayerName);//("180fd");
                        if (layerGround != null)
                        {
                            layerGround.Visible = false;
                        }
                    }
                    globeControl1.Globe.ClearLastTrackPolygon();
                    globeControl1.Globe.Action = EnumAction3D.ActionNull;
                    break;
                case "digFillAnalysis":
                    DigFillAnalysisDlg dlg1 = new DigFillAnalysisDlg();
                    dlg1.m_globe = globeControl1.Globe;
                    dlg1.m_polygon3D = polygon;
                    globeControl1.Globe.Action = EnumAction3D.ActionNull;
                    dlg1.Show(this);
                    break;
                case "FloodAnalysis":
                    FrmFloodAnalysis frmFloodAnalysis = new FrmFloodAnalysis(globeControl1.Globe, polygon);
                    frmFloodAnalysis.Show(this);
                    globeControl1.Globe.Action = EnumAction3D.ActionNull;
                    break;
                case "BSQDuoBianXiangStatis":
                    FrmBSQStatis bsqFrm = new FrmBSQStatis(globeControl1, e.Polygon);
                    bsqFrm.Show(this);
                    globeControl1.Globe.Action = EnumAction3D.ActionNull;
                    break;

                case "":
                    break;
                default:
                    break;
            }
        }
        /// <summary>
        /// 鼠标悬浮提示
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void globeControl1_FeatureMouseHoverEvent(object sender, FeatureMouseHoverEventArgs e)
        {
            try
            {
                if (e.Feature == null) return;
                if (isFeatureContainsBianhao(e.Feature))
                {
                    featureTooltip.ShowBalloon((int)e.MousePos.X, (int)e.MousePos.Y, e.Feature.GetValue(featureIDFieldName).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);
            }
        }
        
        /// <summary>
        /// 添加管线绘制完成事件, 红线工具绘制完成
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>(完善)
        void globeControl1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left) return;
            if (m_AddPipeLine && 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();
                }
            }
            if (m_isDrawTunnel && globeControl1.Globe.Action == EnumAction3D.DrawPolyline)//创建隧道
            {
                GSOLayer tunnel = globeControl1.Globe.Layers.GetLayerByCaption("隧道");
                if (tunnel != null && tunnel.GetAllFeatures().Length > 0)
                {
                    GSOFeature feature = tunnel.GetAt(tunnel.GetAllFeatures().Length - 1);
                    FrmCreateTunnel frm = new FrmCreateTunnel(globeControl1, feature);
                    if (frm.ShowDialog() == DialogResult.OK)
                    {
                        //tunnel.Save();
                    }
                }
                globeControl1.Refresh();
            }
            if (m_isDrawCitySevenLine && globeControl1.Globe.Action == EnumAction3D.DrawPolyline)//绘制城市七线
            {
                string lineType = citySevenLineType;
                string lineName = cityServerLineName;
                GSOFeature feature = null;
                switch (lineType)
                {
                    case "城市红线":
                        GSOLayer layerRed = globeControl1.Globe.Layers.GetLayerByCaption(lineType);
                        if (layerRed != null && layerRed.GetAllFeatures().Length > 0)
                        {
                            feature = layerRed.GetAt(layerRed.GetAllFeatures().Length - 1);
                            if (feature != null)
                            {
                                feature.Name = lineName;
                                GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D();
                                style.LineColor = Color.Red;    //改变绘制的线的颜色  
                                style.LineWidth = 1;         //改变绘制的线的宽度  
                                feature.Geometry.Style = style;
                                //layerRed.Save();
                            }
                        }
                        break;
                    case "城市橙线":
                        GSOLayer layerOrange = globeControl1.Globe.Layers.GetLayerByCaption(lineType);
                        if (layerOrange != null && layerOrange.GetAllFeatures().Length > 0)
                        {
                            feature = layerOrange.GetAt(layerOrange.GetAllFeatures().Length - 1);
                            if (feature != null)
                            {
                                feature.Name = lineName;
                                GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D();
                                style.LineColor = Color.Orange;
                                feature.Geometry.Style = style;
                                //layerOrange.Save();
                            }
                        }
                        break;
                    case "城市黄线":
                        GSOLayer layerYellow = globeControl1.Globe.Layers.GetLayerByCaption(lineType);
                        if (layerYellow != null && layerYellow.GetAllFeatures().Length > 0)
                        {
                            feature = layerYellow.GetAt(layerYellow.GetAllFeatures().Length - 1);
                            if (feature != null)
                            {
                                feature.Name = lineName;
                                GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D();
                                style.LineColor = Color.Yellow;
                                feature.Geometry.Style = style;
                                //layerYellow.Save();
                            }
                        }
                        break;
                    case "城市绿线":
                        GSOLayer layerGreen = globeControl1.Globe.Layers.GetLayerByCaption(lineType);
                        if (layerGreen != null && layerGreen.GetAllFeatures().Length > 0)
                        {
                            feature = layerGreen.GetAt(layerGreen.GetAllFeatures().Length - 1);
                            if (feature != null)
                            {
                                feature.Name = lineName;
                                GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D();
                                style.LineColor = Color.Green;
                                feature.Geometry.Style = style;
                                //layerGreen.Save();
                            }
                        }
                        break;
                    case "城市蓝线":
                        GSOLayer layerBlue = globeControl1.Globe.Layers.GetLayerByCaption(lineType);
                        if (layerBlue != null && layerBlue.GetAllFeatures().Length > 0)
                        {
                            feature = layerBlue.GetAt(layerBlue.GetAllFeatures().Length - 1);
                            if (feature != null)
                            {
                                feature.Name = lineName;
                                GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D();
                                style.LineColor = Color.Blue;
                                feature.Geometry.Style = style;
                                //layerBlue.Save();
                            }
                        }
                        break;
                    case "城市紫线":
                        GSOLayer layerPurple = globeControl1.Globe.Layers.GetLayerByCaption(lineType);
                        if (layerPurple != null && layerPurple.GetAllFeatures().Length > 0)
                        {
                            feature = layerPurple.GetAt(layerPurple.GetAllFeatures().Length - 1);
                            if (feature != null)
                            {
                                feature.Name = lineName;
                                GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D();
                                style.LineColor = Color.Purple;
                                feature.Geometry.Style = style;
                                //layerPurple.Save();
                            }
                        }
                        break;
                    case "城市黑线":
                        GSOLayer layerBlack = globeControl1.Globe.Layers.GetLayerByCaption(lineType);
                        if (layerBlack != null && layerBlack.GetAllFeatures().Length > 0)
                        {
                            feature = layerBlack.GetAt(layerBlack.GetAllFeatures().Length - 1);
                            if (feature != null)
                            {
                                feature.Name = lineName;
                                GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D();
                                style.LineColor = Color.Black;
                                feature.Geometry.Style = style;
                                //layerBlack.Save();
                            }
                        }
                        break;
                }

                globeControl1.Globe.DestLayerFeatureAdd = null;
            }
            m_AddPipeLine = false;
            m_isDrawTunnel = false;
            m_isDrawCitySevenLine = false;
            if (m_isDrawRedPology && 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.Refresh();
                        }
                    }
                }
            }
            m_isDrawRedPology = false;
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
        }

        /// <summary>
        /// 获取globeControl1中鼠标按下的坐标供区别鼠标右键和滚轮按下事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void globeControl1_MouseDown(object sender, MouseEventArgs e)
        {
            mouseDownX1 = e.X;
            mouseDownY1 = e.Y;
        }
        /// <summary>
        /// 获取globeControl2中鼠标按下的坐标供区别鼠标右键和滚轮按下事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void globeControl2_MouseDown(object sender, MouseEventArgs e)
        {
            mouseDownX2 = e.X;
            mouseDownY2 = e.Y;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void globeControl2_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                if (e.X != mouseDownX2 || e.Y != mouseDownY2) return;
                RightScreenToolMenu.Show(globeControl2, e.X, e.Y);
            }
        }
        /// <summary>
        /// (完善)#wxl 待整理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void globeControl1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (globeControl1.Globe.Action == EnumAction3D.VisibilityAnalysis)
                {
                    buttonItemFX5_1.Checked = false;
                    return;
                }
                if (globeControl1.Globe.Action == EnumAction3D.SelectObject && trackflag == "vertical")  // 垂直净距分析
                {
                    if (globeControl1.Globe.SelObjectCount > 0)
                    {
                        dataGridViewX2.Rows.Clear();
                    }
                    for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++)
                    {
                        GSOLayer resLayer = null;
                        GSOFeature feat = null;
                        globeControl1.Globe.GetSelectObject(i, out feat, out resLayer);
                        if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                        {
                            int idx = dataGridViewX2.Rows.Add();
                            dataGridViewX2.Rows[idx].Tag = feat;
                            dataGridViewX2.Rows[idx].Cells[0].Value = resLayer.Caption;
                            string featureName;
                            if (isFeatureContainsBianhao(feat))
                            {
                                featureName = feat.GetValue(featureIDFieldName).ToString();
                            }
                            else
                            {
                                featureName = feat.Name;
                            }
                            dataGridViewX2.Rows[idx].Cells[1].Value = featureName;
                        }
                    }
                    return;
                }
                if (globeControl1.Globe.Action == EnumAction3D.SelectObject && trackflag == "spacing")  // 间距分析
                {
                    if (globeControl1.Globe.SelObjectCount > 0)
                    {
                        dataGridViewLineList.Rows.Clear();
                    }
                    for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++)
                    {
                        GSOLayer resLayer = null;
                        GSOFeature feat = null;
                        globeControl1.Globe.GetSelectObject(i, out feat, out resLayer);
                        if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                        {
                            int idx = dataGridViewLineList.Rows.Add();
                            dataGridViewLineList.Rows[idx].Tag = feat;
                            dataGridViewLineList.Rows[idx].Cells[0].Value = resLayer.Caption;
                            string featureName;
                            if (isFeatureContainsBianhao(feat))
                            {
                                featureName = feat.GetValue(featureIDFieldName).ToString();
                            }
                            else
                            {
                                featureName = feat.Name;
                            }
                            dataGridViewLineList.Rows[idx].Cells[1].Value = featureName;
                        }
                    }
                    return;
                }
                if (globeControl1.Globe.Action == EnumAction3D.SelectObject && trackflag == "horizontal") // 水平净距分析
                {
                    if (globeControl1.Globe.SelObjectCount > 0)
                    {
                        dataGridViewX8.Rows.Clear();
                    }
                    for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++)
                    {
                        GSOLayer resLayer = null;
                        GSOFeature feat = null;
                        globeControl1.Globe.GetSelectObject(i, out feat, out resLayer);
                        if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                        {
                            int idx = dataGridViewX8.Rows.Add();
                            dataGridViewX8.Rows[idx].Tag = feat;
                            dataGridViewX8.Rows[idx].Cells[0].Value = resLayer.Caption;
                            string featureName;
                            if (isFeatureContainsBianhao(feat))
                            {
                                featureName = feat.GetValue(featureIDFieldName).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();
                    }
                    for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++)
                    {
                        GSOLayer resLayer = null;
                        GSOFeature feat = null;
                        globeControl1.Globe.GetSelectObject(i, out feat, out resLayer);
                        if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                        {
                            int idx = dataGridViewX4.Rows.Add();
                            dataGridViewX4.Rows[idx].Tag = feat;
                            dataGridViewX4.Rows[idx].Cells[0].Value = resLayer.Caption;
                            string featureName;
                            if (isFeatureContainsBianhao(feat))
                            {
                                featureName = feat.GetValue(featureIDFieldName).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();
                    }
                    for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++)
                    {
                        GSOLayer resLayer = null;
                        GSOFeature feat = null;
                        globeControl1.Globe.GetSelectObject(i, out feat, out resLayer);
                        if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                        {
                            int idx = dataGridViewX6.Rows.Add();
                            dataGridViewX6.Rows[idx].Tag = feat;
                            dataGridViewX6.Rows[idx].Cells[0].Value = resLayer.Caption;
                            string featureName;
                            if (isFeatureContainsBianhao(feat))
                            {
                                featureName = feat.GetValue(featureIDFieldName).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;

                bsqPT = pt;

                if (buttonItemLS5.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 (e.X == mouseDownX1 && e.Y == mouseDownY1)
                {
                    toolRightMenu.Show(globeControl1, e.X, e.Y);
                    if (buttonItemLS5.Checked)
                    {
                        buttonItemLS5.Checked = false;
                    }
                }
                else
                {
                    return;
                }
            }
            globeControl1.Refresh();
        }

        /// <summary>
        /// 判断网络图片是否存在
        /// </summary>
        /// <param name="fileUrl"></param>
        /// <returns></returns>
        public static bool RemoteFileExists(string fileUrl)
        {
            bool result = false;

            WebResponse response = null;
            try
            {
                WebRequest req = 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;
        }

        /// <summary>
        /// 鼠标点击, 弹出气泡功能globeControl1 wxl待整理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void globeControl1_FeatureMouseClickEvent(object sender, FeatureMouseClickEventArgs e)
        {
            GSOFeature feature = e.Feature;

            string str1 = "";
            if (feature == null) return;
            if (feature.GetFieldDefn("图片编码") != null)//
            {
                str1 = GetBubbleInfo(feature, globeControl1);
                if (RemoteFileExists(Utility.PicRootURL + feature.GetValue("图片编码")))
                {
                    str1 += "<img width='440' height='350' src='" + Utility.PicRootURL + feature.GetValue("图片编码") + "' />";
                }
                else if (RemoteFileExists(Utility.PicDefaultURL))
                {
                    str1 += "<img width='440' height='350' src='" + Utility.PicDefaultURL + "' />";
                }
            }
            else if (isFeatureContainsBianhao(feature)) //管线模型图层
            {
                str1 = GetBubbleInfo(feature, globeControl1);
            }

            if (str1 == "") return;
            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);
        }

        /// <summary>
        /// 鼠标点击, 弹出气泡功能globeControl2
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void globeControl2_FeatureMouseClickEvent(object sender, FeatureMouseClickEventArgs e)
        {
            GSOFeature feature = e.Feature;

            string str1 = "";
            if (feature == null) return;
            if (feature.GetFieldDefn("图片编码") != null) //
            {
                str1 = GetBubbleInfo(feature, globeControl2);
                if (RemoteFileExists(Utility.PicRootURL + feature.GetValue("图片编码")))
                {
                    str1 += "<img width='440' height='350' src='" + Utility.PicRootURL + feature.GetValue("图片编码") + "' />";
                }
                else if (RemoteFileExists(Utility.PicDefaultURL))
                {
                    str1 += "<img width='440' height='350' src='" + Utility.PicDefaultURL + "' />";
                }
            }
            else if (isFeatureContainsBianhao(feature)) //管线模型图层
            {
                str1 = GetBubbleInfo(feature, globeControl2);
            }

            if (str1 == "") return;
            featureTooltip2.HideBalloon();
            balloonEx2.HideBalloon();
            balloonEx2.SetSize(EnumSizeIndexEx.CONTENT_CX, 480);
            balloonEx2.SetSize(EnumSizeIndexEx.CONTENT_CY, 420);
            balloonEx2.ShowBalloon((int)e.MousePos.X, (int)e.MousePos.Y, str1);
        }

        /// <summary>
        /// 拼接气泡表格字符串(完善)
        /// </summary>
        /// <param name="feature"></param>
        /// <returns></returns>
        private string GetBubbleInfo(GSOFeature feature, GSOGlobeControl globeControl)
        {
            if (feature == null)
            {
                return "";
            }
            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;\" >";
            string title = "";
            if (feature.GetFieldDefn("编码") != null)
            {
                string pipelinecode = feature.GetFieldAsString("编码");
                if (pipelinecode != null)
                {
                    if (Utility.listPipelineType != null)
                    {
                        for (int i = 0; i < Utility.listPipelineType.Count; i++)
                        {
                            PipelineType pipelineType = Utility.listPipelineType[i];
                            if (pipelineType == null || pipelineType.code.Trim() != pipelinecode.Trim()) continue;
                            title = pipelineType.type + "   " + pipelineType.name;
                            if (pipelineType.type == pipelineType.name)
                            {
                                title = pipelineType.type;
                            }
                            break;
                        }
                    }
                }
            }

            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;\">" + title + "   " + feature.GetFieldAsString(featureIDFieldName) + "</th></tr>";

            int rowCount = feature.GetFieldCount();
            string layerName = feature.Dataset.Name;
            string queryFields = "";
            if (Utility.Query_Fields.ContainsKey(layerName))
            {
                queryFields = Utility.Query_Fields[layerName].ToString().Trim();
            }
            else
            {
                layerName = feature.Dataset.Caption;
                queryFields = getpipeLineFields.get_Fields(layerName, globeControl);
            }
            if (queryFields != null)
            {
                string[] param = { "," };
                string[] fieldNames = queryFields.Split(param, StringSplitOptions.RemoveEmptyEntries);
                for (int j = 0; j < fieldNames.Length; j++)
                {
                    string fieldName = fieldNames[j].Trim();
                    GSOFieldDefn field1 = feature.GetFieldDefn(fieldName);

                    string name1 = "";
                    string value1 = "";
                    if (field1 != null)
                    {
                        if (field1.Name == "图片编码")
                        {
                            j++;
                        }
                        if (j < rowCount)
                        {
                            field1 = feature.GetFieldDefn(j);
                            name1 = field1.Name;
                            if (name1 == "模型路径")
                            {
                                continue;
                            }
                            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 (field1.Type == EnumFieldType.Double)
                            {
                                double dl1 = feature.GetFieldAsDouble(j);
                                if (!name1.Contains("管径") && !name1.Contains("电压") && !name1.Contains("角度"))
                                {
                                    name1 += "_米";
                                }
                                value1 = dl1.ToString("0.00");
                            }
                            else
                            {
                                if (!feature.IsFieldValueNull(j))
                                {
                                    value1 = feature.GetValue(j).ToString();
                                }
                            }
                        }
                    }
                    string name2 = "";
                    string value2 = "";
                    if (j + 1 < rowCount)
                    {
                        GSOFieldDefn field2 = feature.GetFieldDefn(j + 1);

                        if (field2 != null)
                        {
                            if (field2.Name == "图片编码")
                            {
                                j++;
                            }
                            if (j + 1 < rowCount)
                            {
                                field2 = feature.GetFieldDefn(j + 1);
                                name2 = field2.Name;

                                if (name2 == "模型路径")
                                {
                                    continue;
                                }

                                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 (field2.Type == EnumFieldType.Double)
                                {
                                    double dl2 = feature.GetFieldAsDouble(j + 1);
                                    if (!name2.Contains("管径") && !name2.Contains("电压") && !name2.Contains("角度"))
                                    {
                                        name2 += "_米";
                                    }
                                    value2 = dl2.ToString("0.00");
                                }
                                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;
        }

        //string filename = Utility.filename;
        //List<string> g1layername = new List<string>();

        /// <summary>
        /// 获取目标图层
        /// </summary>
        /// <returns></returns>
        private GSOLayer TreeNodeFeatureLayer()
        {
            TreeNode featureAddPipeFitTreenode = GetDestLayerFeatureAddTreeNode();
            GSOLayer featureAddLayer = globeControl1.Globe.Layers.GetLayerByCaption(featureAddPipeFitTreenode.Tag.ToString().Split('|')[1]);

            return featureAddLayer != null ? featureAddLayer : 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) // Config配置文件配置的图层
                    {
                        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) continue;
                                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(tempChildNode2.Tag.ToString().Split('|')[1]);
                                    if (layer == null)
                                    {
                                        continue;
                                    }
                                    if (tempChildNode2.Tag != null && layer.IsDestLayerFeatureAdd())
                                    {
                                        return tempChildNode2;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return null;
        }

        /// <summary>
        /// 地上模式  菜单按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem87_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItem87.Text);

            if (buttonItem87.Checked) return;
            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();
        }
        /// <summary>
        /// 地下模式 菜单按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem88_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItem88.Text);

            if (buttonItem88.Checked) return;
            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();
        }
        /// <summary>
        /// 行走模式 菜单按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem27_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItem27.Text);

            if (buttonItem27.Checked) return;
            buttonItem27.Checked = true;
            buttonItem87.Checked = false;
            buttonItem88.Checked = false;

            globeControl1.Globe.CameraMode = EnumCameraMode.Walk;
        }
        /// <summary>
        /// 地面透明度设置  菜单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void sliderGroundTransSet1_ValueChanged(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, sliderGroundTransSet1.Text);

            globeControl1.Globe.GroundOpaque = 100 - sliderGroundTransSet1.Value;
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(Utility.roadLayerName);//("180fd");
            if (layer != null)
                layer.Opaque = 100 - sliderGroundTransSet1.Value;
            optiValue = sliderGroundTransSet1.Value;
        }
        /// <summary>
        /// 图例  菜单按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnlegendSet_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, btnlegendSet.Text);

            btnlegendSet.Checked = !btnlegendSet.Checked;
            legend.Visible = !legend.Visible;
            globeControl1.Refresh();
        }
        /// <summary>
        /// 快速定位  菜单按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem91_Click(object sender, EventArgs e) //
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItem91.Text);
            FrmFlyToPosition fly = new FrmFlyToPosition(globeControl1);
            fly.Show(this);
        }
        /// <summary>
        /// 图层管理 菜单按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItem1.Text);

            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;

                //修改图层管理与标注管理、覆土审查、水平净距分析、垂直净距分析和碰撞分析控件之间的逻辑关系
                controlContainerItem5.Visible = false;
                sideBar1.Visible = false;
                sideBarPanelItem4.Visible = false;
                panel3.Visible = false;
                sideBar1.ExpandedPanel = sideBarPanelItem3;
                buttonItemBZ11.Checked = false;
                Refresh();
            }
        }
        /// <summary>
        /// 全屏显示  菜单按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem89_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItem89.Text);

            buttonItem89.Checked = !buttonItem89.Checked;
            FullScreen();
        }

        //全屏显示调用的windows底层api函数
        [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;
        int heightOld;
        int xOld;
        int yOld;
        /// <summary>
        /// 全屏显示功能实现(完善)
        /// </summary>
        private void FullScreen()
        {
            if (!m_bFullScreen)  // 启用全屏
            {
                xOld = Location.X;
                yOld = Location.Y;
                widthOld = Width;
                heightOld = Height;

                SuspendLayout();//挂起

                FormBorderStyle = FormBorderStyle.Sizable;
                WindowState = FormWindowState.Maximized;
                //////任务栏
                IntPtr trayHwnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Shell_TrayWnd", null);
                if (trayHwnd != IntPtr.Zero)
                {
                    ShowWindow(trayHwnd.ToInt32(), 0);
                }

                int widthFull = Screen.PrimaryScreen.Bounds.Width;
                int heightFull = Screen.PrimaryScreen.Bounds.Height;

                FormBorderStyle = FormBorderStyle.None;
                WindowState = FormWindowState.Normal;

                Location = new Point(0, 0);
                SetFullScreen(widthFull, heightFull);

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

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

                ResumeLayout();//重新开始

                m_bFullScreen = true;
            }
            else  // 取消全屏
            {
                SuspendLayout();//挂起

                //////任务栏
                IntPtr trayHwnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Shell_TrayWnd", null);
                if (trayHwnd != IntPtr.Zero)
                {
                    ShowWindow(trayHwnd.ToInt32(), 1);
                }

                FormBorderStyle = FormBorderStyle.Sizable;
                WindowState = FormWindowState.Normal;

                Location = new Point(xOld, yOld);
                SetFullScreen(widthOld, heightOld);

                ////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;
                sideBar1.Visible = true;
                buttonItem1.Checked = true;
                expandableSplitter2.Visible = true;
                statusStrip1.Visible = true;
                ribbonControl1.Visible = true;
                pictureBox1.Visible = true;

                ResumeLayout();//重新开始                
                m_bFullScreen = false;
                Focus();
                //初始化隐藏图层管理 
                sideBarPanelItem3.Visible = false;
                layerTree.Visible = false;
                controlContainerItem3.Visible = false;
                if (sideBarPanelItem4.Visible)
                {
                    sideBar1.Visible = true;
                    controlContainerItem5.Visible = true;
                }
                else
                {
                    sideBar1.Visible = false;
                }
                buttonItem1.Checked = false;
                Refresh();
            }
        }

        /// <summary>
        /// 设置窗体宽、高
        /// </summary>
        /// <param name="width"></param>
        /// <param name="height"></param>
        private void SetFullScreen(int width, int height)
        {
            Width = width;
            Height = height;
        }

        /// <summary>
        /// 全屏功能的快捷键F5
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainFrm_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.F5:
                    FullScreen();
                    break;
                case Keys.Escape:
                    if (m_bFullScreen)
                    {
                        FullScreen();
                    }
                    break;

                default:
                    break;
            }
            if (e.KeyCode == Keys.P && e.Modifiers == Keys.Control)
            {
                buttonItem130_Click_1(this, EventArgs.Empty);
            }
        }

        private Point getUpperLeftPoint(Point p1, Point p2, out int mapWidth, out int mapHeight) //
        {
            Rectangle rc = new Rectangle();

            p1 = globeControl1.PointToScreen(p1);
            p2 = globeControl1.PointToScreen(p2);

            int x = Screen.PrimaryScreen.Bounds.X;
            int y = Screen.PrimaryScreen.Bounds.Y;
            int screenWidth = SystemInformation.WorkingArea.Width;
            int screenHeight = SystemInformation.WorkingArea.Height;

            rc.X = p1.X < x ? x : p1.X;
            rc.Y = p1.Y < y ? y : p1.Y;
            p1.X = rc.Left;
            p1.Y = rc.Top;

            p2.X = p2.X > screenWidth ? screenWidth : p2.X;
            p2.Y = p2.Y > screenHeight ? screenHeight : p2.Y;
            rc.Width = p2.X - rc.X;
            rc.Height = p2.Y - rc.Y;

            mapWidth = rc.Width;
            mapHeight = rc.Height;
            Point pt = new Point(rc.Left, rc.Top);
            return pt;
        }

        Image printImage;
        private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
        {
            e.Graphics.DrawImage(printImage, 10, 10);
        }
        /// <summary>
        /// 输出地图  菜单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOutputJPG_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, btnOutputJPG.Text);

            Point pt1 = new Point(Convert.ToInt32(0), Convert.ToInt32(0));
            Point pt2 = new Point(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height));
            int mapWidth = 0;
            int mapHeight = 0;
            Point pt = getUpperLeftPoint(pt1, pt2, out mapWidth, out mapHeight);
            int rightBottomX = pt.X + mapWidth;
            int rightBottomY = pt.Y + mapHeight;
            Image myImg = new Bitmap(mapWidth, mapHeight);
            Graphics g = Graphics.FromImage(myImg);
            g.CopyFromScreen(pt, new Point(0, 0), new Size(rightBottomX, rightBottomY));

            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 = Path.GetExtension(dlg.FileName);//扩展名 
                switch (extension)
                {
                    case ".jpg":
                        myImg.Save(dlg.FileName, ImageFormat.Jpeg);
                        break;
                    case ".png":
                        myImg.Save(dlg.FileName, ImageFormat.Png);
                        break;
                    case ".bmp":
                        myImg.Save(dlg.FileName, ImageFormat.Bmp);
                        break;
                    case ".gif":
                        myImg.Save(dlg.FileName, ImageFormat.Gif);
                        break;
                    default:
                        break;
                }
            }
        }
        /// <summary>
        /// 图层目录树 右键菜单中的 目标图层 菜单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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]);
                globeControl1.Globe.DestLayerFeatureAdd = layer;
            }
        }
        /// <summary>
        /// 图层目录树 右键菜单中的 可选择 菜单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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;
        }
        /// <summary>
        /// 图层目录树 右键菜单中的 可编辑 菜单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void LayerEditableMenuItem_Click(object sender, EventArgs e)
        {
            TreeNode node = layerNodeContexMenu.Tag as TreeNode;
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(node.Tag.ToString().Split('|')[1]);
            LayerEditableMenuItem.Checked = !LayerEditableMenuItem.Checked;
            layer.Editable = LayerEditableMenuItem.Checked;
        }
        /// <summary>
        /// 图层目录树 右键菜单中的 保存 菜单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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.GetLayerByCaption(layerCaption);
            layer.Dataset.Save();
        }

        #region wxl feature的公共方法
        /// <summary>
        /// 查找指定图层中在 指定范围内的feature对象集合
        /// </summary>
        /// <param name="polygon"></param>
        /// <param name="layername"></param>
        /// <returns></returns>
        private GSOFeatures Polygon_Contain_PointAnalysis(GSOGeoPolygon3D polygon, string layername)
        {
            GSOFeatures feats = new GSOFeatures();
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layername);
            if (layer == null)return feats;
            GSOFeatureLayer flayer = layer as GSOFeatureLayer;
            if (flayer == null) return feats;
            feats = polygon == null ? flayer.GetAllFeatures() : flayer.FindFeaturesInPolygon(polygon, false);
            return feats;
        }
        #endregion
        /// <summary>
        /// 清除结果 菜单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem47_Click(object sender, EventArgs e)
        {
            globeControl1.Globe.ClearAnalysis();
            dataGridViewX1.DataSource = null;
            panelOfTable.Visible = false;
            clearFeatureHighLight();
        }
        /// <summary>
        /// 设置菜单的选中状态
        /// </summary>
        private void ActionToolMenuChecked()
        {
            if (globeControl1.Globe.Action != EnumAction3D.TrackPolyline)
            {
                buttonItemFX2_1.Checked = false;
                buttonItemFX2_4.Checked = false;
                buttonItemFX2_3.Checked = false;
                buttonItemFX4_3.Checked = false;
            }
            if (globeControl1.Globe.Action != EnumAction3D.NormalHit)
            {
                buttonItemFX3_6.Checked = false;
                buttonItemFX3_5.Checked = false;
            }
            if (globeControl1.Globe.Action != EnumAction3D.TrackPolygon)
            {
                buttonItemFX4_2.Checked = false;
                buttonItemFX4_1.Checked = false;
            }
        }
        /// <summary>
        /// 主窗体关闭事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MainFrm_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("是否退出系统?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
                e.Cancel = true;
            else
                globeControl1.Globe.MemoryLayer.SaveAs(Application.StartupPath + "/MyPlace.kml");
        }

        #region 完善
        /// <summary>
        /// 垂直净距分析 功能界面中的 选择图层复选框 选中状态改变事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBoxX2_CheckedChanged(object sender, EventArgs e)
        {
            clearFeatureHighLight();
            comboBoxEx1.Enabled = checkBoxX2.Checked;
            if (checkBoxX2.Checked)
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;

                trackflag = "";
                dataGridViewX2.Rows.Clear();
                dataGridViewX3.Rows.Clear();

                comboBoxEx1.SelectedIndex = -1;
            }
            globeControl1.Globe.ClearAnalysis();
            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }
        /// <summary>
        /// 水平净距分析 功能界面中的 选择图层复选框 选中状态改变事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBoxX2_CheckedChanged_shuiping(object sender, EventArgs e)
        {
            clearFeatureHighLight();//清除高亮
            comboBoxEx4.Enabled = checkBoxX8.Checked;
            if (checkBoxX8.Checked)
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                trackflag = "";
                dataGridViewX8.Rows.Clear();
                dataGridViewX9.Rows.Clear();

                comboBoxEx4.SelectedIndex = -1;

            }
            globeControl1.Globe.ClearAnalysis();
            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }
        /// <summary>
        /// 垂直净距分析 功能界面中的 选择管线复选框 选中状态改变事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBoxX1_CheckedChanged(object sender, EventArgs e)
        {
            clearFeatureHighLight();
            if (checkBoxX1.Checked)
            {
                comboBoxEx1.SelectedItem = null;
                globeControl1.Globe.ClearAnalysis();
                layerTemp.RemoveAllFeature();
                globeControl1.Refresh();
                comboBoxEx1.Enabled = false;
                dataGridViewX2.Rows.Clear();
                dataGridViewX3.Rows.Clear();
                trackflag = "vertical";
                globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
            else
            {
                comboBoxEx1.Enabled = true;
            }
        }
        /// <summary>
        /// 水平净距分析 功能界面中的 选择管线复选框 选中状态改变事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBoxX1_CheckedChanged_shuiping(object sender, EventArgs e)
        {
            clearFeatureHighLight();//清除高亮
            if (checkBoxX7.Checked)
            {
                comboBoxEx4.SelectedItem = null;
                globeControl1.Globe.ClearAnalysis();
                layerTemp.RemoveAllFeature();
                globeControl1.Refresh();
                comboBoxEx4.Enabled = false;
                dataGridViewX8.Rows.Clear();
                dataGridViewX9.Rows.Clear();
                trackflag = "horizontal";
                globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
            else
            {
                comboBoxEx4.Enabled = true;
            }
        }
        /// <summary>
        /// 垂直净距分析 功能界面中的 选择图层下拉框 选中项改变 事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxEx1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBoxEx1.SelectedIndex <= -1) return;
            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();
            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;
            }
        }
        /// <summary>
        /// 水平净距分析 功能界面中的 选择图层下拉框 选中项改变 事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxEx1_SelectedIndexChanged_shuiping(object sender, EventArgs e)
        {
            if (comboBoxEx4.SelectedIndex <= -1) return;
            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();
            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;
            }
        }
        Dictionary<string, int> featCount = new Dictionary<string, int>();
        Dictionary<string, double> featLenth = new Dictionary<string, double>();
        Dictionary<string, GSOPoint3d> m_FeaturesWithBianhao = new Dictionary<string, GSOPoint3d>();//记录编号和对应的标注点的位置
        GSOFeatures polygonJingJuAnalysises = new GSOFeatures();
        /// <summary>
        /// 垂直净距分析 功能界面中的 开始分析按钮  事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX1_Click(object sender, EventArgs e)
        {
            if (!checkBoxX1.Checked && !checkBoxX2.Checked)
            {
                MessageBox.Show("请确定是选择管线还是选择图层!", "提示");
                return;
            }
            if (textBoxX2.Text.Trim() == "")
            {
                MessageBox.Show("净距标准不能为空!", "提示");
                return;
            }
            double dJingJuBiaoZhun = 0.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();
                clearFeatureHighLight();
                dataGridViewX3.Rows.Clear();
                m_FeaturesWithBianhao.Clear();
                Cursor = Cursors.WaitCursor;
                if (checkBoxX1.Checked) // 选择管线
                {
                    for (int i = 0; i < dataGridViewX2.Rows.Count; i++)
                    {
                        GSOFeature selectedFeature = dataGridViewX2.Rows[i].Tag as GSOFeature;
                        if (selectedFeature != null)
                        {
                            selectState = 1;
                            VerticalDistanceAnalysis("垂直净距分析", selectedFeature, Utility.m_PipelineLayerNames, dJingJuBiaoZhun, 0.0);
                        }
                    }
                }
                else if (checkBoxX2.Checked) // 选择图层
                {
                    if (comboBoxEx1.SelectedItem == null)
                    {
                        MessageBox.Show("请选择一个图层!", "提示");
                        return;
                    }
                    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++)
                    {
                        selectState = 1;
                        VerticalDistanceAnalysis("垂直净距分析", feats[i], Utility.m_PipelineLayerNames, dJingJuBiaoZhun, 0.0);
                    }
                }
                if (featCount.Count > 0)
                {
                    for (int i = 0; i < Utility.m_PipelineLayerNames.Count; i++)
                    {
                        if (featCount.ContainsKey(Utility.m_PipelineLayerNames[i]) && featLenth.ContainsKey(Utility.m_PipelineLayerNames[i]))
                        {
                            listBox1.Items.Add(Utility.m_PipelineLayerNames[i] + ":" + featCount[Utility.m_PipelineLayerNames[i]] + "条,共" + featLenth[Utility.m_PipelineLayerNames[i]].ToString("0.00") + "米");
                        }
                    }
                }
                if (dataGridViewX3.Rows.Count == 0 && selectState == 1)
                {
                    MessageBox.Show("没有不符合净距标准的管线!", "提示");
                }
            }
            else
            {
                MessageBox.Show("请选中要进行垂直净距分析的管线!", "提示");
            }
            globeControl1.Refresh();
            Cursor = Cursors.Default;
        }
        /// <summary>
        /// 在指定的两点组成的线的中间添加一个marker对象,并将marker对象添加到指定的图层中
        /// </summary>
        /// <param name="markerLayer"></param>
        /// <param name="pntIntersect1"></param>
        /// <param name="pntIntersect2"></param>
        /// <param name="distance"></param>
        /// <returns></returns>
        private GSOPoint3d LabelVerticalDistance(GSOLayer markerLayer, GSOPoint3d pntIntersect1, GSOPoint3d pntIntersect2, double distance, bool markerVisible)
        {
            if (pntIntersect1 == null || pntIntersect2 == null)
            {
                return new GSOPoint3d();
            }
            GSOGeoPolyline3D disline = new GSOGeoPolyline3D();
            GSOPoint3ds point3ds = new GSOPoint3ds();
            point3ds.Add(pntIntersect1);
            point3ds.Add(pntIntersect2);
            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 line = new GSOFeature();
            line.Geometry = disline;

            GSOGeoMarker dismarker = new GSOGeoMarker();
            dismarker.X = pntIntersect1.X;
            dismarker.Y = pntIntersect1.Y;
            dismarker.Z = (pntIntersect1.Z + pntIntersect2.Z) / 2;

            string disStr = distance.ToString("0.00");
            if (disStr != "0.00")
            {
                dismarker.Text = distance.ToString("0.00") + "米";
            }
            else
            {
                dismarker.Text = "交叉";
            }
            dismarker.AltitudeMode = EnumAltitudeMode.Absolute;
            GSOMarkerStyle3D styleMarker = new GSOMarkerStyle3D();
            GSOTextStyle styleText = new GSOTextStyle();
            styleText.IsSizeFixed = true;
            styleText.ForeColor = Color.White;
            styleText.FontSize = 20;
            styleMarker.TextStyle = styleText;
            dismarker.Style = styleMarker;

            GSOFeature marker = new GSOFeature();
            marker.Geometry = dismarker;

            line.Visible = marker.Visible = markerVisible;

            markerLayer.AddFeature(line);
            markerLayer.AddFeature(marker);

            return dismarker.Position;
        }
        /// <summary>
        /// 计算指定feature对象与除了该feature所在图层之外的 所有管线图层中的所有feature对象 的垂直距离 并在表格中记录符合要求的管线 
        /// </summary>
        /// <param name="type"></param>
        /// <param name="caption"></param>
        /// <param name="feat"></param>
        /// <param name="dis"></param>
        private void VerticalDistanceAnalysis(string type, GSOFeature selectedFeature, List<string> _pipelineLayerNames, double verticalDistance, double horizontalDistance)
        {
            if (selectedFeature == null)
            {
                selectState = 0;
                MessageBox.Show("请选择一条管线!");
                return;
            }
            GSOGeoPolyline3D line1 = selectedFeature.Geometry as GSOGeoPolyline3D;
            if (line1 == null)
            {
                selectState = 0;
                MessageBox.Show("请选择一条管线!");
                return;
            }
            GSOGeoPolygon3D polygon = line1.CreateBuffer(0.1, true, 5, true, false);

            string caption = selectedFeature.Dataset.Caption;

            GSOPoint3d pntIntersect1 = new GSOPoint3d();
            GSOPoint3d pntIntersect2 = new GSOPoint3d();
            GSOPoint3d pntProIntersect1 = new GSOPoint3d();
            GSOPoint3d pntProIntersect2 = new GSOPoint3d();
            for (int i = 0; i < _pipelineLayerNames.Count; i++)
            {
                if (caption == _pipelineLayerNames[i])
                {
                    continue;
                }
                GSOLayer layer2 = globeControl1.Globe.Layers.GetLayerByCaption(_pipelineLayerNames[i]);
                if (layer2 == null) continue;
                GSOFeatureLayer flayer2 = layer2 as GSOFeatureLayer;
                GSOFeatureDataset fdataset2 = flayer2.Dataset as GSOFeatureDataset;
                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;

                    double dDist = -1;
                    dDist = globeControl1.Globe.Analysis3D.ComputeHorizonDistance(line1, line2, out pntIntersect1, out pntIntersect2, out pntProIntersect1, out pntProIntersect2, false);
                      
                    if (dDist > -1)
                    {
                        dDist = Math.Abs(pntIntersect1.Z - pntIntersect2.Z) - pipeStyle1.Radius - pipeStyle2.Radius;//获得净距值

                        if (dDist < verticalDistance)
                        {
                            int idx = -1;
                            GSOPoint3d markerPosition = new GSOPoint3d();
                            if (type == "垂直净距分析")
                            {
                                feat2.HighLight = true;
                                markerPosition = LabelVerticalDistance(layerTemp, pntIntersect1, pntIntersect2, dDist, true);

                                idx = dataGridViewX3.Rows.Add();
                                dataGridViewX3.Rows[idx].Cells[0].Value = caption;
                                dataGridViewX3.Rows[idx].Cells[1].Value = selectedFeature.Name;
                                dataGridViewX3.Rows[idx].Cells[2].Value = layer2.Caption;
                                dataGridViewX3.Rows[idx].Cells[3].Value = feat2.Name;
                                dataGridViewX3.Rows[idx].Cells[4].Value = dDist.ToString("0.00");
                            }
                            else if (type == "碰撞分析")
                            {
                                feat2.HighLight = true;
                                markerPosition = LabelVerticalDistance(layerTemp, pntIntersect1, pntIntersect2, dDist, false);

                                selectedFeature.HighLight = true;
                                idx = dataGridViewX5.Rows.Add();
                                dataGridViewX5.Rows[idx].Cells[0].Value = dataGridViewX4.Rows[0].Cells[0].Value.ToString();
                                dataGridViewX5.Rows[idx].Cells[1].Value = selectedFeature.Name;
                                dataGridViewX5.Rows[idx].Cells[2].Value = layer2.Caption;
                                dataGridViewX5.Rows[idx].Cells[3].Value = feat2.Name;
                            }
                            else if (type == "间距分析")
                            {
                                GSOGeoPolygon3D polygonSpacing = line2.CreateBuffer(horizontalDistance, true, 5, false, false);
                                if (polygonSpacing != null)
                                {
                                    GSOFeatures horizontalFeatures = layer2.FindFeaturesInPolygon(polygonSpacing, false);
                                    if (horizontalFeatures != null)
                                    {
                                        for (int m = 0; m < horizontalFeatures.Length; m++)
                                        {
                                            GSOFeature horizontalFeature = horizontalFeatures[m];
                                            if (horizontalFeature != null && horizontalFeature.ID == feat2.ID)
                                            {
                                                feat2.HighLight = true;
                                                idx = dataGridViewAnalysisResult.Rows.Add();
                                                dataGridViewAnalysisResult.Rows[idx].Tag = feat2;
                                                dataGridViewAnalysisResult.Rows[idx].Cells[0].Value = dataGridViewLineList.Rows[0].Cells[0].Value.ToString();
                                                dataGridViewAnalysisResult.Rows[idx].Cells[1].Value = selectedFeature.Name;
                                                dataGridViewAnalysisResult.Rows[idx].Cells[2].Value = layer2.Caption;
                                                dataGridViewAnalysisResult.Rows[idx].Cells[3].Value = feat2.Name;
                                                dataGridViewAnalysisResult.Rows[idx].Cells[4].Value = dDist.ToString("0.00");
                                                dataGridViewAnalysisResult.Rows[idx].Cells[5].Value = horizontalDistance.ToString("0.00");
                                                break;
                                            }
                                        }
                                    }
                                }
                            }

                            if (m_FeaturesWithBianhao.ContainsKey(selectedFeature.Name + "-" + feats2[j].Name) == false)
                            {
                                m_FeaturesWithBianhao.Add(selectedFeature.Name + "-" + feats2[j].Name, markerPosition);//添加飞行位置记录
                            }

                            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();
            selectedFeature.ReleaseInnerPointer();
        }
        /// <summary>
        /// 垂直净距分析中 表格行的 双击定位 功能。 与覆土分析的实现方法不同,主要原因是需要标注垂距
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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 key = dataGridViewX3.Rows[hittestinfo.RowIndex].Cells[1].Value.ToString().Trim() + "-" + dataGridViewX3.Rows[hittestinfo.RowIndex].Cells[3].Value.ToString().Trim();
                    if (m_FeaturesWithBianhao.ContainsKey(key))
                    {
                        globeControl1.Globe.JumpToPosition(m_FeaturesWithBianhao[key], EnumAltitudeMode.Absolute, 5);
                    }
                }
            }
        }
        /// <summary>
        /// 水平净距分析 功能界面中 开始分析按钮 的事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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();
                clearFeatureHighLight();
                dataGridViewX9.Rows.Clear();
                Cursor = Cursors.WaitCursor;
                if (checkBoxX7.Checked) //选择管线
                {
                    for (int i = 0; i < dataGridViewX8.Rows.Count; i++)
                    {
                        GSOFeature selectedFeature = dataGridViewX8.Rows[i].Tag as GSOFeature;
                        if (selectedFeature != null)
                        {
                            selectState = 1;
                            HorizontalDistanceAnalysis(selectedFeature, Utility.m_PipelineLayerNames, dJingJuBiaoZhun);
                        }
                    }
                }
                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++)
                    {
                        HorizontalDistanceAnalysis(feats[i], Utility.m_PipelineLayerNames, dJingJuBiaoZhun);
                    }
                }
                if (featCount.Count > 0) //统计结果
                {
                    for (int i = 0; i < Utility.m_PipelineLayerNames.Count; i++)
                    {
                        if (featCount.ContainsKey(Utility.m_PipelineLayerNames[i]) && featLenth.ContainsKey(Utility.m_PipelineLayerNames[i]))
                        {
                            listBox3.Items.Add(Utility.m_PipelineLayerNames[i] + ":" + featCount[Utility.m_PipelineLayerNames[i]] + "条,共" + featLenth[Utility.m_PipelineLayerNames[i]].ToString("0.00") + "米");
                        }
                    }
                }

                if (dataGridViewX9.Rows.Count == 0 && selectState == 1)
                {
                    MessageBox.Show("没有不符合净距标准的管线!", "提示");
                }
            }
            else
            {
                MessageBox.Show("请选中要进行水平净距分析的管线!", "提示");
            }
            globeControl1.Refresh();
            Cursor = Cursors.Default;
        }
        /// <summary>
        /// 计算指定feature对象与除了该feature所在图层之外的 所有管线图层中的所有feature对象 的水平距离 并记录符合要求的管线  功能
        /// </summary>
        /// <param name="type"></param>
        /// <param name="caption"></param>
        /// <param name="feat"></param>
        /// <param name="dis"></param>
        private void HorizontalDistanceAnalysis(GSOFeature selectedFeature, List<string> _pipelineLayerNames, double dis)
        {
            if (selectedFeature == null)
            {
                selectState = 0;
                MessageBox.Show("请选择一条管线!");
                return;
            }
            GSOGeoPolyline3D line1 = selectedFeature.Geometry as GSOGeoPolyline3D;
            if (line1 == null)
            {
                selectState = 0;
                MessageBox.Show("请选择一条管线!");
                return;
            }

            string caption = selectedFeature.Dataset.Caption;

            GSOGeoPolygon3D polygon = line1.CreateBuffer(dis, true, 5, true, false);
            GSOFeature new_feat = new GSOFeature();
            new_feat.Geometry = polygon;
            polygonJingJuAnalysises.Add(new_feat);
            layerTemp.AddFeature(new_feat);

            for (int i = 0; i < _pipelineLayerNames.Count; i++)
            {
                if (caption == _pipelineLayerNames[i])
                {
                    continue;
                }
                GSOLayer layer2 = globeControl1.Globe.Layers.GetLayerByCaption(_pipelineLayerNames[i]);
                if (layer2 == null) continue;
                GSOFeatureLayer flayer2 = layer2 as GSOFeatureLayer;
                GSOFeatureDataset fdataset2 = flayer2.Dataset as GSOFeatureDataset;
                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;
                    }

                    feat2.HighLight = true;
                    int idx = dataGridViewX9.Rows.Add();
                    dataGridViewX9.Rows[idx].Tag = feat2;
                    dataGridViewX9.Rows[idx].Cells[0].Value = caption;
                    dataGridViewX9.Rows[idx].Cells[1].Value = selectedFeature.Name;
                    dataGridViewX9.Rows[idx].Cells[2].Value = layer2.Caption;
                    dataGridViewX9.Rows[idx].Cells[3].Value = feats2[j].Name;
                    dataGridViewX9.Rows[idx].Cells[4].Value = dis.ToString("0.00");

                    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));
                    }
                }
            }
        }
        /// <summary>
        /// 水平净距分析 功能界面中 表格的 双击定位 功能
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridViewX9_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left) return;
            DataGridView.HitTestInfo hittestinfo = dataGridViewX9.HitTest(e.X, e.Y);
            if (hittestinfo.RowIndex <= -1) return;
            GSOFeature rowFeature = dataGridViewX9.Rows[hittestinfo.RowIndex].Tag as GSOFeature;
            if (rowFeature == null) return;
            if (rowFeature.Geometry != null && rowFeature.Geometry.Type == EnumGeometryType.GeoPolyline3D)
            {
                GSOGeoPolyline3D line = rowFeature.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(rowFeature, 5);
            }
        }
        /// <summary>
        /// 碰撞分析 功能界面中 开始分析按钮 事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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();
                clearFeatureHighLight();
                m_FeaturesWithBianhao.Clear();
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                Cursor = Cursors.WaitCursor;
                if (checkBoxX3.Checked)  // 选择管线
                {
                    for (int i = 0; i < dataGridViewX4.Rows.Count; i++)
                    {
                        GSOFeature selectedFeature = dataGridViewX4.Rows[i].Tag as GSOFeature;
                        if (selectedFeature != null)
                        {
                            selectState = 1;
                            VerticalDistanceAnalysis("碰撞分析", selectedFeature, Utility.m_PipelineLayerNames, 0, 0.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++)
                    {
                        selectState = 1;
                        VerticalDistanceAnalysis("碰撞分析", feats[i], Utility.m_PipelineLayerNames, 0, 0.0);
                    }
                }

                if (featCount.Count > 0)
                {
                    for (int i = 0; i < Utility.m_PipelineLayerNames.Count; i++)
                    {
                        if (featCount.ContainsKey(Utility.m_PipelineLayerNames[i]) && featLenth.ContainsKey(Utility.m_PipelineLayerNames[i]))
                        {
                            listBox2.Items.Add(Utility.m_PipelineLayerNames[i] + ":" + featCount[Utility.m_PipelineLayerNames[i]] + "条,共" + featLenth[Utility.m_PipelineLayerNames[i]].ToString("0.00") + "米");
                        }
                    }
                }
                if (dataGridViewX5.Rows.Count == 0 && selectState == 1)
                {
                    MessageBox.Show("没有发生碰撞的管线!", "提示");
                }
            }
            else
            {
                MessageBox.Show("请选中要进行碰撞分析的管线!", "提示");
            }
            globeControl1.Refresh();
            Cursor = Cursors.Default;
        }
        /// <summary>
        ///  碰撞分析功能界面中 表格的 双击定位 功能
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridViewX5_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left) return;
            DataGridView.HitTestInfo hittestinfo = dataGridViewX5.HitTest(e.X, e.Y);
            if (hittestinfo.RowIndex <= -1) return;
            string key = dataGridViewX5.Rows[hittestinfo.RowIndex].Cells[1].Value.ToString().Trim() + "-" + dataGridViewX5.Rows[hittestinfo.RowIndex].Cells[3].Value.ToString().Trim();
            if (m_FeaturesWithBianhao.ContainsKey(key))
            {
                globeControl1.Globe.JumpToPosition(m_FeaturesWithBianhao[key], EnumAltitudeMode.Absolute, 5);
            }
        }
        /// <summary>
        /// 覆土分析功能操作界面中的 选择管线 复选框选中状态改变事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBoxX5_CheckedChanged(object sender, EventArgs e)
        {
            clearFeatureHighLight();
            if (checkBoxX5.Checked)
            {
                comboBoxEx3.SelectedItem = null;
                globeControl1.Globe.ClearAnalysis();
                layerTemp.RemoveAllFeature();
                globeControl1.Refresh();
                comboBoxEx3.Enabled = false;
                dataGridViewX6.Rows.Clear();
                dataGridViewX7.Rows.Clear();
                trackflag = "ftAnalysis";
                globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
            else
            {
                comboBoxEx3.Enabled = true;
            }
        }
        /// <summary>
        /// 覆土分析功能操作界面中的 选择图层 复选框选中状态改变事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBoxX6_CheckedChanged(object sender, EventArgs e)
        {
            clearFeatureHighLight();
            comboBoxEx3.Enabled = checkBoxX6.Checked;
            if (checkBoxX6.Checked)
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;

                trackflag = "";
                dataGridViewX6.Rows.Clear();
                dataGridViewX7.Rows.Clear();

                comboBoxEx3.SelectedIndex = -1;
            }
            globeControl1.Globe.ClearAnalysis();
            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }
        /// <summary>
        /// 覆土分析功能操作界面中的 图层下拉框选中项改变事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxEx3_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBoxEx3.SelectedIndex <= -1) return;
            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();

            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;
            }
        }
        /// <summary>
        /// 覆土分析功能操作界面中的 开始分析 按钮事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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();
                clearFeatureHighLight();
                Cursor = Cursors.WaitCursor;


                GSOPoint3d markerPosition = new GSOPoint3d();
                if (checkBoxX5.Checked) // 覆土分析 选择管线
                {
                    for (int i = 0; i < dataGridViewX6.Rows.Count; i++)
                    {
                        GSOFeature rowFeature = dataGridViewX6.Rows[i].Tag as GSOFeature;
                        if (rowFeature == null) continue;
                        string featureName = "";
                        if (isFeatureContainsBianhao(rowFeature))//判断rowFeature是否包含“编号”字段
                        {
                            featureName = rowFeature.GetValue(featureIDFieldName).ToString();
                        }
                        else
                        {
                            featureName = rowFeature.Name;
                        }

                        GSOGeoPolyline3D line = rowFeature.Geometry as GSOGeoPolyline3D;
                        if (line == null)
                        {
                            continue;
                        }
                        GSOPipeLineStyle3D style = line.Style as GSOPipeLineStyle3D;
                        if (style == null)
                        {
                            continue;
                        }
                        if (line.PartCount <= 0) continue;
                        GSOPoint3ds pts = line[0];
                        GSOPoint3d pt = new GSOPoint3d();

                        for (int m = 0; m < pts.Count; m++)
                        {
                            if (Math.Abs(pts[m].Z + (style.Radius)) < Convert.ToDouble(textBoxX3.Text.Trim()))
                            {
                                rowFeature.HighLight = true;
                                int idx = dataGridViewX7.Rows.Add();
                                dataGridViewX7.Rows[idx].Tag = rowFeature;
                                dataGridViewX7.Rows[idx].Cells[0].Value = rowFeature.Dataset.Caption;
                                dataGridViewX7.Rows[idx].Cells[1].Value = featureName;
                                dataGridViewX7.Rows[idx].Cells[2].Value = Math.Abs((pts[m].Z + (style.Radius))).ToString("0.00");

                                pt.X = pts[m].X;
                                pt.Y = pts[m].Y;
                                pt.Z = 0;
                                markerPosition = LabelVerticalDistance(layerTemp, pts[m], pt, Convert.ToDouble(dataGridViewX7.Rows[idx].Cells[2].Value), true);
                                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 (isFeatureContainsBianhao(feats[i]))
                        {
                            featureName = feats[i].GetValue(featureIDFieldName).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 || line.PartCount <= 0) continue;
                        GSOPoint3ds pts = line[0];
                        GSOPoint3d pt = new GSOPoint3d();
                        for (int m = 0; m < pts.Count; m++)
                        {
                            if (Math.Abs(pts[m].Z + (style.Radius)) < Convert.ToDouble(textBoxX3.Text.Trim()))
                            {
                                f.HighLight = true;
                                int idx = dataGridViewX7.Rows.Add();
                                dataGridViewX7.Rows[idx].Tag = f;
                                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))).ToString("0.00");

                                pt.X = pts[m].X;
                                pt.Y = pts[m].Y;
                                pt.Z = 0;
                                markerPosition = LabelVerticalDistance(layerTemp, pts[m], pt, Convert.ToDouble(dataGridViewX7.Rows[idx].Cells[2].Value), true);

                                break;
                            }
                        }
                    }
                }
                globeControl1.Refresh();
                if (dataGridViewX7.Rows.Count == 0)
                {
                    MessageBox.Show("所有管线满足覆土净距标准!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                MessageBox.Show("请选中要进行覆土分析的管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            Cursor = Cursors.Default;
        }
        /// <summary>
        /// 覆土分析中 表格的 双击定位 功能
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridViewX7_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left) return;
            DataGridView.HitTestInfo hittestinfo = dataGridViewX7.HitTest(e.X, e.Y);
            if (hittestinfo.RowIndex <= -1) return;
            GSOFeature rowFeature = dataGridViewX7.Rows[hittestinfo.RowIndex].Tag as GSOFeature;
            if (rowFeature == null) return;
            if (rowFeature.Geometry != null && rowFeature.Geometry.Type == EnumGeometryType.GeoPolyline3D)
            {
                GSOGeoPolyline3D line = rowFeature.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(rowFeature, 5);
            }
        }
        /// <summary>
        /// 覆土分析功能操作界面中的 导出Excel按钮 事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX10_Click(object sender, EventArgs e)
        {
            if (dataGridViewX7.Rows.Count > 0)
            {
                ExportExcel("覆土分析", dataGridViewX7, null);
            }
            else
            {
                MessageBox.Show("表格内容为空!", "提示");
            }
        }
        /// <summary>
        /// 覆土分析功能操作界面底部的 关闭 按钮事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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();
            layerTemp.RemoveAllFeature();

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

            //Refresh();
        }
        /// <summary>
        /// 垂直净距分析 功能界面中 清除分析结果按钮 事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX2_Click(object sender, EventArgs e)
        {
            trackflag = "";
            globeControl1.Globe.Action = EnumAction3D.ActionNull;

            checkBoxX1.Checked = false;
            checkBoxX2.Checked = false;
            comboBoxEx1.SelectedIndex = -1;
            comboBoxEx1.Enabled = false;
            textBoxX2.Text = "1";
            dataGridViewX2.Rows.Clear();
            dataGridViewX3.Rows.Clear();
            listBox1.Items.Clear();

            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }
        /// <summary>
        /// 水平净距分析 功能界面中 清除分析结果按钮 事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX15_Click(object sender, EventArgs e)
        {
            trackflag = "";
            globeControl1.Globe.Action = EnumAction3D.ActionNull;

            checkBoxX7.Checked = false;
            checkBoxX8.Checked = false;
            comboBoxEx4.SelectedIndex = -1;
            comboBoxEx4.Enabled = false;
            textBoxX4.Text = "1";
            dataGridViewX8.Rows.Clear();
            dataGridViewX9.Rows.Clear();
            listBox3.Items.Clear();

            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }
        /// <summary>
        /// 垂直净距分析功能界面中 关闭按钮 事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX3_Click(object sender, EventArgs e)
        {
            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 (layerTemp != null)
            {
                layerTemp.RemoveAllFeature();
            }
            if (buttonItem1.Checked)
            {
                sideBar1.ExpandedPanel = sideBarPanelItem3;
            }
            else
            {
                sideBar1.Visible = false;
            }

            Refresh();
        }
        /// <summary>
        /// 水平净距分析功能界面中 删除缓冲区按钮 事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX14_Click(object sender, EventArgs e)
        {
            trackflag = "";

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

            Refresh();
        }
        /// <summary>
        /// 导出指定DataGridView控件中的内容
        /// </summary>
        /// <param name="type"></param>
        /// <param name="_dataGridView"></param>
        private void ExportExcel(string type, DataGridView _dataGridView, ListBox _listBox)
        {
            if (_dataGridView.Rows.Count <= 0) return;
            SaveFileDialog dlg = new SaveFileDialog();
            dlg.Filter = "Excel files (*.xls)|*.xls";
            dlg.FilterIndex = 0;
            dlg.RestoreDirectory = true;
            //dlg.CreatePrompt = true;
            dlg.Title = "保存为Excel文件";
            dlg.FileName = type + "-" + DateTime.Now.ToString("yyyyMMdd") + ".xls";
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                Stream myStream;
                myStream = dlg.OpenFile();
                StreamWriter sw = new StreamWriter(myStream, Encoding.GetEncoding(-0));
                string columnTitle = "";
                try
                {
                    if (_listBox != null)
                    {
                        string strList = "";
                        for (int i = 0; i < _listBox.Items.Count; i++)
                        {
                            strList += _listBox.Items[i] + @"/";
                        }
                        sw.WriteLine("内容:" + type + "  日期:" + DateTime.Now.ToString("yyyy-MM-dd") + " 结果:" + strList);
                    }
                    else
                    {
                        sw.WriteLine("内容:" + type + "  日期:" + DateTime.Now.ToString("yyyy-MM-dd"));
                    }
                    //写入列标题
                    for (int i = 0; i < _dataGridView.ColumnCount; i++)
                    {
                        if (i > 0)
                        {
                            columnTitle += "\t";
                        }
                        columnTitle += _dataGridView.Columns[i].HeaderText;
                    }
                    sw.WriteLine(columnTitle);

                    //写入列内容   
                    for (int j = 0; j < _dataGridView.Rows.Count; j++)
                    {
                        string columnValue = "";
                        for (int k = 0; k < _dataGridView.Columns.Count; k++)
                        {
                            if (k > 0)
                            {
                                columnValue += "\t";
                            }
                            if (_dataGridView.Rows[j].Cells[k].Value == null)
                            {
                                columnValue += "";
                            }
                            else
                            {
                                columnValue += _dataGridView.Rows[j].Cells[k].Value.ToString().Trim();
                            }
                        }

                        sw.WriteLine(columnValue);
                    }
                    sw.Close();
                    myStream.Close();
                    if (MessageBox.Show("导出Excel文件成功!是否打开?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        Process.Start(dlg.FileName);
                    }
                }
                catch (Exception ex)
                {
                    //MessageBox.Show(ex.ToString());
                }
                finally
                {
                    sw.Close();
                    myStream.Close();
                }
            }
        }
        /// <summary>
        /// 垂直净距分析功能界面中 导出Excel按钮 事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX4_Click(object sender, EventArgs e)
        {
            if (dataGridViewX3.Rows.Count > 0)
            {
                ExportExcel("垂直净距分析", dataGridViewX3, listBox1);
            }
            else
            {
                MessageBox.Show("表格内容为空!", "提示");
            }
        }
        /// <summary>
        /// 水平净距分析功能界面中 导出Excel按钮 事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX4_Click_shuiping(object sender, EventArgs e)
        {
            if (dataGridViewX9.Rows.Count > 0)
            {
                ExportExcel("水平净距分析", dataGridViewX9, listBox3);
            }
            else
            {
                MessageBox.Show("表格内容为空!", "提示");
            }
        }  
        /// <summary>
        /// 碰撞分析功能界面中 选择管线复选框 选中状态改变事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBoxX3_CheckedChanged(object sender, EventArgs e)
        {
            clearFeatureHighLight();
            if (checkBoxX3.Checked)
            {
                comboBoxEx2.SelectedItem = null;
                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;
            }
        }
        /// <summary>
        /// 碰撞分析功能界面中 选择图层复选框 选中状态改变事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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();
        }
        /// <summary>
        /// 碰撞分析功能界面中 选择图层下拉框 选中项改变事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxEx2_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBoxEx2.SelectedIndex <= -1) return;
            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;
            }
        }
        /// <summary>
        /// 清除所有图层中的所有feature对象的高亮状态 功能
        /// </summary>
        private void clearFeatureHighLight()
        {
            for (int i = 0; i < globeControl1.Globe.Layers.Count; i++)
            {
                GSOLayer layer = globeControl1.Globe.Layers[i];
                if (!(layer is GSOFeatureLayer)) continue;
                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) continue;
                    lineStyle.ArrowVisible = false;
                    feat.Geometry.SetModified(true);
                }
            }
            for (int i = 0; i < globeControl2.Globe.Layers.Count; i++)
            {
                GSOLayer layer = globeControl2.Globe.Layers[i];
                if (!(layer is GSOFeatureLayer)) continue;
                GSOFeatures feats = layer.GetAllFeatures();
                for (int j = 0; j < feats.Length; j++)
                {
                    GSOFeature feat = feats[j];
                    feat.HighLight = false;
                }
            }

            if (globeControl1.Globe.Action == EnumAction3D.SelectObject)
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                //globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
        }
        /// <summary>
        /// 碰撞分析功能界面中 清除分析结果按钮 事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX8_Click(object sender, EventArgs e)
        {
            trackflag = "";
            globeControl1.Globe.Action = EnumAction3D.ActionNull;

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

            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }
        /// <summary>
        /// 碰撞分析功能界面中 导出Excel按钮 事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX6_Click(object sender, EventArgs e)
        {
            if (dataGridViewX5.Rows.Count > 0)
            {
                ExportExcel("碰撞分析", dataGridViewX5, listBox2);
            }
            else
            {
                MessageBox.Show("表格内容为空!", "提示");
            }
        }
        /// <summary>
        /// 碰撞分析 功能界面中 关闭按钮 事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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();
        }
        /// <summary>
        /// 覆土分析 功能界面中的 清除分析结果 按钮事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonX16_Click(object sender, EventArgs e)
        {
            trackflag = "";
            globeControl1.Globe.Action = EnumAction3D.ActionNull;

            checkBoxX5.Checked = false;
            checkBoxX6.Checked = false;
            comboBoxEx3.SelectedIndex = -1;
            comboBoxEx3.Enabled = false;
            textBoxX3.Text = "1";
            dataGridViewX6.Rows.Clear();
            dataGridViewX7.Rows.Clear();

            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }

        string citySevenLineType = "";
        string cityServerLineName = "";

        /// <summary>
        /// 间距分析 开始分析按钮 分析绘制的七线和管线的距离是否符合标准
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonStartAnalysis_Click(object sender, EventArgs e)
        {
            if (!checkBoxSelectPipeline.Checked && !checkBoxSelectLayer.Checked)
            {
                MessageBox.Show("请确定是选择管线还是选择图层!", "提示");
                return;
            }
            if (textBoxVerticalDistance.Text.Trim() == "")
            {
                MessageBox.Show("垂直净距标准不能为空!", "提示");
                return;
            }
            if (textBoxHorizontalDistance.Text.Trim() == "")
            {
                MessageBox.Show("水平净距标准不能为空!", "提示");
                return;
            }
            double dVerticalJingJuBiaoZhun = 0.0;
            if (!double.TryParse(textBoxVerticalDistance.Text.Trim(), out dVerticalJingJuBiaoZhun))
            {
                MessageBox.Show("请输入正确的垂直净距标准!", "提示");
                return;
            }
            double dHorizontalJingJuBiaoZhun = 0.0;
            if (!double.TryParse(textBoxHorizontalDistance.Text.Trim(), out dHorizontalJingJuBiaoZhun))
            {
                MessageBox.Show("请输入正确的水平净距标准!", "提示");
                return;
            }

            if (dataGridViewLineList.Rows.Count > 0)
            {
                featCount.Clear();
                featLenth.Clear();
                listBoxStasticsResult.Items.Clear();
                layerTemp.RemoveAllFeature();
                polygonJingJuAnalysises.RemoveAll();
                clearFeatureHighLight();
                dataGridViewAnalysisResult.Rows.Clear();
                m_FeaturesWithBianhao.Clear();
                Cursor = Cursors.WaitCursor;
                if (checkBoxSelectPipeline.Checked) // 选择管线
                {
                    for (int i = 0; i < dataGridViewLineList.Rows.Count; i++)
                    {
                        GSOFeature selectedFeature = dataGridViewLineList.Rows[i].Tag as GSOFeature;
                        if (selectedFeature != null)
                        {
                            selectState = 1;
                            VerticalDistanceAnalysis("间距分析", selectedFeature, Utility.m_PipelineLayerNames, dVerticalJingJuBiaoZhun, dHorizontalJingJuBiaoZhun);//分析
                        }
                    }
                }
                else if (checkBoxSelectLayer.Checked) // 选择图层
                {
                    if (comboBoxLayer.SelectedItem == null)
                    {
                        MessageBox.Show("请选择一个图层!", "提示");
                        return;
                    }
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxLayer.SelectedItem.ToString());
                    if (layer == null)
                    {
                        return;
                    }

                    GSOFeatureLayer flayer = layer as GSOFeatureLayer;
                    if (flayer == null)
                    {
                        return;
                    }

                    GSOFeatures feats = flayer.GetAllFeatures();
                    if (feats == null)
                    {
                        return;
                    }
                    for (int i = 0; i < feats.Length; i++)
                    {
                        selectState = 1;
                        VerticalDistanceAnalysis("间距分析", feats[i], Utility.m_PipelineLayerNames, dVerticalJingJuBiaoZhun, dHorizontalJingJuBiaoZhun);//分析
                    }
                }
                if (featCount.Count > 0)
                {
                    for (int i = 0; i < Utility.m_PipelineLayerNames.Count; i++)
                    {
                        if (featCount.ContainsKey(Utility.m_PipelineLayerNames[i]) && featLenth.ContainsKey(Utility.m_PipelineLayerNames[i]))
                        {
                            listBoxStasticsResult.Items.Add(Utility.m_PipelineLayerNames[i] + ":" + featCount[Utility.m_PipelineLayerNames[i]] + "条,共" + featLenth[Utility.m_PipelineLayerNames[i]].ToString("0.00") + "米");
                        }
                    }
                }
                if (dataGridViewAnalysisResult.Rows.Count == 0 && selectState == 1)
                {
                    MessageBox.Show("没有不符合间距分析标准的管线!", "提示");
                }
            }
            else
            {
                MessageBox.Show("请选中要进行间距分析的管线!", "提示");
            }
            globeControl1.Refresh();
            Cursor = Cursors.Default;
        }
        /// <summary>
        /// 间距分析 清除分析结果
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonClearAnalysisResult_Click(object sender, EventArgs e)
        {
            trackflag = "";
            globeControl1.Globe.Action = EnumAction3D.ActionNull;

            checkBoxSelectLayer.Checked = false;
            checkBoxSelectPipeline.Checked = false;
            comboBoxLayer.SelectedIndex = -1;
            comboBoxLayer.Enabled = false;
            dataGridViewLineList.Rows.Clear();
            dataGridViewAnalysisResult.Rows.Clear();
            listBoxStasticsResult.Items.Clear();

            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }
        /// <summary>
        /// 间距分析 导出Excel按钮 将间距分析的结果以Excel表格的形式导出
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonExportExcel_Click(object sender, EventArgs e)
        {
            if (dataGridViewAnalysisResult.Rows.Count > 0)
            {
                ExportExcel("间距分析", dataGridViewAnalysisResult, listBoxStasticsResult);
            }
            else
            {
                MessageBox.Show("表格内容为空!", "提示");
            }
        }
        /// <summary>
        /// 间距分析 关闭按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonClosePanel_Click(object sender, EventArgs e)
        {
            trackflag = "";

            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            sideBarPanelItem4.Visible = false;
            panelSpacingAnalysis.Visible = false;
            checkBoxSelectPipeline.Checked = false;
            checkBoxSelectLayer.Checked = false;
            comboBoxLayer.SelectedIndex = -1;
            dataGridViewLineList.Rows.Clear();
            dataGridViewAnalysisResult.Rows.Clear();

            sideBar1.Visible = false;
            Refresh();
        }
        /// <summary>
        /// 间距分析 分析结果表格双击定位
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridViewAnalysisResult_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left && e.RowIndex > -1)
            {
                GSOFeature rowFeature = dataGridViewAnalysisResult.Rows[e.RowIndex].Tag as GSOFeature;
                if (rowFeature != null)
                {
                    if (rowFeature.Geometry != null && rowFeature.Geometry.Type == EnumGeometryType.GeoPolyline3D)
                    {
                        GSOGeoPolyline3D line = rowFeature.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(rowFeature, 5);
                }
            }
        }
        /// <summary>
        /// 间距分析 选择管线复选框
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBoxSelectPipeline_CheckedChanged(object sender, EventArgs e)
        {
            clearFeatureHighLight();//清除高亮
            if (checkBoxSelectPipeline.Checked)
            {
                comboBoxLayer.SelectedItem = null;
                globeControl1.Globe.ClearAnalysis();
                layerTemp.RemoveAllFeature();
                globeControl1.Refresh();
                comboBoxLayer.Enabled = false;
                dataGridViewLineList.Rows.Clear();
                dataGridViewAnalysisResult.Rows.Clear();
                trackflag = "spacing";
                globeControl1.Globe.Action = EnumAction3D.SelectObject;
            }
            else
            {
                comboBoxLayer.Enabled = true;
            }
        }
        /// <summary>
        /// 间距分析 选择图层复选框
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBoxSelectLayer_CheckedChanged(object sender, EventArgs e)
        {
            clearFeatureHighLight();//清除高亮
            comboBoxLayer.Enabled = checkBoxSelectLayer.Checked;
            if (checkBoxSelectLayer.Checked)
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                trackflag = "";
                dataGridViewLineList.Rows.Clear();
                dataGridViewAnalysisResult.Rows.Clear();

                comboBoxLayer.SelectedIndex = -1;
            }
            globeControl1.Globe.ClearAnalysis();
            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }
        /// <summary>
        /// 间距分析 选择图层下拉框
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxLayer_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (comboBoxLayer.SelectedIndex > -1)
            {
                dataGridViewLineList.Rows.Clear();
                dataGridViewAnalysisResult.Rows.Clear();
                listBoxStasticsResult.Items.Clear();
                GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxLayer.SelectedItem.ToString());
                if (layer == null)
                    return;

                GSOFeatureLayer flayer = layer as GSOFeatureLayer;
                if (flayer == null)
                    return;
                GSOFeatures feats = flayer.GetAllFeatures();
                if (feats == null)
                    return;
                for (int i = 0; i < feats.Length; i++)
                {
                    int idx = dataGridViewLineList.Rows.Add();
                    dataGridViewLineList.Rows[idx].Cells[0].Value = comboBoxLayer.SelectedItem.ToString();
                    dataGridViewLineList.Rows[idx].Cells[1].Value = feats[i].Name;
                }
            }
        }
        /// <summary>
        /// 碰撞分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX1_1_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemFX4_4.Text);

            dataGridViewX4.Size = new Size(195, 120);
            dataGridViewX5.Size = new Size(195, 120);

            layerTemp.RemoveAllFeature();
            clearFeatureHighLight();
            globeControl1.Refresh();

            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = true;
            buttonItem1.Checked = true;
            controlContainerItem3.Visible = true;
            sideBarPanelItem4.Visible = true;
            sideBarPanelItem4.Text = "碰撞分析";
            trackflag = "collision";
            controlContainerItem5.Control = panel2;
            panel2.Dock = DockStyle.Fill;
            panel2.Visible = true;
            sideBar1.ExpandedPanel = sideBarPanelItem4;
            sideBar1.Refresh();
            Refresh();
        }
        /// <summary>
        /// 覆土分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX1_2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemFX5_1.Text);
            dataGridViewX6.Size = new Size(195, 120);
            dataGridViewX7.Size = new Size(195, 120);

            layerTemp.RemoveAllFeature();
            clearFeatureHighLight();
            globeControl1.Refresh();
            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = true;
            buttonItem1.Checked = true;
            controlContainerItem3.Visible = true;
            sideBarPanelItem4.Visible = true;
            sideBarPanelItem4.Text = "覆土分析";
            trackflag = "ftAnalysis";
            controlContainerItem5.Control = panel4;
            panel4.Visible = true;
            panel4.Dock = DockStyle.Fill;
            sideBar1.ExpandedPanel = sideBarPanelItem4;
            sideBar1.Refresh();
            Refresh();
        }
        /// <summary>
        /// 间距分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX1_3_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemFX1_3.Text);

            dataGridViewLineList.Size = new Size(185, 120);
            dataGridViewAnalysisResult.Size = new Size(185, 120);

            layerTemp.RemoveAllFeature();
            clearFeatureHighLight();

            globeControl1.Refresh();
            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = true;
            buttonItem1.Checked = true;
            controlContainerItem3.Visible = true;
            sideBarPanelItem4.Visible = true;
            sideBarPanelItem4.Text = "间距分析";
            trackflag = "spacing";
            controlContainerItem5.Control = panelSpacingAnalysis;
            panelSpacingAnalysis.Dock = DockStyle.Fill;
            panelSpacingAnalysis.Visible = true;
            sideBar1.ExpandedPanel = sideBarPanelItem4;
            sideBar1.Refresh();


            Refresh();
        }
        /// <summary>
        /// 垂直净距分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX1_4_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemFX1_4.Text);
            dataGridViewX2.Size = new Size(185, 92);
            dataGridViewX3.Size = new Size(185, 120);

            layerTemp.RemoveAllFeature();
            clearFeatureHighLight();

            globeControl1.Refresh();
            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = true;
            buttonItem1.Checked = true;
            controlContainerItem3.Visible = true;
            sideBarPanelItem4.Visible = true;
            sideBarPanelItem4.Text = "垂直净距分析";
            trackflag = "vertical";
            controlContainerItem5.Control = panel1;
            panel1.Dock = DockStyle.Fill;
            panel1.Visible = true;
            sideBar1.ExpandedPanel = sideBarPanelItem4;
            sideBar1.Refresh();
            Refresh();
        }
        /// <summary>
        /// 水平净距分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX1_5_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemFX4_6.Text);
            dataGridViewX8.Size = new Size(185, 120);
            dataGridViewX9.Size = new Size(185, 120);


            layerTemp.RemoveAllFeature();
            clearFeatureHighLight();
            globeControl1.Refresh();
            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = true;
            buttonItem1.Checked = true;
            controlContainerItem3.Visible = true;
            sideBarPanelItem4.Visible = true;
            sideBarPanelItem4.Text = "水平净距分析";
            trackflag = "horizontal";
            controlContainerItem5.Control = panel5;
            panel5.Dock = DockStyle.Fill;
            panel5.Visible = true;
            sideBar1.ExpandedPanel = sideBarPanelItem4;
            sideBar1.Refresh();
            Refresh();
        }
        /// <summary>
        /// 碰撞审查
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSH1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemSH1.Text);

            dataGridViewX4.Size = new Size(185, 92);
            dataGridViewX5.Size = new Size(185, 120);

            layerTemp.RemoveAllFeature();
            clearFeatureHighLight();
            globeControl1.Refresh();

            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = true;
            buttonItem1.Checked = true;
            controlContainerItem3.Visible = true;
            sideBarPanelItem4.Visible = true;
            sideBarPanelItem4.Text = "碰撞审查";
            trackflag = "collision";
            controlContainerItem5.Control = panel2;
            panel2.Dock = DockStyle.Fill;
            panel2.Visible = true;
            sideBar1.ExpandedPanel = sideBarPanelItem4;
            sideBar1.Refresh();

            Refresh();
        }
        /// <summary>
        /// 覆土审查
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSH2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemSH2.Text);

            dataGridViewX6.Size = new Size(185, 92);
            dataGridViewX7.Size = new Size(185, 120);

            layerTemp.RemoveAllFeature();
            clearFeatureHighLight();
            globeControl1.Refresh();
            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = true;
            buttonItem1.Checked = true;
            controlContainerItem3.Visible = true;
            sideBarPanelItem4.Visible = true;
            sideBarPanelItem4.Text = "覆土审查";
            trackflag = "ftAnalysis";
            controlContainerItem5.Control = panel4;
            panel4.Visible = true;
            panel4.Dock = DockStyle.Fill;
            sideBar1.ExpandedPanel = sideBarPanelItem4;
            sideBar1.Refresh();
            Refresh();
        }
        /// <summary>
        /// 水平净距审查
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSH3_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemSH3.Text);

            dataGridViewX8.Size = new Size(190, 92);
            dataGridViewX9.Size = new Size(190, 120);

            layerTemp.RemoveAllFeature();
            clearFeatureHighLight();
            globeControl1.Refresh();
            sideBar1.Visible = true;
            sideBarPanelItem3.Visible = true;
            buttonItem1.Checked = true;
            controlContainerItem3.Visible = true;
            sideBarPanelItem4.Visible = true;
            sideBarPanelItem4.Text = "水平净距审查";
            trackflag = "horizontal";
            controlContainerItem5.Control = panel5;
            panel5.Dock = DockStyle.Fill;
            panel5.Visible = true;
            sideBar1.ExpandedPanel = sideBarPanelItem4;
            sideBar1.Refresh();
            Refresh();
        }
        /// <summary>
        /// 垂直净距审查
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSH4_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemSH4.Text);

            dataGridViewX2.Visible = true;
            dataGridViewX3.Visible = true;
            dataGridViewX2.Size = new Size(185, 92);
            dataGridViewX3.Size = new Size(185, 120);

            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;
            controlContainerItem5.Control = panel1;
            panel1.Dock = DockStyle.Fill;
            panel1.Visible = true;
            sideBar1.ExpandedPanel = sideBarPanelItem4;
            sideBar1.Refresh();
            Refresh();
        }
        #endregion

        /// <summary>
        /// 添加指定路径下的数据 功能
        /// </summary>
        /// <param name="strDataPath"></param>
        /// <returns></returns>
        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)
                {
                    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;
                    layerManagerNode.Nodes.Insert(0, node);
                }
                newlayername = layer.Caption;
            }
            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;
                    layerManagerNode.Nodes.Insert(0, node);
                }
                newlayername = terrain.Caption;
            }
            else if (Path.GetExtension(strDataPath).ToLower().Equals(".dxf"))
            {
                GSOLayer layer = globeControl1.Globe.Layers.Add(strDataPath);
                objRes = layer;
                if (layer != null)
                {
                    GSODataset dataset = layer.Dataset;
                    CheckDatasetGeoReference(layer.Dataset, strDataPath);
                    CheckDatasetGeoReference(layer.Dataset, strDataPath);
                    TreeNode node = new TreeNode();
                    node.Tag = layer;
                    node.Text = layer.Dataset.Caption;
                    node.ImageIndex = 0;
                    node.SelectedImageIndex = 0;
                    node.Checked = layer.Visible;
                    layerManagerNode.Nodes.Insert(0, node);
                }
                newlayername = layer.Caption;
            }
            else
            {
                GSOLayer layer = globeControl1.Globe.Layers.Add(strDataPath);

                objRes = layer;
                if (layer == null)
                    MessageBox.Show("layer is null");

                CheckDatasetGeoReference(layer.Dataset, strDataPath);
                TreeNode node = new TreeNode();
                node.Tag = layer;
                node.Text = layer.Dataset.Caption;
                node.ImageIndex = 0;
                node.SelectedImageIndex = 0;
                node.Checked = layer.Visible;
                layerManagerNode.Nodes.Insert(0, node);

                newlayername = layer.Caption;
            }
            return objRes;
        }
        /// <summary>
        /// 连接数据库 菜单事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ConnectDB(object sender, EventArgs e)
        {
            FrmDatabaseParaSetting frm = new FrmDatabaseParaSetting(globeControl1);
            if (frm.ShowDialog() == DialogResult.OK)
            {
                ds = FrmDatabaseParaSetting.ds;
                if (ds != null)
                {
                    ds.IsCloseSaved = false;
                }
            }
        }
        /// <summary>
        /// 根据指定图层创建图层节点并将节点添加到图层管理节点的子节点集合中
        /// </summary>
        /// <param name="layer"></param>
        private void addNodeToLayerManagerNode(GSOLayer layer)
        {
            if (layer == null) return;
            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;

            if (layerManagerNode.Nodes.Contains(node)) return;
            layerManagerNode.Nodes.Insert(0, node);
            layerManagerNode.Expand();
        }
        /// <summary>
        /// 获取指定图层中最后一个feature对象的名称对应的整数
        /// </summary>
        /// <param name="layer"></param>
        /// <returns></returns>
        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;
        }

        /// <summary>
        /// 判断选中的对象是否为管线 
        /// </summary>
        /// <param name="resFeature">被选中管线</param>
        /// <returns>返回一根线</returns>
        private GSOFeature IsPipeLineOfSelectedObj()
        {
            GSOFeature resFeature = null;
            if (globeControl1.Globe.SelObjectCount < 1) return null;
            GSOLayer resLayer = null;
            globeControl1.Globe.GetSelectObject(0, out resFeature, out resLayer);
            if (resFeature == null) return null;

            GSOGeoPolyline3D line1 = resFeature.Geometry as GSOGeoPolyline3D;
            if (line1 == null) return null;
            GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D;
            if (pipeStyle1 == null) return null;
            
            return resFeature;
        }
        /// <summary>
        /// 图层节点树中 节点 右键单击事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void layerMarkerTree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                if (e.Node.Text == "标注管理" || e.Node.Text == "传感器管理")
                    return;
                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;
                        }
                    }
                }
            }
        }
        /// <summary>
        /// 标注管理、传感器管理 图层目录树的右键菜单中的 刷新列表 菜单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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);
            }
        }
        /// <summary>
        /// 给指定的图层节点添加代表feature对象的子节点
        /// </summary>
        /// <param name="layerTreeNode"></param>
        private void RefreshTreeNodeLayerFeatureList(TreeNode layerTreeNode)
        {
            layerTreeNode.Nodes.Clear();
            GSOLayer layer = (GSOLayer)layerTreeNode.Tag;
            // 只将类型为内存数据集的图层列出,如果是其它类型的数据集可能数据量太大,没发显示在树控件中
            if (layer.Dataset is GSOFeatureDataset)
            {
                VisitFeature3Ds(layer.GetAllFeatures(), layerTreeNode);
            }
        }
        /// <summary>
        /// 标注管理、传感器管理 图层目录树的右键菜单中的 移除所有 菜单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void toolStripMenuItem2_Click(object sender, EventArgs e)
        {
            TreeNode node = contextMenuStrip3.Tag as TreeNode;
            if (node == null) return;
            GSOFeature feature3d = node.Tag as GSOFeature;
            if (feature3d == null) return;
            feature3d.Delete();
            globeControl1.Globe.Refresh();
            node.Remove();
        }
        /// <summary>
        /// 图层目录树的 节点对应的复选框选中状态改变事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void layerMarkerTree_AfterCheck(object sender, TreeViewEventArgs e)
        {
            if (e.Action != TreeViewAction.Unknown)
            {
                CheckTreeNode(e.Node, e.Node.Checked);
            }
        }
        /// <summary>
        /// 改变指定节点对应的复选框的选中状态
        /// </summary>
        /// <param name="node"></param>
        /// <param name="bChecked"></param>
        private void CheckTreeNode(TreeNode node, Boolean bChecked)
        {
            CheckChildTreeNode(node, bChecked);
            globeControl1.Globe.Refresh();
        }
        /// <summary>
        /// 改变指定节点的子节点对应的复选框的选中状态
        /// </summary>
        /// <param name="node"></param>
        /// <param name="bChecked"></param>
        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).SetVisibleDirectly(bChecked);
                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);
            }
        }
        /// <summary>
        /// 标注管理、传感器管理 目录树中的feature节点的右键菜单中的 删除 菜单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        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) return;
            l.RemoveAllFeature();
            node.Nodes.Clear();
            globeControl1.Refresh();
        }
        //定时检查传感器的状态
        public Timer timerOfSensor = null;
        /// <summary>
        /// 一键审核---导入数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem127_Click_2(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "打开数据");

            try
            {
                string dbIp = Utility.sgdbip;
                string database = Utility.sgdbname;
                string user = Utility.sgdbuser;
                string pass = Utility.sgdbpwd;
                shds = globeControl1.Globe.DataManager.OpenOracleDataSource(dbIp + "/" + database, "", "", user, pass);
                if (shds == null)
                {
                    MessageBox.Show("施工数据库连接失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
                FrmPipelineModelDB frm = new FrmPipelineModelDB(globeControl1, shds, true);
                if (frm.ShowDialog() == DialogResult.OK)
                {
                    addNodeToLayerManagerNode(frm.rukuLayer);
                }
            }
            catch (Exception ex)
            {
                LogError.PublishError(ex);
                MessageBox.Show("内存过载请清理内存,并重新启动规划分析!", "提示");
            }
        }
        /// <summary>
        ///自动导出图片 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem130_Click_1(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "导出审核图");

            Point pt1 = new Point(Convert.ToInt32(0), Convert.ToInt32(0));
            Point pt2 = new Point(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height));

            int mapWidth = 0;
            int mapHeight = 0;
            Point pt = getUpperLeftPoint(pt1, pt2, out mapWidth, out mapHeight);
            int rightBottomX = pt.X + mapWidth;
            int rightBottomY = pt.Y + mapHeight;
            Image myImg = new Bitmap(mapWidth, mapHeight);
            Graphics g = Graphics.FromImage(myImg);
            g.CopyFromScreen(pt, new Point(0, 0), new Size(rightBottomX, rightBottomY));

            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 = Path.GetExtension(dlg.FileName);//扩展名 
                switch (extension)
                {
                    case ".jpg":
                        myImg.Save(dlg.FileName, ImageFormat.Jpeg);
                        break;
                    case ".png":
                        myImg.Save(dlg.FileName, ImageFormat.Png);
                        break;
                    case ".bmp":
                        myImg.Save(dlg.FileName, ImageFormat.Bmp);
                        break;
                    case ".gif":
                        myImg.Save(dlg.FileName, ImageFormat.Gif);
                        break;
                    default:
                        break;
                }
            }
        }
        /// <smary>
        /// 一键审核功能
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem128_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItem128.Text);
            frmSh = new FrmYJSHTC(globeControl1, globeControl2, layerTree);

            if (frmSh.ShowDialog() == DialogResult.OK)
            {
                frmWait = new FrmWait("一键审核……");
                frmWait.Location = new Point(Width - frmWait.Width - 10, Height - frmWait.Height - 50);
                frmWait.Owner = this;
                frmWait.Show();
                Thread thread = new Thread(doWork);
                thread.IsBackground = true;
                thread.Start();
            }
        }
        
        void doWork()
        {
            FrmShResult frmShResult = null;

            double dVerticalJingJuBiaoZhun = 1, dHorizontalJingJuBiaoZhun = 1;
            if (frmSh.rukuLayer != null)
            {
                #region
                Invoke((EventHandler) delegate
                {
                    try
                    {
                        List<string> managerLayerList = new List<string>();
                        for (int i = 0; i < layerManagerNode.Nodes.Count; i++)
                        {
                            managerLayerList.Add(layerManagerNode.Nodes[i].Text);
                        }
                        if (!managerLayerList.Contains(frmSh.rukuLayer.Caption))
                        {
                            TreeNode node = new TreeNode();
                            node.Tag = frmSh.rukuLayer;
                            node.Text = frmSh.rukuLayer.Dataset.Caption;
                            node.ImageIndex = 0;
                            node.SelectedImageIndex = 0;
                            node.Checked = frmSh.rukuLayer.Visible;
                            layerManagerNode.Nodes.Insert(0, node);
                            layerManagerNode.Expand();
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "提示");
                    }
                });
                #endregion

                shlayername = frmSh.rukuLayer.Name;
                globeControl1.Refresh();
            }
            #region wxl 下面unreachable
            if (frmShResult != null && !frmShResult.IsDisposed)
            {
                try
                {
                    clearFeatureHighLight();
                    ClearRedlineAnalyseResult();
                    frmShResult.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            #endregion wxl
            frmShResult = new FrmShResult(dVerticalJingJuBiaoZhun, dHorizontalJingJuBiaoZhun, shlayername, globeControl1,
                Utility.m_PipelineLayerNames);

            if (boolfrmShResult) return;

            frmShResult.Location = new Point(Width - frmShResult.Width - 10, Height - frmShResult.Height - 50);
            frmShResult.Owner = this;
            //一键审核实际计算步骤
            frmShResult.analysis();

            //MainFrm窗体显示控制,回到一键审核Tab
            Invoke((EventHandler) delegate
            {
                frmShResult.Show();
                frmWait.Close();
                //将tab页恢复到一键审核
                ribbonTabItem11.Checked = true;
                try
                {
                    globeControl1.Globe.Action = EnumAction3D.ActionNull;
                    splitContainer1.Panel2Collapsed = true;

                    panelOfTable.Visible = false;
                    legendSC.Visible = false;
                    legendSG.Visible = false;

                    GSOLayer redLayer = globeControl1.Globe.Layers.GetLayerByCaption("红线");
                    if (redLayer != null)
                    {
                        redLayer.Visible = false;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("系统运行错误:" + ex, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            });

            boolfrmShResult = true;
        }
        /// <summary>
        /// 清除渲染结果
        /// </summary>
        public void ClearRedlineAnalyseResult()
        {
            for (int i = 0; i < globeControl1.Globe.Layers.Count; i++)
            {
                GSOLayer layer = globeControl1.Globe.Layers[i];
                if (layer.Caption == "tempLgdData")
                {
                    layer.RemoveAllFeature();
                }
            }

            layerTemp.RemoveAllFeature();
            globeControl1.Refresh();
        }
        /// <summary>
        /// 已审核的图层
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem132_Click_1(object sender, EventArgs e)
        {
            //保存日志
            LogManager.saveLog(Utility.userName, buttonItem132.Text);

            if (shds == null)
            {
                //没连的话,直接连接审核库; //审核库配置读配置文件
                string dbIp = Utility.sgdbip;
                string database = Utility.sgdbname;
                string user = Utility.sgdbuser;
                string pass = Utility.sgdbpwd;

                shds = globeControl1.Globe.DataManager.OpenOracleDataSource(dbIp + "/" + database, "", "", user, pass);
                if (shds == null)
                {
                    MessageBox.Show("数据库连接失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }
            }
            FrmShLayers frm = new FrmShLayers(globeControl1, shds);
            frm.Show();

        }
        /// <summary>
        /// 审核入库
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem133_Click_1(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "审核入库");
            FrmShRK frmShrk = new FrmShRK(globeControl1);
            frmShrk.Show();
        }
        /// <summary>
        /// 模拟设计修改
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem134_Click_1(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "模拟设计修改");

            frmModify = new FrmMnModify(globeControl1, shlayername, shresultLists);

            if (boolfrmModify != false) return;
            frmModify.Owner = this;
            frmModify.Location = new Point(Width - frmModify.Width - 10, Height - frmModify.Height - 50);
            frmModify.Show();
            boolfrmModify = true;
        }
        /// <summary>
        /// 一键审核中调节透明度
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void sliderItem1_ValueChanged(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, sliderItem1.Text);

            globeControl1.Globe.GroundOpaque = 100 - sliderItem1.Value;
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(Utility.roadLayerName); //("180fd");

            if (layer != null)
                layer.Opaque = 100 - sliderItem1.Value;
            optiValue = sliderItem1.Value;
        }
        /// <summary>
        /// 红线审核中的透明度分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void sliderItem3_ValueChanged(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, sliderItem3.Text);

            globeControl1.Globe.GroundOpaque = 100 - sliderItem3.Value;
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(Utility.roadLayerName); //("180fd");
            if (layer != null)
                layer.Opaque = 100 - sliderItem3.Value;
            optiValue = sliderItem3.Value;
        }
        #region yanxiaowei
        //初始化DataGridViewX1控件
        public delegate void DataGridViewDelegate(DataTable dt, string strLable, string strLayer, bool initDataGrid);
        /// <summary>
        /// 代理函数,操作DatgridViewX1
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="strLable"></param>
        public void InitDataGridViewX1(DataTable dt, string strLable, string strLayer, bool initDataGrid)
        {
            if (initDataGrid)
            {
                dataGridViewX1.DataSource = dt;
                panelOfTable.Visible = true;
                toolStripNumbers.Text = strLable;
                dataGridViewX1.Tag = strLayer;
            }
            else
            {
                dataGridViewX1.DataSource = null;
                dataGridViewX1.Refresh();
                panelOfTable.Visible = false;
                toolStripNumbers.Text = "";
                dataGridViewX1.Tag = "";
                globeControl1.Globe.MemoryLayer.RemoveAllFeature(); //清除双击产生的标注
            }
        }
        FrmAnalysisGuiHuaResult from;
        /// <summary>
        /// 主窗体下方属性表格 双击定位 功能
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void dataGridViewX1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (!redSH)
            {
                if (e.Button == MouseButtons.Left)
                {
                    DataGridView.HitTestInfo hittestinfo = dataGridViewX1.HitTest(e.X, e.Y);
                    if (hittestinfo.RowIndex > -1)
                    {
                        string featureName = "";
                        if (dataGridViewX1.Columns.Contains("编号"))
                        {
                            featureName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["编号"].Value.ToString();
                        }
                        else if (dataGridViewX1.Columns.Contains("标识器编号"))
                        {
                            featureName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["标识器编号"].Value.ToString();
                        }
                        featureName = featureName.Trim();

                        GSOLayer layer = null;
                        layer = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX1.Tag.ToString());

                        if (layer == null) return;

                        GSOFeatures features = layer.GetFeatureByName(featureName, false);
                        if (features.Length == 0) return;
                        GSOFeature rowFeature = features[0];

                        ClassSearchAnalysis.AddMakerToLineFeature(globeControl1, rowFeature);

                    }
                }
            }
            else
            {
                if (e.Button == MouseButtons.Left)
                {
                    if (from != null && !from.IsDisposed)
                    {
                        try
                        {
                            from.Close();
                        }
                        catch (Exception ex)
                        {
                            LogError.PublishError(ex);
                        }
                    }
                    try
                    {
                        DataGridView.HitTestInfo hittestinfo = dataGridViewX1.HitTest(e.X, e.Y);
                        if (hittestinfo.RowIndex >= 0)
                        {
                            string layer = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["管线类型"].Value.ToString();
                            string hxName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["红线编号"].Value.ToString();
                            FrmAnalysisGuiHuaResult frm = new FrmAnalysisGuiHuaResult(globeControl1, lineStruct, featsList,
                                panelOfTable, dataGridViewX1, layer, hxName);
                            frm.Location = new Point(Width - frm.Width - 10, Height - frm.Height - 20);
                            frm.Show(this);

                            from = frm;
                        }
                    }
                    catch (Exception ex)
                    {
                        LogError.PublishError(ex);
                    }
                }
            }
        }
        /// <summary>
        /// 空间查询
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSearch1_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemSearch1.Text);

            trackflag = "PipelineSpatialQuery";
            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
            globeControl1.Globe.TrackPolygonTool.TrackMode = EnumTrackMode.SpaceTrack;
        }
        /// <summary>
        /// 关键字查询
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSearch9_Click(object sender, EventArgs e)
        { 
            LogManager.saveLog(Utility.userName, buttonItemSearch9.Text);

            FrmKeywordQuery.ShowForm(globeControl1, Utility.m_PipelineLayerNames, InitDataGridViewX1);
        }
        /// <summary>
        /// 编号查询
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSearch2_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemSearch2.Text);

            FrmCodingQuery.ShowForm(globeControl1, Utility.m_PipelineLayerNames, InitDataGridViewX1);
        }
        /// <summary>
        /// 坐标查询
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSearch3_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemSearch3.Text);

            FrmSetLatLonPos.ShowForm(globeControl1);
        }
        /// <summary>
        /// 附属物查询
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSearch10_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemSearch10.Text);

            FrmFittingQuery.ShowForm(globeControl1, Utility.instrumenLayerNames, InitDataGridViewX1);
        }
        /// <summary>
        /// 管径查询
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSearch4_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemSearch4.Text);

            FrmDiameterQuery.ShowForm(globeControl1, Utility.m_PipelineLayerNames, InitDataGridViewX1);
        }
        /// <summary>
        /// 材质查询
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSearch5_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemSearch5.Text);

            FrmMaterialSel.ShowForm(globeControl1, Utility.m_PipelineLayerNames, InitDataGridViewX1);
        }
        /// <summary>
        /// 基本查询
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSearch6_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemSearch6.Text);

            FrmBasicQuery.ShowForm(globeControl1, InitDataGridViewX1);
        }
        /// <summary>
        /// 复合查询
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSearch7_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemSearch7.Text);

            FrmQuerySQL.ShowForm(globeControl1, InitDataGridViewX1);
        }
        /// <summary>
        /// 关联查询
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSearch8_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemSearch8.Text);

            if (globeControl1.Globe.SelObjectCount != 1)
            {
                MessageBox.Show("请选中一个对象!", "提示");
                return;
            }
            double valueAllowance = 1.0;

            for (int j = 0; j < globeControl1.Globe.SelObjectCount; j++)
            {
                GSOFeature feature = null;
                GSOLayer layer = null;
                globeControl1.Globe.GetSelectObject(j, out feature, out layer);

                if (feature == null && feature.Geometry == null || (feature.Geometry.Type == EnumGeometryType.GeoPolygon3D
                    || feature.Geometry.Type == EnumGeometryType.GeoWater))
                    return;
                ClassSearchAnalysis.ResultRelationAnalysis(globeControl1, feature, Utility.valueLayerNames, Utility.workwellLayerNames,
                    Utility.instrumenLayerNames, Utility.pipefittingLayerNames, Utility.m_PipelineLayerNames, valueAllowance);
            }
        }
        #endregion
        /// <summary>
        /// 清除分析(完善)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemClear_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemClear.Text);

            globeControl1.Globe.ClearMeasure();
            layerTemp.RemoveAllFeature();
            layerTemp2.RemoveAllFeature();
            buttonItemLS5.Checked = false;

            dataGridViewX1.DataSource = null;
            panelOfTable.Visible = false;

            globeControl1.Globe.MemoryLayer.RemoveAllFeature();
            globeControl1.Globe.ClearAnalysis();


            // 清除净距分析结果
            buttonX2_Click(null, null);
            buttonX8_Click(null, null);
            buttonX15_Click(null, null);
            buttonX16_Click(null, null);
            buttonClearAnalysisResult_Click(null, null);

            NetworkAnalysisTool.ClearAllTopAnalysis(globeControl1);

//            GSOFeatures feats = globeControl1.Globe.MemoryLayer.GetFeatureByName("粒子要素", true);
//            if (feats.Length > 0)
//                globeControl1.Globe.MemoryLayer.RemoveFeatureByID(feats[0].ID);

            globeControl1.Globe.UnderGroundFloor.Visible = false;//隐藏地下网格线

            // ClearUpDownTraceAnalysis(); //清除上下游分析
            globeControl1.Globe.RemoveAllPits();//清除所有坑
            MarkTools.removeAllMarker(globeControl1);//清除所有标注
            #region wxl 这段不清楚什么用处,注释掉,对系统没有影响

            //            if (layerMarkerTree != null && layerMarkerTree.Nodes.Count > 0)
            //            {
            //                for (int i = 0; i < layerMarkerTree.Nodes[0].Nodes.Count; i++)
            //                {
            //                    layerMarkerTree.Nodes[0].Nodes[i].Nodes.Clear();
            //                }
            //            }
            #endregion

            clearFeatureHighLight();//取消管线高亮

            GSOLayer layerGround = globeControl1.Globe.Layers.GetLayerByCaption(Utility.roadLayerName);//("180fd");
            if (layerGround != null)
            {
                layerGround.Visible = true;
            }
            globeControl1.Refresh();
            globeControl2.Refresh();
            ClearRedlineAnalyseResult();
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
        }
        /// <summary>
        /// 管线长度全区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ1_ALL_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "管线长度统计");
            FrmAllPipelineStatis frm = new FrmAllPipelineStatis(globeControl1, null, InitDataGridViewX1, Utility.m_PipelineLayerNames);
            frm.Show(this);
        }
        /// <summary>
        /// 管线长度绘制区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ1_DRAW_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "管线长度统计");

            trackflag = "PipelineDistanceStatistics";
            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
            globeControl1.Globe.TrackPolygonTool.TrackMode = EnumTrackMode.SpaceTrack;
        }
        /// <summary>
        /// 阀门数量全区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ2_ALL_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "阀门数量统计");
            FrmValveStatistics frm = new FrmValveStatistics(globeControl1, null, InitDataGridViewX1);
            frm.Show(this);

            globeControl1.Globe.Action = EnumAction3D.ActionNull;
        }
        /// <summary>
        /// 阀门数量绘制区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ2_DRAW_Click(object sender, EventArgs e)
        { 
            LogManager.saveLog(Utility.userName, "阀门数量统计");

            trackflag = "valvequery";
            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
            globeControl1.Globe.TrackPolygonTool.TrackMode = EnumTrackMode.SpaceTrack;
        }
        /// <summary>
        /// 井盖数量全区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ3_ALL_Click(object sender, EventArgs e)
        {
            FrmAllWorkWellStatis frm = new FrmAllWorkWellStatis(globeControl1, null, InitDataGridViewX1);
            frm.Show(this);
        }
        /// <summary>
        /// 井盖数量绘制区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ3_DRAW_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "井盖数量统计");

            trackflag = "workwellquery";
            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
            globeControl1.Globe.TrackPolygonTool.TrackMode = EnumTrackMode.SpaceTrack;
        }
        /// <summary>
        /// 管径分段统计全区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ4_ALL_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "管径分段统计");

            Frmpipediameterstatis.ShowForm(globeControl1, Utility.m_PipelineLayerNames, 0);
        }
        /// <summary>
        /// 管径分段统计绘制区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ4_DRAW_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "管径分段统计");

            trackflag = null;
            Frmpipediameterstatis.ShowForm(globeControl1, Utility.m_PipelineLayerNames, 1);
        }
        /// <summary>
        /// 埋深分段统计全区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ5_ALL_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "埋深分段统计");
            FrmpipeDeepstatis.ShowForm(globeControl1, Utility.m_PipelineLayerNames, 0);
        }
        /// <summary>
        /// 埋深分段统计绘制区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ5_DRAW_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "埋深分段统计");
            trackflag = null;
            FrmpipeDeepstatis.ShowForm(globeControl1, Utility.m_PipelineLayerNames, 1);
        }
        /// <summary>
        /// 管径分类统计全区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ6_ALL_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "管径分类汇总");

            FrmpipeDiametergather.ShowForm(globeControl1, Utility.m_PipelineLayerNames, 0);
        }
        /// <summary>
        /// 管径分类统计绘制区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ6_DRAW_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "管径分类汇总");

            trackflag = null;
            FrmpipeDiametergather.ShowForm(globeControl1, Utility.m_PipelineLayerNames, 1);
        }
        /// <summary>
        /// 材质分类统计全区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ7_ALL_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "材质分类汇总");

            FrmpipeMaterialGather.ShowForm(globeControl1, Utility.m_PipelineLayerNames, 0);
        }
        /// <summary>
        /// 材质分类统计绘制区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ7_DRAW_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "材质分类汇总");

            trackflag = null;
            FrmpipeMaterialGather.ShowForm(globeControl1, Utility.m_PipelineLayerNames, 1);
        }
        /// <summary>
        /// 附属物分类统计全区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ8_ALL_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "附属物分类汇总");

            FrmAccessoriesgather.ShowForm(globeControl1, Utility.instrumenLayerNames, 0);
        }
        /// <summary>
        /// 附属物分类统计绘制区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemTJ8_DRAW_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, "附属物分类汇总");

            trackflag = null;
            FrmAccessoriesgather.ShowForm(globeControl1, Utility.instrumenLayerNames, 1);
        }
        #region Predaotr,断面分析
        /// <summary>
        /// 横断面分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX2_1_Click(object sender, EventArgs e)
        {
            globeControl1.Globe.Action = EnumAction3D.TrackPolyline;
            globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true;
            globeControl1.Globe.TrackPolylineTool.TrackMode = EnumTrackMode.SpaceTrack;
            trackPolylineEndMode = EnumTrackPolylineEndMode.HDM_Analysis;
        }
        /// <summary>
        /// 纵断面分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX2_2_Click(object sender, EventArgs e)
        {
            if (globeControl1.Globe.SelObjectCount < 1)
            {
                MessageBox.Show("请选择一条或者多条管线!", "提示", MessageBoxButtons.OK,
                    MessageBoxIcon.Information);
                return;
            }
            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);
                }
            }
            List<GSOFeature> feats = SectionAnalysisTool.ZDMAnalysis(selectFeatures);
            if (feats != null && feats.Count >= 1)
            {
                FrmProfileAnalysis frm = new FrmProfileAnalysis(globeControl1, feats);
                frm.Show(this);
            }
        }
        /// <summary>
        /// 道路断面分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX2_3_Click(object sender, EventArgs e)
        {
            globeControl1.Globe.Action = EnumAction3D.TrackPolyline;
            globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true;
            globeControl1.Globe.TrackPolylineTool.TrackMode = EnumTrackMode.SpaceTrack;
            trackPolylineEndMode = EnumTrackPolylineEndMode.DLDM_Analysis;
        }
        /// <summary>
        /// 基线剖面分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX2_4_Click(object sender, EventArgs e)
        {
            globeControl1.Globe.Action = EnumAction3D.TrackPolyline;
            globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true;
            globeControl1.Globe.TrackPolylineTool.TrackMode = EnumTrackMode.SpaceTrack;
            trackPolylineEndMode = EnumTrackPolylineEndMode.JXPM_Analysis;
        }
        #endregion
        /// <summary>
        /// 创建拓扑
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX3_1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemFX3_1.Text);

            FrmGenAndFaMenTopu frm = new FrmGenAndFaMenTopu(globeControl1, Utility.m_PipelineLayerNames, Utility.valueLayerNames);
            frm.Show(this);
        }
        #region Predator :拓扑分析
        /// <summary>
        /// 上游分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX3_2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemFX3_2.Text);
            NetworkTraceUpDown(true);
        }
        /// <summary>
        /// 下游分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX3_3_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemFX3_3.Text);
            NetworkTraceUpDown(false);
        }
        /// <summary>
        /// 上下游追踪 功能
        /// </summary>
        /// <param name="bTraceUp"></param>
        private void NetworkTraceUpDown(Boolean bTraceUp)
        {
            GSOFeature selLineFeature = globeControl1.Globe.SelectedObject;
            if (selLineFeature == null || selLineFeature.Geometry == null || selLineFeature.Geometry.Type != EnumGeometryType.GeoPolyline3D)
            {
                MessageBox.Show("请点击“编辑”—“选中对象”选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            GSOLayer selLayer = globeControl1.Globe.SelectedObjectLayer;

            NetworkAnalysisTool.TraceUpDownAnalysis(bTraceUp,
                 selLineFeature, selLayer);
        }
        /// <summary>
        /// 流向分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX3_4_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemFX3_4.Text);

            FrmFlow frm = new FrmFlow(globeControl1, Utility.m_PipelineLayerNames);
            frm.Show(this);
        }
        /// <summary>
        /// 关阀分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX3_5_Click(object sender, EventArgs e)
        {
            if (globeControl1.Globe.SelObjectCount < 1)
            {
                MessageBox.Show("请选中至少一根管线!!");
                buttonItemFX3_5.Checked = false;
                return;
            }
            GSOLayer resLayer = null;
            GSOFeature resFeature = null;
            globeControl1.Globe.GetSelectObject(0, out resFeature, out resLayer);

            String pipeLayerName = resLayer.Caption;
            String pipeLayerNamePrefix = pipeLayerName.Substring(0, pipeLayerName.IndexOf("管线"));
            GSOLayer valveLayer = globeControl1.Globe.Layers[pipeLayerNamePrefix + "阀门"];
            if (valveLayer == null)
            {
                MessageBox.Show("无" + pipeLayerNamePrefix + "阀门图层", "提示");
                return;
            }

            GSOFeatures valveFeats = NetworkAnalysisTool.CloseValvesAnalysis(resFeature,
                resLayer, valveLayer);

            if (valveFeats != null)
            {
                FrmCloseValves frm = new FrmCloseValves(globeControl1, valveFeats);
                frm.Show(this);
            }
            else
            {
                MessageBox.Show("未找到关闭阀门");
            }
        }
        /// <summary>
        /// 连通分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX3_6_Click(object sender, EventArgs e)
        {
            if (globeControl1.Globe.SelObjectCount < 2)
            {
                MessageBox.Show("请选中至少两个管线!!");
                buttonItemFX3_6.Checked = false;
                return;
            }
            GSOFeature selFeat0, selFeat1;
            GSOLayer layer0, layer1;
            globeControl1.Globe.GetSelectObject(0, out selFeat0, out layer0);
            globeControl1.Globe.GetSelectObject(1, out selFeat1, out layer1);

            if (!layer0.IsSameInnerObject(layer1))
            {
                MessageBox.Show("不在同一个图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                buttonItemFX3_6.Checked = false;
                return;
            }
            NetworkAnalysisTool.ConnexityAnalysis(selFeat0, selFeat1, layer0);
        }
        /// <summary>
        /// 爆管分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX3_7_Click(object sender, EventArgs e)
        {
            NetworkTraceUpDown(true);        //上游追踪:

            GSOFeature selLineFeature = globeControl1.Globe.SelectedObject;
            if (selLineFeature == null || selLineFeature.Geometry == null || selLineFeature.Geometry.Type != EnumGeometryType.GeoPolyline3D)
            {
                MessageBox.Show("请点击“编辑”—“选中对象”选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            GSOLayer selLayer = globeControl1.Globe.SelectedObjectLayer;

            NetworkAnalysisTool.ExplodeAnalysis(globeControl1, selLineFeature, selLayer);

            buttonItemFX3_5_Click(sender, e); //关阀分析:
        }
        #endregion
        /// <summary>
        /// 多边形开挖
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX4_1_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemFX4_1.Text);

            trackflag = "pit";
            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
            globeControl1.Globe.TrackPolygonTool.TrackMode = EnumTrackMode.SpaceTrack; //是这个么?是的,在模型上
        }
        /// <summary>
        /// 挖方量分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX4_2_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemFX4_2.Text);

            trackflag = "digFillAnalysis";
            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
            globeControl1.Globe.TrackPolygonTool.TrackMode = EnumTrackMode.SpaceTrack;
            ActionToolMenuChecked();
        }
        /// <summary>
        /// 沿线开挖
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX4_3_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemFX4_3.Text);

            if (!buttonItemFX4_3.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.TrackPolylineTool.VerticalLineVisible = true;
                    globeControl1.Globe.TrackPolylineTool.TrackMode = EnumTrackMode.SpaceTrack;
                    buttonItemFX4_3.Checked = true;
                }
            }
            else
            {
                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                buttonItemFX4_3.Checked = false;
                globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = false;
            }
            ActionToolMenuChecked();
        }
        /// <summary>
        /// 创建隧道
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX4_4_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemFX4_4.Text);

            globeControl1.Globe.Action = EnumAction3D.DrawPolyline;
            GSOLayer tunnel = globeControl1.Globe.Layers.GetLayerByCaption("隧道");
            if (tunnel == null)
                MessageBox.Show("场景中未加载隧道图层!", "提示");
            else
            {
                globeControl1.Globe.DestLayerFeatureAdd = tunnel;
                tunnel.Editable = true;
                m_isDrawTunnel = true;
                m_AddPipeLine = false;
                m_isDrawCitySevenLine = false;
            }
        }
        /// <summary>
        /// 隐藏隧道
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX4_5_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemFX4_5.Text);

            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption("隧道");
            if (layer != null)
            {
                layer.Visible = !layer.Visible;
            }
        }
        /// <summary>
        /// 删除隧道
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX4_6_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemFX4_6.Text);

            if (globeControl1.Globe.SelObjectCount > 0)
            {
                int tunnelCount = 0;
                for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++)
                {
                    GSOFeature f = null;
                    GSOLayer layer = null;
                    globeControl1.Globe.GetSelectObject(i, out f, out layer);
                    if (f == null || f.Dataset.Caption != "隧道") continue;
                    tunnelCount++;
                    f.Delete();
                    if (layer != null)
                    {
                        globeControl1.Globe.AddToEditHistroy(layer, f, EnumEditType.Delete);
                    }
                    globeControl1.Refresh();
                }
                if (tunnelCount == 0)
                {
                    MessageBox.Show("请选中要删除的隧道!", "提示");
                }
            }
            else
            {
                MessageBox.Show("请选中要删除的隧道!", "提示");
            }
        }
        /// <summary>
        /// 通视分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX5_1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemFX5_1.Text);

            globeControl1.Globe.Action = globeControl1.Globe.Action != EnumAction3D.VisibilityAnalysis ? EnumAction3D.VisibilityAnalysis : EnumAction3D.ActionNull;
        }
        /// <summary>
        /// 可视域分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX5_2_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemFX5_2.Text);

            globeControl1.Globe.Action = EnumAction3D.ViewshedAnalysis;
        }
        /// <summary>
        /// 可视包络分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX5_3_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemFX5_3.Text);

            globeControl1.Globe.Action = EnumAction3D.ViewEnvelopeAnalysis;
        }
        /// <summary>
        /// 缓冲区分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX6_1_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemFX6_1.Text);

            GSOFeature feat = globeControl1.Globe.SelectedObject;
            if (feat == null)
            {
                MessageBox.Show("请选择要分析的要素!");
                return;
            }
            if (feat.Geometry.Type == EnumGeometryType.GeoPolyline3D)
            {
                GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D;
                if (line1 == null)
                {
                    MessageBox.Show("请选择一条管线!");
                    return;
                }

                FrmBufferAnalysis frm = new FrmBufferAnalysis(globeControl1, line1, layerTemp);
                frm.Show(this);
            }
            else
            {
                FrmBufferAnalysisBSQ frm = new FrmBufferAnalysisBSQ(globeControl1, layerTemp, bsqPT);
                frm.Show(this);
            }

        }
        /// <summary>
        /// 附属物分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX6_2_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemFX6_2.Text);

            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            FrmAccessoryAnalysis dlg = new FrmAccessoryAnalysis(globeControl1, layerTemp);
            dlg.Show(this);
        }
        /// <summary>
        /// 无源淹没分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFX6_3_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemFX6_3.Text);

            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
            trackflag = "FloodAnalysis";
        }
        /// <summary>
        /// 水平距离
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemLS1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemLS1.Text);

            globeControl1.Globe.Action = EnumAction3D.MeasureDistance;
            globeControl1.Globe.DistanceRuler.SpaceMeasure = false;
            buttonItemLS5.Checked = false;
        }
        /// <summary>
        /// 垂直距离
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemLS2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemLS2.Text);

            buttonItemLS5.Checked = false;
            globeControl1.Globe.Action = EnumAction3D.MeasureHeight;
            globeControl1.Globe.DistanceRuler.SpaceMeasure = false;
        }
        /// <summary>
        /// 空间距离
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemLS3_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemLS3.Text);

            buttonItemLS5.Checked = false;
            globeControl1.Globe.Action = EnumAction3D.MeasureDistance;
            globeControl1.Globe.DistanceRuler.SpaceMeasure = true;
        }
        /// <summary>
        /// 地表距离
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemLS4_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemLS4.Text);

            buttonItemLS5.Checked = false;
            globeControl1.Globe.Action = EnumAction3D.MeasureDistance;
            globeControl1.Globe.DistanceRuler.SpaceMeasure = false;
        }
        /// <summary>
        /// 高度量算
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemLS5_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemLS5.Text);

            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            buttonItemLS5.Checked = !buttonItemLS5.Checked;
            if (!buttonItemLS5.Checked) return;
            globeControl1.Globe.Action = EnumAction3D.SelectObject;
        }
        /// <summary>
        /// 水平面积
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemLS6_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemLS6.Text);

            buttonItemLS5.Checked = false;
            globeControl1.Globe.Action = EnumAction3D.MeasureArea;
            globeControl1.Globe.AreaRuler.SpaceMeasure = true;
        }
        /// <summary>
        /// 地表面积
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemLS7_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemLS7.Text);

            buttonItemLS5.Checked = false;
            globeControl1.Globe.Action = EnumAction3D.MeasureArea;
            globeControl1.Globe.AreaRuler.SpaceMeasure = false;

        }

        # region Fan 重构标注代码
        /// <summary>
        /// 标高标注
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSZ1_Click(object sender, EventArgs e)
        {
            GSOFeature resFeature = IsPipeLineOfSelectedObj();
            if (resFeature == null)
            {
                MessageBox.Show("请选中一根管线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D;
            if (selLine[0].Count <= 1)
            {
                return;
            }

            MarkTools.getInstance().showMarker(resFeature,
                globeControl1, EnumMarkLayer.Mark_Altitude, "");
        }
        /// <summary>
        /// 管径标注
        /// </summary>
        GSOFeature radiusMarkerFeature;
        private void buttonItemBZ2_Click(object sender, EventArgs e)
        {
            GSOFeature resFeature = IsPipeLineOfSelectedObj();
            if (resFeature == null)
            {
                MessageBox.Show("请选中一根管线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D;
            if (selLine==null||selLine[0].Count <= 1)//wxl增加为空判断,下面方法同理
            {
                return;
            }

            MarkTools.getInstance().showMarker(resFeature,
             globeControl1, EnumMarkLayer.Mark_Diameter, "");
        }
        /// <summary>
        /// 埋深标注
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBZ3_Click(object sender, EventArgs e)
        {
            GSOFeature resFeature = IsPipeLineOfSelectedObj();
            if (resFeature == null)
            {
                MessageBox.Show("请选中一根管线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D;
            if (selLine[0].Count <= 1)
            {
                return;
            }

            MarkTools.getInstance().showMarker(resFeature,
                globeControl1, EnumMarkLayer.Mark_Depth, "");

        }
        /// <summary>
        /// 坐标标注
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBZ4_Click(object sender, EventArgs e)
        {
            GSOFeature resFeature = IsPipeLineOfSelectedObj();
            if (resFeature == null)
            {
                MessageBox.Show("请选中一根管线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D;
            if (selLine[0].Count <= 1)
            {
                return;
            }
            MarkTools.getInstance().showMarker(resFeature,
                globeControl1, EnumMarkLayer.Mark_Location, "");
        }
        /// <summary>
        /// 距离标注
        /// </summary>
        bool distanceMarker;
        private void buttonItemBZ5_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemBZ5.Text);

            globeControl1.Globe.Action = EnumAction3D.TrackPolyline;
            //globeControl1.Globe.DistanceRuler.MeasureMode = EnumDistanceMeasureMode.HVSLineMeasure;
            distanceMarker = true;
        }
        /// <summary>
        /// 自定义标注
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBZ6_Click(object sender, EventArgs e)
        {
            GSOFeature f = globeControl1.Globe.SelectedObject;
            GSOLayer l = globeControl1.Globe.SelectedObjectLayer;
            FrmCustomLabel frm = new FrmCustomLabel(globeControl1, l, f);
            if (frm.ShowDialog() == DialogResult.OK)
            {
                MarkTools.getInstance().showMarker(f, globeControl1, EnumMarkLayer.Mark_Custom, frm.labelText);
            }
        }
        /// <summary>
        /// 扯旗标注
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBZ7_Click(object sender, EventArgs e)
        {
            GSOFeature f = globeControl1.Globe.SelectedObject;
            GSOLayer l = globeControl1.Globe.SelectedObjectLayer;
            FrmMarker frm = new FrmMarker();
            if (frm.ShowDialog() == DialogResult.OK)
            {
                MarkTools.getInstance().showMarker(f, globeControl1, EnumMarkLayer.Mark_Custom, frm.markerContent);
            }
        }
        /// <summary>
        /// 坡度标注
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBZ8_Click(object sender, EventArgs e)
        {
            GSOFeature resFeature = IsPipeLineOfSelectedObj();
            if (resFeature == null)
            {
                MessageBox.Show("请选中一根管线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            GSOGeoPolyline3D selLine = resFeature.Geometry as GSOGeoPolyline3D;
            if (selLine[0].Count <= 1)
            {
                return;
            }

            MarkTools.getInstance().showMarker(resFeature,
             globeControl1, EnumMarkLayer.Mark_Slope, "");
        }
        /// <summary>
        /// 属性标注
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBZ9_Click(object sender, EventArgs e)
        {
            GSOFeature f = globeControl1.Globe.SelectedObject;
            GSOLayer l = globeControl1.Globe.SelectedObjectLayer;
            FrmPropertiesMarker frm = new FrmPropertiesMarker(globeControl1, l, f);
            if (frm.ShowDialog() == DialogResult.OK)
            {
                MarkTools.getInstance().showMarker(f, globeControl1, EnumMarkLayer.Mark_Property, frm.labelText);
            }
        }
        /// <summary>
        /// 红线工具
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
//        private void buttonItemBZ10_Click(object sender, EventArgs e)
//        {
//            //日志记录 
//            LogManager.saveLog(Utility.userName, buttonItemBZ10.Text);
//            setMarkerLayerUnVisible("红线工具");
//            GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("红线工具");
//            if (l == null) return;
//            l.Visible = true;
//            globeControl1.Globe.DestLayerFeatureAdd = l;
//            l.Editable = true;
//            globeControl1.Globe.Action = EnumAction3D.DrawPolygon;
//            m_isDrawRedPology = true;
//        }
        /// <summary>
        /// 标注管理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBZ11_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemBZ11.Text);

            buttonItemBZ11.Checked = !buttonItemBZ11.Checked;
            string[] markerStrs = new string[10];
            markerStrs[0] = "标高标注";
            markerStrs[1] = "管径标注";
            markerStrs[2] = "埋深标注";
            markerStrs[3] = "坐标标注";
            markerStrs[4] = "坡度标注";
            markerStrs[5] = "属性标注";
            markerStrs[6] = "自定义标注";
            markerStrs[7] = "距离标注";
            markerStrs[8] = "红线工具";
            markerStrs[9] = "扯旗标注";

            if (buttonItemBZ11.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;
                }

                Refresh();
            }
        }

        #endregion
        /// <summary>
        /// 飞行到目标点
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFXGJ1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemFXGJ1.Text);

            FrmSetFlytoPos.ShowForm(globeControl1);
        }
        /// <summary>
        /// 自定义飞行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFXGJ2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemFXGJ2.Text);

            GSOGeoPolyline3D line = null;
            GSOFeature f = globeControl1.Globe.SelectedObject;
            if (f != null)
            {
                line = f.Geometry as GSOGeoPolyline3D;
            }

            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);
            }
        }
        /// <summary>
        /// 绕中心点飞行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFXGJ3_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemFXGJ3.Text);

            globeControl1.Globe.FlyAroundCenter(10000, EnumFlyRepeatValueType.MiliSeconds);
            globeControl1.Globe.CurFlyID = 1;
        }
        /// <summary>
        /// 绕眼睛飞行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemFXGJ4_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemFXGJ4.Text);

            globeControl1.Globe.FlyAroundEye(720, EnumFlyRepeatValueType.Degrees);
            globeControl1.Globe.CurFlyID = 2;
        }
        /// <summary>
        /// 权限管理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemXT1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemXT1.Text);

            FrmUserRoleMgr frm = new FrmUserRoleMgr();
            frm.ShowDialog();
        }
        /// <summary>
        /// 数据库管理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemXT2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemXT2.Text);

            //查看数据库列表
            FrmDbManager frm = new FrmDbManager();
            frm.ShowDialog();
        }
        /// <summary>
        /// 用户列表
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemXT3_1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemXT3_1.Text);

            FrmUserManager frm = new FrmUserManager();
            frm.ShowDialog();
        }
        /// <summary>
        /// 创建新用户
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemXT3_2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemXT3_2.Text);

            FrmUserAdd frm = new FrmUserAdd(-1);
            frm.ShowDialog();
        }
        /// <summary>
        /// 人员修改
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemXT4_2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemXT4_2.Text);

            FrmAppUSER appUSER = new FrmAppUSER();
            appUSER.ShowDialog();
        }
        /// <summary>
        /// 增加人员
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemXT4_1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemXT4_1.Text);

            FrmAppUSERRESET appUSERRESET = new FrmAppUSERRESET();
            appUSERRESET.ShowDialog();
        }
        /// <summary>
        /// 热点功能统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemZTT2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemZTT2.Text);

            FrmHotFuncStat frmhfs = new FrmHotFuncStat();
            frmhfs.ShowDialog();
        }

        private void buttonItemZTT3_1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemZTT3_1.Text);

            FrmAPP appfrm = new FrmAPP("专题图申请");
            appfrm.ShowDialog();
        }

        private void buttonItemZTT3_2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemZTT3_2.Text);

            FrmAPPFORASK appForask = new FrmAPPFORASK("专题图审核");
            appForask.ShowDialog();
        }

        private void buttonItemZTT3_3_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemZTT3_3.Text);

            FrmAPPregion appregion = new FrmAPPregion("专题图审核");
            appregion.ShowDialog();
        }

        private void buttonItemZTT4_1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemZTT4_1.Text);

            FrmAPP appfrm = new FrmAPP("打印申请");
            appfrm.ShowDialog();
        }

        private void buttonItemZTT4_2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemZTT4_2.Text);

            FrmAPPFORASK appForask = new FrmAPPFORASK("打印审核");
            appForask.ShowDialog();
        }

        private void buttonItemZTT4_3_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemZTT4_3.Text);

            FrmAPPregion appregion = new FrmAPPregion("打印审核");
            appregion.ShowDialog();
        }

        private void buttonItemZTT5_1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemZTT5_1.Text);

            FrmAPP appfrm = new FrmAPP("拷贝申请");
            appfrm.ShowDialog();
        }

        private void buttonItemZTT5_2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemZTT5_2.Text);

            FrmAPPFORASK appForask = new FrmAPPFORASK("拷贝审核");
            appForask.ShowDialog();
        }

        private void buttonItemZTT5_3_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemZTT5_3.Text);

            FrmAPPregion appregion = new FrmAPPregion("拷贝审核");
            appregion.Show();
        }

        private void buttonItemSPSZ_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemSPSZ.Text);

            FrmLayerControl frm = new FrmLayerControl(layerTree, globeControl1, globeControl2);
            frm.Show(this);
        }
        /// <summary>
        /// 综合规划区域审查
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSH5_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemSH5.Text);
            FrmCityServerLineAnalysis frm = new FrmCityServerLineAnalysis(globeControl1, Utility.m_PipelineLayerNames);
            frm.Show(this);
        }
      
        /// <summary>
        /// 数据质量检查
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSJGL2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemSJGL2.Text);
            FrmValiData frm = new FrmValiData(globeControl1);
            frm.ShowDialog();
        }
        /// <summary>
        /// 数据预处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSJGL3_Click(object sender, EventArgs e)
        {
            //保存日志
            LogManager.saveLog(Utility.userName, buttonItemSJGL3.Text);

            FrmEditShapeFile frm = new FrmEditShapeFile(globeControl1);
            frm.ShowDialog(this);
        }
        /// <summary>
        /// 连接数据库
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSJGL4_1_Click(object sender, EventArgs e)
        {
            //保存日志
            LogManager.saveLog(Utility.userName, buttonItemSJGL4_1.Text);

            FrmDatabaseParaSetting frm = new FrmDatabaseParaSetting(globeControl1);
            if (frm.ShowDialog() == DialogResult.OK)
            {
                ds = FrmDatabaseParaSetting.ds;
                if (ds != null)
                {
                    ds.IsCloseSaved = false;
                }
            }
        }
        /// <summary>
        /// 管线入库
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSJGL4_2_Click(object sender, EventArgs e)
        {
            //保存日志
            LogManager.saveLog(Utility.userName, buttonItemSJGL4_2.Text);

            if (ds == null)
            {
                MessageBox.Show("请先连接数据库", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                ConnectDB(null, null);
            }
            if (ds == null)
                return;
            FrmPipelineModelDB frm = new FrmPipelineModelDB(globeControl1, ds, false);

            if (frm.ShowDialog() == DialogResult.OK)
            {
                addNodeToLayerManagerNode(frm.rukuLayer);
            }
        }
        /// <summary>
        /// 附属物入库
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSJGL4_3_Click(object sender, EventArgs e)
        {
            //保存日志
            LogManager.saveLog(Utility.userName, buttonItemSJGL4_3.Text);

            if (ds == null)
            {
                MessageBox.Show("请先连接数据库!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                ConnectDB(null, null);
            }
            if (ds == null)
                return;
            FrmAddWellShp frm = new FrmAddWellShp(globeControl1, ds);

            if (frm.ShowDialog() == DialogResult.OK)
            {
                addNodeToLayerManagerNode(frm.rukuLayer);
            }
        }
        /// <summary>
        /// 坐标转换
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSJGL5_Click(object sender, EventArgs e)
        {
            //保存日志
            LogManager.saveLog(Utility.userName, buttonItemSJGL5.Text);

            FrmProject frm = new FrmProject();
            frm.ShowDialog();
        }
        /// <summary>
        /// 元数据基本管理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSJGL6_1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemSJGL6_1.Text);

            FrmMetadata frmmd = new FrmMetadata();
            frmmd.ShowDialog();
        }
        /// <summary>
        /// 元数据查询管理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSJGL6_2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemSJGL6_2.Text);

            FrmMetadataStat frmmds = new FrmMetadataStat();
            frmmds.ShowDialog();
        }
        /// <summary>
        /// 操作日志管理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSJGL7_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemSJGL7.Text);

            FrmLogOper frmlo = new FrmLogOper();
            frmlo.ShowDialog();
        }
        /// <summary>
        /// 数据字典管理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSJGL8_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemSJGL8.Text);

            FrmMDDictory frmmdd = new FrmMDDictory();
            frmmdd.ShowDialog();
        }
        /// <summary>
        /// 数据库备份
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSJGL9_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemSJGL9.Text);

            //新
            FrmBACKORACLE backOracle = new FrmBACKORACLE();
            backOracle.Show();
        }
        /// <summary>
        /// 创建管段
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemBJ1.Text);

            frmPipeSetEdit frm = new frmPipeSetEdit(globeControl1, Utility.m_PipelineLayerNames);
            if (frm.ShowDialog() == DialogResult.OK)
            {
                m_AddPipeLine = true;
                m_isDrawTunnel = false;
                m_isDrawCitySevenLine = false;
                globeControl1.Globe.Action = EnumAction3D.DrawPolyline;
            }
        }
        /// <summary>
        /// 创建附属物
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemBJ2.Text);

            FrmSetGoalLayer frm = new FrmSetGoalLayer(globeControl1, Utility.instrumenLayerNames, "附属物");
            if (frm.ShowDialog() == DialogResult.OK)
            {
                GSOLayer featureAddLayer = TreeNodeFeatureLayer();
                if (featureAddLayer != null)
                {
                    FrmAddInstrument dlg = new FrmAddInstrument(globeControl1, featureAddLayer);
                    dlg.Show(this);
                }
            }
        }
        /// <summary>
        /// 创建特征管点
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ3_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemBJ3.Text);

            FrmSetGoalLayer frm = new FrmSetGoalLayer(globeControl1, Utility.pipefittingLayerNames, "管点");
            if (frm.ShowDialog() == DialogResult.OK)
            {
                GSOLayer featureAddLayer = TreeNodeFeatureLayer();
                if (featureAddLayer == null) return;
                FrmAddPipeFitting dlg = new FrmAddPipeFitting(globeControl1, featureAddLayer);
                dlg.Show(this);
            }
        }
        /// <summary>
        /// 绘制城市七线(完善)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ4_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemBJ4.Text);

            FrmCitySevenLineType frm = new FrmCitySevenLineType();
            if (frm.ShowDialog() == DialogResult.OK)
            {
                globeControl1.Globe.Action = EnumAction3D.DrawPolyline;
                m_isDrawCitySevenLine = true;
                m_isDrawTunnel = false;
                m_AddPipeLine = false;
                citySevenLineType = frm.citySevenLineType;
                cityServerLineName = frm.citySevenLineName;
                switch (frm.citySevenLineType)
                {
                    case "城市红线":
                        GSOLayer layerRed = globeControl1.Globe.Layers.GetLayerByCaption(frm.citySevenLineType);
                        if (layerRed != null)
                        {
                            globeControl1.Globe.DestLayerFeatureAdd = layerRed;
                            layerRed.Editable = true;
                        }
                        break;
                    case "城市橙线":
                        GSOLayer layerOrange = globeControl1.Globe.Layers.GetLayerByCaption(frm.citySevenLineType);
                        if (layerOrange != null)
                        {
                            globeControl1.Globe.DestLayerFeatureAdd = layerOrange;
                            layerOrange.Editable = true;
                        }
                        break;
                    case "城市黄线":
                        GSOLayer layerYellow = globeControl1.Globe.Layers.GetLayerByCaption(frm.citySevenLineType);
                        if (layerYellow != null)
                        {
                            globeControl1.Globe.DestLayerFeatureAdd = layerYellow;
                            layerYellow.Editable = true;
                        }
                        break;
                    case "城市绿线":
                        GSOLayer layerGreen = globeControl1.Globe.Layers.GetLayerByCaption(frm.citySevenLineType);
                        if (layerGreen != null)
                        {
                            globeControl1.Globe.DestLayerFeatureAdd = layerGreen;
                            layerGreen.Editable = true;
                        }
                        break;
                    case "城市蓝线":
                        GSOLayer layerBlue = globeControl1.Globe.Layers.GetLayerByCaption(frm.citySevenLineType);
                        if (layerBlue != null)
                        {
                            globeControl1.Globe.DestLayerFeatureAdd = layerBlue;
                            layerBlue.Editable = true;
                        }
                        break;
                    case "城市紫线":
                        GSOLayer layerPurple = globeControl1.Globe.Layers.GetLayerByCaption(frm.citySevenLineType);
                        if (layerPurple != null)
                        {
                            globeControl1.Globe.DestLayerFeatureAdd = layerPurple;
                            layerPurple.Editable = true;
                        }
                        break;
                    case "城市黑线":
                        GSOLayer layerBlack = globeControl1.Globe.Layers.GetLayerByCaption(frm.citySevenLineType);
                        if (layerBlack != null)
                        {
                            globeControl1.Globe.DestLayerFeatureAdd = layerBlack;
                            layerBlack.Editable = true;
                        }
                        break;
                }
            }
        }
        /// <summary>
        /// 选中对象
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ5_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemBJ5.Text);

            globeControl1.Globe.Action = EnumAction3D.SelectObject;
        }
        /// <summary>
        /// 平移对象
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ6_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemBJ6.Text);

            globeControl1.Globe.Action = EnumAction3D.MoveObject;
        }
        /// <summary>
        /// 升降对象
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ7_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemBJ7.Text);

            globeControl1.Globe.Action = EnumAction3D.ElevateObject;
        }
        /// <summary>
        /// 旋转对象
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ8_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemBJ8.Text);

            globeControl1.Globe.Action = EnumAction3D.RotateObject;
        }
        /// <summary>
        /// 连接管段
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ9_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemBJ9.Text);

            if (globeControl1.Globe.SelObjectCount < 2)
            {
                MessageBox.Show("对不起,请至少选中2个对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            globeControl1.Globe.InsertJointPipeline(false);
        }
        /// <summary>
        /// 后退
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ11_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemBJ11.Text);
            globeControl1.Globe.UnDoEdit();
        }
        /// <summary>
        /// 前进
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ12_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemBJ12.Text);

            globeControl1.Globe.ReDoEdit();
        }
        /// <summary>
        /// 导出CAD
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ10_1_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemBJ10_1.Text);

            #region 导出成dxf格式
            List<string> listVectorNames = new List<string>();
            for (int i = 0; i < Utility.m_PipelineLayerNames.Count; i++)
            {
                if (Utility.m_PipelineLayerNames[i] == "移动" || Utility.m_PipelineLayerNames[i] == "联通"
                     || Utility.m_PipelineLayerNames[i] == "电信" || Utility.m_PipelineLayerNames[i] == "共通"
                     || Utility.m_PipelineLayerNames[i] == "有线电视" || Utility.m_PipelineLayerNames[i] == "交通信号"
                     || Utility.m_PipelineLayerNames[i] == "供电")
                {
                    continue;
                }
                if (!listVectorNames.Contains(Utility.m_PipelineLayerNames[i]))
                {
                    listVectorNames.Add(Utility.m_PipelineLayerNames[i]);
                }
            }
            for (int i = 0; i < Utility.valueLayerNames.Count; i++)
            {
                if (!listVectorNames.Contains(Utility.valueLayerNames[i]))
                {
                    listVectorNames.Add(Utility.valueLayerNames[i]);
                }
            }
            for (int i = 0; i < Utility.workwellLayerNames.Count; i++)
            {
                if (!listVectorNames.Contains(Utility.workwellLayerNames[i]))
                {
                    listVectorNames.Add(Utility.workwellLayerNames[i]);
                }
            }
            for (int i = 0; i < Utility.instrumenLayerNames.Count; i++)
            {
                if (!listVectorNames.Contains(Utility.instrumenLayerNames[i]))
                {
                    listVectorNames.Add(Utility.instrumenLayerNames[i]);
                }
            }
            for (int i = 0; i < Utility.pipefittingLayerNames.Count; i++)
            {
                if (!listVectorNames.Contains(Utility.pipefittingLayerNames[i]))
                {
                    listVectorNames.Add(Utility.pipefittingLayerNames[i]);
                }
            }

            FrmExportCADS frm = new FrmExportCADS(globeControl1, listVectorNames);//Utility.m_PipelineLayerNames);
            frm.ShowDialog();
            #endregion
        }
        /// <summary>
        /// 导出矢量
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ10_2_Click(object sender, EventArgs e)
        {
            //日志记录 
            LogManager.saveLog(Utility.userName, buttonItemBJ10_2.Text);

            List<string> listVectorNames = new List<string>();
            for (int i = 0; i < Utility.m_PipelineLayerNames.Count; i++)
            {
                if (!listVectorNames.Contains(Utility.m_PipelineLayerNames[i]))
                {
                    listVectorNames.Add(Utility.m_PipelineLayerNames[i]);
                }
            }
            for (int i = 0; i < Utility.valueLayerNames.Count; i++)
            {
                if (!listVectorNames.Contains(Utility.valueLayerNames[i]))
                {
                    listVectorNames.Add(Utility.valueLayerNames[i]);
                }
            }
            for (int i = 0; i < Utility.workwellLayerNames.Count; i++)
            {
                if (!listVectorNames.Contains(Utility.workwellLayerNames[i]))
                {
                    listVectorNames.Add(Utility.workwellLayerNames[i]);
                }
            }
            for (int i = 0; i < Utility.instrumenLayerNames.Count; i++)
            {
                if (!listVectorNames.Contains(Utility.instrumenLayerNames[i]))
                {
                    listVectorNames.Add(Utility.instrumenLayerNames[i]);
                }
            }
            for (int i = 0; i < Utility.pipefittingLayerNames.Count; i++)
            {
                if (!listVectorNames.Contains(Utility.pipefittingLayerNames[i]))
                {
                    listVectorNames.Add(Utility.pipefittingLayerNames[i]);
                }
            }
            FrmExportVector frm = new FrmExportVector(globeControl1, listVectorNames);
            frm.ShowDialog();
        }
        /// <summary>
        /// 删除模型
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemBJ13_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemBJ13.Text);
            if (globeControl1.Globe.SelObjectCount > 0)
            {
                for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++)
                {
                    GSOFeature f = null;
                    GSOLayer layer = null;
                    globeControl1.Globe.GetSelectObject(i, out f, out layer);
                    if (f == null) continue;
                    f.Delete();
                    if (layer != null)
                        globeControl1.Globe.AddToEditHistroy(layer, f, EnumEditType.Delete);
                    globeControl1.Refresh();
                }
                MessageBox.Show("删除成功!", "提示");
            }
            else
            {
                MessageBox.Show("请选中要删除的模型!", "提示");
            }

            globeControl1.Globe.Action = EnumAction3D.ActionNull;
        }

        public struct LineStruct
        {
            public string layerName;
            public string layerCode;
            public string lineLength;
            public string hxName;
        }

        List<LineStruct> lineStruct = new List<LineStruct>();
        List<GSOFeatures> featsList = new List<GSOFeatures>();

        /// <summary>
        /// 红线审核
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemHX2_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemHX2.Text);
            redSH = true;
            featsList.Clear();
            lineStruct.Clear();
            List<GSOLayer> listPipelineLayers = new List<GSOLayer>();

            GSOLayer layer = null;
            for (int i = 0; i < Utility.m_PipelineLayerNames.Count; i++)
            {
                layer = globeControl1.Globe.Layers.GetLayerByCaption(Utility.m_PipelineLayerNames[i]);
                if (layer == null) continue;
                listPipelineLayers.Add(layer);
            }
            //yanxiaowei 重构
            GSOFeatures selectFeatures = new GSOFeatures();
            for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++)
            {
                GSOFeature feature = null;
                globeControl1.Globe.GetSelectObject(i, out feature, out layer);
                selectFeatures.Add(feature);
            }
            DataTable table = new DataTable();

            ClassGSOTool.CalculateRedLineResult(out table, redSH, selectFeatures, globeControl1,
                listPipelineLayers, out lineStruct, out featsList);

            if (table.Rows.Count == 0)
            {
                MessageBox.Show("没有侵入地块红线的管线数据!", "提示");
                dataGridViewX1.DataSource = null;
                panelOfTable.Visible = false;
            }
            else
                AddDatagridView(table);
        }

        private void AddDatagridView(DataTable table)
        {
            dataGridViewX1.DataSource = table;
            panelOfTable.Visible = true;
            panelOfTable.Height = 200;
            toolStripNumbers.Text = "红线审核 |共有:" + table.Rows.Count + "条";
            toolStripDropDownButton3.Visible = true;
        }
        /// <summary>
        /// 主窗体 下方的工具条中的 导出.xls文件 按钮事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void toolStripDropDownButton3_Click(object sender, EventArgs e)
        {
            if (dataGridViewX1.Rows.Count != 0)
            {
                string strSaveFile = string.Empty;
                SaveFileDialog savefiledialog = new SaveFileDialog();
                savefiledialog.Filter = "Excel文件|*.xls,*.xlsx";
                savefiledialog.AddExtension = true;
                savefiledialog.FileName = "红线审核";
                if (savefiledialog.ShowDialog() == DialogResult.OK)
                    strSaveFile = savefiledialog.FileName;
                else return;

                ExpEXCEL.ExpToExcel(dataGridViewX1, strSaveFile, "红线审核", lineStruct, featsList);
                MessageBox.Show("导出成功!");
            }
            else
            {
                MessageBox.Show("表格内容为空!", "提示");
            }
        }

        private void sliderItem2_ValueChanged(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, sliderItem2.Text);

            globeControl1.Globe.GroundOpaque = 100 - sliderItem2.Value;
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(Utility.roadLayerName);//("180fd");
            if (layer != null)
            {
                layer.Opaque = 100 - sliderItem2.Value;
            }
            layer = globeControl2.Globe.Layers.GetLayerByCaption("180fd");//("180fd");
            if (layer != null)
            {
                layer.Opaque = 100 - sliderItem2.Value;
            }
            globeControl2.Globe.GroundOpaque = 100 - sliderItem2.Value;

            optiValue = sliderItem2.Value;
        }
        /// <summary>
        /// 数据管理导入文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemSJGL1_Click(object sender, EventArgs e)
        {
            //日志记录
            LogManager.saveLog(Utility.userName, buttonItemSJGL1.Text);

            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "矢量数据(*.shp)|*.shp|栅格数据(*.lrp)|*.lrp|栅格缓存(*.lrc)|*.lrc|KML数据(*.kml)|*.kml|矢量数据(*.lgd)|*.lgd|矢量缓存(*.gft)|*.gft|CAD文件(*.dxf)|*.dxf|全部支持格式(*.lrp,*.tif,*.img,*.lrc,*.kml,*.lgd,*.shp,*.gft,*.dxf)|*.lrp;*.tif;*.img;*.lrc;*.kml;*.lgd;*.shp;*.gft;*.dxf";
            dlg.Multiselect = true;
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    for (int i = 0; i < dlg.FileNames.Length; i++)
                    {
                        AddLayerData(dlg.FileNames[i]);
                    }
                    layerManagerNode.Expand();

                    //放大到新导入的图层
                    GSOLayer lyr = globeControl1.Globe.Layers.GetLayerByCaption(newlayername);
                    if (newlayername != "")
                    {
                        GSOFeatures features = lyr.GetAllFeatures();
                        GSORect2d rd = lyr.LatLonBounds;
                        GSOPoint2d rdcenter = rd.Center;

                        globeControl1.Globe.JumpToPosition(new GSOPoint3d(rdcenter.X, rdcenter.Y, 0),
                            EnumAltitudeMode.Absolute, 100);

                        globeControl1.Refresh();
                    }
                }
                catch (Exception ex)
                {
                    LogHelper.WriteLog(typeof(MainFrm), ex);
                }
            }
        }
        /// <summary>
        /// 导入红线(完善)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemHX1_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemHX1.Text);

            GSODataSource dataSpace = globeControl1.Globe.DataManager.OpenOracleDataSource(Utility.DBServer.Trim() + "/" + Utility.dbdatabase.Trim(), "", "", Utility.userID, Utility.DBPassword);
            string filepath = "";
            //日志记录
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "矢量数据(*.shp)|*.shp|矢量数据(*.lgd)|*.lgd|CAD数据(*.dxf)|*.dxf|全部支持格式(*.lgd,*.shp,*.dxf)|*.lgd;*.shp;*.dxf;";
            dlg.Multiselect = true;

            #region 临时图层显示
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                string filePath = dlg.FileName;
                string lastname = Path.GetFileName(filePath);

                #region
                for (int i = 0; i < dlg.FileNames.Length; i++)
                {
                    string strDataPath = dlg.FileNames[i];
                    filepath = strDataPath;

                    GSOLayer layer = globeControl1.Globe.Layers.Add(strDataPath);
                    GSOFeatures RedFeatures = layer.GetAllFeatures();

                    redlinelayername = layer.Caption;
                    if (layer != null)
                    {
                        layerRedRegion = layer;

                        GSODataset dataset = layer.Dataset;
                        CheckDatasetGeoReference(layer.Dataset, strDataPath);
                        CheckDatasetGeoReference(layer.Dataset, strDataPath);

                        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);

                        for (int j = 0; j < layer.GetAllFeatures().Length; j++)
                        {
                            GSOFeature f = layer.GetAt(j);
                            if (f != null)
                                f.Geometry.AltitudeMode = EnumAltitudeMode.RelativeToGround;
                        }
                    }
                    layerManagerNode.Expand();

                    //放大到红线
                    GSOLayer lyr = globeControl1.Globe.Layers.GetLayerByCaption(redlinelayername);

                    GSOSimpleLineStyle3D redlinestyle = new GSOSimpleLineStyle3D();
                    redlinestyle.LineColor = Color.Red;
                    redlinestyle.LineWidth = 5;
                    lyr.Style = redlinestyle;

                    if (redlinelayername != "")
                    {
                        GSOFeatures features = lyr.GetAllFeatures();
                        RedFeatures = features;
                        GSORect2d rd = lyr.LatLonBounds;
                        GSOPoint2d rdcenter = rd.Center;

                        globeControl1.Globe.JumpToPosition(new GSOPoint3d(rdcenter.X, rdcenter.Y, 0), EnumAltitudeMode.Absolute, 500);

                        ////////////////////////初始化地面透明度为50////////////////////// 
                        sliderGroundTransSet1.Value = 50;
                        sliderItem1.Value = 50;

                        globeControl1.Globe.GroundOpaque = 100 - sliderGroundTransSet1.Value;

                        layer = globeControl1.Globe.Layers.GetLayerByCaption(Utility.roadLayerName);//("180fd");
                        if (layer != null)
                        {
                            layer.Opaque = 100 - sliderGroundTransSet1.Value;
                        }

                        /////////////////////////////////////////////////////////////////////////////////////////// 
                        globeControl1.Globe.Layers.MoveTo(0, globeControl1.Globe.Layers.Count - 1);
                        globeControl1.Refresh();
                    }

                    IModelBuilder modelBuilder = new RedLineBuilder();

                    modelBuilder.batchInsert(dataSpace, redDt, RedFeatures);

                }
                #endregion

            }
            #endregion
        }
        /// <summary>
        /// 定位
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemLocation_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemLocation.Text);

            FrmFlyToPosition fly = new FrmFlyToPosition(globeControl1, globeControl2);
            fly.Show(this);
        }
        /// <summary>
        /// 红线审核
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ribbonTabItem6_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {

                globeControl1.BeforeSceneRenderEvent -= globeControl1_BeforeSceneRenderEvent;
                globeControl2.BeforeSceneRenderEvent -= globeControl2_BeforeSceneRenderEvent;

                globeControl1.Globe.FlyToPosition(new GSOPoint3d(120.610963, 31.188121, 50), EnumAltitudeMode.Absolute, -4, 50, 800);
                globeControl1.Globe.FlyToPointSpeed = 10000000;
                globeControl1.Globe.Action = EnumAction3D.SelectObject;
                globeControl1.Refresh();

                dataGridViewX1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

                //zhanshi = false;
                redSH = true;
                splitContainer1.Panel2Collapsed = true;
                legendSG.Visible = false;
                legendSC.Visible = false;
                ClearGZData();
                GSOLayer redLayer = globeControl1.Globe.Layers.GetLayerByCaption("红线");
                if (redLayer == null) return;
                redLayer.Visible = true;
            }
            catch (Exception ex)
            {
                //MessageBox.Show("系统运行错误:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// 基础工具
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ribbonTabItem1_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {

                globeControl1.BeforeSceneRenderEvent -= globeControl1_BeforeSceneRenderEvent;
                globeControl2.BeforeSceneRenderEvent -= globeControl2_BeforeSceneRenderEvent;

                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                dataGridViewX1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                //zhanshi = false;
                redSH = false;
                splitContainer1.Panel2Collapsed = true;
                panelOfTable.Visible = false;
                legendSC.Visible = false;
                legendSG.Visible = false;
                ClearGZData();
                GSOLayer redLayer = globeControl1.Globe.Layers.GetLayerByCaption("红线");
                if (redLayer == null) return;
                redLayer.Visible = false;
            }
            catch (Exception ex)
            {
                //MessageBox.Show("系统运行错误:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// 一键审核
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ribbonTabItem11_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {

                globeControl1.BeforeSceneRenderEvent -= globeControl1_BeforeSceneRenderEvent;
                globeControl2.BeforeSceneRenderEvent -= globeControl2_BeforeSceneRenderEvent;

                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                //zhanshi = false;
                redSH = false;
                splitContainer1.Panel2Collapsed = true;
                dataGridViewX1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                panelOfTable.Visible = false;
                legendSC.Visible = false;
                legendSG.Visible = false;
                ClearGZData();
                GSOLayer redLayer = globeControl1.Globe.Layers.GetLayerByCaption("红线");
                if (redLayer == null) return;
                redLayer.Visible = false;
            }
            catch (Exception ex)
            {
                //MessageBox.Show("系统运行错误:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        
        /// <summary>
        /// 双屏对比
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ribbonTabItem9_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {
                globeControl1.BeforeSceneRenderEvent += globeControl1_BeforeSceneRenderEvent;
                globeControl2.BeforeSceneRenderEvent += globeControl2_BeforeSceneRenderEvent;

                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                panelOfTable.Visible = false;

                splitContainer1.Panel2Collapsed = false;
                //zhanshi = true;
                redSH = false;
                dataGridViewX1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                sliderItem2.Value = 100 - globeControl1.Globe.GroundOpaque;
                globeControl2.Globe.GroundOpaque = globeControl1.Globe.GroundOpaque;
                legendSC.Visible = true;
                legendSG.Visible = true;

                GSOLayer redLayer = globeControl1.Globe.Layers.GetLayerByCaption("红线");
                if (redLayer != null)
                    redLayer.Visible = false;
            }
            catch (Exception ex)
            {
                //MessageBox.Show("系统运行错误:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// 文档管理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ribbonTabItem4_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {

                globeControl1.BeforeSceneRenderEvent -= globeControl1_BeforeSceneRenderEvent;
                globeControl2.BeforeSceneRenderEvent -= globeControl2_BeforeSceneRenderEvent;

                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                panelOfTable.Visible = false;
                //zhanshi = false;
                redSH = false;
                splitContainer1.Panel2Collapsed = true;
                dataGridViewX1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                legendSC.Visible = false;
                legendSG.Visible = false;
                ClearGZData();
                GSOLayer redLayer = globeControl1.Globe.Layers.GetLayerByCaption("红线");
                if (redLayer != null)
                    redLayer.Visible = false;
            }
            catch (Exception ex)
            {
                //MessageBox.Show("系统运行错误:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// 基础管理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ribbonTabItem14_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {
                globeControl1.BeforeSceneRenderEvent -= globeControl1_BeforeSceneRenderEvent;
                globeControl2.BeforeSceneRenderEvent -= globeControl2_BeforeSceneRenderEvent;

                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                panelOfTable.Visible = false;
                //zhanshi = false;
                redSH = false;
                splitContainer1.Panel2Collapsed = true;
                dataGridViewX1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                legendSC.Visible = false;
                legendSG.Visible = false;
                ClearGZData();

                GSOLayer redLayer = globeControl1.Globe.Layers.GetLayerByCaption("红线");
                if (redLayer != null)
                    redLayer.Visible = false;
            }
            catch (Exception ex)
            {
                //MessageBox.Show("系统运行错误:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        /// <summary>
        /// 权限管理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ribbonTabItem2_MouseDown(object sender, MouseEventArgs e)
        {
            try
            {
                globeControl1.BeforeSceneRenderEvent -= globeControl1_BeforeSceneRenderEvent;
                globeControl2.BeforeSceneRenderEvent -= globeControl2_BeforeSceneRenderEvent;

                globeControl1.Globe.Action = EnumAction3D.ActionNull;
                panelOfTable.Visible = false;
                //zhanshi = false;
                redSH = false;
                splitContainer1.Panel2Collapsed = true;
                dataGridViewX1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                legendSC.Visible = false;
                legendSG.Visible = false;
                ClearGZData();

                GSOLayer redLayer = globeControl1.Globe.Layers.GetLayerByCaption("红线");
                if (redLayer == null) return;
                redLayer.Visible = false;
            }
            catch (Exception ex)
            {
                //MessageBox.Show("系统运行错误:" + ex.ToString(), "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        //GSOFeature dpFeatuer = null;
        /// <summary>
        /// 双屏分析,点击管段分析
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItem8_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItem8.Text);

            int width = Width;
            FrmCompareFeature.ShowForm(globeControl1, globeControl2, layerTemp, layerTemp2, Utility.m_PipelineLayerNames, Utility.sgPipeLayersNames, width);
        }
        /// <summary>
        /// 红线审核导出图片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemDCTP_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemDCTP.Text);

            Point pt1 = new Point(Convert.ToInt32(0), Convert.ToInt32(0));
            Point pt2 = new Point(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height));

            int mapWidth = 0;
            int mapHeight = 0;
            Point pt = getUpperLeftPoint(pt1, pt2, out mapWidth, out mapHeight);
            int rightBottomX = pt.X + mapWidth;
            int rightBottomY = pt.Y + mapHeight;
            Image myImg = new Bitmap(mapWidth, mapHeight);
            Graphics g = Graphics.FromImage(myImg);
            g.CopyFromScreen(pt, new Point(0, 0), new Size(rightBottomX, rightBottomY));

            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 = Path.GetExtension(dlg.FileName);//扩展名 
                switch (extension)
                {
                    case ".jpg":
                        myImg.Save(dlg.FileName, ImageFormat.Jpeg);
                        break;
                    case ".png":
                        myImg.Save(dlg.FileName, ImageFormat.Png);
                        break;
                    case ".bmp":
                        myImg.Save(dlg.FileName, ImageFormat.Bmp);
                        break;
                    case ".gif":
                        myImg.Save(dlg.FileName, ImageFormat.Gif);
                        break;
                    default:
                        break;
                }
            }
        }
        /// <summary>
        /// 标识器全区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 标识器分类统计ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            globeControl1.Globe.Action = EnumAction3D.ActionNull;
            FrmBSQStatis bsqStatis = new FrmBSQStatis(globeControl1, null);
            bsqStatis.Show(this);
        }
        /// <summary>
        /// 标识器绘制区域统计
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void 标识器分类统计ToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            trackflag = "BSQDuoBianXiangStatis";
            globeControl1.Globe.Action = EnumAction3D.TrackPolygon;
        }
        private void btn_check_history_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, btn_check_history.Text);

            if (FrmCheckHistory.isOpen)
                return;
            FrmCheckHistory frm = new FrmCheckHistory(globeControl1, globeControl2);
            frm.addNode += addNodeToLayerManagerNode;
            frm.Show();
        }

        private void buttonItem查看数据_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItem查看数据.Text);

            FrmThreeOracle tr = new FrmThreeOracle(globeControl1);

            if (tr.ShowDialog() == DialogResult.OK)
            {
                addNodeToLayerManagerNode(tr.rukuLayer);
                globeControl1.Refresh();
            }
        }
        /// <summary>
        /// 规划数据入库
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonItemGHRK_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemGHRK.Text);

            FrmGHRK ghrk = new FrmGHRK(globeControl1, layerManagerNode);
            ghrk.Show(this);
        }

        private void btn_user_info_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, btn_user_info.Text);

            if (FrmSysUserInfoManger.IS_OPEN) return;
            FrmSysUserInfoManger frm = new FrmSysUserInfoManger();
            frm.ShowDialog();
        }

        private void btn_role_info_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, btn_role_info.Text);

            if (!FrmRoleInfoManager.IS_OPEN)
            {
                FrmRoleInfoManager frm = new FrmRoleInfoManager();
                frm.ShowDialog();
            }
        }

        private void btn_resc_info_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, btn_resc_info.Text);

            if (SysRescInfoManager.IS_OPEN) return;
            SysRescInfoManager frm = new SysRescInfoManager();
            frm.ShowDialog();
        }

        private void btn_role_resc_Click(object sender, EventArgs e)
        {

            LogManager.saveLog(Utility.userName, btn_role_resc.Text);

            if (FrmRoleRescManager.IS_OPEN) return;
            FrmRoleRescManager frm = new FrmRoleRescManager();
            frm.ShowDialog();
        }

        private void btn_user_role_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, btn_user_role.Text);

            if (!FrmUserRole.IS_OPEN)
            {
                FrmUserRole frm = new FrmUserRole();
                frm.ShowDialog();
            }
        }
//文档管理 操作
        private void btn_document_info_Click(object sender, EventArgs e)
        {

            LogManager.saveLog(Utility.userName, btn_document_info.Text);
            if (FormDocumentManager.IS_OPEN) return;
            Cursor = Cursors.WaitCursor;
            FormDocumentManager frm = new FormDocumentManager();
            frm.changeCursor += changeCursorToDefault;
            frm.ShowDialog();
        }

        private void changeCursorToDefault()
        {
            Cursor = Cursors.Default;
        }

        private void buttonItemexp_CAD_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, buttonItemexp_CAD.Text);

            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "支持格式(*.dwg)|*.dwg";
            dlg.Multiselect = true;
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                foreach (string strDataPath in dlg.FileNames)
                {
                    AddLayerData(strDataPath);
                }
            }

            GSOLayer lyr = globeControl1.Globe.Layers.GetLayerByCaption(newlayername);
            if (newlayername != "")
            {
                GSOFeatures features = lyr.GetAllFeatures();
                GSORect2d rd = lyr.LatLonBounds;
                GSOPoint2d rdcenter = rd.Center;

                globeControl1.Globe.JumpToPosition(new GSOPoint3d(rdcenter.X, rdcenter.Y, 0), EnumAltitudeMode.Absolute, 100);

                globeControl1.Refresh();
            }
        }

        private void btn_password_edit_Click(object sender, EventArgs e)
        {
            LogManager.saveLog(Utility.userName, btn_password_edit.Text);

            if (!FrmChangePassword.IS_OPEN)
            {
                FrmChangePassword frm = new FrmChangePassword();
                frm.ShowDialog();
            }
        }

        private void 导出CADToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            TreeNode node = layerNodeContexMenu.Tag as TreeNode;
            if (node == null)
            {
                MessageBox.Show("请在左侧节点集中选择要导出的图层", "提示");
                return;
            }
            GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(node.Text.Trim());
            if (layer != null && layer.GetAllFeatures().Length > 0)
            {
                string strProjectName = Utility.projectStr;
                if (strProjectName == "") return;
                SaveFileDialog dlg = new SaveFileDialog();
                dlg.Filter = "*.dwg|*.dwg|*.dxf|*.dxf";
                dlg.FileName = layer.Caption;
                if (dlg.ShowDialog(this) != DialogResult.OK) return;
                globeControl1.Globe.MemoryLayer.SaveAs(dlg.FileName);
                GSOLayer newlayer = globeControl1.Globe.Layers.Add(dlg.FileName);
                newlayer.RemoveAllFeature();
                int featureCount = layer.GetAllFeatures().Length;
                for (int i = 0; i < featureCount; i++)
                {
                    GSOFeature feature = layer.GetAt(i);
                    if (feature == null || feature.Geometry == null) continue;
                    switch (feature.Geometry.Type)
                    {
                        case EnumGeometryType.GeoPolyline3D:
                            feature.Geometry.Style = new GSOSimpleLineStyle3D();
                            break;
                        case EnumGeometryType.GeoPolygon3D:
                            feature.Geometry.Style = new GSOSimplePolygonStyle3D();
                            break;
                    }
                    newlayer.AddFeature(feature);
                }
                newlayer.Save();
                newlayer.Dataset.DataSource.RemoveDataset(newlayer.Dataset);
                globeControl1.Globe.Layers.Remove(newlayer);
                MessageBox.Show("导出CAD完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                MessageBox.Show("要导出的图层为空", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
        }

        private void buttonItemGBJC_Click(object sender, EventArgs e)
        {
            FrmGBJC gb = new FrmGBJC(globeControl1, globeControl2, layerTemp, layerTemp2);
            gb.Show(this);
        }

        #region 右屏管纵数据控制
        private void 五十米主干道ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            lendendGZ50.Visible = true;
            lendendGZ42.Visible = false;
            lendendGZ36.Visible = false;
            lendendGZ26.Visible = false;
            lendendGZ24_1.Visible = false;
            lendendGZ24_2.Visible = false;
            lendendGZ24_3.Visible = false;
        }

        private void 三十六米次干道ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            lendendGZ50.Visible = false;
            lendendGZ42.Visible = false;
            lendendGZ36.Visible = true;
            lendendGZ26.Visible = false;
            lendendGZ24_1.Visible = false;
            lendendGZ24_2.Visible = false;
            lendendGZ24_3.Visible = false;
        }

        private void 四十二米次干道ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            lendendGZ50.Visible = false;
            lendendGZ42.Visible = true;
            lendendGZ36.Visible = false;
            lendendGZ26.Visible = false;
            lendendGZ24_1.Visible = false;
            lendendGZ24_2.Visible = false;
            lendendGZ24_3.Visible = false;
        }

        private void 二十四米一块板ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            lendendGZ50.Visible = false;
            lendendGZ42.Visible = false;
            lendendGZ36.Visible = false;
            lendendGZ26.Visible = false;
            lendendGZ24_1.Visible = true;
            lendendGZ24_2.Visible = false;
            lendendGZ24_3.Visible = false;
        }

        private void 二十四米三块板ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            lendendGZ50.Visible = false;
            lendendGZ42.Visible = false;
            lendendGZ36.Visible = false;
            lendendGZ26.Visible = false;
            lendendGZ24_1.Visible = false;
            lendendGZ24_2.Visible = false;
            lendendGZ24_3.Visible = true;
        }

        private void 二十四米停车带ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            lendendGZ50.Visible = false;
            lendendGZ42.Visible = false;
            lendendGZ36.Visible = false;
            lendendGZ26.Visible = false;
            lendendGZ24_1.Visible = false;
            lendendGZ24_2.Visible = true;
            lendendGZ24_3.Visible = false;
        }

        private void 二十六米大堤路ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            lendendGZ50.Visible = false;
            lendendGZ42.Visible = false;
            lendendGZ36.Visible = false;
            lendendGZ26.Visible = true;
            lendendGZ24_1.Visible = false;
            lendendGZ24_2.Visible = false;
            lendendGZ24_3.Visible = false;
        }

        private void 清除管纵数据ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ClearGZData();
        }

        private void ClearGZData()
        {
            lendendGZ50.Visible = false;
            lendendGZ42.Visible = false;
            lendendGZ36.Visible = false;
            lendendGZ26.Visible = false;
            lendendGZ24_1.Visible = false;
            lendendGZ24_2.Visible = false;
            lendendGZ24_3.Visible = false;
        }
        #endregion

        private void buttonItemPasswordReset_Click(object sender, EventArgs e)
        {
            Frm_password_reset reset = new Frm_password_reset();
            reset.Show();
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            int Width = this.Width;
            string welcomeUser = "欢迎您:" + Utility.userName;
            Graphics g = e.Graphics;
            g.DrawString(welcomeUser, new Font("宋体", 12), new SolidBrush(Color.Black), Width - 180, 50);
        }

    }
}