using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using GeoScene.Globe; using GeoScene.Data; using GeoScene.Engine; using System.Runtime.InteropServices; using DevComponents.DotNetBar.Rendering; using DevComponents.DotNetBar; using System.Xml; using System.Collections; using System.Data.SqlClient; using System.Diagnostics; using Microsoft.Win32; using System.Threading; using System.Net.NetworkInformation; using System.Net.Sockets; using MySql.Data.MySqlClient; namespace Cyberpipe { public partial class MainFrm : Office2007Form { TreeNode terrainManagerNode = null; TreeNode layerManagerNode = null; TreeNode myPlaceNode = null; bool m_bFullScreen = false; Rectangle m_rcOld = new Rectangle(0, 0, 0, 0); GeoScene.Globe.GSOGlobeControl globeControl1; GSOGlobeControl globeControl2; private GSOHudButton legend;//定义图例 private GSOHudButton btnToolNone; private GSOHudButton btnToolSelect; System.Windows.Forms.ToolTip tooltip1; GSOBalloon featureTooltip; GSOBalloonEx balloonEx; GSOFeature m_feature; GSOLayer layerTemp; List<string> pipelineLayerNames = new List<string>();//线图层名称 List<string> workwellLayerNames = new List<string>();//工井图层名称 List<string> valueLayerNames = new List<string>();//阀门图层名称 List<string> instrumenLayerNames = new List<string>();//附属物图层名称 string roadLayerName = ""; public static string currentQueryLayer;//定义当前查询的图层 //定位和闪烁初始化定义 int count = 0; private string flashflag = "single"; //bool m_AddTunnel = false;//bool创建隧道 public bool m_AddPipeLine = false;//bool添加管线 bool m_bAddPipeFitting = false;//bool添加管件 private string trackflag;//定义阀门查询个数 //private Point m_pntRMouseDown; private GSOFeature m_ConnexityAnalysisFirstFeature; private GSOFeature m_ConnexityAnaylsisSecondFeature; private GSOLayer m_ConnexityAnalysisFirstLayer; private GSOLayer m_COnnexityAnalysisSecondLayer; private GSOFeatures m_ConnexityAnalyResFeatures; private GSOFeatures m_TraceUpDownAnalyResFeatures; private GSOFeatures m_AffectedPipeLines; private GSOFeatures m_CloseValvesAnalyResFeatures; private GSOFeatures m_BoosterValvesAnalyResFeatures; //管线间距分析 //private GSOFeature m_DisAnalysisFirstFeature; //private GSOFeature m_DisAnalysisSecondFeature; private GSOFeature disFeature = new GSOFeature(); private GSOFeature featureDis = new GSOFeature(); ArrayList m_CloseValvesList = new ArrayList();//声明集合存储阀门分析的阀门Feature对象 ArrayList m_BoosterValvesList = new ArrayList();//声明集合存储阀门分析的阀门Feature对象 //记录沿线飞行设置 //int m_nFlyMode = 2; double m_dFlyAboveLine = 1; double m_dFlyAlongLineSpeed = 50; double m_dFlyAlongLineRotateSpeed = 50; // 挖坑设置 Double m_dDigPitValue = 3; Double m_dDigPitWidthAlongLine = 6; Boolean m_bDigPitByDepth = true; private SqlConnection connBackup = null; public MainFrm() { InitializeComponent(); PipeSys.Attach(this.panelEx5.Controls); globeControl1 = PipeSys.getGlobeCtrl(); globeControl1.Dock = DockStyle.Fill; this.ribbonControl1.Width = this.Width; this.panelEx4.Controls.Add(splitContainer1); splitContainer1.Dock = DockStyle.Fill; this.panelEx4.Controls.Add(expandableSplitter2); expandableSplitter2.Dock = DockStyle.Bottom; this.panelEx4.Controls.Add(panelEx6); panelEx6.Dock = DockStyle.Bottom; sideBar1.Visible = true; sideBarPanelItem3.Visible = true; buttonItem1.Checked = true; controlContainerItem3.Visible = true; controlContainerItem3.Control = layerTree; layerTree.Dock = DockStyle.Fill; sideBar1.ExpandedPanel = sideBarPanelItem3; sideBar1.Refresh(); Refresh(); controlContainerItem5.Control = panel1; panel1.Dock = DockStyle.Fill; panel1.Height = Screen.PrimaryScreen.WorkingArea.Height - 120; sideBarPanelItem4.Visible = false; panel5.Visible = false; //sideBarPanelItemSensor.Visible = false; panelEx3.Visible = false; panel2.Height = Screen.PrimaryScreen.WorkingArea.Height - 120; featureTooltip = new GSOBalloon(globeControl1.Handle); balloonEx = new GSOBalloonEx(globeControl1.Handle); Utility.SetBallons(featureTooltip, balloonEx); PipeSys.Attach(this.panelEx1.Controls); globeControl2 = PipeSys.getGlobeCtrl(); globeControl2.Dock = DockStyle.Fill; } private void MainFrm_Load(object sender, EventArgs e) { //分辨率问题 int SW = Screen.PrimaryScreen.Bounds.Width; double dsw = (double)SW; if (SW > 1440) { double myScreen = dsw / 1440; this.buttonX1.Width = (int)(this.buttonX1.Width * myScreen); this.buttonX2.Width = (int)(this.buttonX2.Width * myScreen); this.buttonX3.Width = (int)(this.buttonX3.Width * myScreen); this.buttonX4.Width = (int)(this.buttonX4.Width * myScreen); this.buttonX5.Width = (int)(this.buttonX5.Width * myScreen); this.buttonX6.Width = (int)(this.buttonX6.Width * myScreen); this.buttonX7.Width = (int)(this.buttonX8.Width * myScreen); this.buttonX8.Width = (int)(this.buttonX8.Width * myScreen); this.buttonX9.Width = (int)(this.buttonX9.Width * myScreen); this.buttonX12.Width = (int)(this.buttonX12.Width * myScreen); this.buttonX14.Width = (int)(this.buttonX14.Width * myScreen); this.buttonX15.Width = (int)(this.buttonX15.Width * myScreen); this.buttonX16.Width = (int)(this.buttonX16.Width * myScreen); this.labelX1.Width = (int)(this.labelX1.Width * myScreen); this.labelX2.Width = (int)(this.labelX2.Width * myScreen); this.labelX3.Width = (int)(this.labelX3.Width * myScreen); this.labelX4.Width = (int)(this.labelX4.Width * myScreen); this.labelX6.Width = (int)(this.labelX6.Width * myScreen); this.labelX8.Width = (int)(this.labelX8.Width * myScreen); this.labelX9.Width = (int)(this.labelX9.Width * myScreen); this.labelX12.Width = (int)(this.labelX12.Width * myScreen); this.labelX13.Width = (int)(this.labelX13.Width * myScreen); this.labelX14.Width = (int)(this.labelX14.Width * myScreen); this.labelX16.Width = (int)(this.labelX16.Width * myScreen); this.labelX17.Width = (int)(this.labelX17.Width * myScreen); this.labelX11.Width = (int)(this.labelX11.Width * myScreen); this.labelX19.Width = (int)(this.labelX19.Width * myScreen); //this.labelX20.Width = (int)(this.labelX20.Width * myScreen); this.labelX21.Width = (int)(this.labelX21.Width * myScreen); this.labelX22.Width = (int)(this.labelX22.Width * myScreen); this.labelX24.Width = (int)(this.labelX24.Width * myScreen); } btnToolNone = new GSOHudButton(); btnToolNone.SetImage(Application.StartupPath + "\\Resource\\image\\Pan1.png"); btnToolNone.FadeOut = false; btnToolNone.Align = EnumAlign.TopLeft; btnToolNone.SetOffset(20, 15); btnToolNone.Name = "0"; btnToolNone.HeightFixed = true; btnToolNone.WidthFixed = true; globeControl1.Globe.AddHudControl(btnToolNone); globeControl2.Globe.AddHudControl(btnToolNone); btnToolSelect = new GSOHudButton(); btnToolSelect.SetImage(Application.StartupPath + "\\Resource\\image\\select1.png"); btnToolSelect.FadeOut = false; btnToolSelect.Align = EnumAlign.TopLeft; btnToolSelect.SetOffset(20, 50); //btnToolSelect.MinOpaque = 0.05f; btnToolSelect.Name = "1"; //btnToolSelect.MaxOpaque = 1; btnToolSelect.HeightFixed = true; btnToolSelect.WidthFixed = true; globeControl1.Globe.AddHudControl(btnToolSelect); globeControl2.Globe.AddHudControl(btnToolSelect); legend = new GSOHudButton(); legend.SetImage(Application.StartupPath + "/Resource/图例P.png"); legend.SetOffset(0, 15); legend.MinOpaque = 1; legend.MaxOpaque = 1; legend.FadeOut = false; legend.Name = "legend"; legend.Align = EnumAlign.BottomRight; globeControl1.Globe.AddHudControl(legend); legend.Visible = false; this.KeyPreview = true; globeControl1.Globe.UnderGroundFloor.Visible = false; globeControl1.Globe.LatLonGrid.Visible = false; globeControl1.Globe.StatusBar.SetTextVisible(EnumStatusBarText.ProCoord, false); globeControl1.Globe.Antialiasing = true; globeControl1.Globe.FeatureMouseOverEnable = true; globeControl1.Globe.ModelUseLighting = true; globeControl1.Globe.EditSnapObject = false; globeControl1.Globe.MaxUserBackgroundAlt = 20000; globeControl1.Globe.UserBackgroundColorValid = true; globeControl1.Globe.UserBackgroundColor = Color.White; globeControl1.Globe.FlyAlongLineSpeed = m_dFlyAlongLineSpeed; globeControl1.Globe.FlyAlongLineRotateSpeed = m_dFlyAlongLineRotateSpeed; globeControl1.Globe.FlyToPointSpeed = globeControl1.Globe.FlyToPointSpeed * 3; globeControl2.Globe.UnderGroundFloor.Visible = false; globeControl2.Globe.LatLonGrid.Visible = false; globeControl2.Globe.StatusBar.SetTextVisible(EnumStatusBarText.ProCoord, false); globeControl2.Globe.Antialiasing = true; globeControl2.Globe.FeatureMouseOverEnable = true; globeControl2.Globe.ModelUseLighting = true; globeControl2.Globe.EditSnapObject = false; globeControl2.Globe.MaxUserBackgroundAlt = 20000; globeControl2.Globe.UserBackgroundColorValid = true; globeControl2.Globe.UserBackgroundColor = Color.White; globeControl2.Globe.FlyAlongLineSpeed = m_dFlyAlongLineSpeed; globeControl2.Globe.FlyAlongLineRotateSpeed = m_dFlyAlongLineRotateSpeed; globeControl2.Globe.FlyToPointSpeed = globeControl2.Globe.FlyToPointSpeed * 3; // globeControl1.AfterLayerAddEvent += new AfterLayerAddEventHandler(globeControl1_AfterLayerAddEvent); globeControl1.HudControlMouseDownEvent += new HudControlMouseDownEventHandler(globeControl1_HudControlMouseDownEvent); globeControl2.HudControlMouseDownEvent += new HudControlMouseDownEventHandler(globeControl2_HudControlMouseDownEvent); globeControl1.HudControlMouseIntoEvent += new HudControlMouseIntoEventHandler(globeControl1_HudControlMouseIntoEvent); globeControl1.HudControlMouseOutEvent += new HudControlMouseOutEventHandler(globeControl1_HudControlMouseOutEvent); //globeControl1.MouseDown += new MouseEventHandler(globeControl1_MouseDown); //globeControl1.MouseMove += new MouseEventHandler(globeControl1_MouseMove); //globeControl1.MouseUp += new MouseEventHandler(globeControl1_MouseUp); globeControl1.FeatureMouseClickEvent += new FeatureMouseClickEventHandler(globeControl1_FeatureMouseClickEvent); globeControl1.FeatureMouseHoverEvent += new FeatureMouseHoverEventHandler(globeControl1_FeatureMouseHoverEvent); globeControl1.MouseDoubleClick += new MouseEventHandler(globeControl1_MouseDoubleClick); globeControl1.MouseClick += new MouseEventHandler(globeControl1_MouseClick); globeControl1.CameraBeginMoveEvent += new CameraBeginMoveEventHandler(globeControl1_CameraBeginMoveEvent); //globeControl1.TrackPolylineAnalysisEndEvent += new TrackPolylineAnalysisEndEventHandler(globeControl1_TrackPolylineAnalysisEndEvent); globeControl1.TrackPolylineEndEvent += new TrackPolylineEndEventHandler(globeControl1_TrackPolylineEndEvent); //globeControl1.TrackPolygonAnalysisEndEvent += new TrackPolygonAnalysisEndEventHandler(globeControl1_TrackPolygonAnalysisEndEvent); globeControl1.TrackPolygonEndEvent += new TrackPolygonEndEventHandler(globeControl1_TrackPolygonEndEvent); globeControl1.TrackRectEndEvent += new TrackRectEndEventHandler(globeControl1_TrackRectEndEvent); GSOSimplePolygonStyle3D trackingRectStyle = globeControl1.Globe.TrackRectTool.TrackingPolygonStyle as GSOSimplePolygonStyle3D; trackingRectStyle.FillColor = Color.FromArgb(0, 0, 0, 0); GSOSimplePolygonStyle3D trackRectStyle = globeControl1.Globe.TrackRectTool.PolygonStyle as GSOSimplePolygonStyle3D; trackRectStyle.FillColor = Color.FromArgb(0, 0, 0, 0); GSOSimpleLineStyle3D trackRectLineStyle = globeControl1.Globe.TrackRectTool.PolygonStyle.OutlineStyle as GSOSimpleLineStyle3D; trackRectLineStyle.LineType = EnumLineType.Solid; GSOSimpleLineStyle3D trackRectLineStyle1 = globeControl1.Globe.TrackRectTool.TrackingPolygonStyle.OutlineStyle as GSOSimpleLineStyle3D; trackRectLineStyle1.LineType = EnumLineType.Solid; trackRectLineStyle1.LineColor = Color.FromArgb(0, 174, 255); trackRectLineStyle1.LineWidth = 1; globeControl1.Globe.StatusBar.SetProject(Utility.projectStr); globeControl1.Globe.StatusBar.SetTextVisible(EnumStatusBarText.ProCoord, true); globeControl2.Globe.StatusBar.SetProject(Utility.projectStr); globeControl2.Globe.StatusBar.SetTextVisible(EnumStatusBarText.ProCoord, true); //双屏联动 globeControl1.BeforeSceneRenderEvent += new BeforeSceneRenderEventHandler(globeControl1_BeforeSceneRenderEvent); globeControl2.BeforeSceneRenderEvent += new BeforeSceneRenderEventHandler(globeControl2_BeforeSceneRenderEvent); globeControl1.Globe.ConnectServer(Utility.serverip, Utility.serverport, "", ""); //加载locaServer中的数据 globeControl2.Globe.ConnectServer(Utility.serverip, Utility.serverport, "", ""); //加载locaServer中的数据 double x = Convert.ToDouble(Utility.Query_Fields["经纬度坐标"].ToString().Split(',')[0]); double y = Convert.ToDouble(Utility.Query_Fields["经纬度坐标"].ToString().Split(',')[1]); double z = Convert.ToDouble(Utility.Query_Fields["经纬度坐标"].ToString().Split(',')[2]); jumpToCameraState(x, y, z); Utility.dataSource = globeControl1.Globe.DataManager.OpenSqlServeDataSource(Utility.DBServer, "", Utility.dbdatabase, Utility.userID, Utility.DBPassword); if (Utility.dataSource == null) { MessageBox.Show("数据库连接失败,请确认配置文件参数是否正确!"); } myPlaceNode = new TreeNode(); myPlaceNode.ImageIndex = 0; myPlaceNode.SelectedImageIndex = 0; myPlaceNode.Checked = true; myPlaceNode.Tag = globeControl1.Globe.MemoryLayer; myPlaceNode.Text = "我的地标"; myPlaceNode.NodeFont = new Font(layerTree.Font, FontStyle.Bold); layerTree.Nodes.Add(myPlaceNode); ReadKmlToMemoryLayer(Path.GetDirectoryName(Application.ExecutablePath) + "/MyPlace.kml"); //AddTerrains(); //AddLayers(); TreeNode node = new TreeNode(); node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Checked = true; node.Text = "标注管理"; layerMarkerTree.Nodes.Add(node); string[] markerStrs = new string[9]; markerStrs[0] = "标高标注"; markerStrs[1] = "管径标注"; markerStrs[2] = "埋深标注"; markerStrs[3] = "坐标标注"; markerStrs[4] = "坡度标注"; markerStrs[5] = "属性标注"; markerStrs[6] = "自定义标注"; markerStrs[7] = "距离标注"; markerStrs[8] = "红线工具"; for (int i = 0; i < markerStrs.Length; i++) { if (File.Exists(Application.StartupPath + "\\标注管理\\" + markerStrs[i] + ".lgd")) { GSOLayer l = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\标注管理\\" + markerStrs[i] + ".lgd"); if (l != null) { TreeNode node1 = new TreeNode(); node1.Text = l.Caption; node1.ImageIndex = 0; node1.SelectedImageIndex = 0; node1.Checked = true; node1.Tag = l; layerMarkerTree.Nodes[0].Nodes.Add(node1); } } } //传感器 TreeNode nodeSensor = new TreeNode(); nodeSensor.ImageIndex = 0; nodeSensor.SelectedImageIndex = 0; nodeSensor.Checked = false; nodeSensor.Text = "传感器管理"; layerSensorTree.Nodes.Add(nodeSensor);//传感器 if (Utility.sensorMarkerLayers != null) { for (int i = 0; i < Utility.sensorMarkerLayers.Count; i++) { MarkerLayer mLayer = Utility.sensorMarkerLayers[i]; if (File.Exists(Application.StartupPath + "\\传感器\\" + mLayer.layerName + ".lgd")) { GSOLayer l = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\传感器\\" + mLayer.layerName + ".lgd"); if (l != null) { l.Visible = false; TreeNode node1 = new TreeNode(); node1.Text = l.Caption; node1.ImageIndex = 0; node1.SelectedImageIndex = 0; node1.Checked = false; node1.Tag = l; layerSensorTree.Nodes[0].Nodes.Add(node1); } } } } layerManagerNode = new TreeNode(); layerManagerNode.ImageIndex = 0; layerManagerNode.SelectedImageIndex = 0; layerManagerNode.Checked = true; layerManagerNode.Text = "本地图层"; layerTree.Nodes.Add(layerManagerNode); //GSOLayer layerTunnel = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\隧道.lgd"); //GSODataset dataset = layerTunnel.Dataset; //CheckDatasetGeoReference(layerTunnel.Dataset); //TreeNode node = new TreeNode(); //node.Tag = layerTunnel; //node.Text = layerTunnel.Dataset.Caption; //node.ImageIndex = 0; //node.SelectedImageIndex = 0; //node.Checked = layerTunnel.Visible; //// 注意用insert不要用add,因为后加入的图层在上层 ////layerManagerNode.Nodes.Add(node); //layerManagerNode.Nodes.Insert(0, node); loadTreeView(layerTree); sideBar1.ExpandedPanel = sideBarPanelItem3; comboBoxEx1.Items.Clear(); comboBoxEx2.Items.Clear(); comboBoxEx3.Items.Clear(); comboBoxEx4.Items.Clear(); for (int i = 0; i < pipelineLayerNames.Count; i++) { comboBoxEx1.Items.Add(pipelineLayerNames[i]); comboBoxEx2.Items.Add(pipelineLayerNames[i]); comboBoxEx3.Items.Add(pipelineLayerNames[i]); comboBoxEx4.Items.Add(pipelineLayerNames[i]); } connBackup = OledbHelper.sqlConnection();//链接数据库中的master,实现数据库文件备份 splitContainer1.Panel2Collapsed = true; layerTemp = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\tempLgdData.lgd"); buttonItem87.Checked = true;//默认地上模式 //insertControlToDatabase();//向数据库插入resource configResource();//给登录的用户配置resource } void ReadKmlToMemoryLayer(String kmlPath) { GSODataset dataset = globeControl1.Globe.DataManager.AddFileDataset(kmlPath); GSOFeatureDataset fdataset = dataset as GSOFeatureDataset; if (fdataset != null) { GSOFeatures features = fdataset.GetAllFeatures(); AddFeaturesNodeToMyPlace(features); } } void AddFeaturesNodeToMyPlace(GSOFeatures features) { if (features == null || features.Length ==0) { return; } for (Int32 i = 0; i < features.Length; i++) { GSOFeature feature = features[i]; if (feature.Type == EnumFeatureType.FeatureFolder) { GSOFeatureFolder featureFolder = (GSOFeatureFolder)feature; AddFeaturesNodeToMyPlace(featureFolder.Features); } else { TreeNode tempnode = new TreeNode(); tempnode.Text = feature.Name; if (feature.Geometry != null) { switch (feature.Geometry.Type) { case EnumGeometryType.GeoPoint3D: case EnumGeometryType.GeoMarker: tempnode.ImageIndex = 3; tempnode.SelectedImageIndex = 3; break; case EnumGeometryType.GeoPolyline3D: tempnode.ImageIndex = 4; tempnode.SelectedImageIndex = 4; break; case EnumGeometryType.GeoPolygon3D: tempnode.ImageIndex = 5; tempnode.SelectedImageIndex = 5; break; case EnumGeometryType.GeoModel: case EnumGeometryType.GeoEntity: case EnumGeometryType.GeoGroupEntity: case EnumGeometryType.GeoSphereEntity: case EnumGeometryType.GeoBoxEntity: case EnumGeometryType.GeoEllipsoidEntity: case EnumGeometryType.GeoCylinderEntity: case EnumGeometryType.GeoFrustumEntity: case EnumGeometryType.GeoEllipCylinderEntity: case EnumGeometryType.GeoEllipFrustumEntity: case EnumGeometryType.GeoRangeEllipsoidEntity: case EnumGeometryType.GeoRangeEllipCylinderEntity: case EnumGeometryType.GeoRangeEllipFrustumEntity: tempnode.ImageIndex = 6; tempnode.SelectedImageIndex = 6; break; case EnumGeometryType.GeoGroundOverlay: tempnode.ImageIndex = 7; tempnode.SelectedImageIndex = 7; break; } } GSOFeature newFeature = globeControl1.Globe.MemoryLayer.AddFeature(feature); tempnode.Checked = newFeature.Visible; tempnode.Tag = newFeature; myPlaceNode.Nodes.Add(tempnode); } } } #region 配置用户权限 private void insertControlToDatabase() { ArrayList listItem = new ArrayList(); List<Resource> subListItem = new List<Resource>(); System.Windows.Forms.Control.ControlCollection cc = ribbonControl1.Controls; for (int i = 0; i < cc.Count; i++) { if (cc[i].GetType() == typeof(DevComponents.DotNetBar.RibbonStrip)) { DevComponents.DotNetBar.RibbonStrip ribbonStripResource = cc[i] as DevComponents.DotNetBar.RibbonStrip; for (int j = 0; j < ribbonStripResource.Items.Count; j++) { if (ribbonStripResource.Items[j].GetType() == typeof(DevComponents.DotNetBar.RibbonTabItem)) { DevComponents.DotNetBar.RibbonTabItem ribbonTabItemResource = ribbonStripResource.Items[j] as DevComponents.DotNetBar.RibbonTabItem; string tabItemResourceName = ribbonTabItemResource.Text; listItem.Add(tabItemResourceName); subListItem.Add(new Resource(tabItemResourceName, "NULL")); if (ribbonTabItemResource.SubItems.Count > 0) { for (int k = 0; k < ribbonTabItemResource.SubItems.Count; k++) { if (ribbonTabItemResource.SubItems[k].GetType() == typeof(DevComponents.DotNetBar.ButtonItem)) { DevComponents.DotNetBar.ButtonItem buttonItemResource = ribbonTabItemResource.SubItems[k] as DevComponents.DotNetBar.ButtonItem; string buttonItemResourceName = buttonItemResource.Text; subListItem.Add(new Resource(buttonItemResourceName, tabItemResourceName)); } } } } } } else if (cc[i].GetType() == typeof(DevComponents.DotNetBar.RibbonPanel)) { DevComponents.DotNetBar.RibbonPanel ribbonPanelResource = cc[i] as DevComponents.DotNetBar.RibbonPanel; for (int j = 0; j < ribbonPanelResource.Controls.Count; j++) { if (ribbonPanelResource.Controls[j].GetType() == typeof(DevComponents.DotNetBar.RibbonBar)) { DevComponents.DotNetBar.RibbonBar ribbonBarResource = ribbonPanelResource.Controls[j] as DevComponents.DotNetBar.RibbonBar; for (int k = 0; k < ribbonBarResource.Items.Count; k++) { if (ribbonBarResource.Items[k].GetType() == typeof(DevComponents.DotNetBar.ButtonItem)) { DevComponents.DotNetBar.ButtonItem buttonItemResource = ribbonBarResource.Items[k] as DevComponents.DotNetBar.ButtonItem; string buttonItemResourceName = buttonItemResource.Text; subListItem.Add(new Resource(buttonItemResourceName, ribbonBarResource.Name)); if (buttonItemResource.SubItems.Count > 0) { for (int m = 0; m < buttonItemResource.SubItems.Count; m++) { if (buttonItemResource.SubItems[m].GetType() == typeof(DevComponents.DotNetBar.ButtonItem)) { DevComponents.DotNetBar.ButtonItem subButtonItemResource = buttonItemResource.SubItems[m] as DevComponents.DotNetBar.ButtonItem; string SubButtonItemResourceName = subButtonItemResource.Text; subListItem.Add(new Resource(SubButtonItemResourceName, buttonItemResourceName)); } } } } else { if (ribbonBarResource.Items[k].GetType() == typeof(DevComponents.DotNetBar.SliderItem)) { DevComponents.DotNetBar.SliderItem sliderItemResource = ribbonBarResource.Items[k] as DevComponents.DotNetBar.SliderItem; subListItem.Add(new Resource(sliderItemResource.Text.Trim(), ribbonBarResource.Name)); if (sliderItemResource.SubItems.Count > 0) { for (int m = 0; m < sliderItemResource.SubItems.Count; m++) { if (sliderItemResource.SubItems[m].GetType() == typeof(DevComponents.DotNetBar.ButtonItem)) { DevComponents.DotNetBar.ButtonItem subButtonItemResource = sliderItemResource.SubItems[m] as DevComponents.DotNetBar.ButtonItem; string subButtonItemResourceName = subButtonItemResource.Text; subListItem.Add(new Resource(subButtonItemResourceName, sliderItemResource.Text.Trim())); } } } } } } } } } } if (subListItem.Count > 0) { foreach (Resource r in subListItem) { string pname = getRealName(r.resourceParentName); string sql = "insert into RESC(name,aid,pname) values('" + r.resourceName + "',1,'" + pname + "')"; int rowCount = OledbHelper.sqlExecuteNonQuery(sql); } MessageBox.Show("插入成功", "提示"); } } private string getRealName(string name) { string realName = ""; switch (name) { case "ribbonBar10": realName = "文件"; break; case "ribbonBar21": realName = "浏览"; break; case "ribbonBar4": realName = "场景"; break; case "ribbonBar2": realName = "查询"; break; case "ribbonBar16": realName = "查询"; break; case "ribbonBar11": realName = "编辑"; break; case "ribbonBar5": realName = "编辑"; break; case "ribbonBar6": realName = "统计"; break; case "ribbonBar8": realName = "统计"; break; case "ribbonBar14": realName = "量算"; break; case "ribbonBar12": realName = "标注"; break; case "ribbonBar1": realName = "分析"; break; case "ribbonBarJJ": realName = "净距分析"; break; case "ribbonBarTP": realName = "拓扑分析"; break; case "ribbonBarSY": realName = "视域分析"; break; case "ribbonBarKW": realName = "开挖分析"; break; case "ribbonBarQY": realName = "区域分析"; break; case "ribbonBarMN": realName = "模拟分析"; break; case "ribbonBarDM": realName = "断面分析"; break; case "ribbonBar13": realName = "数据管理"; break; case "ribbonBar3": realName = "数据管理"; break; case "ribbonBar9": realName = "数据管理"; break; case "ribbonBar7": realName = "飞行"; break; case "ribbonBar15": realName = "用户管理"; break; default : realName = name; break; } return realName; } private void configResource() { if (Utility.userName != null && Utility.userName != "") { string userName = Utility.userName; string sql = "select RESC.name from UserStatus join Role on UserStatus.rid = Role.id join Perm on Role.pid=Perm.id join PermRESC on Perm.id=PermRESC.permid join RESC on PermRESC.rescid=RESC.id where UserStatus.username='" + userName + "'"; DataTable dt = OledbHelper.QueryTable(sql); if (dt != null && dt.Rows.Count > 0) { string[] sResourceName = new string[dt.Rows.Count]; for (int i = 0; i < dt.Rows.Count; i++) { sResourceName[i] = dt.Rows[i][0].ToString().Trim(); } setControlVisilbe(sResourceName); } } } private bool isContainName(string[] array, string name) { bool bl = false; for (int i = 0; i < array.Length; i++) { if (array[i] == name) { bl = true; break; } } return bl; } private void setControlVisilbe(string[] resourceNames) { ArrayList listItem = new ArrayList(); ArrayList subListItem = new ArrayList(); System.Windows.Forms.Control.ControlCollection cc = ribbonControl1.Controls; for (int i = 0; i < cc.Count; i++) { if (cc[i].GetType() == typeof(DevComponents.DotNetBar.RibbonStrip)) { DevComponents.DotNetBar.RibbonStrip ribbonStripResource = cc[i] as DevComponents.DotNetBar.RibbonStrip; for (int j = 0; j < ribbonStripResource.Items.Count; j++) { if (ribbonStripResource.Items[j].GetType() == typeof(DevComponents.DotNetBar.RibbonTabItem)) { DevComponents.DotNetBar.RibbonTabItem ribbonTabItemResource = ribbonStripResource.Items[j] as DevComponents.DotNetBar.RibbonTabItem; string tabItemResourceName = ribbonTabItemResource.Text; listItem.Add(tabItemResourceName); subListItem.Add(tabItemResourceName); if (!isContainName(resourceNames, tabItemResourceName)) { ribbonTabItemResource.Visible = false; } if (ribbonTabItemResource.SubItems.Count > 0) { for (int k = 0; k < ribbonTabItemResource.SubItems.Count; k++) { if (ribbonTabItemResource.SubItems[k].GetType() == typeof(DevComponents.DotNetBar.ButtonItem)) { DevComponents.DotNetBar.ButtonItem buttonItemResource = ribbonTabItemResource.SubItems[k] as DevComponents.DotNetBar.ButtonItem; string buttonItemResourceName = buttonItemResource.Text; subListItem.Add(buttonItemResourceName); if (!isContainName(resourceNames, buttonItemResourceName)) { buttonItemResource.Visible = false; } } } } } } } else if (cc[i].GetType() == typeof(DevComponents.DotNetBar.RibbonPanel)) { DevComponents.DotNetBar.RibbonPanel ribbonPanelResource = cc[i] as DevComponents.DotNetBar.RibbonPanel; for (int j = 0; j < ribbonPanelResource.Controls.Count; j++) { if (ribbonPanelResource.Controls[j].GetType() == typeof(DevComponents.DotNetBar.RibbonBar)) { DevComponents.DotNetBar.RibbonBar ribbonBarResource = ribbonPanelResource.Controls[j] as DevComponents.DotNetBar.RibbonBar; for (int k = 0; k < ribbonBarResource.Items.Count; k++) { if (ribbonBarResource.Items[k].GetType() == typeof(DevComponents.DotNetBar.ButtonItem)) { DevComponents.DotNetBar.ButtonItem buttonItemResource = ribbonBarResource.Items[k] as DevComponents.DotNetBar.ButtonItem; string buttonItemResourceName = buttonItemResource.Text; subListItem.Add(buttonItemResourceName); if (!isContainName(resourceNames, buttonItemResourceName)) { buttonItemResource.Visible = false; } if (buttonItemResource.SubItems.Count > 0) { for (int m = 0; m < buttonItemResource.SubItems.Count; m++) { if (buttonItemResource.SubItems[m].GetType() == typeof(DevComponents.DotNetBar.ButtonItem)) { DevComponents.DotNetBar.ButtonItem subButtonItemResource = buttonItemResource.SubItems[m] as DevComponents.DotNetBar.ButtonItem; string SubButtonItemResourceName = subButtonItemResource.Text; subListItem.Add(SubButtonItemResourceName); if (!isContainName(resourceNames, SubButtonItemResourceName)) { subButtonItemResource.Visible = false; } } } } } else { if (ribbonBarResource.Items[k].GetType() == typeof(DevComponents.DotNetBar.SliderItem)) { DevComponents.DotNetBar.SliderItem sliderItemResource = ribbonBarResource.Items[k] as DevComponents.DotNetBar.SliderItem; if (!isContainName(resourceNames, sliderItemResource.Text.Trim())) { sliderItemResource.Visible = false; } if (sliderItemResource.SubItems.Count > 0) { for (int m = 0; m < sliderItemResource.SubItems.Count; m++) { if (sliderItemResource.SubItems[m].GetType() == typeof(DevComponents.DotNetBar.ButtonItem)) { DevComponents.DotNetBar.ButtonItem subButtonItemResource = sliderItemResource.SubItems[m] as DevComponents.DotNetBar.ButtonItem; if (!isContainName(resourceNames, subButtonItemResource.Text.Trim())) { subButtonItemResource.Visible = false; } } } } } } } } } } } } #endregion void globeControl2_HudControlMouseDownEvent(object sender, HudControlMouseDownEventArgs e) { switch (e.HudControl.Name) { case "0": globeControl2.Globe.Action = EnumAction3D.ActionNull; break; case "1": globeControl2.Globe.Action = EnumAction3D.SelectObject; break; } } void globeControl2_BeforeSceneRenderEvent(object sender, BeforeSceneRenderEventArgs e) { if (globeControl2.Focused && buttonItem95.Checked && buttonItem95.Enabled) { GSOCameraState camera = globeControl2.Globe.CameraState; globeControl1.Globe.JumpToCameraState(camera); } } void globeControl1_BeforeSceneRenderEvent(object sender, BeforeSceneRenderEventArgs e) { if (globeControl1.Focused && buttonItem95.Checked && buttonItem95.Enabled) { GSOCameraState camera = globeControl1.Globe.CameraState; globeControl2.Globe.JumpToCameraState(camera); } } void globeControl1_AfterLayerAddEvent(object sender, AfterLayerAddEventArgs e) { if (e.Layer.Name != null && e.Layer.Name.Length > 5) { if (e.Layer.Name.Substring(0, 5).Equals("fttp:")) { return; } } if (Path.GetExtension(e.Layer.Name).ToLower().Equals(".kml")) { AddKmlLayer(e.Layer); } else { GSODataset dataset = e.Layer.Dataset; CheckDatasetGeoReference(e.Layer.Dataset); TreeNode node = new TreeNode(); node.Tag = e.Layer; node.Text = e.Layer.Dataset.Caption; node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Checked = e.Layer.Visible; // 注意用insert不要用add,因为后加入的图层在上层 //layerManagerNode.Nodes.Add(node); layerManagerNode.Nodes.Insert(0, node); } layerManagerNode.Expand(); terrainManagerNode.Expand(); } private void AddKmlLayer(GSOLayer layer) { if (layer != null) { TreeNode node = new TreeNode(); node.Tag = layer; node.Text = layer.Caption; node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Checked = layer.Visible; layerManagerNode.Nodes.Insert(0, node); VisitFeature3Ds(layer.GetAllFeatures(), node); } } private void VisitFeature3Ds(GSOFeatures feature3ds, TreeNode node) { for (int i = 0; i < feature3ds.Length; i++) { GSOFeature feature = feature3ds[i]; if (feature.Type == EnumFeatureType.FeatureFolder) { TreeNode tempnode = new TreeNode(); tempnode.Text = feature.Name; tempnode.ImageIndex = 1; tempnode.SelectedImageIndex = 1; tempnode.Checked = node.Checked; tempnode.Tag = feature; node.Nodes.Add(tempnode); GSOFeatureFolder featureFolder = (GSOFeatureFolder)feature; VisitFeature3Ds(featureFolder.Features, tempnode); } else { TreeNode tempnode = new TreeNode(); tempnode.Text = feature.Name; if (feature.Geometry != null) { switch (feature.Geometry.Type) { case EnumGeometryType.GeoPoint3D: case EnumGeometryType.GeoMarker: tempnode.ImageIndex = 3; tempnode.SelectedImageIndex = 3; break; case EnumGeometryType.GeoPolyline3D: tempnode.ImageIndex = 4; tempnode.SelectedImageIndex = 4; break; case EnumGeometryType.GeoPolygon3D: tempnode.ImageIndex = 5; tempnode.SelectedImageIndex = 5; break; case EnumGeometryType.GeoModel: case EnumGeometryType.GeoEntity: case EnumGeometryType.GeoGroupEntity: case EnumGeometryType.GeoSphereEntity: case EnumGeometryType.GeoBoxEntity: case EnumGeometryType.GeoEllipsoidEntity: case EnumGeometryType.GeoCylinderEntity: case EnumGeometryType.GeoFrustumEntity: case EnumGeometryType.GeoEllipCylinderEntity: case EnumGeometryType.GeoEllipFrustumEntity: case EnumGeometryType.GeoRangeEllipsoidEntity: case EnumGeometryType.GeoRangeEllipCylinderEntity: case EnumGeometryType.GeoRangeEllipFrustumEntity: tempnode.ImageIndex = 6; tempnode.SelectedImageIndex = 6; break; case EnumGeometryType.GeoGroundOverlay: tempnode.ImageIndex = 7; tempnode.SelectedImageIndex = 7; break; } } tempnode.Checked = node.Checked; tempnode.Tag = feature; node.Nodes.Add(tempnode); } } } Boolean CheckDatasetGeoReference(GSODataset dataset) { Boolean bSuccess = false; if (dataset.GeoReferenceType == EnumGeoReferenceType.Flat) { if (MessageBox.Show("数据没有空间参考信息,请设置空间参考信息!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) == DialogResult.OK) { String strPath = Path.GetDirectoryName(Application.ExecutablePath) + "\\Coordinate Systems"; OpenFileDialog dlg = new OpenFileDialog(); dlg.InitialDirectory = strPath; dlg.RestoreDirectory = true; dlg.Filter = "投影文件|*.prj||"; if (dlg.ShowDialog() == DialogResult.OK) { bSuccess = dataset.LoadProjectionFromESRIFile(dlg.FileName); } } } else { return true; } return bSuccess; } void globeControl1_TrackRectEndEvent(object sender, TrackRectEndEventArgs e) { if (e.Polygon != null) { globeControl1.Globe.TrackRectTool.Clear(); globeControl1.ImmediatelyRefresh(); globeControl1.SwapBuffer(); Point pt1 = new Point(Convert.ToInt32(e.StartPos.X), Convert.ToInt32(e.StartPos.Y)); Point pt2 = new Point(Convert.ToInt32(e.EndPos.X), Convert.ToInt32(e.EndPos.Y)); Point pt = getUpperLeftPoint(pt1, pt2); Image myImg = new Bitmap(Convert.ToInt32(e.Rect.Width), Convert.ToInt32(e.Rect.Height)); Graphics g = Graphics.FromImage(myImg); g.CopyFromScreen(pt, new Point(0, 0), new Size(Convert.ToInt32(e.Rect.Width), Convert.ToInt32(e.Rect.Height))); SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "输出JPEG(*.jpg)|*.jpg|输出PNG(*.png)|*.png|输出BMP(*.bmp)|*.bmp|输出BMP(*.gif)|*.gif"; if (dlg.ShowDialog() == DialogResult.OK) { string extension = System.IO.Path.GetExtension(dlg.FileName);//扩展名 switch (extension) { case ".jpg": myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Jpeg); break; case ".png": myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Png); break; case ".bmp": myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Bmp); break; case ".gif": myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Gif); break; default: break; } } this.globeControl1.Globe.Action = EnumAction3D.ActionNull; this.globeControl1.Globe.MouseRoamingEnable = true; } } private void jumpToCameraState(double x, double y, double z)//定位正北正90度俯视 { GSOCameraState camera = new GSOCameraState(); camera.Latitude = y; camera.Longitude = x; camera.Distance = z; camera.Tilt = 0; camera.Heading = 0; globeControl1.Globe.JumpToCameraState(camera); globeControl2.Globe.JumpToCameraState(camera); } void globeControl1_HudControlMouseOutEvent(object sender, HudControlMouseOutEventArgs e) { if (tooltip1 != null) { tooltip1.RemoveAll(); } } void globeControl1_HudControlMouseIntoEvent(object sender, HudControlMouseIntoEventArgs e) { GSOHudButton btn = e.HudControl as GSOHudButton; tooltip1 = new System.Windows.Forms.ToolTip(); switch (e.HudControl.Name) { case "0": tooltip1.SetToolTip(globeControl1, "浏览对象"); break; case "1": tooltip1.SetToolTip(globeControl1, "选择对象"); break; } } void globeControl1_HudControlMouseDownEvent(object sender, HudControlMouseDownEventArgs e) { switch (e.HudControl.Name) { case "0": globeControl1.Globe.Action = EnumAction3D.ActionNull; break; case "1": globeControl1.Globe.Action = EnumAction3D.SelectObject; break; } } private void layerTree_AfterCheck(object sender, TreeViewEventArgs e)//layerTree选中后事件 { if (e.Node.Tag != null) { if (e.Node.Tag.ToString().Contains("|")) { string nodeTag = e.Node.Tag.ToString().Split('|')[1]; GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(nodeTag); if (layer != null) { layer.Visible = e.Node.Checked; globeControl1.Globe.Refresh(); } } if (e.Node.Tag is GSOLayer) { GSOLayer layer = e.Node.Tag as GSOLayer; layer.Visible = e.Node.Checked; globeControl1.Globe.Refresh(); } if (e.Node.Tag is GSOFeature) { if (e.Node.Nodes.Count == 0) { GSOFeature feat = e.Node.Tag as GSOFeature; feat.Visible = e.Node.Checked; globeControl1.Globe.Refresh(); } } } CheckControl(e); } //树节点选中方法 private void CheckControl(TreeViewEventArgs e) { if (e.Action != TreeViewAction.Unknown) { if (e.Node != null && !Convert.IsDBNull(e.Node)) { CheckParentNode(e.Node); if (e.Node.Nodes.Count > 0) { CheckAllChildNodes(e.Node, e.Node.Checked); } } } } //改变所有子节点的状态 private void CheckAllChildNodes(TreeNode pn, bool IsChecked) { foreach (TreeNode tn in pn.Nodes) { tn.Checked = IsChecked; if (tn.Nodes.Count > 0) { CheckAllChildNodes(tn, IsChecked); } } } //改变父节点的选中状态,此处为所有子节点不选中时才取消父节点选中,可以根据需要修改 private void CheckParentNode(TreeNode curNode) { bool bChecked = false; if (curNode.Parent != null) { foreach (TreeNode node in curNode.Parent.Nodes) { if (node.Checked) { bChecked = true; break; } } if (bChecked) { curNode.Parent.Checked = true; CheckParentNode(curNode.Parent); } else { curNode.Parent.Checked = false; CheckParentNode(curNode.Parent); } } } private void layerTree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Button == MouseButtons.Right) { layerTree.SelectedNode = e.Node; if (e.Node.Tag != null) { if (e.Button == MouseButtons.Right && e.Node.Tag.ToString().Contains("|")) { if (e.Node.Tag.ToString().Split('|')[0] == "locaserver") { foreach (ToolStripItem item in layerNodeContexMenu.Items) { item.Visible = false; } return; } if (e.Node.Tag.ToString().Split('|')[0] == "new") { //FeatureAddLayerMenuItem.Enabled = true; LayerEditableMenuItem.Enabled = true; foreach (ToolStripItem item in layerNodeContexMenu.Items) { item.Visible = false; } //FeatureAddLayerMenuItem.Visible = true; LayerSelectableMenuItem.Visible = true; LayerEditableMenuItem.Visible = true; RemoveLayer.Visible = true; RefreshLayerFeatureListMenuItem.Visible = true; SaveLayerMenuItem.Visible = true; } // FeatureAddLayerMenuItem.Visible = true; LayerEditableMenuItem.Visible = true; LayerEditableMenuItem.Visible = true; SaveLayerMenuItem.Visible = true; layerNodeContexMenu.Show(layerTree, e.X, e.Y); layerNodeContexMenu.Tag = e.Node; GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(e.Node.Tag.ToString().Split('|')[1]); LayerSelectableMenuItem.Checked = layer.Selectable; LayerEditableMenuItem.Checked = layer.Editable; //FeatureAddLayerMenuItem.Checked = layer.IsDestLayerFeatureAdd(); } else { if (e.Node.Tag is GSOLayer && e.Node.Parent != null && e.Node.Parent.Text.Trim() == "本地图层") { contextMenuStripDeleteLayerNode.Show(layerTree, e.X, e.Y); contextMenuStripDeleteLayerNode.Tag = e.Node; } if (e.Node.Tag is GSOFeature && e.Node.Parent != null && e.Node.Parent.Text.Trim() == "我的地标") { contextMenuStripDeleteLayerNode.Show(layerTree, e.X, e.Y); contextMenuStripDeleteLayerNode.Tag = e.Node; } } } } } private void 删除ToolStripMenuItem2_Click(object sender, EventArgs e) { TreeNode node = layerTree.SelectedNode; if (node != null && node.Parent != null && node.Parent.Text.Trim() == "本地图层") { if (node.Tag is GSOLayer) { GSOLayer layer = node.Tag as GSOLayer; globeControl1.Globe.Layers.Remove(layer); globeControl1.Globe.Refresh(); node.Remove(); } } if (node != null && node.Parent != null && node.Parent.Text.Trim() == "我的地标") { if (node.Tag is GSOFeature) { GSOFeature f = node.Tag as GSOFeature; f.Delete(); globeControl1.Globe.Refresh(); node.Remove(); } } } private void layerTree_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Node.Tag != null) { if (e.Node.Tag.ToString().Contains("|")) { string nodeTag = e.Node.Tag.ToString().Split('|')[1]; GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(nodeTag); if (layer != null) { double x = layer.LatLonBounds.Center.X; double y = layer.LatLonBounds.Center.Y; globeControl1.Globe.FlyToPosition(new GSOPoint3d(x, y, 0), EnumAltitudeMode.Absolute); } } if (e.Node.Tag is GSOLayer) { GSOLayer layer = e.Node.Tag as GSOLayer; double x = layer.LatLonBounds.Center.X; double y = layer.LatLonBounds.Center.Y; globeControl1.Globe.FlyToPosition(new GSOPoint3d(x, y, 0), EnumAltitudeMode.Absolute); } if (e.Node.Tag is GSOFeature) { if (e.Node.Nodes.Count == 0) { GSOFeature feat = e.Node.Tag as GSOFeature; globeControl1.Globe.FlyToFeature(feat); } } } } void globeControl1_CameraBeginMoveEvent(object sender, CameraBeginMoveEventArgs e) { if (featureTooltip.IsVisible()) { featureTooltip.HideBalloon(); } if (balloonEx.IsVisible()) { balloonEx.HideBalloon(); } } void globeControl1_TrackPolylineEndEvent(object sender, TrackPolylineEndEventArgs e) { ArrayList arraylistPoint = new ArrayList(); ArrayList arraylistLine = new ArrayList(); if (e.Polyline != null) { //横断面分析 if (btnItem_HDMAnalysis.Checked || buttonItem9.Checked) { if(pipelineLayerNames != null) { GSOGeoPolygon3D polygon = e.Polyline.CreateBuffer(0.1, true, 5, true, false); for (int i = 0; i < pipelineLayerNames.Count; i++) { if (pipelineLayerNames[i] != null) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(pipelineLayerNames[i]); if (layer == null) { continue; } if (layer.Visible == false) { continue; } GSOFeatureLayer featurelayer = layer as GSOFeatureLayer; if (featurelayer != null) { GSOFeatures feats = featurelayer.FindFeaturesInPolygon(polygon, false); //featurelayer.GetAllFeatures(); for (int j = 0; j < feats.Length; j++) { GSOFeature feateline = feats[j]; GSOGeoPolyline3D geoline = feateline.Geometry as GSOGeoPolyline3D; if (geoline != null) { if (geoline.Style != null) { if (geoline.Style.GetType() == typeof(GSOPipeLineStyle3D)) { GSOPoint3d pntIntersect1 = new GSOPoint3d(); GSOPoint3d pntIntersect2 = new GSOPoint3d(); GSOPoint3d pntProIntersect1 = new GSOPoint3d(); GSOPoint3d pntProIntersect2 = new GSOPoint3d(); // 计算两条线的距离和交点,若果失败返回-1 // 若在同一直线上,并且有交点,返回0 // 若不在同一平面,返回最近两点的距离,并且计算最近两点 double honLen; double verLen; double dNoIntersetStartRatio; double dDist = globeControl1.Globe.Analysis3D.ComputeTwoGeoPolylineDistance(e.Polyline, geoline, out pntIntersect1, out pntIntersect2, out honLen, out verLen, false, false, 0); globeControl1.Globe.Action = EnumAction3D.ActionNull; if (dDist > -1) { arraylistPoint.Add(pntIntersect2); arraylistLine.Add(feateline); } } } } } } } } } if (btnItem_HDMAnalysis.Checked) { FrmHDMAnalysis3 frm = FrmHDMAnalysis3.GetForm(arraylistPoint, arraylistLine, e.Polyline, globeControl1); if (!frm.isShowFirst) { frm.Show(this); } frm.LoadChartEvent(); } else { FrmRoadHDM frm = FrmRoadHDM.GetForm(arraylistPoint, arraylistLine, e.Polyline, globeControl1); if (!frm.isShowFirst) { frm.Show(this); } frm.LoadChartEvent(); } globeControl1.Globe.ClearLastTrackPolyline(); } else if (BaselineProfileAnalysisMenuItem.Checked) { FrmBaseLineProfillAnalysis dlg = new FrmBaseLineProfillAnalysis(globeControl1.Globe,e.Polyline); dlg.Show(this); globeControl1.Globe.ClearLastTrackPolyline(); } else if (buttonItem28.Checked) { GSOGeoPolygon3D resPolygon = e.Polyline.CreateBuffer(m_dDigPitWidthAlongLine, false, 0, false, false); GSOGeoPit geoPit = new GSOGeoPit(); geoPit.PitPolygon = resPolygon; if (m_bDigPitByDepth) { geoPit.PitDepth = m_dDigPitValue; geoPit.PitDepthUsing = true; } else { geoPit.PitBottomAlt = m_dDigPitValue; geoPit.PitDepthUsing = false; } globeControl1.Globe.AddPit("", geoPit); GSOLayer layerGround = globeControl1.Globe.Layers.GetLayerByCaption(roadLayerName);// ("180fd"); if (layerGround != null) { layerGround.Visible = false; } // 清除当前TrackPolygonAnalysis的痕迹 globeControl1.Globe.ClearLastTrackPolyline(); } else if (distanceMarker) { setMarkerLayerUnVisible("距离标注"); GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("距离标注"); if (l != null) { l.Visible = true; if (getLabelName(l) != -1) { GSOGeoPolyline3D line = e.Polyline; if (line.PartCount > 0) { double length = line.GetSpaceLength(true, 6378137);//线的长度 GSOGeoPoint3D pt = new GSOGeoPoint3D(); GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2); GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1]; pt.X = point3d.X; pt.Y = point3d.Y; pt.Z = point3d.Z; string Twodecimalplaces = string.Format("{0:F}", length); string radiusLabelName = "" + Twodecimalplaces + "米"; //string radiusLabelName = "" + length + "米";//标注名称 GSOPoint2d point2d = new GSOPoint2d(0, 30);//标注位置 int labelText = getLabelName(l); GSOFeature newFeatureLine = new GSOFeature(); newFeatureLine.Geometry = line; newFeatureLine.Name = (labelText + 1).ToString() + "-line"; l.AddFeature(newFeatureLine); globeControl1.Globe.ClearLastTrackPolyline(); GSOFeature newFeature = new GSOFeature(); newFeature = createLabel(l, newFeature, pt, radiusLabelName, (labelText + 1).ToString(), point2d); l.AddFeature(newFeature); globeControl1.Refresh(); } } } } } globeControl1.Globe.Action = EnumAction3D.ActionNull; ActionToolMenuChecked(); } void globeControl1_TrackPolylineAnalysisEndEvent(object sender, TrackPolylineEndEventArgs e) { ArrayList arraylistPoint = new ArrayList(); ArrayList arraylistLine = new ArrayList(); if (e.Polyline != null) { //横断面分析 if (btnItem_HDMAnalysis.Checked || buttonItem9.Checked) { for (int i = 0; i < globeControl1.Globe.Layers.Count; i++) { GSOLayer layer = globeControl1.Globe.Layers[i]; if (layer == null) { continue; } if (layer.Visible == false) { continue; } GSOFeatureLayer featurelayer = layer as GSOFeatureLayer; if (featurelayer != null) { GSOFeatures feats = featurelayer.GetAllFeatures(); for (int j = 0; j < feats.Length; j++) { GSOFeature feateline = feats[j]; GSOGeoPolyline3D geoline = feateline.Geometry as GSOGeoPolyline3D; if (geoline != null) { if (geoline.Style != null) { if (geoline.Style.GetType() == typeof(GSOPipeLineStyle3D)) { GSOPoint3d pntIntersect1 = new GSOPoint3d(); GSOPoint3d pntIntersect2 = new GSOPoint3d(); GSOPoint3d pntProIntersect1 = new GSOPoint3d(); GSOPoint3d pntProIntersect2 = new GSOPoint3d(); // 计算两条线的距离和交点,若果失败返回-1 // 若在同一直线上,并且有交点,返回0 // 若不在同一平面,返回最近两点的距离,并且计算最近两点 double honLen; double verLen; double dDist = globeControl1.Globe.Analysis3D.ComputeVerticalDistance(e.Polyline, geoline, out pntIntersect1, out pntIntersect2, out pntProIntersect1, out pntProIntersect2, false); globeControl1.Globe.Action = EnumAction3D.ActionNull; if (dDist > -1) { arraylistPoint.Add(pntIntersect2); arraylistLine.Add(feateline); } } } } } } } if (btnItem_HDMAnalysis.Checked) { FrmHDMAnalysis3 frm = FrmHDMAnalysis3.GetForm(arraylistPoint, arraylistLine, e.Polyline, globeControl1); if (!frm.isShowFirst) { frm.Show(this); } frm.LoadChartEvent(); } else { FrmRoadHDM frm = FrmRoadHDM.GetForm(arraylistPoint, arraylistLine, e.Polyline, globeControl1); if (!frm.isShowFirst) { frm.Show(this); } frm.LoadChartEvent(); } globeControl1.Globe.ClearAnalysis(); } else if (BaselineProfileAnalysisMenuItem.Checked) { FrmBaseLineProfillAnalysis dlg = new FrmBaseLineProfillAnalysis(globeControl1.Globe,e.Polyline); dlg.Show(this); } else if (buttonItem28.Checked) { GSOGeoPolygon3D resPolygon = e.Polyline.CreateBuffer(m_dDigPitWidthAlongLine, false, 0, false, false); GSOGeoPit geoPit = new GSOGeoPit(); geoPit.PitPolygon = resPolygon; if (m_bDigPitByDepth) { geoPit.PitDepth = m_dDigPitValue; geoPit.PitDepthUsing = true; } else { geoPit.PitBottomAlt = m_dDigPitValue; geoPit.PitDepthUsing = false; } globeControl1.Globe.AddPit("", geoPit); // 清除当前TrackPolygonAnalysis的痕迹 globeControl1.Globe.ClearLastTrackPolyline(); } } globeControl1.Globe.Action = EnumAction3D.ActionNull; ActionToolMenuChecked(); } void globeControl1_TrackPolygonEndEvent(object sender, TrackPolygonEndEventArgs e) { if (globeControl1.Globe.Action == EnumAction3D.TrackPolygon) { switch (trackflag) { case "valvequery": workWellLen.Clear(); List<GSOFeatures> list = new List<GSOFeatures>(); for (int i = 0; i < valueLayerNames.Count; i++) { GSOFeatures fs = PolygonIntersectAnalysis_Well(e.Polygon, valueLayerNames[i]); list.Add(fs); } FrmLayerSelectedQuery frm = new FrmLayerSelectedQuery(workWellLen, list, dataGridViewX1, toolStripNumbers, globeControl1, panelEx6); frm.Show(this); //panelEx6.Visible = true; toolStripFeatureLength.Text = ""; globeControl1.Globe.Action = EnumAction3D.ActionNull; break; case "pipelinespatialquery": pipeLineDis.Clear(); List<GSOFeatures> list1 = new List<GSOFeatures>(); for (int i = 0; i < pipelineLayerNames.Count; i++) { GSOFeatures fs = PolygonIntersectAnalysis(e.Polygon, pipelineLayerNames[i]); list1.Add(fs); } FrmAllPipelineStatis frm1 = new FrmAllPipelineStatis(0, pipeLineDis, list1, dataGridViewX1, toolStripNumbers, toolStripFeatureLength, globeControl1, panelEx6); frm1.Show(this); globeControl1.Globe.Action = EnumAction3D.ActionNull; break; case "pipelinespatialquery1": pipeLineDis.Clear(); List<GSOFeatures> list2 = new List<GSOFeatures>(); for (int i = 0; i < pipelineLayerNames.Count; i++) { GSOFeatures fs = PolygonIntersectAnalysis(e.Polygon, pipelineLayerNames[i]); list2.Add(fs); } FrmAllPipelineStatis.ShowForm(1, pipeLineDis, list2, dataGridViewX1, toolStripNumbers, toolStripFeatureLength, globeControl1, panelEx6); globeControl1.Globe.Action = EnumAction3D.ActionNull; break; case "workwellquery": workWellLen.Clear(); List<GSOFeatures> listWell = new List<GSOFeatures>(); for (int i = 0; i < workwellLayerNames.Count; i++) { GSOFeatures fs = PolygonIntersectAnalysis_Well(e.Polygon, workwellLayerNames[i]); listWell.Add(fs); } FrmAllWorkWellStatis frmWell = new FrmAllWorkWellStatis(workWellLen, listWell, dataGridViewX1, toolStripNumbers, globeControl1, panelEx6); frmWell.Show(this); globeControl1.Globe.Action = EnumAction3D.ActionNull; break; case "pit": double depth; FrmTackPolygonDlg dlg = new FrmTackPolygonDlg(); if (dlg.ShowDialog() == DialogResult.OK) { depth = dlg.depth; GSOGeoPit geoPit = new GSOGeoPit(); geoPit.PitPolygon = e.Polygon; geoPit.PitDepth = depth; geoPit.PitDepthUsing = true; globeControl1.Globe.AddPit("", geoPit); GSOLayer layerGround = globeControl1.Globe.Layers.GetLayerByCaption(roadLayerName);//("180fd"); if (layerGround != null) { layerGround.Visible = false; } } // 清除当前TrackPolygonAnalysis的痕迹 globeControl1.Globe.ClearLastTrackPolygon(); globeControl1.Globe.Action = EnumAction3D.ActionNull; break; case "digFillAnalysis": DigFillAnalysisDlg dlg1 = new DigFillAnalysisDlg(); dlg1.m_globe = globeControl1.Globe; dlg1.m_polygon3D = e.Polygon; globeControl1.Globe.Action = EnumAction3D.ActionNull; dlg1.Show(this); break; case "": break; default: break; } } } void globeControl1_TrackPolygonAnalysisEndEvent(object sender, TrackPolygonEndEventArgs e) { if (globeControl1.Globe.Action == EnumAction3D.TrackPolygon) { switch (trackflag) { case "valvequery": workWellLen.Clear(); List<GSOFeatures> list = new List<GSOFeatures>(); for (int i = 0; i < valueLayerNames.Count; i++) { GSOFeatures fs = PolygonIntersectAnalysis_Well(e.Polygon, valueLayerNames[i]); list.Add(fs); } FrmLayerSelectedQuery frm = new FrmLayerSelectedQuery(workWellLen, list, dataGridViewX1, toolStripNumbers, globeControl1,panelEx6); frm.Show(this); //panelEx6.Visible = true; toolStripFeatureLength.Text = ""; globeControl1.Globe.Action = EnumAction3D.ActionNull; break; case "pipelinespatialquery": pipeLineDis.Clear(); List<GSOFeatures> list1 = new List<GSOFeatures>(); for (int i = 0; i < pipelineLayerNames.Count; i++) { GSOFeatures fs = PolygonIntersectAnalysis(e.Polygon, pipelineLayerNames[i]); list1.Add(fs); } FrmAllPipelineStatis frm1 = new FrmAllPipelineStatis(0,pipeLineDis, list1, dataGridViewX1, toolStripNumbers, toolStripFeatureLength, globeControl1, panelEx6); frm1.Show(this); //this.panelEx6.Visible = true; globeControl1.Globe.Action = EnumAction3D.ActionNull; //MessageBox.Show(pipe1 + pipe2 + pipe3 + pipe4 + pipe5 + pipe6, "统计"); break; case "pipelinespatialquery1": pipeLineDis.Clear(); List<GSOFeatures> list2 = new List<GSOFeatures>(); for (int i = 0; i < pipelineLayerNames.Count; i++) { GSOFeatures fs = PolygonIntersectAnalysis(e.Polygon, pipelineLayerNames[i]); list2.Add(fs); } FrmAllPipelineStatis.ShowForm(1, pipeLineDis, list2, dataGridViewX1, toolStripNumbers, toolStripFeatureLength, globeControl1, panelEx6); globeControl1.Globe.Action = EnumAction3D.ActionNull; break; case "workwellquery": workWellLen.Clear(); List<GSOFeatures> listWell = new List<GSOFeatures>(); for (int i = 0; i < workwellLayerNames.Count; i++) { GSOFeatures fs = PolygonIntersectAnalysis_Well(null, workwellLayerNames[i]); listWell.Add(fs); } FrmAllWorkWellStatis frmWell = new FrmAllWorkWellStatis(workWellLen, listWell, dataGridViewX1, toolStripNumbers, globeControl1,panelEx6); frmWell.Show(this); globeControl1.Globe.Action = EnumAction3D.ActionNull; break; case "pit": double depth; FrmTackPolygonDlg dlg = new FrmTackPolygonDlg(); if (dlg.ShowDialog() == DialogResult.OK) { depth = dlg.depth; GSOGeoPit geoPit = new GSOGeoPit(); geoPit.PitPolygon = e.Polygon; geoPit.PitDepth = depth; geoPit.PitDepthUsing = true; globeControl1.Globe.AddPit("", geoPit); } // 清除当前TrackPolygonAnalysis的痕迹 globeControl1.Globe.ClearLastTrackPolygon(); globeControl1.Globe.Action = EnumAction3D.ActionNull; break; case "digFillAnalysis": DigFillAnalysisDlg dlg1 = new DigFillAnalysisDlg(); dlg1.m_globe = globeControl1.Globe; dlg1.m_polygon3D = e.Polygon; globeControl1.Globe.Action = EnumAction3D.ActionNull; dlg1.Show(this); break; case "": break; default: break; } } } private void VerticalAnalysis(GSOFeatures feats, string caption) { for (int i = 0; i < feats.Length; i++) { int idx = dataGridViewX2.Rows.Add(); dataGridViewX2.Rows[idx].Cells[0].Value = caption; dataGridViewX2.Rows[idx].Cells[1].Value = feats[i].Name; } } private bool ValiPort() { Ping p = new Ping();//创建Ping对象p PingReply pr = p.Send(Utility.localicenseserverip);//向指定IP或者主机名的计算机发送ICMP协议的ping数据包 if (pr.Status == IPStatus.Success)//如果ping成功 { try { TcpClient tcpc = new TcpClient(Utility.localicenseserverip, Utility.localicenseserverport);//对IP地址为"192.168.0.105"的计算机的1500端口提出连接申请 tcpc.Close(); return true; } catch (Exception ex) { LogError.PublishError(ex); MessageBox.Show("端口连接错误!" + ex.Message); return false; } } else { int times = 0;//重新连接次数; int count = 2;//设置尝试次数 while (times < count) { //Thread.Sleep(1000);//等待时间(方便测试的话,你可以改为1000) pr = p.Send(Utility.localicenseserverip); if (pr.Status == IPStatus.Success) { try { TcpClient tcpc = new TcpClient(Utility.localicenseserverip, Utility.localicenseserverport);//对IP地址为"192.168.0.105"的计算机的1500端口提出连接申请 tcpc.Close(); return true; } catch (Exception ex) { LogError.PublishError(ex); MessageBox.Show("端口连接错误!" + ex.Message); return false; } } else { times++; if (times < count) { continue; } else { MessageBox.Show("重新尝试连接失败"); return false; } } } return false; } } void globeControl1_FeatureMouseHoverEvent(object sender, FeatureMouseHoverEventArgs e) { try { if (e.Feature != null) { if (e.Feature.GetFieldDefn("编号") != null) { featureTooltip.ShowBalloon((int)e.MousePos.X, (int)e.MousePos.Y, e.Feature.GetValue("编号").ToString()); } else if (e.Feature.Name != "") { featureTooltip.ShowBalloon((int)e.MousePos.X, (int)e.MousePos.Y, e.Feature.Name); } } } catch (Exception ex) { LogError.PublishError(ex); } } void globeControl1_MouseDoubleClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (m_AddPipeLine == true && globeControl1.Globe.Action==EnumAction3D.DrawPolyline) { GSOLayer layerDest = globeControl1.Globe.DestLayerFeatureAdd; if (layerDest != null) { GSOFeatures features = layerDest.GetAllFeatures(); GSOFeature f = features[features.Length - 1]; GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; globeControl1.Globe.Action = EnumAction3D.ActionNull; if (f != null && f.Geometry.Type == EnumGeometryType.GeoPolyline3D) { FrmLineCoordinate lineCoordiante = new FrmLineCoordinate(f, globeControl1, layerDest.Caption); lineCoordiante.Show(this); } globeControl1.Refresh(); } } m_AddPipeLine = false; if (drawRedPology == true && globeControl1.Globe.Action==EnumAction3D.DrawPolygon) { GSOLayer layerDest = globeControl1.Globe.DestLayerFeatureAdd; if (layerDest != null) { GSOFeatures features = layerDest.GetAllFeatures(); //GSOFeatures features = globeControl1.Globe.MemoryLayer.GetAllFeatures(); GSOFeature f = features[features.Length - 1]; if (f != null) { GSOGeoPolygon3D polygon = f.Geometry as GSOGeoPolygon3D; if (polygon != null) { GSOSimplePolygonStyle3D geoStyle3d = new GSOSimplePolygonStyle3D(); f.Name = (getLabelName(layerDest)+1).ToString(); geoStyle3d.FillColor = Color.Red; polygon.Style = geoStyle3d; GSOLabel label = new GSOLabel(); label.Text = "此区域正在施工中!"; label.Style = new GSOLabelStyle(); label.Style.HasTracktionLine = false; polygon.Label = label; globeControl1.Globe.Action = EnumAction3D.ActionNull; globeControl1.Refresh(); } } } } drawRedPology = false; } } Dictionary<string, GSOFeature> dis_Feats = new Dictionary<string, GSOFeature>(); void globeControl1_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (globeControl1.Globe.Action == EnumAction3D.VisibilityAnalysis) { btnSpaceVisibilityAnalysis.Checked = false; return; } if (globeControl1.Globe.Action == EnumAction3D.SelectObject && trackflag == "vertical") { if (globeControl1.Globe.SelObjectCount > 0) { dataGridViewX2.Rows.Clear(); //layerTemp.RemoveAllFeature(); } for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++) { GSOLayer resLayer = null; GSOFeature feat = null; globeControl1.Globe.GetSelectObject(i, out feat, out resLayer); // GSOFeature feat = globeControl1.Globe.GetSelectObject(i; if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D) { int idx = dataGridViewX2.Rows.Add(); dataGridViewX2.Rows[idx].Cells[0].Value = resLayer.Caption; string featureName; if (feat.GetFieldDefn("编号") != null) { featureName = feat.GetValue("编号").ToString(); } else { featureName = feat.Name; } dataGridViewX2.Rows[idx].Cells[1].Value = featureName; } } return; } if (globeControl1.Globe.Action == EnumAction3D.SelectObject && trackflag == "horizontal") { if (globeControl1.Globe.SelObjectCount > 0) { dataGridViewX8.Rows.Clear(); //layerTemp.RemoveAllFeature(); } for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++) { GSOLayer resLayer = null; GSOFeature feat = null; globeControl1.Globe.GetSelectObject(i, out feat, out resLayer); // GSOFeature feat = globeControl1.Globe.GetSelectObject(i; if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D) { int idx = dataGridViewX8.Rows.Add(); dataGridViewX8.Rows[idx].Cells[0].Value = resLayer.Caption; string featureName; if (feat.GetFieldDefn("编号") != null) { featureName = feat.GetValue("编号").ToString(); } else { featureName = feat.Name; } dataGridViewX8.Rows[idx].Cells[1].Value = featureName; } } return; } if (globeControl1.Globe.Action == EnumAction3D.SelectObject && trackflag == "collision") { if (globeControl1.Globe.SelObjectCount > 0) { dataGridViewX4.Rows.Clear(); //layerTemp.RemoveAllFeature(); } for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++) { GSOLayer resLayer = null; GSOFeature feat = null; globeControl1.Globe.GetSelectObject(i, out feat, out resLayer); // GSOFeature feat = globeControl1.Globe.GetSelectObject(i; if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D) { int idx = dataGridViewX4.Rows.Add(); dataGridViewX4.Rows[idx].Cells[0].Value = resLayer.Caption; string featureName; if (feat.GetFieldDefn("编号") != null) { featureName = feat.GetValue("编号").ToString(); } else { featureName = feat.Name; } dataGridViewX4.Rows[idx].Cells[1].Value = featureName; } } return; } if (globeControl1.Globe.Action == EnumAction3D.SelectObject && trackflag == "ftAnalysis") { if (globeControl1.Globe.SelObjectCount > 0) { dataGridViewX6.Rows.Clear(); //layerTemp.RemoveAllFeature(); } for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++) { GSOLayer resLayer = null; GSOFeature feat = null; globeControl1.Globe.GetSelectObject(i, out feat, out resLayer); // GSOFeature feat = globeControl1.Globe.GetSelectObject(i; if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D) { int idx = dataGridViewX6.Rows.Add(); dataGridViewX6.Rows[idx].Cells[0].Value = resLayer.Caption; string featureName; if (feat.GetFieldDefn("编号") != null) { featureName = feat.GetValue("编号").ToString(); } else { featureName = feat.Name; } dataGridViewX6.Rows[idx].Cells[1].Value = featureName; } } return; } GSOPoint3d point; GSOLayer templayer; GSOFeature feature1 = globeControl1.Globe.HitTest(e.X, e.Y, out templayer, out point, false, true, 0); if (point.X == 0 && point.Y == 0 && point.Z == 0) { point = globeControl1.Globe.ScreenToScene(e.X, e.Y); } GSOGeoPoint3D pt = new GSOGeoPoint3D(); pt.X = point.X; pt.Y = point.Y; pt.Z = point.Z; if (m_bAddPipeFitting == true) { GSOLayer featureAddLayer = TreeNodeFeatureLayer(); if (featureAddLayer == null) { return; } FrmAddPipeFitting dlg = new FrmAddPipeFitting(globeControl1, pt, featureAddLayer); dlg.ShowDialog(); m_bAddPipeFitting = false; } if (btnSpaceMeasureHeight.Checked && globeControl1.Globe.Action == EnumAction3D.SelectObject) { double z = globeControl1.Globe.GetZ(point.X, point.Y); double modelZ = 0; if (feature1 != null) { modelZ = feature1.Geometry.GeoBottomCenterPoint.Z; } GSOGeoPolyline3D line = new GSOGeoPolyline3D(); GSOPoint3ds pts = new GSOPoint3ds(); GSOPoint3d pt1 = new GSOPoint3d(); pt1.X = point.X; pt1.Y = point.Y; pt1.Z = point.Z - z; pts.Add(pt1); pts.Add(point); line.AddPart(pts); GSOFeature feat = new GSOFeature(); line.AltitudeMode = EnumAltitudeMode.Absolute; feat.Geometry = line; GSOLabel label = new GSOLabel(); GSOLabelStyle style = new GSOLabelStyle(); style.OutlineColor = Color.Transparent; style.HasTracktionLine = false; style.BackBeginColor = Color.Transparent; style.BackEndColor = Color.Transparent; style.BackMidColor = Color.Transparent; label.Style = style; label.Text = "高度:" + (point.Z -z).ToString("0.00") + "米"; feat.Label = label; layerTemp.AddFeature(feat); } } else if(e.Button == MouseButtons.Right) { if (btnSpaceMeasureHeight.Checked) { btnSpaceMeasureHeight.Checked = false; } } globeControl1.Refresh(); } public static bool RemoteFileExists(string fileUrl) { bool result = false; System.Net.WebResponse response = null; try { System.Net.WebRequest req = System.Net.WebRequest.Create(fileUrl); response = req.GetResponse(); result = response == null ? false : true; } catch (Exception ex) { result = false; } finally { if (response != null) { response.Close(); } } return result; } string featureIDFieldName = "编号"; private bool isFeatureContainsBianhao(GSOFeature feature) { bool isContains = true; if (feature.GetFieldDefn("编号") == null && feature.GetFieldDefn("标识器编号") != null) { isContains = false; } else if (feature.GetFieldDefn("标识器编号") == null) { featureIDFieldName = "标识器编号"; } else if (feature.GetFieldDefn("编号") == null) { featureIDFieldName = "编号"; } return isContains; } void globeControl1_FeatureMouseClickEvent(object sender, FeatureMouseClickEventArgs e) { GSOFeature feature = e.Feature; string str1 = ""; if (feature != null) { if (feature.GetFieldDefn("图片编码") != null) // { str1 = GetBubbleInfo(feature); if (RemoteFileExists(Utility.PicRootURL + feature.GetValue("图片编码").ToString())) { str1 += "<img width='440' height='350' src='" + Utility.PicRootURL + feature.GetValue("图片编码").ToString() + "' />"; } else if (RemoteFileExists(Utility.PicDefaultURL)) { str1 += "<img width='440' height='350' src='" + Utility.PicDefaultURL + "' />"; } } else if (feature.GetFieldDefn("编号") != null || ) //管线模型图层 { str1 = GetBubbleInfo(feature); } if (str1 != "") { featureTooltip.HideBalloon(); balloonEx.HideBalloon(); balloonEx.SetSize(EnumSizeIndexEx.CONTENT_CX, 480); balloonEx.SetSize(EnumSizeIndexEx.CONTENT_CY, 420); balloonEx.ShowBalloon((int)e.MousePos.X, (int)e.MousePos.Y, str1); return; } } } private string GetBubbleInfo(GSOFeature feature) { string str = ""; str = "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"width:100%;background:#FFFFFF none repeat scroll 0 0;border-collapse:collapse;font-family:\"Lucida Sans Unicode\",\"Lucida Grande\",Sans-Serif;font-size:10px;text-align:center;\" >"; //str += "<tr><th colspan=4 style=\"font-size:medium; text-align:center;border-bottom:1px solid #6678B1;color:#003399;font-weight:normal;padding:10px 8px;\">管线属性信息</th></tr>"; //string pipetype = ""; str += "<tr><th colspan=4 style=\"font-size:medium; text-align:center;border-bottom:1px solid #6678B1;color:#003399;font-weight:normal;padding:10px 8px;\">" +feature.GetFieldAsString("权属单位") +" " + feature.GetFieldAsString("编号") + "</th></tr>"; int rowCount = feature.GetFieldCount();// (feature.GetFieldCount() % 2 == 0) ? (feature.GetFieldCount() / 2) : (feature.GetFieldCount() / 2 + 1); for (int j = 0; j < rowCount; j++) { GSOFieldDefn field1 = (GSOFieldDefn)feature.GetFieldDefn(j); string name1 = ""; string value1 = ""; if (field1 != null) { if (field1.Name == "图片编码") { j++; } if (j < rowCount) { field1 = (GSOFieldDefn)feature.GetFieldDefn(j); name1 = field1.Name; if (field1.Type == EnumFieldType.Text) { value1 = feature.GetFieldAsString(j); } else if (field1.Type == EnumFieldType.Date) { DateTime dd = Convert.ToDateTime(feature.GetFieldAsDataTime(j)); if (dd.Year <= 1) { value1 = ""; } else { value1 = dd.ToShortDateString(); } } else { if (!feature.IsFieldValueNull(j)) { value1 = feature.GetValue(j).ToString(); } } } } string name2 = ""; string value2 = ""; if (j + 1 < rowCount) { GSOFieldDefn field2 = (GSOFieldDefn)feature.GetFieldDefn(j + 1); ; if (field2 != null) { if (field2.Name == "图片编码") { j++; } if (j + 1 < rowCount) { field2 = (GSOFieldDefn)feature.GetFieldDefn(j + 1); name2 = field2.Name; if (field2.Type == EnumFieldType.Text) { value2 = feature.GetFieldAsString(j + 1); } else if (field2.Type == EnumFieldType.Date) { DateTime dd = Convert.ToDateTime(feature.GetFieldAsDataTime(j + 1)); if (dd.Year <= 1) { value2 = ""; } else { value2 = dd.ToShortDateString(); } } else { if (!feature.IsFieldValueNull(j + 1)) { value2 = feature.GetValue(j + 1).ToString(); } } } } j++; } str += "<tr><td width=100 style=\"font-size:10pt;border:1px solid #CCCCCC;color:#666699;padding:2px 2px; background-color:#E7F3FB\"><center>" + name1 + "</center></td><td width=100 style=\"font-size:10pt;border:1px solid #CCCCCC;color:#666699;padding:2px 2px;\"><center>" + value1 + "</center></td><td width=100 style=\"font-size:10pt;border:1px solid #CCCCCC;color:#666699;padding:2px 2px;background-color:#E7F3FB\"><center>" + name2 + "</center></td><td width=100 style=\"font-size:10pt;border:1px solid #CCCCCC;color:#666699;padding:2px 2px;\"><center>" + value2 + "</center></td></tr>"; } str += "</table>"; return str; } private void AddTerrains() { for (int i = 0; i < Utility.TerrainsName.Count; i++) { globeControl1.Globe.Terrains.Add(Utility.TerrainsName[i].ToString()); } } private void AddLayers() { for (int i = 0; i < Utility.LayerNames.Count; i++) { GSODataset dataset1 = Utility.dataSource.GetDatasetByName(Utility.LayerNames[i].ToString()); if (dataset1 == null) { continue; } dataset1.Caption = Utility.LayerLabels[i].ToString(); GSOLayer templayer = globeControl1.Globe.Layers.Add(dataset1); templayer.MaxVisibleAltitude = 10000; } } string filename = Utility.filename; private void loadTreeView(TreeView tv)//构建图层树 { try { XmlDocument doc = new XmlDocument(); doc.Load(filename); XmlNodeList Params1 = doc.SelectNodes("/Params/layers"); tv.ShowLines = false; tv.CheckBoxes = true; #region 三级 //foreach (XmlNode paramsNode in Params1) //layers //{ // foreach (XmlNode layerNode in paramsNode) //layer // { // TreeNode nodelayer = new TreeNode(); // string layerName = layerNode.Attributes["label"].Value; // nodelayer.Text = layerName; // if (layerNode.HasChildNodes != false) // { // tv.Nodes.Add(nodelayer); // foreach (XmlNode layerchildNode in layerNode) //layerchild // { // if (layerchildNode.Name == "layerchild") // { // TreeNode nodelayerchild = new TreeNode(); // string layerType = layerchildNode.Attributes["type"].Value; // string layerchildName = layerchildNode.Attributes["label"].Value; // if (layerType == "locaserver") // { // string layerName1 = layerchildNode.Attributes["layer"].Value; // nodelayerchild.Text = layerchildName; // nodelayerchild.Tag = layerType + "|" + layerName1; // nodelayerchild.Checked = true; // nodelayer.Nodes.Add(nodelayerchild); // } // else // { // string layerName1 = layerchildNode.Attributes["layer"].Value; // if (layerchildNode.Attributes["isPipeLine"] != null) // { // pipelineLayerNames.Add(layerName1); // } // if (layerchildNode.Attributes["isWorkWell"] != null) // { // workwellLayerNames.Add(layerName1); // } // if (layerchildNode.Attributes["isValve"] != null) // { // valueLayerNames.Add(layerName1); // } // if (layerchildNode.Attributes["isInstrument"] != null) // { // instrumenLayerNames.Add(layerName1); // } // bool boollayer = AddLayers(layerName1, ""); // nodelayerchild.Text = layerchildName; // nodelayerchild.Tag = layerType + "|" + layerName1; // nodelayerchild.Checked = boollayer; // nodelayer.Nodes.Add(nodelayerchild); // } // } // else if (layerchildNode.Name == "layertype") // { // TreeNode nodelayerchild = new TreeNode(); // string layerType = layerchildNode.Attributes["label"].Value; // nodelayerchild.Text = layerType; // nodelayerchild.Tag = layerType; // nodelayerchild.Checked = true; // nodelayer.Nodes.Add(nodelayerchild); // if (layerchildNode.HasChildNodes == true) // { // foreach (XmlNode childNodeLayer in layerchildNode) // { // TreeNode nodelayerchild1 = new TreeNode(); // string layerName1 = childNodeLayer.Attributes["layer"].Value; // string layerchildName = childNodeLayer.Attributes["label"].Value; // string layerType1 = childNodeLayer.Attributes["type"].Value; // if (childNodeLayer.Attributes["isPipeLine"] != null) // { // pipelineLayerNames.Add(layerName1); // } // if (childNodeLayer.Attributes["isWorkWell"] != null) // { // workwellLayerNames.Add(layerName1); // } // if (childNodeLayer.Attributes["isValve"] != null) // { // valueLayerNames.Add(layerName1); // } // if (childNodeLayer.Attributes["isInstrument"] != null) // { // instrumenLayerNames.Add(layerName1); // } // bool boollayer = AddLayers(layerName1, ""); // nodelayerchild1.Text = layerchildName; // nodelayerchild1.Tag = layerType1 + "|" + layerName1; // nodelayerchild1.Checked = boollayer; // nodelayerchild.Nodes.Add(nodelayerchild1); // } // } // } // } // } // else // { // tv.Nodes.Add(nodelayer); // } // } //} #endregion foreach (XmlNode paramsNode in Params1) //layers { foreach (XmlNode layerNode in paramsNode) //layer { TreeNode nodelayer = new TreeNode(); string layerName = layerNode.Attributes["label"].Value; nodelayer.Text = layerName; if (layerNode.HasChildNodes != false) { tv.Nodes.Add(nodelayer); foreach (XmlNode layerchildNode in layerNode) //layerchild { if (layerchildNode.Name == "layerchild") { TreeNode nodelayerchild = new TreeNode(); string layerType = layerchildNode.Attributes["type"].Value; string layerchildName = layerchildNode.Attributes["label"].Value; if (layerType == "locaserver") { string layerName1 = layerchildNode.Attributes["layer"].Value; if (layerchildNode.Attributes["isRoad"] != null) { roadLayerName = layerName1; } nodelayerchild.Text = layerchildName; nodelayerchild.Tag = layerType + "|" + layerName1; nodelayerchild.Checked = true; nodelayer.Nodes.Add(nodelayerchild); } else { string layerName1 = layerchildNode.Attributes["layer"].Value; if (layerchildNode.Attributes["isPipeLine"] != null) { pipelineLayerNames.Add(layerName1); } if (layerchildNode.Attributes["isWorkWell"] != null) { workwellLayerNames.Add(layerName1); } if (layerchildNode.Attributes["isValve"] != null) { valueLayerNames.Add(layerName1); } if (layerchildNode.Attributes["isInstrument"] != null) { instrumenLayerNames.Add(layerName1); } bool boollayer = AddLayers(layerName1, ""); nodelayerchild.Text = layerchildName; nodelayerchild.Tag = layerType + "|" + layerName1; nodelayerchild.Checked = boollayer; nodelayer.Nodes.Add(nodelayerchild); } } else if (layerchildNode.Name == "layertype") { TreeNode nodelayerchild = new TreeNode(); string layerType = layerchildNode.Attributes["label"].Value; nodelayerchild.Text = layerType; nodelayerchild.Tag = layerType; nodelayerchild.Checked = true; nodelayer.Nodes.Add(nodelayerchild); if (layerchildNode.HasChildNodes == true) { foreach (XmlNode childNodeLayer in layerchildNode) { if (childNodeLayer.HasChildNodes == true) { TreeNode nodelayerchild2 = new TreeNode(); string layer = childNodeLayer.Attributes["label"].Value; nodelayerchild2.Text = layer; nodelayerchild2.Tag = layer; nodelayerchild2.Checked = true; nodelayerchild.Nodes.Add(nodelayerchild2); foreach (XmlNode n in childNodeLayer) { TreeNode nodelayerchild1 = new TreeNode(); string layerName1 = n.Attributes["layer"].Value; string layerchildName = n.Attributes["label"].Value; string layerType1 = n.Attributes["type"].Value; if (n.Attributes["isPipeLine"] != null) { pipelineLayerNames.Add(layerName1); } if (n.Attributes["isWorkWell"] != null) { workwellLayerNames.Add(layerName1); } if (n.Attributes["isValve"] != null) { valueLayerNames.Add(layerName1); } if (n.Attributes["isInstrument"] != null) { instrumenLayerNames.Add(layerName1); } bool boollayer = AddLayers(layerName1, ""); nodelayerchild1.Text = layerchildName; nodelayerchild1.Tag = layerType1 + "|" + layerName1; nodelayerchild1.Checked = boollayer; nodelayerchild2.Nodes.Add(nodelayerchild1); } } else { TreeNode nodelayerchild1 = new TreeNode(); string layerName1 = childNodeLayer.Attributes["layer"].Value; string layerchildName = childNodeLayer.Attributes["label"].Value; string layerType1 = childNodeLayer.Attributes["type"].Value; if (childNodeLayer.Attributes["isPipeLine"] != null) { pipelineLayerNames.Add(layerName1); } if (childNodeLayer.Attributes["isWorkWell"] != null) { workwellLayerNames.Add(layerName1); } if (childNodeLayer.Attributes["isValve"] != null) { valueLayerNames.Add(layerName1); } if (childNodeLayer.Attributes["isInstrument"] != null) { instrumenLayerNames.Add(layerName1); } bool boollayer = AddLayers(layerName1, ""); nodelayerchild1.Text = layerchildName; nodelayerchild1.Tag = layerType1 + "|" + layerName1; nodelayerchild1.Checked = boollayer; nodelayerchild.Nodes.Add(nodelayerchild1); } } } } } } else { tv.Nodes.Add(nodelayer); } } } if (tv.Nodes.Count > 0) { tv.Nodes[0].Expand(); if (tv.Nodes.Count > 0) { foreach (TreeNode node in tv.Nodes) { node.Expand(); } } } //tv.ExpandAll(); foreach (TreeNode tn in tv.Nodes) { if (tn.Nodes.Count > 0) { foreach (TreeNode tnChild in tn.Nodes) { if (tnChild.Checked) tn.Checked = true; } } } } catch (Exception ex) { LogError.PublishError(ex); } } private GSOLayer TreeNodeFeatureLayer() { TreeNode featureAddPipeFitTreenode = GetDestLayerFeatureAddTreeNode(); GSOLayer featureAddLayer = globeControl1.Globe.Layers.GetLayerByCaption(featureAddPipeFitTreenode.Tag.ToString().Split('|')[1]); if (featureAddLayer != null) return featureAddLayer; else return null; } private TreeNode GetDestLayerFeatureAddTreeNode() { for (int i = 0; i < layerTree.Nodes.Count; i++) { TreeNode tempNode = layerTree.Nodes[i]; for (int j = 0; j < tempNode.Nodes.Count; j++) { TreeNode tempChildNode = tempNode.Nodes[j]; if (tempChildNode.Tag.ToString().Split('|').Length > 1) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(tempChildNode.Tag.ToString().Split('|')[1]); if (layer == null) { continue; } if (tempChildNode.Tag != null && layer.IsDestLayerFeatureAdd()) { return tempChildNode; } } else { for (int m = 0; m < tempChildNode.Nodes.Count; m++) { TreeNode tempChildNode1 = tempChildNode.Nodes[m]; if (tempChildNode1.Tag.ToString().Split('|').Length > 1) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(tempChildNode1.Tag.ToString().Split('|')[1]); if (layer == null) { continue; } if (tempChildNode1.Tag != null && layer.IsDestLayerFeatureAdd()) { return tempChildNode1; } } else { for (int n = 0; n < tempChildNode1.Nodes.Count; n++) { TreeNode tempChildNode2 = tempChildNode1.Nodes[n]; if (tempChildNode2.Tag.ToString().Split('|').Length > 1) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(tempChildNode2.Tag.ToString().Split('|')[1]); if (layer == null) { continue; } if (tempChildNode2.Tag != null && layer.IsDestLayerFeatureAdd()) { return tempChildNode2; } } else { } } } } } } } return null; } //添加图层 private bool AddLayers(string layerName, string layerCaption) { try { GSODataset dataset1 = Utility.dataSource.GetDatasetByName(layerName); //dataset1.Caption = layerCaption; GSOLayer templayer = globeControl1.Globe.Layers.Add(dataset1); templayer.MaxVisibleAltitude = 1000; return templayer.Visible; } catch (Exception ex) { LogError.PublishError(ex); return false; } } private void buttonItem86_Click(object sender, EventArgs e)//三维导航 { globeControl1.Globe.Action = EnumAction3D.ActionNull; } private void buttonItem87_Click(object sender, EventArgs e)//地上模式 { if (!buttonItem87.Checked) { buttonItem87.Checked = true; buttonItem88.Checked = false; buttonItem27.Checked = false; switch (globeControl1.Globe.CameraMode) { case EnumCameraMode.UnderGround: globeControl1.Globe.CameraMode = EnumCameraMode.Navigation; GSOCameraState state = new GSOCameraState(); state.AltitudeMode = globeControl1.Globe.CameraState.AltitudeMode; state.Altitude = globeControl1.Globe.CameraState.Altitude; state.Distance = globeControl1.Globe.CameraState.Distance; state.Heading = globeControl1.Globe.CameraState.Heading; state.Latitude = globeControl1.Globe.CameraState.Latitude; state.Longitude = globeControl1.Globe.CameraState.Longitude; if (globeControl1.Globe.CameraState.Tilt < 95 && globeControl1.Globe.CameraState.Tilt > 85) { state.Tilt = 85; } else { state.Tilt = 180 - globeControl1.Globe.CameraState.Tilt; } globeControl1.Globe.JumpToCameraState(state); break; case EnumCameraMode.Walk: globeControl1.Globe.CameraMode = EnumCameraMode.Navigation; break; } globeControl1.Globe.Refresh(); } } private void buttonItem88_Click(object sender, EventArgs e)//地下模式 { if (!buttonItem88.Checked) { buttonItem88.Checked = true; buttonItem27.Checked = false; buttonItem87.Checked = false; switch (globeControl1.Globe.CameraMode) { case EnumCameraMode.Navigation: case EnumCameraMode.Walk: globeControl1.Globe.CameraMode = EnumCameraMode.UnderGround; GSOCameraState state = new GSOCameraState(); state.AltitudeMode = globeControl1.Globe.CameraState.AltitudeMode; state.Altitude = globeControl1.Globe.CameraState.Altitude; state.Distance = globeControl1.Globe.CameraState.Distance; state.Heading = globeControl1.Globe.CameraState.Heading; state.Latitude = globeControl1.Globe.CameraState.Latitude; state.Longitude = globeControl1.Globe.CameraState.Longitude; if (globeControl1.Globe.CameraState.Tilt < 95 && globeControl1.Globe.CameraState.Tilt > 85) { state.Tilt = 95; } else { state.Tilt = 180 - globeControl1.Globe.CameraState.Tilt; } globeControl1.Globe.JumpToCameraState(state); break; } globeControl1.Globe.Refresh(); } } private void buttonItem27_Click(object sender, EventArgs e)//行走模式 { if (!buttonItem27.Checked) { buttonItem27.Checked = true; buttonItem87.Checked = false; buttonItem88.Checked = false; globeControl1.Globe.CameraMode = EnumCameraMode.Walk; } } private void sliderGroundTransSet1_ValueChanged(object sender, EventArgs e)//地面透明度设置 { globeControl1.Globe.GroundOpaque = 100 - sliderGroundTransSet1.Value; GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(roadLayerName);//("180fd"); if (layer != null) { layer.Opaque = 100 - sliderGroundTransSet1.Value; } if (buttonItem94.Checked) { layer = globeControl2.Globe.Layers.GetLayerByCaption(roadLayerName);//("180fd"); if (layer != null) { layer.Opaque = 100 - sliderGroundTransSet1.Value; } globeControl2.Globe.GroundOpaque = 100 - sliderGroundTransSet1.Value; } } private void btnlegendSet_Click(object sender, EventArgs e)//图例 { btnlegendSet.Checked = !btnlegendSet.Checked; legend.Visible = !legend.Visible; globeControl1.Refresh(); } private void buttonItem91_Click(object sender, EventArgs e) //快速定位 { GSOCameraState cameraState = new GSOCameraState(); cameraState.Longitude = 120.610963; cameraState.Latitude = 31.187621; cameraState.Tilt = 0.0; cameraState.Distance = 300; cameraState.Heading = 0; // cameraState.AltitudeMode = EnumAltitudeMode.RelativeToGround; globeControl1.Globe.JumpToCameraState(cameraState); } private void buttonItem1_Click(object sender, EventArgs e) { buttonItem1.Checked = !buttonItem1.Checked; if (buttonItem1.Checked) { sideBarPanelItem3.Visible = true; layerTree.Visible = true; controlContainerItem3.Visible = true; sideBar1.Visible = true; Refresh(); } else { sideBarPanelItem3.Visible = false; layerTree.Visible = false; controlContainerItem3.Visible = false; if (sideBarPanelItem4.Visible == true) { sideBar1.Visible = true; controlContainerItem5.Visible = true; } else { sideBar1.Visible = false; } Refresh(); } } private void buttonItem89_Click(object sender, EventArgs e)//全屏 { buttonItem89.Checked = !buttonItem89.Checked; FullScreen(); } //全屏显示 [DllImport("user32.dll", EntryPoint = "ShowWindow")] private static extern int ShowWindow(int hWnd, int _value); //任务栏 [DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)] static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); int widthOld = 0; int heightOld = 0; int xOld = 0; int yOld = 0; private void FullScreen()//全屏显示 { if (!m_bFullScreen) { xOld = this.Location.X; yOld = this.Location.Y; widthOld = this.Width; heightOld = this.Height; this.SuspendLayout();//挂起 this.ShowInTaskbar = true; this.FormBorderStyle = FormBorderStyle.Sizable; this.WindowState = FormWindowState.Maximized; //////任务栏 IntPtr trayHwnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Shell_TrayWnd", null); if (trayHwnd != IntPtr.Zero) { ShowWindow(trayHwnd.ToInt32(), 0); } this.Location = new Point(0, 0); int widthFull = Screen.PrimaryScreen.Bounds.Width; int heightFull = Screen.PrimaryScreen.Bounds.Height; SetFullScreen(widthFull, heightFull); this.ShowInTaskbar = false; this.FormBorderStyle = FormBorderStyle.None; this.WindowState = FormWindowState.Normal; ////hudButton btnToolNone.SetImage(Application.StartupPath + "\\Resource\\image\\Pan1.png"); btnToolSelect.SetImage(Application.StartupPath + "\\Resource\\image\\select1.png"); buttonItem89.Checked = true; this.sideBar1.Visible = false; expandableSplitter1.Expanded = false; expandableSplitter1.Visible = false; this.statusStrip1.Visible = false; this.expandableSplitter2.Expanded = false; this.expandableSplitter2.Visible = false; this.ribbonControl1.Visible = false; this.pictureBox1.Visible = false; this.ResumeLayout();//重新开始 m_bFullScreen = true; } else { this.SuspendLayout();//挂起 //////任务栏 IntPtr trayHwnd = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Shell_TrayWnd", null); if (trayHwnd != IntPtr.Zero) { ShowWindow(trayHwnd.ToInt32(), 1); } this.Location = new Point(xOld, yOld); SetFullScreen(widthOld, heightOld); this.ShowInTaskbar = true; this.FormBorderStyle = FormBorderStyle.Sizable; this.WindowState = FormWindowState.Normal; ////hudButton btnToolNone.SetImage(Application.StartupPath + "\\Resource\\image\\Pan1.png"); btnToolSelect.SetImage(Application.StartupPath + "\\Resource\\image\\select1.png"); buttonItem89.Checked = false; expandableSplitter1.Expanded = true; expandableSplitter1.Visible = true; this.sideBar1.Visible = true; buttonItem1.Checked = true; this.ShowInTaskbar = true; this.expandableSplitter2.Visible = true; this.statusStrip1.Visible = true; this.ribbonControl1.Visible = true; this.pictureBox1.Visible = true; this.ResumeLayout();//重新开始 m_bFullScreen = false; } } private void SetFullScreen(int width, int height) { this.Width = width; this.Height = height; } private void MainFrm_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.F5: FullScreen(); break; case Keys.Escape: // esc仅仅取消全屏 if (m_bFullScreen) { FullScreen(); } break; default: break; } } private Point getUpperLeftPoint(Point p1, Point p2) //输出地图 { Rectangle rc = new Rectangle(); p1 = this.globeControl1.PointToScreen(p1); p2 = this.globeControl1.PointToScreen(p2); // Normalize the rectangle. if (p1.X < p2.X) { rc.X = p1.X; rc.Width = p2.X - p1.X; } else { rc.X = p2.X; rc.Width = p1.X - p2.X; } if (p1.Y < p2.Y) { rc.Y = p1.Y; rc.Height = p2.Y - p1.Y; } else { rc.Y = p2.Y; rc.Height = p1.Y - p2.Y; } Point pt = new Point(rc.Left, rc.Top); return pt; } Image printImage; private void buttonItem13_Click(object sender, EventArgs e)//打印 { Point pt1 = new Point(Convert.ToInt32(0), Convert.ToInt32(0)); Point pt2 = new Point(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height)); Point pt = getUpperLeftPoint(pt1, pt2); printImage = new Bitmap(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height)); Graphics g = Graphics.FromImage(printImage); g.CopyFromScreen(pt, new Point(0, 0), new Size(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height))); PrintDialog pd = new PrintDialog(); try { if (pd.ShowDialog() == DialogResult.OK) //如果确认,将会覆盖所有的打印参数设置 { //页面设置对话框(可以不使用,其实PrintDialog对话框已提供页面设置) //PageSetupDialog psd = new PageSetupDialog(); //psd.Document = printDocument1; //if ( psd.ShowDialog()==DialogResult.OK) //{ //打印预览 PrintPreviewDialog ppd = new PrintPreviewDialog(); ppd.Document = printDocument1; if (DialogResult.OK == ppd.ShowDialog()) printDocument1.Print(); //打印 //} } } catch { printDocument1.PrintController.OnEndPrint(printDocument1, new System.Drawing.Printing.PrintEventArgs()); } } private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { e.Graphics.DrawImage(printImage, 10, 10); } private void btnOutputJPG_Click(object sender, EventArgs e)//输出地图 { //globeControl1.Globe.Action = EnumAction3D.TrackRect; //绘制矩形模式 //globeControl1.Globe.TrackRectTool.TrackMode = EnumTrackMode.ScreenTrack; //在屏幕上绘制 Point pt1 = new Point(Convert.ToInt32(0), Convert.ToInt32(0)); Point pt2 = new Point(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height)); Point pt = getUpperLeftPoint(pt1, pt2); Image myImg = new Bitmap(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height)); Graphics g = Graphics.FromImage(myImg); g.CopyFromScreen(pt, new Point(0, 0), new Size(Convert.ToInt32(panelEx5.Width), Convert.ToInt32(panelEx5.Height))); SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "输出JPEG(*.jpg)|*.jpg|输出PNG(*.png)|*.png|输出BMP(*.bmp)|*.bmp|输出BMP(*.gif)|*.gif"; if (dlg.ShowDialog() == DialogResult.OK) { string extension = System.IO.Path.GetExtension(dlg.FileName);//扩展名 switch (extension) { case ".jpg": myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Jpeg); break; case ".png": myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Png); break; case ".bmp": myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Bmp); break; case ".gif": myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Gif); break; default: break; } } } private void expandableSplitter1_ExpandedChanged(object sender, ExpandedChangeEventArgs e) { } private void buttonItem104_Click(object sender, EventArgs e)//管径查询 { FrmDiameterQuery.ShowForm(globeControl1,pipelineLayerNames,dataGridViewX1,panelEx6,toolStripNumbers,toolStripFeatureLength); //frm.Show(this); } private void ToolStripText(string currentLayer, int dataCount)//综合管线条件查询显示结果 { if (dataCount != 0) { double featurelength = PipeLength(currentLayer, 0);// 统计管线的里程数 toolStripNumbers.Text = " 管线类型:" + currentLayer + " | 共有:" + Convert.ToString(dataCount - 1) + "条记录"; toolStripFeatureLength.Text = " 管线里程:" + featurelength.ToString("0.00") + " 米"; } else { toolStripNumbers.Text = "管线类型: " + currentLayer + "| 共有:" + 0 + " 条记录 | "; } } public Double PipeLength(string currentQlayer, double totalLength) { if (dataGridViewX1.Rows.Count - 1 != 0) { for (int i = 0; i < dataGridViewX1.Rows.Count - 1; i++) { string featureName = dataGridViewX1.Rows[i].Cells["编号"].Value.ToString().Trim(); //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[currentQlayer])); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(currentQlayer); GSOFeatures features = layer.GetFeatureByName(featureName, false); for (int j = 0; j < features.Length; j++) { GSOFeature feat = features[j]; GSOGeoPolyline3D line = feat.Geometry as GSOGeoPolyline3D; double lentgh = line.GetSpaceLength(true, 6378137); totalLength += lentgh; } } } return totalLength; } private void buttonItem105_Click(object sender, EventArgs e)//材质查询 { FrmMaterialSel.ShowForm(globeControl1, pipelineLayerNames, dataGridViewX1,panelEx6,toolStripNumbers,toolStripFeatureLength); //frm.Show(this); } private void FlyToMenu_Click(object sender, EventArgs e) { if (m_feature != null) { if (m_feature.Geometry != null && m_feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOGeoPolyline3D line = m_feature.Geometry as GSOGeoPolyline3D; double length = line.GetSpaceLength(true, 6378137); GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2); GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1]; globeControl1.Globe.FlyToPosition(point3d, EnumAltitudeMode.Absolute,0,45,5); } else { globeControl1.Globe.FlyToFeature(m_feature, 0, 45, 3); } LightMenu_Click(sender, e); } } private void LightMenu_Click(object sender, EventArgs e) { flashflag = "single"; timer1.Start(); } private void AllLightMenuItem_Click(object sender, EventArgs e) { flashflag = "all"; timer1.Start(); } private void timer1_Tick(object sender, EventArgs e) { if (count < 12) { count++; if (flashflag == "single") { if (m_feature != null) { if (count % 2 != 0) { m_feature.HighLight = true; globeControl1.Refresh(); } else { m_feature.HighLight = false; globeControl1.Refresh(); } } } else if (flashflag == "all") { GSOFeatures feats = Utility.Table2Features(dataGridViewX1.DataSource as DataTable, currentQueryLayer, globeControl1); if (feats.Length > 0) { if (count % 2 != 0) { for (int i = 0; i < feats.Length; i++) { GSOFeature tempfeat = feats[i]; tempfeat.HighLight = true; } globeControl1.Refresh(); } else { for (int i = 0; i < feats.Length; i++) { GSOFeature tempfeat = feats[i]; tempfeat.HighLight = false; } globeControl1.Refresh(); } } } } else { timer1.Stop(); count = 0; } } private void dataGridViewX1_MouseClick(object sender, MouseEventArgs e) { if (m_feature != null && m_feature.HighLight == true) { m_feature.HighLight = false; } m_feature = null; if (e.Button == MouseButtons.Right) { DataGridView.HitTestInfo hittestinfo = dataGridViewX1.HitTest(e.X, e.Y); if (hittestinfo.RowIndex > -1) { string featureName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["编号"].Value.ToString(); contextMenuStrip1.Show(dataGridViewX1, e.X, e.Y); featureName = featureName.Trim(); //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[currentQueryLayer])); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(currentQueryLayer); if (layer == null) return; GSOFeatures features = layer.GetFeatureByName(featureName, false); //GSOFeatures allfeatures = layer.GetAllFeatures(); for (int j = 0; j < features.Length; j++) { if (features[j].Name == featureName) { m_feature = features[j]; break; } } //GSOFeatures feats = layer.GetAllFeatures(); //for (int j = 0; j < feats.Length; j++) //{ // if (feats[j].GetFieldAsString("编号") == featureName) // { // m_feature = feats[j]; // break; // } //} } } } private void dataGridViewX1_MouseDoubleClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { DataGridView.HitTestInfo hittestinfo = dataGridViewX1.HitTest(e.X, e.Y); if (hittestinfo.RowIndex > -1) { string featureName = dataGridViewX1.Rows[hittestinfo.RowIndex].Cells["编号"].Value.ToString(); featureName = featureName.Trim(); //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[currentQueryLayer])); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(currentQueryLayer); // GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption("reli"); if (layer != null) { GSOFeatures features = layer.GetFeatureByName(featureName, false); for (int j = 0; j < features.Length; j++) { if (features[j].Name == featureName) { m_feature = features[j]; if (m_feature.Geometry != null && m_feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOGeoPolyline3D line = m_feature.Geometry as GSOGeoPolyline3D; double length = line.GetSpaceLength(true, 6378137);//线的长度; GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2); GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1]; globeControl1.Globe.FlyToPosition(point3d, EnumAltitudeMode.Absolute, 0, 45, 5); LightMenu_Click(sender, e); } else { globeControl1.Globe.FlyToFeature(m_feature, 0, 45, 3); } } } } } } } private void btnAddPipeLine_Click(object sender, EventArgs e)//添加管线 { frmPipeSetEdit frm = new frmPipeSetEdit(globeControl1,pipelineLayerNames); if (frm.ShowDialog() == DialogResult.OK) { m_AddPipeLine = true; m_bAddPipeFitting = false; globeControl1.Globe.Action = EnumAction3D.DrawPolyline; } } private void btnAddPipeFitting_Click(object sender, EventArgs e)//添加管件 { //List<string> workwellLayerNames = new List<string>();//工井图层名称 //List<string> valueLayerNames = new List<string>();//阀门图层名称 //List<string> instrumenLayerNames = new List<string>();//附属物图层名称 List<string> list = new List<string>(); list.AddRange(workwellLayerNames); list.AddRange(valueLayerNames); list.AddRange(instrumenLayerNames); FrmSetGoalLayer frm = new FrmSetGoalLayer(globeControl1,list); if (frm.ShowDialog() == DialogResult.OK) { globeControl1.Globe.Action = EnumAction3D.ActionNull; m_bAddPipeFitting = true; } } private void btnSelObj_Click(object sender, EventArgs e)//选中对象 { globeControl1.Globe.Action = EnumAction3D.SelectObject; } private void btnMoveObj_Click(object sender, EventArgs e)//平移对象 { globeControl1.Globe.Action = EnumAction3D.MoveObject; } private void btnElevateObj_Click(object sender, EventArgs e)//升降对象 { globeControl1.Globe.Action = EnumAction3D.ElevateObject; } private void btnRotateModel_Click(object sender, EventArgs e)//旋转对象 { globeControl1.Globe.Action = EnumAction3D.RotateObject; } private void btnAddLine_Click(object sender, EventArgs e)//绘制线 { globeControl1.Globe.DestLayerFeatureAdd = globeControl1.Globe.MemoryLayer; globeControl1.Globe.Action = EnumAction3D.DrawPolyline; } private void btnAddPolygon_Click(object sender, EventArgs e)//绘制面 { globeControl1.Globe.DestLayerFeatureAdd = globeControl1.Globe.MemoryLayer; globeControl1.Globe.Action = EnumAction3D.DrawPolygon; } private void FeatureAddLayerMenuItem_Click(object sender, EventArgs e) { if (!FeatureAddLayerMenuItem.Checked) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; FeatureAddLayerMenuItem.Checked = true; GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(node.Tag.ToString().Split('|')[1]); //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)node.Tag); globeControl1.Globe.DestLayerFeatureAdd = layer; } } private void LayerSelectableMenuItem_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; Int32 nIndex = node.Index; GSOLayer layer = globeControl1.Globe.Layers[nIndex]; LayerSelectableMenuItem.Checked = !LayerSelectableMenuItem.Checked; layer.Selectable = LayerSelectableMenuItem.Checked; } private void LayerEditableMenuItem_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; //GSOLayer layer = node.Tag as GSOLayer; //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)node.Tag); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(node.Tag.ToString().Split('|')[1]); LayerEditableMenuItem.Checked = !LayerEditableMenuItem.Checked; layer.Editable = LayerEditableMenuItem.Checked; } private void SaveLayerMenuItem_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; Int32 nIndex = node.Index; string layerCaption = node.Tag.ToString().Split('|')[1]; //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)node.Tag); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layerCaption); //globeControl1.Globe.Layers[nIndex].Save(); layer.Dataset.Save(); } private void buttonItem8_Click(object sender, EventArgs e) { } Dictionary<string, double> pipeLineDis = new Dictionary<string, double>(); Dictionary<string, int> workWellLen = new Dictionary<string, int>(); private void buttonItem2_Click(object sender, EventArgs e) //全区域管线距离统计 { pipeLineDis.Clear(); List<GSOFeatures> list = new List<GSOFeatures>(); for (int i = 0; i < pipelineLayerNames.Count; i++) { GSOFeatures fs = PolygonIntersectAnalysis(null, pipelineLayerNames[i]); list.Add(fs); } FrmAllPipelineStatis frm = new FrmAllPipelineStatis(0,pipeLineDis, list, dataGridViewX1, toolStripNumbers, toolStripFeatureLength, globeControl1, panelEx6); frm.Show(this); } private GSOFeatures PolygonIntersectAnalysis(GSOGeoPolygon3D polygon, string pipelinetype)//全区域管线统计 { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(pipelinetype); if (layer == null) return null; GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = new GSOFeatures(); if (polygon == null) feats = flayer.GetAllFeatures(); else feats = flayer.FindFeaturesInPolygon(polygon, false); double totallength = 0.01; for (int i = 0; i < feats.Length; i++) { GSOFeature feat = feats[i]; GSOGeoPolyline3D line = feat.Geometry as GSOGeoPolyline3D; double length = line.GetSpaceLength(true, 6378137); totallength += length; if (polygon != null) feat.HighLight = true; } double toLength = Convert.ToDouble(totallength.ToString().Substring(0, totallength.ToString().IndexOf("."))); pipeLineDis.Add(pipelinetype, toLength); return feats; //MessageBox.Show("该范围内共有:" + feats.Length.ToString() + " 条管线\n" + "管线总里程为:" + totallength.ToString("0.00") + " 米。", pipelinetype + "统计"); } private void buttonItem5_Click(object sender, EventArgs e)//绘制区域管线距离统计 { trackflag = "pipelinespatialquery"; globeControl1.Globe.Action = EnumAction3D.TrackPolygon; } private void buttonItem47_Click(object sender, EventArgs e) { globeControl1.Globe.ClearAnalysis(); dataGridViewX1.DataSource = null; panelEx6.Visible = false; //layerTemp.RemoveAllFeature(); for (int i = 0; i < globeControl1.Globe.Layers.Count; i++) { GSOLayer layer = globeControl1.Globe.Layers[i]; if (layer is GSOFeatureLayer) { GSOFeatures feats = layer.GetAllFeatures(); for (int j = 0; j < feats.Length; j++) { GSOFeature feat = feats[j]; feat.HighLight = false; } } } //ClearConnexityAnalysis();//清除连通性分析 //ClearCloseValvesAnalysis();//清除阀门分析 ////清除管线间距分析 //if (disFeature.ID != 0) //{ // globeControl1.Globe.MemoryLayer.RemoveFeatureByID(disFeature.ID); //} //if (featureDis.ID != 0) //{ // globeControl1.Globe.MemoryLayer.RemoveFeatureByID(featureDis.ID); //} } private void buttonItem6_Click(object sender, EventArgs e)//全区域阀门数量统计 { workWellLen.Clear(); List<GSOFeatures> list = new List<GSOFeatures>(); for (int i = 0; i < valueLayerNames.Count; i++) { GSOFeatures fs = PolygonIntersectAnalysis_Well(null, valueLayerNames[i]); list.Add(fs); } FrmLayerSelectedQuery frm = new FrmLayerSelectedQuery(workWellLen, list, dataGridViewX1, toolStripNumbers, globeControl1,panelEx6); frm.Show(this); //GSOFeatures feats_reli = Polygon_Contain_PointAnalysis(null, "燃气球阀V4");//已将返回的length类型修改为返回的features,数据库中不存在热力阀门表,以后会添加热力阀门表来替换dx_relifamen表 //FrmLayerSelectedQuery frm = new FrmLayerSelectedQuery("燃气球阀V4", feats_reli, dataGridViewX1, toolStripNumbers,globeControl1); //frm.Show(this); //toolStripFeatureLength.Text = ""; //this.panelEx6.Visible = true; globeControl1.Globe.Action = EnumAction3D.ActionNull; } private void buttonItem7_Click(object sender, EventArgs e)//绘制区域阀门数量统计 { trackflag = "valvequery"; globeControl1.Globe.Action = EnumAction3D.TrackPolygon; } private GSOFeatures Polygon_Contain_PointAnalysis(GSOGeoPolygon3D polygon, string layername)//方法修改,返回类型由int类型修改为GSOFeatures { GSOFeatures feats = new GSOFeatures(); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layername); if (layer == null) { return feats; } GSOFeatureLayer flayer = layer as GSOFeatureLayer; if (flayer != null) { GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; } if (polygon == null) { feats = flayer.GetAllFeatures(); } else { feats = flayer.FindFeaturesInPolygon(polygon, false); } return feats; } private void toolStripDropDownButton3_Click(object sender, EventArgs e) { if (dataGridViewX1.Rows.Count > 0) { int startIdx = toolStripNumbers.Text.IndexOf(":"); int endIdx = toolStripNumbers.Text.IndexOf("|"); if (endIdx == -1) { endIdx = toolStripNumbers.Text.Trim().Length; } string stype = toolStripNumbers.Text.Substring(startIdx + 1, endIdx - startIdx - 1); SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "Excel files (*.xls)|*.xls"; dlg.FilterIndex = 0; dlg.RestoreDirectory = true; //dlg.CreatePrompt = true; dlg.Title = "保存为Excel文件"; dlg.FileName = stype + "-" + DateTime.Now.ToString("yyyyMMdd") + ".xls"; if (dlg.ShowDialog() == DialogResult.OK) { Stream myStream; myStream = dlg.OpenFile(); StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0)); string columnTitle = ""; try { sw.WriteLine("内容:" + stype + " 日期:" + DateTime.Now.ToString("yyyy-MM-dd")); //写入列标题 for (int i = 0; i < dataGridViewX1.ColumnCount; i++) { if (i > 0) { columnTitle += "\t"; } columnTitle += dataGridViewX1.Columns[i].HeaderText; } sw.WriteLine(columnTitle); //写入列内容 for (int j = 0; j < dataGridViewX1.Rows.Count; j++) { string columnValue = ""; for (int k = 0; k < dataGridViewX1.Columns.Count; k++) { if (k > 0) { columnValue += "\t"; } if (dataGridViewX1.Rows[j].Cells[k].Value == null) columnValue += ""; else columnValue += dataGridViewX1.Rows[j].Cells[k].Value.ToString().Trim(); } sw.WriteLine(columnValue); } sw.Close(); myStream.Close(); if (MessageBox.Show("导出Excel文件成功!是否打开?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { System.Diagnostics.Process.Start(dlg.FileName); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { sw.Close(); myStream.Close(); } } } } private void btnItem_HDMAnalysis_Click(object sender, EventArgs e)//横断面分析 { if (!btnItem_HDMAnalysis.Checked) { trackflag = "PolylineAnalysis"; globeControl1.Globe.Action = EnumAction3D.TrackPolyline; //globeControl1.Globe.TrackPolylineAnalysis.VerticalLineVisible = true; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true; btnItem_HDMAnalysis.Checked = true; } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; btnItem_HDMAnalysis.Checked = false; //globeControl1.Globe.TrackPolylineAnalysis.VerticalLineVisible = false; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = false; } ActionToolMenuChecked(); } private void ActionToolMenuChecked() { if (globeControl1.Globe.Action != EnumAction3D.TrackPolyline) { btnItem_HDMAnalysis.Checked = false; BaselineProfileAnalysisMenuItem.Checked = false; buttonItem9.Checked = false; buttonItem28.Checked = false; } if (globeControl1.Globe.Action != EnumAction3D.NormalHit) { btnLTAnalysis.Checked = false; ClearConnexityAnalysis(); btnGFFX.Checked = false; ClearCloseValvesAnalysis(); } if (globeControl1.Globe.Action != EnumAction3D.TrackPolygon) { DigFillAnalysisMenuItem.Checked = false; btnPolygonDigPit.Checked = false; } } private void ConnexityAnalysis() { GSODataset curCAYDataset = m_ConnexityAnalysisFirstLayer.Dataset; string srName = curCAYDataset.Name; GSONetworkDataset curCAYNDataset = curCAYDataset.DataSource.GetDatasetByName(srName + "Network") as GSONetworkDataset; if (curCAYNDataset == null) { MessageBox.Show("该图层没有创建网络拓扑,请先创建网络拓扑信息再进行分析!", "提示"); return; } int[] arryResID; curCAYNDataset.ConnexityAnalysis(m_ConnexityAnalysisFirstFeature.ID, m_ConnexityAnaylsisSecondFeature.ID, out arryResID, false, true); m_ConnexityAnalyResFeatures = m_ConnexityAnalysisFirstLayer.GetFeaturesByIDs(arryResID); if (m_ConnexityAnalyResFeatures == null || m_ConnexityAnalyResFeatures.Length < 1) { String strLine1 = "管线:" + m_ConnexityAnalysisFirstFeature.ID; String strLine2 = "管线:" + m_ConnexityAnaylsisSecondFeature.ID; MessageBox.Show(strLine1 + " 与 " + strLine2 + " 不连通", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { int nCount = m_ConnexityAnalyResFeatures.Length; for (int i = 0; i < nCount; i++) { m_ConnexityAnalyResFeatures[i].HighLight = true; GSOGeoPolyline3D geoline = m_ConnexityAnalyResFeatures[i].Geometry as GSOGeoPolyline3D; if (geoline != null) { GSOLineStyle3D lineStyle = geoline.Style as GSOLineStyle3D; if (lineStyle != null) { if (lineStyle.ArrowStyle == null) { lineStyle.ArrowStyle = new GSOArrowStyle(); } lineStyle.ArrowStyle.BodyLen = 8; lineStyle.ArrowVisible = true; lineStyle.ArrowStyle.Play(); } } } globeControl1.Refresh(); } } private void ClearConnexityAnalysis()//清除连通性分析结果 { if (m_ConnexityAnalysisFirstFeature != null) { m_ConnexityAnalysisFirstFeature.HighLight = false; m_ConnexityAnalysisFirstFeature.Label = null; } if (m_ConnexityAnaylsisSecondFeature != null) { m_ConnexityAnaylsisSecondFeature.HighLight = false; m_ConnexityAnaylsisSecondFeature.Label = null; } m_ConnexityAnalysisFirstFeature = null; m_ConnexityAnaylsisSecondFeature = null; m_ConnexityAnalysisFirstLayer = null; m_COnnexityAnalysisSecondLayer = null; if (m_ConnexityAnalyResFeatures != null) { int nCount = m_ConnexityAnalyResFeatures.Length; for (int i = 0; i < nCount; i++) { m_ConnexityAnalyResFeatures[i].HighLight = false; GSOGeoPolyline3D geoline = m_ConnexityAnalyResFeatures[i].Geometry as GSOGeoPolyline3D; if (geoline != null) { GSOLineStyle3D lineStyle = geoline.Style as GSOLineStyle3D; if (lineStyle != null) { lineStyle.ArrowVisible = false; } } } m_ConnexityAnalyResFeatures = null; } } private void ClearCloseValvesAnalysis()//清楚阀门分析结果 { if (m_CloseValvesAnalyResFeatures != null) { for (int i = 0; i < m_CloseValvesList.Count; i++) { GSOFeature feature = m_CloseValvesList[i] as GSOFeature; feature.Label.Text = ""; } globeControl1.Refresh(); m_CloseValvesAnalyResFeatures = null; m_CloseValvesList = new ArrayList(); } } private void ClearBoosterValvesAnalysis()//清楚阀门分析结果 { if (m_BoosterValvesAnalyResFeatures != null) { for (int i = 0; i < m_BoosterValvesList.Count; i++) { GSOFeature feature = m_BoosterValvesList[i] as GSOFeature; feature.Label.Text = ""; } globeControl1.Refresh(); m_BoosterValvesAnalyResFeatures = null; m_BoosterValvesList = new ArrayList(); } } private void buttonItem9_Click(object sender, EventArgs e)//道路断面分析 { if (!buttonItem9.Checked) { trackflag = "RoadPolylineAnalysis"; globeControl1.Globe.Action = EnumAction3D.TrackPolyline; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true; buttonItem9.Checked = true; } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; buttonItem9.Checked = false; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = false; } ActionToolMenuChecked(); } private void btnMeasureDist_Click(object sender, EventArgs e)//水平距离量算 { globeControl1.Globe.Action = EnumAction3D.MeasureDistance; globeControl1.Globe.DistanceRuler.SpaceMeasure = true; btnSpaceMeasureHeight.Checked = false; } private void btnMeasureHeight_Click(object sender, EventArgs e)//垂直距离 { btnSpaceMeasureHeight.Checked = false; globeControl1.Globe.Action = EnumAction3D.MeasureHeight; globeControl1.Globe.DistanceRuler.SpaceMeasure = false; } private void btnMeasureArea_Click(object sender, EventArgs e)//地表面积量算 { btnSpaceMeasureHeight.Checked = false; globeControl1.Globe.Action = EnumAction3D.MeasureArea; globeControl1.Globe.AreaRuler.SpaceMeasure = false; } private void btnSpaceMeasureDistance_Click(object sender, EventArgs e)//空间距离量算 { btnSpaceMeasureHeight.Checked = false; globeControl1.Globe.Action = EnumAction3D.MeasureDistance; globeControl1.Globe.DistanceRuler.SpaceMeasure = true; } private void btnSpaceMeasureHeight_Click(object sender, EventArgs e)//高度量算 { //globeControl1.Globe.Action = EnumAction3D.MeasureHeight; //globeControl1.Globe.HeightRuler.SpaceMeasure = true; globeControl1.Globe.Action = EnumAction3D.ActionNull; btnSpaceMeasureHeight.Checked = !btnSpaceMeasureHeight.Checked; if (btnSpaceMeasureHeight.Checked) { globeControl1.Globe.Action = EnumAction3D.SelectObject; } } private void btnClearMeasure_Click(object sender, EventArgs e) { globeControl1.Globe.ClearMeasure(); globeControl1.Globe.Action = EnumAction3D.ActionNull; layerTemp.RemoveAllFeature(); btnSpaceMeasureHeight.Checked = false; } private void btnSpaceVisibilityAnalysis_Click(object sender, EventArgs e)//通视分析 { if (globeControl1.Globe.Action != EnumAction3D.VisibilityAnalysis) { //btnSpaceVisibilityAnalysis.Checked = true; globeControl1.Globe.Action = EnumAction3D.VisibilityAnalysis; } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; // SetButtonChecked(); } } private void btnProject_Click(object sender, EventArgs e)//坐标投影 { Cyberpipe.Forms.FrmProject frm = new Cyberpipe.Forms.FrmProject(); frm.ShowDialog(); } private void MainFrm_FormClosing(object sender, FormClosingEventArgs e) { globeControl1.Globe.MemoryLayer.SaveAs(Path.GetDirectoryName(Application.ExecutablePath) + "/MyPlace.kml"); //保存标注 //string[] markerStrs = new string[9]; //markerStrs[0] = "标高标注"; //markerStrs[1] = "管径标注"; //markerStrs[2] = "埋深标注"; //markerStrs[3] = "坐标标注"; //markerStrs[4] = "坡度标注"; //markerStrs[5] = "属性标注"; //markerStrs[6] = "自定义标注"; //markerStrs[7] = "距离标注"; //markerStrs[8] = "红线工具"; //for (int i = 0; i < markerStrs.Length; i++) //{ // GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(markerStrs[i]); // if (l != null) // { // l.Save(); // } //} //保存传感器 //if (Utility.sensorMarkerLayers != null) //{ // for (int i = 0; i < Utility.sensorMarkerLayers.Count; i++) // { // MarkerLayer mLayer = Utility.sensorMarkerLayers[i]; // GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(mLayer.layerName); // if (l != null) // { // l.Save(); // } // } //} } private void buttonItem11_Click(object sender, EventArgs e)//创建拓扑 { //FrmPipeSet frm = new FrmPipeSet(globeControl1, pipelineLayerNames,valueLayerNames); FrmGenAndFaMenTopu frm = new FrmGenAndFaMenTopu(globeControl1, pipelineLayerNames, valueLayerNames); frm.Show(this); } private void TraceUpMenuIte_Click(object sender, EventArgs e)//上游追踪 { ClearUpDownTraceAnalysis(); NetworkTraceUpDown(true); } private void ClearUpDownTraceAnalysis()//清除追踪结果 { if (m_TraceUpDownAnalyResFeatures != null) { int nCount = m_TraceUpDownAnalyResFeatures.Length; for (int i = 0; i < nCount; i++) { m_TraceUpDownAnalyResFeatures[i].HighLight = false; GSOGeoPolyline3D geoline = m_TraceUpDownAnalyResFeatures[i].Geometry as GSOGeoPolyline3D; if (geoline != null) { GSOLineStyle3D lineStyle = geoline.Style as GSOLineStyle3D; if (lineStyle != null) { lineStyle.ArrowVisible = false; } } } m_TraceUpDownAnalyResFeatures = null; } } private void ClearAffectedPipeLine() { if (m_AffectedPipeLines != null) { int nCount = m_AffectedPipeLines.Length; for (int i = 0; i < nCount; i++) { m_AffectedPipeLines[i].HighLight = false; } m_AffectedPipeLines = null; } } private void NetworkTraceUpDown(Boolean bTraceUp)//上下游追踪 { if (globeControl1.Globe.SelectedObject == null) { MessageBox.Show("请点击“编辑”—“选中对象”选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } GSOFeature selLineFeature = globeControl1.Globe.SelectedObject; if (selLineFeature.Geometry == null || selLineFeature.Geometry.Type != EnumGeometryType.GeoPolyline3D) { MessageBox.Show("请点击“编辑”—“选中对象”选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (globeControl1.Globe.SelectedObjectLayer == null) { MessageBox.Show("选中管线所在图层为空!", "提示"); return; } GSODataset curCAYDataset = globeControl1.Globe.SelectedObjectLayer.Dataset; if (curCAYDataset == null || curCAYDataset.DataSource == null) { MessageBox.Show("选中管线所在图层不是数据库图层!","提示"); return; } string srName = curCAYDataset.Name; GSONetworkDataset curCAYNDataset = curCAYDataset.DataSource.GetDatasetByName(srName + "Network") as GSONetworkDataset; if (curCAYNDataset == null) { MessageBox.Show("选中管线所在图层没有创建拓扑!","提示"); return; } int[] arryResID; curCAYNDataset.TraceUpDownAnalysis(selLineFeature.ID, out arryResID, bTraceUp, false, true); m_TraceUpDownAnalyResFeatures = globeControl1.Globe.SelectedObjectLayer.GetFeaturesByIDs(arryResID); if (m_TraceUpDownAnalyResFeatures == null || m_TraceUpDownAnalyResFeatures.Length < 1) { String strLine1 = "没有上游!"; if (!bTraceUp) { strLine1 = "没有下游!"; } MessageBox.Show(strLine1); } else { int nCount = m_TraceUpDownAnalyResFeatures.Length; for (int i = 0; i < nCount; i++) { m_TraceUpDownAnalyResFeatures[i].HighLight = true; GSOGeoPolyline3D geoline = m_TraceUpDownAnalyResFeatures[i].Geometry as GSOGeoPolyline3D; if (geoline != null) { GSOLineStyle3D lineStyle = geoline.Style as GSOLineStyle3D; if (lineStyle != null) { if (lineStyle.ArrowStyle == null) { lineStyle.ArrowStyle = new GSOArrowStyle(); lineStyle.ArrowStyle.BodyWidth = 2; lineStyle.ArrowStyle.BodyLen = 6; lineStyle.ArrowStyle.HeadWidth = 8; lineStyle.ArrowStyle.HeadLen = 10; lineStyle.ArrowStyle.OutlineVisible = true; lineStyle.ArrowStyle.OutlineColor = Color.Red; lineStyle.ArrowStyle.Speed = lineStyle.ArrowStyle.Speed / 2; } lineStyle.ArrowVisible = true; lineStyle.ArrowStyle.Play(); } } } globeControl1.Refresh(); } } private void AffectedPipeLine(Boolean bTraceUp)//上下游追踪 { if (globeControl1.Globe.SelectedObject == null) { MessageBox.Show("请点击“编辑”—“选中对象”选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } GSOFeature selLineFeature = globeControl1.Globe.SelectedObject; if (selLineFeature.Geometry == null || selLineFeature.Geometry.Type != EnumGeometryType.GeoPolyline3D) { MessageBox.Show("请点击“编辑”—“选中对象”选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (globeControl1.Globe.SelectedObjectLayer == null) { return; } GSODataset curCAYDataset = globeControl1.Globe.SelectedObjectLayer.Dataset; if (curCAYDataset == null || curCAYDataset.DataSource == null) { return; } string srName = curCAYDataset.Name; GSONetworkDataset curCAYNDataset = curCAYDataset.DataSource.GetDatasetByName(srName + "Network") as GSONetworkDataset; if (curCAYNDataset == null) { return; } int[] arryResID; curCAYNDataset.TraceUpDownAnalysis(selLineFeature.ID, out arryResID, bTraceUp, false, true); m_AffectedPipeLines = globeControl1.Globe.SelectedObjectLayer.GetFeaturesByIDs(arryResID); if (m_AffectedPipeLines == null || m_AffectedPipeLines.Length < 1) { } else { int nCount = m_AffectedPipeLines.Length; for (int i = 0; i < nCount; i++) { m_AffectedPipeLines[i].HighLight = true; } globeControl1.Refresh(); } } private void TraceDownMenuItem_Click(object sender, EventArgs e)//下游追踪 { ClearUpDownTraceAnalysis(); NetworkTraceUpDown(false); } private void buttonItem58_Click(object sender, EventArgs e) { ClearUpDownTraceAnalysis(); } private void buttonItem12_Click(object sender, EventArgs e)//显示全球 { //103.0458, 37.8900, 0, 0, 0, 13726042.91, EnumAltitudeMode.Absolute GSOCameraState camerastate = new GSOCameraState(); camerastate.Longitude = 103.0458; camerastate.Latitude = 37.8900; camerastate.Distance = 13726042.91; camerastate.Heading = -14.7191750305935; camerastate.Tilt = -0.121060930867518; camerastate.Altitude = -454.784417188726; camerastate.AltitudeMode = EnumAltitudeMode.Absolute; globeControl1.Globe.JumpToCameraState(camerastate); } private void btnDelPipeLine_Click(object sender, EventArgs e)//删除模型 { if (globeControl1.Globe.SelObjectCount > 0) { for(int i = 0;i<globeControl1.Globe.SelObjectCount;i++)// for (int i = globeControl1.Globe.SelObjectCount - 1; i >= 0 ; i--) { GSOFeature f = null; GSOLayer layer = null; globeControl1.Globe.GetSelectObject(i,out f,out layer); if (f != null) { f.Delete(); if (layer != null) { globeControl1.Globe.AddToEditHistroy(layer, f, EnumEditType.Delete); } globeControl1.Refresh(); } } } else { MessageBox.Show("请选中要删除的模型!", "提示"); } } private void buttonItem14_Click(object sender, EventArgs e)//流向分析 { FrmFlow frm = new FrmFlow(globeControl1,pipelineLayerNames); frm.Show(this); } private void Flow(object sender, string pipelineNameCN,bool bShow)//流向 { GSOFeatureLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(pipelineNameCN) as GSOFeatureLayer; GSOFeatures feats = layer.GetAllFeatures(); for (int i = 0; i < feats.Length; i++) { GSOFeature feat = feats[i]; GSOLineStyle3D lineStyle = feat.Geometry.Style as GSOLineStyle3D; if (lineStyle != null) { if (lineStyle.ArrowStyle == null) { lineStyle.ArrowStyle = new GSOArrowStyle(); lineStyle.ArrowStyle.BodyWidth = 2; lineStyle.ArrowStyle.BodyLen = 6; lineStyle.ArrowStyle.HeadWidth = 8; lineStyle.ArrowStyle.HeadLen = 10; lineStyle.ArrowStyle.OutlineVisible = true; lineStyle.ArrowStyle.OutlineColor = Color.Red; lineStyle.ArrowStyle.Speed = lineStyle.ArrowStyle.Speed / 2; lineStyle.ArrowStyle.Play(); } //lineStyle.ArrowVisible = !lineStyle.ArrowVisible; lineStyle.ArrowVisible = bShow; layerTree.SelectedNode = null; } } globeControl1.Globe.Refresh(); } private void buttonItem16_Click(object sender, EventArgs e) { try { TreeNode node = layerTree.SelectedNode; if (node == null) { MessageBox.Show("请在左侧列表中选择管线类型!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } if (node.Tag != null) { if (node.Tag.ToString().Contains("|")) { if (node.Tag.ToString().Split('|')[1] == "污水管线" || node.Tag.ToString().Split('|')[1] == "燃气管线v3" || node.Tag.ToString().Split('|')[1] == "雨水管线v1") { Flow(sender, node.Tag.ToString().Split('|')[1],false); } } } } catch (Exception ex) { LogError.PublishError(ex); } } private void btnLTAnalysis_Click(object sender, EventArgs e)//连通性分析 { if (globeControl1.Globe.SelObjectCount < 2) { MessageBox.Show("请选中至少两个管线!!"); btnLTAnalysis.Checked = false; return; } ClearConnexityAnalysis(); globeControl1.Globe.GetSelectObject(0, out m_ConnexityAnalysisFirstFeature, out m_ConnexityAnalysisFirstLayer); globeControl1.Globe.GetSelectObject(1, out m_ConnexityAnaylsisSecondFeature, out m_COnnexityAnalysisSecondLayer); GSOGeoPolyline3D line1 = m_ConnexityAnalysisFirstFeature.Geometry as GSOGeoPolyline3D; GSOGeoPolyline3D line2 = m_ConnexityAnaylsisSecondFeature.Geometry as GSOGeoPolyline3D; if (line1 == null || line2 == null) { MessageBox.Show("请选择管线!!"); btnLTAnalysis.Checked = false; return; } GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D; if (pipeStyle1 == null || pipeStyle2 == null) { MessageBox.Show("请选择管线!!"); btnLTAnalysis.Checked = false; return; } if (!m_ConnexityAnalysisFirstLayer.IsSameInnerObject(m_COnnexityAnalysisSecondLayer)) { MessageBox.Show("不在同一个图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); btnLTAnalysis.Checked = false; ClearConnexityAnalysis(); } else { ConnexityAnalysis(); } } private void btnGFFX_Click(object sender, EventArgs e)//关阀分析 { ClearCloseValvesAnalysis(); if (globeControl1.Globe.SelObjectCount < 1) { MessageBox.Show("请选中至少一根管线!!"); btnGFFX.Checked = false; return; } GSOLayer resLayer = null; GSOFeature resFeature = null; globeControl1.Globe.GetSelectObject(0, out resFeature, out resLayer); GSOGeoPolyline3D line1 = resFeature.Geometry as GSOGeoPolyline3D; if (line1 == null) { MessageBox.Show("请选择管线!!"); return; } GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; if (pipeStyle1 == null) { MessageBox.Show("请选择管线!!"); return; } GSOPoint3d resIntersetPoint = new GSOPoint3d(); if (NetworkCloseValvesAnalysis(resFeature, resIntersetPoint, resLayer)) { //btnGFFX.Checked = false; globeControl1.Globe.Action = EnumAction3D.ActionNull; btnGFFX.Checked = false; } } FrmCloseValves frm; private bool NetworkCloseValvesAnalysis(GSOFeature lineFeature, GSOPoint3d pntBreak, GSOLayer lineLayer)//阀门分析 { if (lineLayer == null || lineFeature == null || lineFeature.Geometry == null || lineFeature.Geometry.Type != EnumGeometryType.GeoPolyline3D) { return false; } GSODataset curCAYDataset = lineLayer.Dataset; if (curCAYDataset == null || curCAYDataset.DataSource == null) { MessageBox.Show("该图层不是要素图层!", "提示"); return false; } string srName = curCAYDataset.Name; GSONetworkDataset curCAYNDataset = curCAYDataset.DataSource.GetDatasetByName(srName + "Network") as GSONetworkDataset; if (curCAYNDataset == null) { MessageBox.Show("该图层没有创建网络拓扑,请先创建网络拓扑信息再进行分析!", "提示"); return false; } ClearCloseValvesAnalysis(); int[] arryResNodeID; int[] arryResValveID; curCAYNDataset.CloseValveAnalysis(lineFeature.ID, out arryResNodeID, out arryResValveID, false, true); //m_CloseValvesAnalyResFeatures = curCAYNDataset.NodeDataset.GetFeaturesByIDs(arryResNodeID); string valveName = lineLayer.Caption; valveName = valveName.Substring(0, valveName.IndexOf("管线")); GSOLayer valveLayer = globeControl1.Globe.Layers.GetLayerByCaption(valveName + "阀门井"); if (valveLayer == null) { MessageBox.Show("和选中对象所在管线图层相关联的阀门图层不存在!", "提示"); return false; } m_CloseValvesAnalyResFeatures = valveLayer.GetFeaturesByIDs(arryResValveID);// curCAYNDataset.NodeDataset.GetFeaturesByIDs(arryResValveID); if (m_CloseValvesAnalyResFeatures == null || m_CloseValvesAnalyResFeatures.Length < 1) { MessageBox.Show("没有找到要关闭的阀门!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); if (frm != null) { frm.Close(); } } else { int nCount = m_CloseValvesAnalyResFeatures.Length; if (nCount > 0) { frm = FrmCloseValves.getForm(globeControl1, m_CloseValvesAnalyResFeatures, m_CloseValvesList); if (!frm.Visible) { frm.Show(this); } } } return true; } FrmBoosterValvers frmbooster = null; private bool NetworkBoosterValvesAnalysis(GSOFeature lineFeature, GSOPoint3d pntBreak, GSOLayer lineLayer)//阀门分析 { if (lineLayer == null || lineFeature == null || lineFeature.Geometry == null || lineFeature.Geometry.Type != EnumGeometryType.GeoPolyline3D) { return false; } GSODataset curCAYDataset = lineLayer.Dataset; if (curCAYDataset == null || curCAYDataset.DataSource == null) { return false; } string srName = curCAYDataset.Name; GSONetworkDataset curCAYNDataset = curCAYDataset.DataSource.GetDatasetByName(srName + "Network") as GSONetworkDataset; if (curCAYNDataset == null) { MessageBox.Show("该图层没有创建网络拓扑,请先创建网络拓扑信息再进行分析!", "提示"); return false; } ClearBoosterValvesAnalysis(); ClearAffectedPipeLine(); int[] arryResNodeID; int[] arryResValveID; curCAYNDataset.CloseValveAnalysis(lineFeature.ID, out arryResNodeID, out arryResValveID, false, true); //m_CloseValvesAnalyResFeatures = curCAYNDataset.NodeDataset.GetFeaturesByIDs(arryResNodeID); //目前只有燃气管线 有阀门 string valveName = lineLayer.Caption; valveName = valveName.Substring(0,valveName.IndexOf("管线")); GSOLayer valveLayer = globeControl1.Globe.Layers.GetLayerByCaption(valveName + "阀门井"); if (valveLayer == null) { MessageBox.Show("和选中对象所在管线图层相关联的阀门图层不存在!", "提示"); return false; } m_BoosterValvesAnalyResFeatures = valveLayer.GetFeaturesByIDs(arryResValveID); //m_BoosterValvesAnalyResFeatures = curCAYNDataset.NodeDataset.GetFeaturesByIDs(arryResValveID); if (m_BoosterValvesAnalyResFeatures == null || m_BoosterValvesAnalyResFeatures.Length < 1) { MessageBox.Show("没有找到要关闭的阀门!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); if (frmbooster != null) { frmbooster.Close(); } } else { int nCount = m_BoosterValvesAnalyResFeatures.Length; if (nCount > 0) { AffectedPipeLine(false); frmbooster = FrmBoosterValvers.getForm(globeControl1, m_BoosterValvesAnalyResFeatures, m_BoosterValvesList, m_AffectedPipeLines); frmbooster.setLstValvesName(); if (!frmbooster.Visible) { frmbooster.Show(this); } } } return true; } private void buttonItem17_Click(object sender, EventArgs e) //清除分析结果 { globeControl1.Globe.ClearAnalysis(); checkBoxX1.Checked = false; checkBoxX2.Checked = false; checkBoxX3.Checked = false; checkBoxX4.Checked = false; checkBoxX5.Checked = false; checkBoxX6.Checked = false; checkBoxX7.Checked = false; checkBoxX8.Checked = false; for (int i = 0; i < globeControl1.Globe.Layers.Count; i++) { GSOLayer layer = globeControl1.Globe.Layers[i]; if (layer is GSOFeatureLayer) { GSOFeatures feats = layer.GetAllFeatures(); for (int j = 0; j < feats.Length; j++) { GSOFeature feat = feats[j]; feat.HighLight = false; GSOLineStyle3D lineStyle = feat.Geometry.Style as GSOLineStyle3D; if (lineStyle != null) { lineStyle.ArrowVisible = false; feat.Geometry.SetModified(true); } } } } ClearConnexityAnalysis();//清除连通性分析 ClearCloseValvesAnalysis();//清除阀门分析 //清除管线间距分析 if (disFeature != null) { if (disFeature.ID != 0) { globeControl1.Globe.MemoryLayer.RemoveFeatureByID(disFeature.ID); } } if (featureDis != null) { if (featureDis.ID != 0) { globeControl1.Globe.MemoryLayer.RemoveFeatureByID(featureDis.ID); } } if (emitterFeature != null) { if (emitterFeature.ID != 0) { globeControl1.Globe.MemoryLayer.RemoveFeatureByID(emitterFeature.ID); } globeControl1.Globe.UnderGroundFloor.Visible = false; } buttonX2_Click(sender, e); ClearUpDownTraceAnalysis(); globeControl1.Globe.RemoveAllPits(); //GSOLayer layerGround = globeControl1.Globe.Layers.GetLayerByCaption("180fd"); //if (layerGround != null && (layerGround.Visible)) //{ // layerGround.Visible = false; //} globeControl1.Globe.Action = EnumAction3D.ActionNull; } private void btnPipeDistance_Click(object sender, EventArgs e)//垂直净距 { layerTemp.RemoveAllFeature(); clearFeatureHighLight(); globeControl1.Refresh(); sideBar1.Visible = true; sideBarPanelItem3.Visible = true; buttonItem1.Checked = true; controlContainerItem3.Visible = true; sideBarPanelItem4.Visible = true; sideBarPanelItem4.Text = "垂直净距分析"; trackflag = "vertical"; //globeControl1.Globe.Action = EnumAction3D.SelectObject; panel2.Visible = false; panel3.Visible = false; panel5.Visible = false; panel4.Visible = false; panelEx1.Visible = false; controlContainerItem5.Control = panel1; panel1.Dock = DockStyle.Fill; panel1.Visible = true; sideBar1.ExpandedPanel = sideBarPanelItem4; sideBar1.Refresh(); Refresh(); } private void buttonItem18_Click(object sender, EventArgs e) { //globeControl1.Globe } private void checkBoxX2_CheckedChanged(object sender, EventArgs e) { clearFeatureHighLight(); comboBoxEx1.Enabled = checkBoxX2.Checked; if (checkBoxX2.Checked) { globeControl1.Globe.Action = EnumAction3D.ActionNull; textBoxX1.Enabled = true; trackflag = ""; dataGridViewX2.Rows.Clear(); dataGridViewX3.Rows.Clear(); comboBoxEx1.SelectedIndex = -1; } globeControl1.Globe.ClearAnalysis(); layerTemp.RemoveAllFeature(); globeControl1.Refresh(); } private void checkBoxX2_CheckedChanged_shuiping(object sender, EventArgs e) { clearFeatureHighLight();//清除高亮 comboBoxEx4.Enabled = checkBoxX8.Checked; if (checkBoxX8.Checked) { globeControl1.Globe.Action = EnumAction3D.ActionNull; //textBoxX5.Enabled = true; trackflag = ""; dataGridViewX8.Rows.Clear(); dataGridViewX9.Rows.Clear(); comboBoxEx4.SelectedIndex = -1; } globeControl1.Globe.ClearAnalysis(); layerTemp.RemoveAllFeature(); globeControl1.Refresh(); } private void checkBoxX1_CheckedChanged(object sender, EventArgs e) { clearFeatureHighLight(); if (checkBoxX1.Checked) { globeControl1.Globe.ClearAnalysis(); layerTemp.RemoveAllFeature(); globeControl1.Refresh(); comboBoxEx1.Enabled = false; dataGridViewX2.Rows.Clear(); dataGridViewX3.Rows.Clear(); trackflag = "vertical"; //globeControl1.Globe.Action = EnumAction3D.TrackPolygonAnalysis; globeControl1.Globe.Action = EnumAction3D.SelectObject; } else { comboBoxEx1.Enabled = true; } } private void checkBoxX1_CheckedChanged_shuiping(object sender, EventArgs e) { clearFeatureHighLight();//清除高亮 if (checkBoxX7.Checked) { globeControl1.Globe.ClearAnalysis(); layerTemp.RemoveAllFeature(); globeControl1.Refresh(); comboBoxEx4.Enabled = false; dataGridViewX8.Rows.Clear(); dataGridViewX9.Rows.Clear(); trackflag = "horizontal"; //globeControl1.Globe.Action = EnumAction3D.TrackPolygonAnalysis; globeControl1.Globe.Action = EnumAction3D.SelectObject; } else { comboBoxEx4.Enabled = true; } } GSOFeatures feats_vertical = new GSOFeatures(); private void comboBoxEx1_SelectedIndexChanged(object sender, EventArgs e) { if (comboBoxEx1.SelectedIndex > -1) { //feats_vertical.RemoveAll(); dataGridViewX2.Rows.Clear(); dataGridViewX3.Rows.Clear(); listBox1.Items.Clear(); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx1.SelectedItem.ToString()); if (layer == null) return; GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = flayer.GetAllFeatures(); //feats_vertical = feats; for (int i = 0; i < feats.Length; i++) { int idx = dataGridViewX2.Rows.Add(); dataGridViewX2.Rows[idx].Cells[0].Value = comboBoxEx1.SelectedItem.ToString(); dataGridViewX2.Rows[idx].Cells[1].Value = feats[i].Name; } } } private void comboBoxEx1_SelectedIndexChanged_shuiping(object sender, EventArgs e) { if (comboBoxEx4.SelectedIndex > -1) { //feats_vertical.RemoveAll(); dataGridViewX8.Rows.Clear(); dataGridViewX9.Rows.Clear(); listBox3.Items.Clear(); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx4.SelectedItem.ToString()); if (layer == null) return; GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = flayer.GetAllFeatures(); //feats_vertical = feats; for (int i = 0; i < feats.Length; i++) { int idx = dataGridViewX8.Rows.Add(); dataGridViewX8.Rows[idx].Cells[0].Value = comboBoxEx4.SelectedItem.ToString(); dataGridViewX8.Rows[idx].Cells[1].Value = feats[i].Name; } } } private void buttonX1_Click(object sender, EventArgs e) { if (!checkBoxX1.Checked && !checkBoxX2.Checked) { MessageBox.Show("请确定是选择管线还是选择图层!", "提示"); return; } if (textBoxX1.Text.Trim() == "") { MessageBox.Show("分析半径不能为空!", "提示"); return; } double dJingJuBiaoZhun = 0; if (!double.TryParse(textBoxX1.Text.Trim(), out dJingJuBiaoZhun)) { MessageBox.Show("请输入正确的分析半径!", "提示"); return; } if (textBoxX2.Text.Trim() == "") { MessageBox.Show("净距标准不能为空!", "提示"); return; } dJingJuBiaoZhun = 0; if (!double.TryParse(textBoxX2.Text.Trim(), out dJingJuBiaoZhun)) { MessageBox.Show("请输入正确的净距标准!", "提示"); return; } if (dataGridViewX2.Rows.Count > 0) { featCount.Clear(); featLenth.Clear(); listBox1.Items.Clear(); layerTemp.RemoveAllFeature(); polygonJingJuAnalysises.RemoveAll(); clearFeatureHighLightIgnoreSelectObject(); dataGridViewX3.Rows.Clear(); if (checkBoxX1.Checked) { for (int i = 0; i < dataGridViewX2.Rows.Count; i++) { GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX2.Rows[i].Cells[0].Value.ToString()); if (l != null) { GSOFeatureLayer flayer = l as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = flayer.GetAllFeatures(); for (int j = 0; j < feats.Length; j++) { if (feats[j].Name == dataGridViewX2.Rows[i].Cells[1].Value.ToString()) { CollisionAnalysis_Selected(l.Caption,feats[j]); } } } } } else if(checkBoxX2.Checked) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx1.SelectedItem.ToString()); if (layer == null) return; GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = flayer.GetAllFeatures(); for (int i = 0; i < feats.Length; i++) { CollisionAnalysis(0,layer.Caption,feats[i],Convert.ToDouble(textBoxX2.Text)); } //listBox1.Items.Add("污水管线:" + m_WushuiCount.ToString() + "条,共" + totalLength_Wushui.ToString("0.00") + "米"); //listBox1.Items.Add("雨水管线:" + m_YushuiCount.ToString() + "条,共" + totalLength_Yushui.ToString("0.00") + "米"); //listBox1.Items.Add("燃气管线:" + m_RanqiCount.ToString() + "条,共" + totalLength_Ranqi.ToString("0.00") + "米"); if (featCount.Count > 0) { for (int i = 0; i < pipelineLayerNames.Count; i++) { if (featCount.ContainsKey(pipelineLayerNames[i]) && featLenth.ContainsKey(pipelineLayerNames[i])) { listBox1.Items.Add(pipelineLayerNames[i] +":"+ featCount[pipelineLayerNames[i]] + "条,共" + featLenth[pipelineLayerNames[i]].ToString("0.00") + "米"); } } } } if(dataGridViewX3.Rows.Count == 0) { MessageBox.Show("没有符合净距标准的管线!", "提示"); } } else { MessageBox.Show("请选中要进行垂直净距分析的管线!", "提示"); //globeControl1.Globe.Action = EnumAction3D.SelectObject; } globeControl1.Refresh(); } private void buttonX1_Click_shuiping(object sender, EventArgs e) { if (!checkBoxX7.Checked && !checkBoxX8.Checked) { MessageBox.Show("请确定是选择管线还是选择图层!", "提示"); return; } if (textBoxX4.Text.Trim() == "") { MessageBox.Show("净距标准不能为空!", "提示"); return; } double dJingJuBiaoZhun = 0; if (!double.TryParse(textBoxX4.Text.Trim(), out dJingJuBiaoZhun)) { MessageBox.Show("请输入正确的净距标准!", "提示"); return; } if (dataGridViewX8.Rows.Count > 0) { featCount.Clear(); featLenth.Clear(); listBox3.Items.Clear(); layerTemp.RemoveAllFeature(); polygonJingJuAnalysises.RemoveAll(); clearFeatureHighLightIgnoreSelectObject(); dataGridViewX9.Rows.Clear(); if (checkBoxX7.Checked) { for (int i = 0; i < dataGridViewX8.Rows.Count; i++) { GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX8.Rows[i].Cells[0].Value.ToString()); if (l != null) { GSOFeatureLayer flayer = l as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = flayer.GetAllFeatures(); for (int j = 0; j < feats.Length; j++) { if (feats[j].Name == dataGridViewX8.Rows[i].Cells[1].Value.ToString()) { CollisionAnalysis_Selected_shuiping(l.Caption, feats[j]); } } } } } else if (checkBoxX8.Checked) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx4.SelectedItem.ToString()); if (layer == null) return; GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = flayer.GetAllFeatures(); for (int i = 0; i < feats.Length; i++) { CollisionAnalysis_shuiping(0, layer.Caption, feats[i], Convert.ToDouble(textBoxX4.Text)); } //listBox1.Items.Add("污水管线:" + m_WushuiCount.ToString() + "条,共" + totalLength_Wushui.ToString("0.00") + "米"); //listBox1.Items.Add("雨水管线:" + m_YushuiCount.ToString() + "条,共" + totalLength_Yushui.ToString("0.00") + "米"); //listBox1.Items.Add("燃气管线:" + m_RanqiCount.ToString() + "条,共" + totalLength_Ranqi.ToString("0.00") + "米"); if (featCount.Count > 0) { for (int i = 0; i < pipelineLayerNames.Count; i++) { if (featCount.ContainsKey(pipelineLayerNames[i]) && featLenth.ContainsKey(pipelineLayerNames[i])) { listBox3.Items.Add(pipelineLayerNames[i] + ":" + featCount[pipelineLayerNames[i]] + "条,共" + featLenth[pipelineLayerNames[i]].ToString("0.00") + "米"); } } } } if (dataGridViewX9.Rows.Count == 0) { MessageBox.Show("没有符合净距标准的管线!", "提示"); } } else { MessageBox.Show("请选中要进行水平净距分析的管线!", "提示"); //globeControl1.Globe.Action = EnumAction3D.SelectObject; } globeControl1.Refresh(); } Dictionary<string, int> featCount = new Dictionary<string, int>(); Dictionary<string, double> featLenth = new Dictionary<string, double>(); GSOFeatures polygonJingJuAnalysises = new GSOFeatures(); private void CollisionAnalysis_Selected(string caption,GSOFeature feat) { if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D) { if (feat == null) { MessageBox.Show("请选择一条管线!"); return; } GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D; if (line1 == null) { MessageBox.Show("请选择一条管线!"); return; } GSOGeoPolygon3D polygon = line1.CreateBuffer(Convert.ToDouble(textBoxX1.Text), true, 5, true, false); GSOFeature new_feat = new GSOFeature(); new_feat.Geometry = polygon; polygonJingJuAnalysises.Add(new_feat); layerTemp.AddFeature(new_feat); GSOPoint3d pntIntersect1 = new GSOPoint3d(); GSOPoint3d pntIntersect2 = new GSOPoint3d(); GSOPoint3d pntProIntersect1 = new GSOPoint3d(); GSOPoint3d pntProIntersect2 = new GSOPoint3d(); double pipeLength = 0; int pipeCount = 0; for (int i = 0; i < pipelineLayerNames.Count; i++) { if (caption == pipelineLayerNames[i]) { continue; } pipeLength = 0; pipeCount = 0; GSOFeatures feats2 = Polygon_Contain_PointAnalysis(polygon, pipelineLayerNames[i]); for (int j = 0; j < feats2.Length; j++) { GSOFeature feat2 = feats2[j]; GSOGeoPolyline3D line2 = feats2[j].Geometry as GSOGeoPolyline3D; if (line2 == null) continue; GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D; if (pipeStyle1 == null || pipeStyle2 == null) continue; // 计算两条线的距离和交点,若果失败返回-1 // 若在同一直线上,并且有交点,返回0 // 若不在同一平面,返回最近两点的距离,并且计算最近两点 double honLen; double verLen; double dDist =-1; //globeControl1.Globe.Analysis3D.ComputeTwoGeoPolylineDistance(line1, line2, out pntIntersect1, out pntIntersect2, false); dDist = globeControl1.Globe.Analysis3D.ComputeVerticalDistance(line1, line2, out pntIntersect1, out pntIntersect2, out pntProIntersect1, out pntProIntersect2, false); dDist = dDist - pipeStyle1.Radius - pipeStyle2.Radius; if (dDist<Convert.ToDouble(textBoxX2.Text)) { #region ////添加碰撞点标注 //GSOGeoPolyline3D disline = new GSOGeoPolyline3D(); //GSOPoint3ds point3ds = new GSOPoint3ds(); //point3ds.Add(pntProIntersect1); //point3ds.Add(pntProIntersect2); //disline.AddPart(point3ds); //GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D(); //创建线的风格 ////设置透明度及颜色,FromArgb()中的四个参数分别为alpha、red、green、blue,取值范围为0到255 //style.LineColor = Color.GreenYellow; //style.LineWidth = 3; //设置线的宽度为3 //style.VertexVisible = true; //显示线的节点 //disline.Style = style; //把风格添加到线上 //disline.AltitudeMode = EnumAltitudeMode.Absolute; //GSOFeature f1 = new GSOFeature(); //f1.Geometry = disline; ////disFeature.Geometry = disline; //GSOGeoMarker markerDis = new GSOGeoMarker(); //markerDis.X = pntIntersect1.X; //markerDis.Y = pntIntersect1.Y; //markerDis.Z = (pntIntersect1.Z + pntIntersect2.Z) / 2; //markerDis.Text = dDist.ToString("0.00") + "米"; //markerDis.AltitudeMode = EnumAltitudeMode.Absolute; //GSOMarkerStyle3D styleMarker = new GSOMarkerStyle3D(); //GSOTextStyle styleText = new GSOTextStyle(); //styleText.IsSizeFixed = true; //styleText.ForeColor = Color.White; //styleText.FontSize = 20; //styleMarker.TextStyle = styleText; //markerDis.Style = styleMarker; //GSOFeature f2 = new GSOFeature(); //f2.Geometry = markerDis; //layerTemp.AddFeature(f1); //layerTemp.AddFeature(f2); #endregion feats2[j].HighLight = true; int idx = dataGridViewX3.Rows.Add(); dataGridViewX3.Rows[idx].Cells[0].Value = caption; dataGridViewX3.Rows[idx].Cells[1].Value = feat.Name; dataGridViewX3.Rows[idx].Cells[2].Value = pipelineLayerNames[i]; dataGridViewX3.Rows[idx].Cells[3].Value = feats2[j].Name; dataGridViewX3.Rows[idx].Cells[4].Value = dDist.ToString("0.00"); pipeLength += line2.GetSpaceLength(true, 6378137); pipeCount++; } line2.ReleaseInnerPointer(); feat2.ReleaseInnerPointer(); } listBox1.Items.Add(pipelineLayerNames[i] +":" + pipeCount.ToString() + "条,共" + pipeLength.ToString("0.00") + "米"); feats2.ReleaseInnerPointer(); } line1.ReleaseInnerPointer(); feat.ReleaseInnerPointer(); } globeControl1.Refresh(); } private void CollisionAnalysis_Selected_shuiping(string caption, GSOFeature feat) { if (feat != null && feat.Geometry.Type == EnumGeometryType.GeoPolyline3D) { if (feat == null) { MessageBox.Show("请选择一条管线!"); return; } GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D; if (line1 == null) { MessageBox.Show("请选择一条管线!"); return; } GSOGeoPolygon3D polygon = line1.CreateBuffer(2 * Convert.ToDouble(textBoxX4.Text.Trim()), true, 5, true, false); GSOFeature new_feat = new GSOFeature(); new_feat.Geometry = polygon; polygonJingJuAnalysises.Add(new_feat); layerTemp.AddFeature(new_feat); //GSOPoint3d pntIntersect1 = new GSOPoint3d(); //GSOPoint3d pntIntersect2 = new GSOPoint3d(); //GSOPoint3d pntProIntersect1 = new GSOPoint3d(); //GSOPoint3d pntProIntersect2 = new GSOPoint3d(); double pipeLength = 0; int pipeCount = 0; for (int i = 0; i < pipelineLayerNames.Count; i++) { if (caption == pipelineLayerNames[i]) { continue; } pipeLength = 0; pipeCount = 0; GSOFeatures feats2 = Polygon_Contain_PointAnalysis(polygon, pipelineLayerNames[i]); for (int j = 0; j < feats2.Length; j++) { GSOFeature feat2 = feats2[j]; GSOGeoPolyline3D line2 = feats2[j].Geometry as GSOGeoPolyline3D; if (line2 == null) { continue; } GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D; if (pipeStyle1 == null || pipeStyle2 == null) { continue; } // 计算两条线的距离和交点,若果失败返回-1 // 若在同一直线上,并且有交点,返回0 // 若不在同一平面,返回最近两点的距离,并且计算最近两点 //double honLen; //double verLen; //double dDist = -1; //globeControl1.Globe.Analysis3D.ComputeTwoGeoPolylineDistance(line1, line2, out pntIntersect1, out pntIntersect2, false); //dDist = globeControl1.Globe.Analysis3D.ComputeHorizonDistance(line1, line2, out pntIntersect1, out pntIntersect2, out pntProIntersect1, out pntProIntersect2, false); // dDist = dDist - pipeStyle1.Radius - pipeStyle2.Radius; //if (dDist < Convert.ToDouble(textBoxX4.Text)) { #region ////添加碰撞点标注 //GSOGeoPolyline3D disline = new GSOGeoPolyline3D(); //GSOPoint3ds point3ds = new GSOPoint3ds(); //point3ds.Add(pntProIntersect1); //point3ds.Add(pntProIntersect2); //disline.AddPart(point3ds); //GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D(); //创建线的风格 ////设置透明度及颜色,FromArgb()中的四个参数分别为alpha、red、green、blue,取值范围为0到255 //style.LineColor = Color.GreenYellow; //style.LineWidth = 3; //设置线的宽度为3 //style.VertexVisible = true; //显示线的节点 //disline.Style = style; //把风格添加到线上 //disline.AltitudeMode = EnumAltitudeMode.Absolute; //GSOFeature f1 = new GSOFeature(); //f1.Geometry = disline; ////disFeature.Geometry = disline; //GSOGeoMarker markerDis = new GSOGeoMarker(); //markerDis.X = pntIntersect1.X; //markerDis.Y = pntIntersect1.Y; //markerDis.Z = (pntIntersect1.Z + pntIntersect2.Z) / 2; //markerDis.Text = dDist.ToString("0.00") + "米"; //markerDis.AltitudeMode = EnumAltitudeMode.Absolute; //GSOMarkerStyle3D styleMarker = new GSOMarkerStyle3D(); //GSOTextStyle styleText = new GSOTextStyle(); //styleText.IsSizeFixed = true; //styleText.ForeColor = Color.White; //styleText.FontSize = 20; //styleMarker.TextStyle = styleText; //markerDis.Style = styleMarker; //GSOFeature f2 = new GSOFeature(); //f2.Geometry = markerDis; //layerTemp.AddFeature(f1); //layerTemp.AddFeature(f2); #endregion feats2[j].HighLight = true; int idx = dataGridViewX9.Rows.Add(); dataGridViewX9.Rows[idx].Cells[0].Value = caption; dataGridViewX9.Rows[idx].Cells[1].Value = feat.Name; dataGridViewX9.Rows[idx].Cells[2].Value = pipelineLayerNames[i]; dataGridViewX9.Rows[idx].Cells[3].Value = feats2[j].Name; dataGridViewX9.Rows[idx].Cells[4].Value = Convert.ToDouble(textBoxX4.Text.Trim()).ToString("0.00"); pipeLength += line2.GetSpaceLength(true, 6378137); pipeCount++; } //line2.ReleaseInnerPointer(); //feat2.ReleaseInnerPointer(); } listBox3.Items.Add(pipelineLayerNames[i] + ":" + pipeCount.ToString() + "条,共" + pipeLength.ToString("0.00") + "米"); //feats2.ReleaseInnerPointer(); } //line1.ReleaseInnerPointer(); //feat.ReleaseInnerPointer(); } globeControl1.Refresh(); } private void CollisionAnalysis(int type, string caption,GSOFeature feat, double dis) {//type 0 垂直净距分析 1 碰撞分析 if (feat == null) { MessageBox.Show("请选择一条管线!"); return; } GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D; if (line1 == null) { MessageBox.Show("请选择一条管线!"); return; } double dWidth = 0.1; if (type != 1) { dWidth = Convert.ToDouble(textBoxX1.Text); } GSOGeoPolygon3D polygon = line1.CreateBuffer(dWidth, true, 5, true, false); if (type != 1) { GSOFeature new_feat = new GSOFeature(); new_feat.Geometry = polygon; polygonJingJuAnalysises.Add(new_feat); layerTemp.AddFeature(new_feat); } GSOFeatures feats = new GSOFeatures(); GSOPoint3d pntIntersect1 = new GSOPoint3d(); GSOPoint3d pntIntersect2 = new GSOPoint3d(); GSOPoint3d pntProIntersect1 = new GSOPoint3d(); GSOPoint3d pntProIntersect2 = new GSOPoint3d(); for (int l2 = 0; l2 < pipelineLayerNames.Count; l2++) { if (caption == pipelineLayerNames[l2]) { continue; } GSOLayer layer2 = globeControl1.Globe.Layers.GetLayerByCaption(pipelineLayerNames[l2]); if (layer2 != null) { GSOFeatureLayer flayer2 = layer2 as GSOFeatureLayer; GSOFeatureDataset fdataset2 = flayer2.Dataset as GSOFeatureDataset; GSOFeatures feats2 = Polygon_Contain_PointAnalysis(polygon, pipelineLayerNames[l2]); for (int j = 0; j < feats2.Length; j++) { GSOFeature feat2 = feats2[j]; GSOGeoPolyline3D line2 = feats2[j].Geometry as GSOGeoPolyline3D; if (line2 == null) continue; GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D; if (pipeStyle1 == null || pipeStyle2 == null) continue; // 计算两条线的距离和交点,若果失败返回-1 // 若在同一直线上,并且有交点,返回0 // 若不在同一平面,返回最近两点的距离,并且计算最近两点 double dDist = -1; dDist = globeControl1.Globe.Analysis3D.ComputeVerticalDistance(line1, line2, out pntIntersect1, out pntIntersect2, out pntProIntersect1, out pntProIntersect2, false); //if (dDist > 0) { dDist = dDist - pipeStyle1.Radius - pipeStyle2.Radius; if (dDist < dis) { feat2.HighLight = true; int idx = -1; if (type == 0) { idx = dataGridViewX3.Rows.Add(); dataGridViewX3.Rows[idx].Cells[0].Value = caption; dataGridViewX3.Rows[idx].Cells[1].Value = feat.Name; dataGridViewX3.Rows[idx].Cells[2].Value = layer2.Caption; dataGridViewX3.Rows[idx].Cells[3].Value = feats2[j].Name; dataGridViewX3.Rows[idx].Cells[4].Value = dDist.ToString("0.00"); } else if (type == 1) { idx = dataGridViewX5.Rows.Add(); dataGridViewX5.Rows[idx].Cells[0].Value = dataGridViewX4.Rows[0].Cells[0].Value.ToString(); dataGridViewX5.Rows[idx].Cells[1].Value = feat.Name; dataGridViewX5.Rows[idx].Cells[2].Value = layer2.Caption; dataGridViewX5.Rows[idx].Cells[3].Value = feats2[j].Name; } if (featCount.ContainsKey(layer2.Caption)) { featCount[layer2.Caption] = featCount[layer2.Caption] + 1; } else { featCount.Add(layer2.Caption, 1); } if (featLenth.ContainsKey(layer2.Caption)) { featLenth[layer2.Caption] = featLenth[layer2.Caption] + line2.GetSpaceLength(true, 6378137); } else { featLenth.Add(layer2.Caption, line2.GetSpaceLength(true, 6378137)); } } } line2.ReleaseInnerPointer(); feat2.ReleaseInnerPointer(); } feats2.ReleaseInnerPointer(); } } line1.ReleaseInnerPointer(); feat.ReleaseInnerPointer(); } private void CollisionAnalysis_shuiping(int type, string caption, GSOFeature feat, double dis) { if (feat == null) { MessageBox.Show("请选择一条管线!"); return; } GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D; if (line1 == null) { MessageBox.Show("请选择一条管线!"); return; } GSOGeoPolygon3D polygon = line1.CreateBuffer(Convert.ToDouble(textBoxX4.Text.Trim()), true, 5, true, false); GSOFeature new_feat = new GSOFeature(); new_feat.Geometry = polygon; polygonJingJuAnalysises.Add(new_feat); layerTemp.AddFeature(new_feat); GSOFeatures feats = new GSOFeatures(); for (int l2 = 0; l2 < pipelineLayerNames.Count; l2++) { if (caption == pipelineLayerNames[l2]) { continue; } GSOLayer layer2 = globeControl1.Globe.Layers.GetLayerByCaption(pipelineLayerNames[l2]); if (layer2 != null) { GSOFeatureLayer flayer2 = layer2 as GSOFeatureLayer; GSOFeatureDataset fdataset2 = flayer2.Dataset as GSOFeatureDataset; GSOFeatures feats2 = Polygon_Contain_PointAnalysis(polygon, pipelineLayerNames[l2]); for (int j = 0; j < feats2.Length; j++) { GSOFeature feat2 = feats2[j]; GSOGeoPolyline3D line2 = feats2[j].Geometry as GSOGeoPolyline3D; if (line2 == null) continue; GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D; if (pipeStyle1 == null || pipeStyle2 == null) { continue; } feat2.HighLight = true; int idx = -1; if (type == 0) { idx = dataGridViewX9.Rows.Add(); dataGridViewX9.Rows[idx].Cells[0].Value = caption; dataGridViewX9.Rows[idx].Cells[1].Value = feat.Name; dataGridViewX9.Rows[idx].Cells[2].Value = layer2.Caption; dataGridViewX9.Rows[idx].Cells[3].Value = feats2[j].Name; dataGridViewX9.Rows[idx].Cells[4].Value = Convert.ToDouble(textBoxX4.Text.Trim()).ToString("0.00"); } else if (type == 1) { idx = dataGridViewX5.Rows.Add(); dataGridViewX5.Rows[idx].Cells[0].Value = dataGridViewX4.Rows[0].Cells[0].Value.ToString(); dataGridViewX5.Rows[idx].Cells[1].Value = feat.Name; dataGridViewX5.Rows[idx].Cells[2].Value = layer2.Caption; dataGridViewX5.Rows[idx].Cells[3].Value = feats2[j].Name; } if (featCount.ContainsKey(layer2.Caption)) { featCount[layer2.Caption] = featCount[layer2.Caption] + 1; } else { featCount.Add(layer2.Caption, 1); } if (featLenth.ContainsKey(layer2.Caption)) { featLenth[layer2.Caption] = featLenth[layer2.Caption] + line2.GetSpaceLength(true, 6378137); } else { featLenth.Add(layer2.Caption, line2.GetSpaceLength(true, 6378137)); } } } } } #region //private void CollisionAnalysis(int type, GSOFeature feat, double dis) //{//type 0 垂直净距分析 1 碰撞分析 // feats_wushui = new GSOFeatures(); // feats_ranqi = new GSOFeatures(); // feats_yushui = new GSOFeatures(); // if (feat == null) // { // MessageBox.Show("请选择一条管线!"); // return; // } // GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D; // if (line1 == null) // { // MessageBox.Show("请选择一条管线!"); // return; // } // GSOPoint3d pntIntersect1 = new GSOPoint3d(); // GSOPoint3d pntIntersect2 = new GSOPoint3d(); // for (int l2 = 0; l2 < globeControl1.Globe.Layers.Count; l2++) // { // GSOLayer layer2 = globeControl1.Globe.Layers[l2]; // if (layer2.Caption.Contains("污水管线") || layer2.Caption.Contains("雨水管线v1") || layer2.Caption.Contains("燃气管线v3")) // { // GSOFeatureLayer flayer2 = layer2 as GSOFeatureLayer; // GSOFeatureDataset fdataset2 = flayer2.Dataset as GSOFeatureDataset; // GSOFeatures feats2 = flayer2.GetAllFeatures(); // for (int j = 0; j < feats2.Length; j++) // { // GSOFeature feat2 = feats2[j]; // GSOGeoPolyline3D line2 = feats2[j].Geometry as GSOGeoPolyline3D; // if (line2 == null) continue; // GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; // GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D; // if (pipeStyle1 == null || pipeStyle2 == null) continue; // // 计算两条线的距离和交点,若果失败返回-1 // // 若在同一直线上,并且有交点,返回0 // // 若不在同一平面,返回最近两点的距离,并且计算最近两点 // double dDist = globeControl1.Globe.Analysis3D.ComputeTwoGeoPolylineDistance(line1, line2, out pntIntersect1, out pntIntersect2, false); // if (dDist > -1) // { // if (dDist != 0) // { // dDist = dDist - pipeStyle1.Radius - pipeStyle2.Radius; // if (dDist < dis) // { // //添加碰撞点标注 // GSOGeoPolyline3D disline = new GSOGeoPolyline3D(); // GSOPoint3ds point3ds = new GSOPoint3ds(); // point3ds.Add(pntProIntersect1); // point3ds.Add(pntProIntersect2); // disline.AddPart(point3ds); // GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D(); //创建线的风格 // //设置透明度及颜色,FromArgb()中的四个参数分别为alpha、red、green、blue,取值范围为0到255 // style.LineColor = Color.GreenYellow; // style.LineWidth = 3; //设置线的宽度为3 // style.VertexVisible = true; //显示线的节点 // disline.Style = style; //把风格添加到线上 // disline.AltitudeMode = EnumAltitudeMode.Absolute; // GSOFeature f1 = new GSOFeature(); // f1.Geometry = disline; // //disFeature.Geometry = disline; // GSOGeoMarker markerDis = new GSOGeoMarker(); // markerDis.X = pntIntersect1.X; // markerDis.Y = pntIntersect1.Y; // markerDis.Z = (pntIntersect1.Z + pntIntersect2.Z) / 2; // markerDis.Text = dDist.ToString().Substring(0, dDist.ToString().IndexOf(".") + 3) + "米"; // markerDis.AltitudeMode = EnumAltitudeMode.Absolute; // GSOMarkerStyle3D styleMarker = new GSOMarkerStyle3D(); // GSOTextStyle styleText = new GSOTextStyle(); // styleText.IsSizeFixed = true; // styleText.ForeColor = Color.White; // styleText.FontSize = 20; // styleMarker.TextStyle = styleText; // markerDis.Style = styleMarker; // GSOFeature f2 = new GSOFeature(); // f2.Geometry = markerDis; // layerTemp.AddFeature(f1); // layerTemp.AddFeature(f2); // int idx = -1; // switch (layer2.Caption) // { // case "污水管线": // feats_wushui.Add(feats2[j]); // if (type == 0) // { // idx = dataGridViewX3.Rows.Add(); // dataGridViewX3.Rows[idx].Cells[0].Value = "污水管线"; // dataGridViewX3.Rows[idx].Cells[1].Value = feats2[j].Name; // dataGridViewX3.Rows[idx].Cells[2].Value = dDist; // } // else if (type == 1) // { // idx = dataGridViewX5.Rows.Add(); // dataGridViewX5.Rows[idx].Cells[0].Value = "污水管线"; // dataGridViewX5.Rows[idx].Cells[1].Value = feats2[j].Name; // } // totalLength_Wushui += line2.GetSpaceLength(true, 6378137); // m_WushuiCount++; // //pnts_wushui.Add(pntIntersect1); // break; // case "雨水管线v1": // feats_yushui.Add(feats2[j]); // if (type == 0) // { // idx = dataGridViewX3.Rows.Add(); // dataGridViewX3.Rows[idx].Cells[0].Value = "雨水管线v1"; // dataGridViewX3.Rows[idx].Cells[1].Value = feats2[j].Name; // dataGridViewX3.Rows[idx].Cells[2].Value = dDist; // } // else if (type == 1) // { // idx = dataGridViewX5.Rows.Add(); // dataGridViewX5.Rows[idx].Cells[0].Value = "雨水管线v1"; // dataGridViewX5.Rows[idx].Cells[1].Value = feats2[j].Name; // } // totalLength_Yushui += line2.GetSpaceLength(true, 6378137); // m_YushuiCount++; // //pnts_yushui.Add(pntIntersect1); // break; // case "燃气管线v3": // feats_ranqi.Add(feats2[j]); // if (type == 0) // { // idx = dataGridViewX3.Rows.Add(); // dataGridViewX3.Rows[idx].Cells[0].Value = "燃气管线v3"; // dataGridViewX3.Rows[idx].Cells[1].Value = feats2[j].Name; // dataGridViewX3.Rows[idx].Cells[2].Value = dDist; // } // else if (type == 1) // { // idx = dataGridViewX5.Rows.Add(); // dataGridViewX5.Rows[idx].Cells[0].Value = "燃气管线v3"; // dataGridViewX5.Rows[idx].Cells[1].Value = feats2[j].Name; // } // totalLength_Ranqi += line2.GetSpaceLength(true, 6378137); // m_RanqiCount++; // // pnts_ranqi.Add(pntIntersect1); // break; // } // } // } // } // line2.ReleaseInnerPointer(); // feat2.ReleaseInnerPointer(); // } // feats2.ReleaseInnerPointer(); // } // } // line1.ReleaseInnerPointer(); // feat.ReleaseInnerPointer(); // //if (feats_wushui.Length + feats_yushui.Length + feats_ranqi.Length <= 0) // //{ // // MessageBox.Show("没有找到碰撞的管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); // // //if (frmCollisionAnalysis != null) // // //{ // // // frmCollisionAnalysis.Close(); // // //} // //} // //else // //{ // //} //} #endregion private void buttonItem21_Click(object sender, EventArgs e) { GSOFeature f = globeControl1.Globe.SelectedObject; if (f != null && f.Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; GSOGeoPolygon3D polygon = line.CreateBuffer(10, true, 5, true, false); GSOFeature feature = new GSOFeature(); feature.Geometry = polygon; globeControl1.Globe.MemoryLayer.AddFeature(feature); } } private void dataGridViewX3_MouseDoubleClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { DataGridView.HitTestInfo hittestinfo = dataGridViewX3.HitTest(e.X, e.Y); if (hittestinfo.RowIndex > -1) { string featureName = dataGridViewX3.Rows[hittestinfo.RowIndex].Cells[1].Value.ToString(); featureName = featureName.Trim(); //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[currentQueryLayer])); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX3.Rows[hittestinfo.RowIndex].Cells["图层"].Value.ToString()); // GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption("reli"); if (layer != null) { GSOFeatures features = layer.GetFeatureByName(featureName, false); for (int j = 0; j < features.Length; j++) { if (features[j].GetFieldDefn("编号") != null && features[j].GetValue("编号").ToString() == featureName) { m_feature = features[j]; if (m_feature.Geometry != null && m_feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOGeoPolyline3D line = m_feature.Geometry as GSOGeoPolyline3D; double length = line.GetSpaceLength(true, 6378137); GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2); GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1]; globeControl1.Globe.JumpToPosition(point3d, EnumAltitudeMode.Absolute,5); } else { globeControl1.Globe.JumpToFeature(m_feature, 5); } break; } else if (features[j].Name == featureName) { m_feature = features[j]; if (m_feature.Geometry != null && m_feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOGeoPolyline3D line = m_feature.Geometry as GSOGeoPolyline3D; double length = line.GetSpaceLength(true, 6378137); GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2); GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1]; globeControl1.Globe.JumpToPosition(point3d, EnumAltitudeMode.Absolute, 5); } else { globeControl1.Globe.JumpToFeature(m_feature, 5); } break; } } } } } } private void dataGridViewX3_MouseDoubleClick_shuiping(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { DataGridView.HitTestInfo hittestinfo = dataGridViewX9.HitTest(e.X, e.Y); if (hittestinfo.RowIndex > -1) { string featureName = dataGridViewX9.Rows[hittestinfo.RowIndex].Cells[1].Value.ToString(); featureName = featureName.Trim(); //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[currentQueryLayer])); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX9.Rows[hittestinfo.RowIndex].Cells[0].Value.ToString()); // GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption("reli"); if (layer != null) { GSOFeatures features = layer.GetFeatureByName(featureName, false); for (int j = 0; j < features.Length; j++) { if (features[j].GetFieldDefn("编号") != null && features[j].GetValue("编号").ToString() == featureName) { m_feature = features[j]; if (m_feature.Geometry != null && m_feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOGeoPolyline3D line = m_feature.Geometry as GSOGeoPolyline3D; double length = line.GetSpaceLength(true, 6378137); GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2); GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1]; globeControl1.Globe.JumpToPosition(point3d, EnumAltitudeMode.Absolute, 5); } else { globeControl1.Globe.JumpToFeature(m_feature, 5); } break; } else if (features[j].Name == featureName) { m_feature = features[j]; if (m_feature.Geometry != null && m_feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOGeoPolyline3D line = m_feature.Geometry as GSOGeoPolyline3D; double length = line.GetSpaceLength(true, 6378137); GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2); GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1]; globeControl1.Globe.JumpToPosition(point3d, EnumAltitudeMode.Absolute, 5); } else { globeControl1.Globe.JumpToFeature(m_feature, 5); } break; } } } } } } private void buttonX2_Click(object sender, EventArgs e) { trackflag = ""; globeControl1.Globe.Action = EnumAction3D.ActionNull; listBox1.Items.Clear(); checkBoxX1.Checked = false; checkBoxX2.Checked = false; comboBoxEx1.SelectedIndex = -1; comboBoxEx1.Enabled = false; layerTemp.RemoveAllFeature(); globeControl1.Refresh(); dataGridViewX2.Rows.Clear(); dataGridViewX3.Rows.Clear(); } private void buttonX2_Click_shuiping(object sender, EventArgs e) { trackflag = ""; globeControl1.Globe.Action = EnumAction3D.ActionNull; listBox3.Items.Clear(); checkBoxX7.Checked = false; checkBoxX8.Checked = false; comboBoxEx4.SelectedIndex = -1; comboBoxEx4.Enabled = false; layerTemp.RemoveAllFeature(); globeControl1.Refresh(); dataGridViewX8.Rows.Clear(); dataGridViewX9.Rows.Clear(); } private void textBoxX1_KeyPress(object sender, KeyPressEventArgs e) { //if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8) //{ // e.Handled = true;//屏蔽 //} TextBox text = sender as TextBox; if ((e.KeyChar < 48 || e.KeyChar > 57) && (e.KeyChar != 8) && (int)e.KeyChar != 46) { e.Handled = true; } if ((int)e.KeyChar == 46) //小数点 { if (text.Text.Length <= 0) e.Handled = true; //小数点不能在第一位 else //处理不规则的小数点 { float f; float oldf; bool b1 = false, b2 = false; b1 = float.TryParse(text.Text, out oldf); b2 = float.TryParse(text.Text + e.KeyChar.ToString(), out f); if (b2 == false) { if (b1 == true) e.Handled = true; else e.Handled = false; } } } } private void buttonX3_Click_pengZhuang(object sender, EventArgs e) { for (int i = 0; i < polygonJingJuAnalysises.Length; i++) { polygonJingJuAnalysises[i].Delete(); } globeControl1.Globe.Refresh(); } private void buttonX3_Click(object sender, EventArgs e) { for (int i = 0; i < polygonJingJuAnalysises.Length; i++) { polygonJingJuAnalysises[i].Delete(); } globeControl1.Globe.Refresh(); //trackflag = ""; //globeControl1.Globe.Action = EnumAction3D.ActionNull; //sideBarPanelItem4.Visible = false; //panel2.Visible = false; //checkBoxX1.Checked = false; //checkBoxX2.Checked = false; //comboBoxEx1.SelectedIndex = -1; //dataGridViewX2.Rows.Clear(); //dataGridViewX3.Rows.Clear(); //if (buttonItem1.Checked) //{ // sideBar1.ExpandedPanel = sideBarPanelItem3; //} //else //{ // sideBar1.Visible = false; //} //Refresh(); } private void BaselineProfileAnalysisMenuItem_Click(object sender, EventArgs e)//基线剖面分析 { if (!BaselineProfileAnalysisMenuItem.Checked) { globeControl1.Globe.Action = EnumAction3D.TrackPolyline; //globeControl1.Globe.TrackPolylineAnalysis.VerticalLineVisible = true; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true; BaselineProfileAnalysisMenuItem.Checked = true; } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; BaselineProfileAnalysisMenuItem.Checked = false; //globeControl1.Globe.TrackPolylineAnalysis.VerticalLineVisible = false; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = false; } ActionToolMenuChecked(); } private void btnPolygonDigPit_Click(object sender, EventArgs e)//多边形挖坑 { trackflag = "pit"; globeControl1.Globe.Action = EnumAction3D.TrackPolygon; } private void buttonItem3_Click(object sender, EventArgs e) { globeControl1.Globe.RemoveAllPits(); } private void DigFillAnalysisMenuItem_Click(object sender, EventArgs e)//挖方量分析 { trackflag = "digFillAnalysis"; globeControl1.Globe.Action = EnumAction3D.TrackPolygon; ActionToolMenuChecked(); } private void btnItemHelp_Click(object sender, EventArgs e) { } private void buttonX4_Click(object sender, EventArgs e) { if (dataGridViewX3.Rows.Count > 0) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "Excel files (*.xls)|*.xls"; dlg.FilterIndex = 0; dlg.RestoreDirectory = true; //dlg.CreatePrompt = true; dlg.Title = "保存为Excel文件"; dlg.FileName = "垂直净距分析" + "-" + DateTime.Now.ToString("yyyyMMdd") + ".xls"; if (dlg.ShowDialog() == DialogResult.OK) { Stream myStream; myStream = dlg.OpenFile(); StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0)); string columnTitle = ""; try { string strList = ""; for (int i = 0; i < listBox1.Items.Count; i++) { strList += listBox1.Items[i].ToString()+ @"/"; } sw.WriteLine("内容:垂直净距分析 日期:" + DateTime.Now.ToString("yyyy-MM-dd") +" 结果:"+strList); //写入列标题 for (int i = 0; i < dataGridViewX3.ColumnCount; i++) { if (i > 0) { columnTitle += "\t"; } columnTitle += dataGridViewX3.Columns[i].HeaderText; } sw.WriteLine(columnTitle); //写入列内容 for (int j = 0; j < dataGridViewX3.Rows.Count; j++) { string columnValue = ""; for (int k = 0; k < dataGridViewX3.Columns.Count; k++) { if (k > 0) { columnValue += "\t"; } if (dataGridViewX3.Rows[j].Cells[k].Value == null) columnValue += ""; else columnValue += dataGridViewX3.Rows[j].Cells[k].Value.ToString().Trim(); } sw.WriteLine(columnValue); } sw.Close(); myStream.Close(); if (MessageBox.Show("导出Excel文件成功!是否打开?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { System.Diagnostics.Process.Start(dlg.FileName); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { sw.Close(); myStream.Close(); } } } } private void buttonX4_Click_shuiping(object sender, EventArgs e) { if (dataGridViewX9.Rows.Count > 0) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "Excel files (*.xls)|*.xls"; dlg.FilterIndex = 0; dlg.RestoreDirectory = true; //dlg.CreatePrompt = true; dlg.Title = "保存为Excel文件"; dlg.FileName = "垂直净距分析" + "-" + DateTime.Now.ToString("yyyyMMdd") + ".xls"; if (dlg.ShowDialog() == DialogResult.OK) { Stream myStream; myStream = dlg.OpenFile(); StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0)); string columnTitle = ""; try { string strList = ""; for (int i = 0; i < listBox3.Items.Count; i++) { strList += listBox3.Items[i].ToString() + @"/"; } sw.WriteLine("内容:垂直净距分析 日期:" + DateTime.Now.ToString("yyyy-MM-dd") + " 结果:" + strList); //写入列标题 for (int i = 0; i < dataGridViewX9.ColumnCount; i++) { if (i > 0) { columnTitle += "\t"; } columnTitle += dataGridViewX9.Columns[i].HeaderText; } sw.WriteLine(columnTitle); //写入列内容 for (int j = 0; j < dataGridViewX9.Rows.Count; j++) { string columnValue = ""; for (int k = 0; k < dataGridViewX9.Columns.Count; k++) { if (k > 0) { columnValue += "\t"; } if (dataGridViewX9.Rows[j].Cells[k].Value == null) columnValue += ""; else columnValue += dataGridViewX9.Rows[j].Cells[k].Value.ToString().Trim(); } sw.WriteLine(columnValue); } sw.Close(); myStream.Close(); if (MessageBox.Show("导出Excel文件成功!是否打开?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { System.Diagnostics.Process.Start(dlg.FileName); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { sw.Close(); myStream.Close(); } } } } private eOffice2007ColorScheme scheme = eOffice2007ColorScheme.VistaGlass; private void command1_Executed(object sender, EventArgs e) { ICommandSource source = sender as ICommandSource; if (source.CommandParameter is string) { eOffice2007ColorScheme colorScheme = (eOffice2007ColorScheme)Enum.Parse(typeof(eOffice2007ColorScheme), source.CommandParameter.ToString()); ribbonControl1.Office2007ColorTable = colorScheme; } } private void ribbonTabItem2_Click(object sender, EventArgs e) { } private void ribbonTabItem13_Click(object sender, EventArgs e) { } private void ribbonTabItem12_Click(object sender, EventArgs e) { } private void LaunchRibbonDialog(object sender, System.EventArgs e) { MessageBoxEx.Show("Start <i>Ribbon Dialog</i> with more options here...", "Ribbon Demo", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void buttonItem102_Click(object sender, EventArgs e)//坐标查询 { FrmSetLatLonPos.ShowForm(globeControl1); //frm.Show(this); } private void buttonItem28_Click(object sender, EventArgs e)//沿线挖坑 { if (!buttonItem28.Checked) { FrmDigPitSetting dlg = new FrmDigPitSetting(m_dDigPitValue, m_bDigPitByDepth, m_dDigPitWidthAlongLine); if (dlg.ShowDialog() == DialogResult.OK) { m_dDigPitValue = dlg.m_dDigPitValue; m_bDigPitByDepth = dlg.m_bDigPitByDepth; m_dDigPitWidthAlongLine = dlg.m_dDigPitWidthAlongLine; trackflag = "LineDigPit"; globeControl1.Globe.Action = EnumAction3D.TrackPolyline; //globeControl1.Globe.TrackPolylineAnalysis.VerticalLineVisible = true; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true; buttonItem28.Checked = true; } } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; buttonItem28.Checked = false; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = false; //globeControl1.Globe.TrackPolylineAnalysis.VerticalLineVisible = false; } ActionToolMenuChecked(); } private void buttonItem29_Click(object sender, EventArgs e)//可视域分析 { globeControl1.Globe.Action = EnumAction3D.ViewshedAnalysis; } private void buttonItem30_Click(object sender, EventArgs e)//可视包络分析 { globeControl1.Globe.Action = EnumAction3D.ViewEnvelopeAnalysis; } private void buttonItem32_Click(object sender, EventArgs e) { buttonItem32.Checked = !buttonItem32.Checked; ribbonBarJJ.Visible = buttonItem32.Checked; ribbonBarJJ.Location = new Point(0, 0); //if (buttonItem32.Checked || buttonItem33.Checked || buttonItem34.Checked || buttonItem35.Checked || buttonItem49.Checked) //{ // ribbonBar1.Visible = true; //} //else //{ // ribbonBar1.Visible = false; //} } private void buttonItem33_Click(object sender, EventArgs e) { buttonItem33.Checked = !buttonItem33.Checked; ribbonBarDM.Visible = buttonItem33.Checked; ribbonBarDM.Location = new Point(0, 0); //if (buttonItem32.Checked || buttonItem33.Checked || buttonItem34.Checked || buttonItem35.Checked || buttonItem49.Checked) //{ // ribbonBar1.Visible = true; //} //else //{ // ribbonBar1.Visible = false; //} } private void buttonItem35_Click(object sender, EventArgs e) { buttonItem35.Checked = !buttonItem35.Checked; ribbonBarKW.Visible = buttonItem35.Checked; ribbonBarKW.Location = new Point(0, 0); //if (buttonItem32.Checked || buttonItem33.Checked || buttonItem34.Checked || buttonItem35.Checked || buttonItem49.Checked) //{ // ribbonBar1.Visible = true; //} //else //{ // ribbonBar1.Visible = false; //} } private void buttonItem49_Click(object sender, EventArgs e) { buttonItem49.Checked = !buttonItem49.Checked; ribbonBarSY.Visible = buttonItem49.Checked; ribbonBarSY.Location = new Point(0, 0); //if (buttonItem32.Checked || buttonItem33.Checked || buttonItem34.Checked || buttonItem35.Checked || buttonItem49.Checked) //{ // ribbonBar1.Visible = true; //} //else //{ // ribbonBar1.Visible = false; //} } private void buttonItem34_Click(object sender, EventArgs e) { buttonItem34.Checked = !buttonItem34.Checked; ribbonBarTP.Visible = buttonItem34.Checked; ribbonBarTP.Location = new Point(0, 0); //if (buttonItem32.Checked || buttonItem33.Checked || buttonItem34.Checked || buttonItem35.Checked || buttonItem34.Checked) //{ // ribbonBar1.Visible = true; //} //else //{ // ribbonBar1.Visible = false; //} } private void buttonItem17_Click_1(object sender, EventArgs e)//大气层 { globeControl1.Globe.Atmosphere.Visible = !globeControl1.Globe.Atmosphere.Visible; buttonItem17.Checked = globeControl1.Globe.Atmosphere.Visible; globeControl1.Refresh(); } private void buttonItem20_Click(object sender, EventArgs e)//经纬网 { globeControl1.Globe.LatLonGrid.Visible = !globeControl1.Globe.LatLonGrid.Visible; buttonItem20.Checked = globeControl1.Globe.LatLonGrid.Visible; globeControl1.Globe.Refresh(); } private void buttonItem21_Click_1(object sender, EventArgs e)//状态条 { globeControl1.Globe.StatusBar.Visible = !globeControl1.Globe.StatusBar.Visible; buttonItem21.Checked = globeControl1.Globe.StatusBar.Visible; //btnToolNone.Visible = true; //btnToolSelect.Visible = true; globeControl1.Globe.Refresh(); } private void buttonItem22_Click(object sender, EventArgs e)//大理石表面 { globeControl1.Globe.MarbleVisible = !globeControl1.Globe.MarbleVisible; buttonItem22.Checked = globeControl1.Globe.MarbleVisible; } private void buttonItem25_Click(object sender, EventArgs e) { if (globeControl1.Globe.Atmosphere.Visible) { globeControl1.Globe.Atmosphere.ShaderUsing = !globeControl1.Globe.Atmosphere.ShaderUsing; buttonItem25.Checked = !buttonItem25.Checked; globeControl1.Refresh(); } else { MessageBox.Show("请先设置大气层可见!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information); } } private void buttonItem24_Click(object sender, EventArgs e) { globeControl1.Globe.Antialiasing = !globeControl1.Globe.Antialiasing; buttonItem24.Checked = globeControl1.Globe.Antialiasing; globeControl1.Refresh(); } private void buttonItem52_Click(object sender, EventArgs e) { FrmSceneLightSet dlg = new FrmSceneLightSet(); dlg.light = globeControl1.Globe.SceneLight; dlg.globeControl = globeControl1; if (dlg.ShowDialog() == DialogResult.OK) { } } private void buttonItem53_Click(object sender, EventArgs e)//模型点模式 { globeControl1.Globe.ModelRenderDetail = EnumRenderDetail.Points; buttonItem53.Checked = true; buttonItem54.Checked = false; buttonItem55.Checked = false; buttonItem58.Checked = false; globeControl1.Refresh(); } private void buttonItem54_Click(object sender, EventArgs e)//模型实体模式 { globeControl1.Globe.ModelRenderDetail = EnumRenderDetail.Solid; buttonItem54.Checked = true; buttonItem53.Checked = false; buttonItem55.Checked = false; buttonItem58.Checked = false; globeControl1.Refresh(); } private void buttonItem55_Click(object sender, EventArgs e)//模型纹理模式 { globeControl1.Globe.ModelRenderDetail = EnumRenderDetail.Texture; buttonItem54.Checked = false; buttonItem53.Checked = false; buttonItem55.Checked = true; buttonItem58.Checked = false; globeControl1.Refresh(); } private void buttonItem58_Click_1(object sender, EventArgs e)//模型线框模式 { globeControl1.Globe.ModelRenderDetail = EnumRenderDetail.WireFrame; buttonItem54.Checked = false; buttonItem53.Checked = false; buttonItem55.Checked = false; buttonItem58.Checked = true; globeControl1.Refresh(); } private void buttonItem60_Click(object sender, EventArgs e) { globeControl1.Globe.UsingFBO = !globeControl1.Globe.UsingFBO; buttonItem60.Checked = globeControl1.Globe.UsingFBO; globeControl1.Refresh(); } private void buttonItem61_Click(object sender, EventArgs e) { globeControl1.Globe.UsingVBO = !globeControl1.Globe.UsingVBO; buttonItem61.Checked = globeControl1.Globe.UsingVBO; globeControl1.Refresh(); } private void buttonItem92_Click(object sender, EventArgs e)//飞行到目标点 { //{ // //for (int i = 0; i <Utility.dataSource.DatasetCount; i++) // //{ // // GSODataset dataset = Utility.dataSource.GetDatasetAt(i); // // if (dataset != null && dataset.Name == "大兴热力管线" || dataset.Name == "大兴热力工井" || dataset.Name == "大兴热力阀门") // // { // // dataset.Caption = dataset.Name; // // GSOLayer layer = globeControl1.Globe.Layers.Add(dataset); // // //layer.MaxVisibleAltitude = 7000; // // //listLayerCaption.Add(layer.Caption); // // } // //} //} //globeControl1.Globe.FlyToPosition(new GSOPoint3d(116.281704, 39.746679, 0), EnumAltitudeMode.RelativeToGround); FrmSetFlytoPos.ShowForm(globeControl1); } private void buttonItem56_Click(object sender, EventArgs e)//绕中心点飞行 { globeControl1.Globe.FlyAroundCenter(10000, EnumFlyRepeatValueType.MiliSeconds); globeControl1.Globe.CurFlyID = 1; } private void buttonItem57_Click(object sender, EventArgs e)//绕眼睛飞行 { globeControl1.Globe.FlyAroundEye(720, EnumFlyRepeatValueType.Degrees); globeControl1.Globe.CurFlyID = 2; } private void buttonItem15_Click(object sender, EventArgs e)//自定义飞行 { GSOGeoPolyline3D line = getSelectObject(); if (line == null) { MessageBox.Show("请先选中一条线!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information); globeControl1.Globe.Action = EnumAction3D.SelectObject; return; } FrmFlySetDlg dlg = new FrmFlySetDlg(); dlg.dFlyAboveLine = m_dFlyAboveLine; dlg.dFlyAloneLineSpeed = m_dFlyAlongLineSpeed; dlg.dFlyAloneLineRotateSpeed = m_dFlyAlongLineRotateSpeed; if (dlg.ShowDialog() == DialogResult.OK) { m_dFlyAboveLine = dlg.dFlyAboveLine; m_dFlyAlongLineSpeed = dlg.dFlyAloneLineSpeed; m_dFlyAlongLineRotateSpeed = dlg.dFlyAloneLineRotateSpeed; globeControl1.Globe.FlyAlongLineSpeed = m_dFlyAlongLineSpeed; globeControl1.Globe.FlyAlongLineRotateSpeed = m_dFlyAlongLineRotateSpeed; globeControl1.Globe.FlyEyeAlongWithLine(line, m_dFlyAboveLine, 85, true, 0, false); } } private GSOGeoPolyline3D getSelectObject() { GSOGeoPolyline3D line = null; GSOFeature f = globeControl1.Globe.SelectedObject; if (f != null && f.Geometry != null) { line = f.Geometry as GSOGeoPolyline3D; } return line; } private void btnAddData_Click(object sender, EventArgs e) { AddLayerData(); } private void AddLayerData() { OpenFileDialog dlg = new OpenFileDialog(); //dlg.Filter = "支持格式(*.lrp,*.tif,*.tiff,*.img,*.asc,*.raw,*.dem,*.adf,*.idr,* .sid,*.ecw,*.e00,*.ers,*.hdr,*.grd,*.lrc,*.git,*.gtt,*.kml,*.lgd,*.shp,*.dxf,*.mif,*.tab,*.dgn,*.vec,*.gml,*.gft)|*.lrp;*.tif;*.tiff;*.img;*.asc;*.raw;*.dem;*.adf;*.idr;*.sid;*.ecw;*.e00;*.ers;*hdr;*.grd;*.lrc;*.git;*.gtt;*.kml;*.lgd;*.shp;*.dxf;*.mif;*.tab;*.dgn;*.vec;*.gml;*.gft|栅格数据(*.lrp)|*.lrp|栅格缓存(*.lrc)|*.lrc|KML数据(*.kml)|*.kml|矢量数据(*.lgd)|*.lgd|矢量缓存(*.gft)|*.gft|其它格式(*.*)|*.*||"; dlg.Filter = "支持格式(*.lrp,*.tif,*.tiff,*.img,*.lrc,*.git,*.gtt,*.kml,*.lgd,*.shp,*.gft)|*.lrp;*.tif;*.tiff;*.img;*.lrc;*.git;*.gtt;*.kml;*.lgd;*.shp;*.gft|栅格数据(*.lrp)|*.lrp|栅格缓存(*.lrc)|*.lrc|KML数据(*.kml)|*.kml|矢量数据(*.lgd)|*.lgd|矢量缓存(*.gft)|*.gft|其它格式(*.*)|*.*||"; dlg.Multiselect = true; if (dlg.ShowDialog() == DialogResult.OK) { for (int i = 0; i < dlg.FileNames.Length; i++) { AddLayerData(dlg.FileNames[i]); } layerManagerNode.Expand(); } } private object AddLayerData(string strDataPath) { object objRes = null; if (Path.GetExtension(strDataPath).ToLower().Equals(".kml")) { GSOLayer layer = globeControl1.Globe.Layers.Add(strDataPath); objRes = layer; if (layer != null) { GSODataset dataset = layer.Dataset; CheckDatasetGeoReference(layer.Dataset); TreeNode node = new TreeNode(); node.Tag = layer; node.Text = layer.Dataset.Caption; node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Checked = layer.Visible; // 注意用insert不要用add,因为后加入的图层在上层 //layerManagerNode.Nodes.Add(node); layerManagerNode.Nodes.Insert(0, node); } } else if (GSOUtility.IsDatasetSupportTerrain(strDataPath)) { GSOTerrain terrain = globeControl1.Globe.Terrains.Add(strDataPath); objRes = terrain; if (terrain != null) { TreeNode node = new TreeNode(); node.Tag = terrain; node.Text = terrain.Caption; node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Checked = terrain.Visible; // 注意用insert不要用add,因为后加入的图层在上层 // terrainManagerNode.Nodes.Add(node); layerManagerNode.Nodes.Insert(0, node); } } else { GSOLayer layer = globeControl1.Globe.Layers.Add(strDataPath); objRes = layer; if (layer != null) { GSODataset dataset = layer.Dataset; CheckDatasetGeoReference(layer.Dataset); TreeNode node = new TreeNode(); node.Tag = layer; node.Text = layer.Dataset.Caption; node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Checked = layer.Visible; // 注意用insert不要用add,因为后加入的图层在上层 //layerManagerNode.Nodes.Add(node); layerManagerNode.Nodes.Insert(0, node); } } //RefreshDataTree(); return objRes; } private void RefreshDataTree() { layerTree.Nodes[0].Nodes.Clear(); Int32 nCount = globeControl1.Globe.DataManager.DataSourceCount; Int32 i = 0; for (i = 0; i < nCount; i++) { GSODataSource dataSpace = globeControl1.Globe.DataManager[i]; TreeNode node = new TreeNode(); node.Text = dataSpace.Name; node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Checked = true; node.Tag = dataSpace; Int32 nDatasetCount = dataSpace.DatasetCount; for (Int32 j = 0; j < nDatasetCount; j++) { GSODataset dataset = dataSpace[j]; TreeNode subNode = new TreeNode(); subNode.Text = dataset.Name; subNode.ImageIndex = 0; subNode.SelectedImageIndex = 0; subNode.Checked = true; subNode.Tag = dataset; node.Nodes.Add(subNode); } layerTree.Nodes[0].Nodes.Add(node); } } private void buttonItem90_Click(object sender, EventArgs e)//关键字查询 { FrmKeywordQuery.ShowForm(globeControl1, pipelineLayerNames, dataGridViewX1, panelEx6, toolStripNumbers, toolStripFeatureLength); } private void buttonItem103_Click(object sender, EventArgs e)//附属物查询 { FrmFittingQuery.ShowForm(globeControl1, instrumenLayerNames, dataGridViewX1, panelEx6, toolStripNumbers, toolStripFeatureLength); } private void buttonItem106_Click(object sender, EventArgs e)//基本查询 { FrmBasicQuery.ShowForm(globeControl1,dataGridViewX1,panelEx6, toolStripNumbers, toolStripFeatureLength); } private void buttonItem107_Click(object sender, EventArgs e)//复合查询 { if (dataGridViewX1.DataSource != null) { dataGridViewX1.DataSource = null; toolStripNumbers.Text = " 管线类型: " + currentQueryLayer + "|| 共有:" + 0 + " 条记录 || "; } List<string> newLayer = new List<string>(); foreach (TreeNode node in layerTree.Nodes) { if (node.Text == "新添加图层") { foreach (TreeNode nodeChild in node.Nodes) { if (nodeChild.Tag.ToString().Split('|')[1].ToString().Contains("管线")) { if (isornotFeatureDataset(nodeChild.Tag.ToString().Split('|')[1].ToString())) { newLayer.Add(nodeChild.Tag.ToString().Split('|')[1].ToString()); } } } } } FrmQuerySQL.ShowForm(globeControl1, dataGridViewX1,"admin", newLayer); } GSOFeatureDataset FdataSet; GSODataset dataSet; private bool isornotFeatureDataset(string layerName) { GSOLayer m_layer = globeControl1.Globe.Layers.GetLayerByCaption(layerName);//获取当前选择的layer图层 if (m_layer == null) return false; GSOFeatureLayer flayer = m_layer as GSOFeatureLayer; dataSet = m_layer.Dataset as GSODataset; FdataSet = dataSet as GSOFeatureDataset; FdataSet.Open(); if (FdataSet.FieldCount > 0) return true; else return false; } private void buttonItem59_Click(object sender, EventArgs e)//井盖全区域 { workWellLen.Clear(); List<GSOFeatures> list = new List<GSOFeatures>(); for (int i = 0; i < workwellLayerNames.Count; i++) { GSOFeatures fs = PolygonIntersectAnalysis_Well(null, workwellLayerNames[i]); list.Add(fs); } FrmAllWorkWellStatis frm = new FrmAllWorkWellStatis(workWellLen, list, dataGridViewX1, toolStripNumbers, globeControl1,panelEx6); frm.Show(this); } private GSOFeatures feats_wushui_well; private GSOFeatures feats_yushuib_well; private GSOFeatures feats_yushuij_well; private GSOFeatures feats_ranqi_well; private GSOFeatures PolygonIntersectAnalysis_Well(GSOGeoPolygon3D polygon, string pipelinetype)//全区域管线统计 { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(pipelinetype); if (layer == null) return null; GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats; if (polygon == null) { feats = flayer.GetAllFeatures(); } else { feats = flayer.FindFeaturesInPolygon(polygon, false); } workWellLen.Add(pipelinetype, feats.Length); return feats; } private void buttonItem62_Click(object sender, EventArgs e) { trackflag = "workwellquery"; globeControl1.Globe.Action = EnumAction3D.TrackPolygon; } private void checkBoxX3_CheckedChanged(object sender, EventArgs e) { clearFeatureHighLight(); if (checkBoxX3.Checked) { globeControl1.Globe.ClearAnalysis(); layerTemp.RemoveAllFeature(); globeControl1.Refresh(); comboBoxEx2.Enabled = false; dataGridViewX4.Rows.Clear(); dataGridViewX5.Rows.Clear(); trackflag = "collision"; globeControl1.Globe.Action = EnumAction3D.SelectObject; } else { comboBoxEx2.Enabled = true; } } private void checkBoxX4_CheckedChanged(object sender, EventArgs e) { clearFeatureHighLight(); comboBoxEx2.Enabled = checkBoxX4.Checked; if (checkBoxX4.Checked) { globeControl1.Globe.Action = EnumAction3D.ActionNull; trackflag = ""; dataGridViewX4.Rows.Clear(); dataGridViewX5.Rows.Clear(); comboBoxEx2.SelectedIndex = -1; } globeControl1.Globe.ClearAnalysis(); layerTemp.RemoveAllFeature(); globeControl1.Refresh(); } private void comboBoxEx2_SelectedIndexChanged(object sender, EventArgs e) { if (comboBoxEx2.SelectedIndex > -1) { listBox2.Items.Clear(); dataGridViewX4.Rows.Clear(); dataGridViewX5.Rows.Clear(); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx2.SelectedItem.ToString()); if (layer == null) return; GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = flayer.GetAllFeatures(); for (int i = 0; i < feats.Length; i++) { int idx = dataGridViewX4.Rows.Add(); dataGridViewX4.Rows[idx].Cells[0].Value = comboBoxEx2.SelectedItem.ToString(); dataGridViewX4.Rows[idx].Cells[1].Value = feats[i].Name; } } } private void clearFeatureHighLight() { for (int i = 0; i < globeControl1.Globe.Layers.Count; i++) { GSOLayer layer = globeControl1.Globe.Layers[i]; if (layer is GSOFeatureLayer) { GSOFeatures feats = layer.GetAllFeatures(); for (int j = 0; j < feats.Length; j++) { GSOFeature feat = feats[j]; feat.HighLight = false; GSOLineStyle3D lineStyle = feat.Geometry.Style as GSOLineStyle3D; if (lineStyle != null) { lineStyle.ArrowVisible = false; feat.Geometry.SetModified(true); } } } } if (globeControl1.Globe.Action == EnumAction3D.SelectObject) { globeControl1.Globe.Action = EnumAction3D.ActionNull; globeControl1.Globe.Action = EnumAction3D.SelectObject; } } private void clearFeatureHighLightIgnoreSelectObject() { for (int i = 0; i < globeControl1.Globe.Layers.Count; i++) { GSOLayer layer = globeControl1.Globe.Layers[i]; if (layer is GSOFeatureLayer) { GSOFeatures feats = layer.GetAllFeatures(); for (int j = 0; j < feats.Length; j++) { GSOFeature feat = feats[j]; feat.HighLight = false; GSOLineStyle3D lineStyle = feat.Geometry.Style as GSOLineStyle3D; if (lineStyle != null) { lineStyle.ArrowVisible = false; feat.Geometry.SetModified(true); } } } } } private void buttonItem63_Click(object sender, EventArgs e)//碰撞分析 { layerTemp.RemoveAllFeature(); clearFeatureHighLight(); globeControl1.Refresh(); sideBar1.Visible = true; sideBarPanelItem3.Visible = true; buttonItem1.Checked = true; controlContainerItem3.Visible = true; sideBarPanelItem4.Visible = true; sideBarPanelItem4.Text = "碰撞分析"; trackflag = "collision"; //globeControl1.Globe.Action = EnumAction3D.SelectObject; panel1.Visible = false; panel3.Visible = false; panel4.Visible = false; panel5.Visible = false; panelEx1.Visible = false; controlContainerItem5.Control = panel2; panel2.Dock = DockStyle.Fill; panel2.Visible = true; sideBar1.ExpandedPanel = sideBarPanelItem4; sideBar1.Refresh(); Refresh(); } private void buttonX7_Click(object sender, EventArgs e) { for (int i = 0; i < polygonJingJuAnalysises.Length; i++) { polygonJingJuAnalysises[i].Delete(); } globeControl1.Globe.Refresh(); //trackflag = ""; //globeControl1.Globe.Action = EnumAction3D.ActionNull; //sideBarPanelItem4.Visible = false; //panel2.Visible = false; //checkBoxX3.Checked = false; //checkBoxX4.Checked = false; //comboBoxEx2.SelectedIndex = -1; //dataGridViewX4.Rows.Clear(); //dataGridViewX5.Rows.Clear(); //if (buttonItem1.Checked) //{ // sideBar1.ExpandedPanel = sideBarPanelItem3; //} //else //{ // sideBar1.Visible = false; //} //Refresh(); } private void buttonX5_Click(object sender, EventArgs e)//碰撞分析 { if (!checkBoxX3.Checked && !checkBoxX4.Checked) { MessageBox.Show("请确定是选择管线还是选择图层!", "提示"); return; } if (dataGridViewX4.Rows.Count > 0) { featLenth.Clear(); featCount.Clear(); listBox2.Items.Clear(); layerTemp.RemoveAllFeature(); polygonJingJuAnalysises.RemoveAll(); dataGridViewX5.Rows.Clear(); clearFeatureHighLightIgnoreSelectObject(); if (checkBoxX3.Checked) { for (int i = 0; i < dataGridViewX4.Rows.Count; i++) { GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX4.Rows[i].Cells[0].Value.ToString()); if (l != null) { GSOFeatureLayer flayer = l as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = flayer.GetAllFeatures(); for (int j = 0; j < feats.Length; j++) { if (feats[j].Name == dataGridViewX4.Rows[i].Cells[1].Value.ToString()) { CollisionAnalysis(1, l.Caption, feats[j], 0); } } } } } else if (checkBoxX4.Checked) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx2.SelectedItem.ToString()); if (layer == null) return; GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = flayer.GetAllFeatures(); for (int i = 0; i < feats.Length; i++) { CollisionAnalysis(1, layer.Caption, feats[i], 0); } } if (featCount.Count > 0) { for (int i = 0; i < pipelineLayerNames.Count; i++) { if (featCount.ContainsKey(pipelineLayerNames[i]) && featLenth.ContainsKey(pipelineLayerNames[i])) { listBox2.Items.Add(pipelineLayerNames[i] + ":" + featCount[pipelineLayerNames[i]] + "条,共" + featLenth[pipelineLayerNames[i]].ToString("0.00") + "米"); } } } if (dataGridViewX5.Rows.Count == 0) { MessageBox.Show("没有发生碰撞的管线!", "提示"); } } else { MessageBox.Show("请选中要进行碰撞分析的管线!", "提示"); //globeControl1.Globe.Action = EnumAction3D.SelectObject; } globeControl1.Refresh(); } private void buttonX8_Click(object sender, EventArgs e) { trackflag = ""; globeControl1.Globe.Action = EnumAction3D.ActionNull; listBox2.Items.Clear(); checkBoxX3.Checked = false; checkBoxX4.Checked = false; comboBoxEx2.SelectedIndex = -1; comboBoxEx2.Enabled = false; layerTemp.RemoveAllFeature(); globeControl1.Refresh(); dataGridViewX4.Rows.Clear(); dataGridViewX5.Rows.Clear(); } private void buttonX6_Click(object sender, EventArgs e) { if (dataGridViewX5.Rows.Count > 0) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "Excel files (*.xls)|*.xls"; dlg.FilterIndex = 0; dlg.RestoreDirectory = true; dlg.Title = "保存为Excel文件"; dlg.FileName = "碰撞分析" + "-" + DateTime.Now.ToString("yyyyMMdd") + ".xls"; if (dlg.ShowDialog() == DialogResult.OK) { Stream myStream; myStream = dlg.OpenFile(); StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0)); string columnTitle = ""; try { string strList = ""; for (int i = 0; i < listBox2.Items.Count; i++) { strList += listBox2.Items[i].ToString() + @"/"; } sw.WriteLine("内容:碰撞分析结果 日期:" + DateTime.Now.ToString("yyyy-MM-dd") + " 结果:" + strList); //写入列标题 for (int i = 0; i < dataGridViewX5.ColumnCount; i++) { if (i > 0) { columnTitle += "\t"; } columnTitle += dataGridViewX5.Columns[i].HeaderText; } sw.WriteLine(columnTitle); //写入列内容 for (int j = 0; j < dataGridViewX5.Rows.Count; j++) { string columnValue = ""; for (int k = 0; k < dataGridViewX5.Columns.Count; k++) { if (k > 0) { columnValue += "\t"; } if (dataGridViewX5.Rows[j].Cells[k].Value == null) columnValue += ""; else columnValue += dataGridViewX5.Rows[j].Cells[k].Value.ToString().Trim(); } sw.WriteLine(columnValue); } sw.Close(); myStream.Close(); if (MessageBox.Show("导出Excel文件成功!是否打开?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { System.Diagnostics.Process.Start(dlg.FileName); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { sw.Close(); myStream.Close(); } } } } private void panel5_VisibleChanged(object sender, EventArgs e) { //if (panel5.Visible == false) //{ // trackflag = ""; // listBox3.Items.Clear(); // checkBoxX7.Checked = false; // checkBoxX8.Checked = false; // comboBoxEx4.SelectedIndex = -1; // comboBoxEx4.Enabled = false; // dataGridViewX8.Rows.Clear(); // dataGridViewX9.Rows.Clear(); //} } private void panel1_VisibleChanged(object sender, EventArgs e) { //if (panel1.Visible == false) //{ // trackflag = ""; // listBox1.Items.Clear(); // checkBoxX1.Checked = false; // checkBoxX2.Checked = false; // comboBoxEx1.SelectedIndex = -1; // comboBoxEx1.Enabled = false; // dataGridViewX2.Rows.Clear(); // dataGridViewX3.Rows.Clear(); //} } private void panel2_VisibleChanged(object sender, EventArgs e) { if (panel2.Visible == false) { //trackflag = ""; //listBox2.Items.Clear(); //checkBoxX3.Checked = false; //checkBoxX4.Checked = false; //comboBoxEx2.SelectedIndex = -1; //comboBoxEx2.Enabled = false; //dataGridViewX4.Rows.Clear(); //dataGridViewX5.Rows.Clear(); } } private void btnExportCAD_Click(object sender, EventArgs e) { FrmExportCADS frm = new FrmExportCADS(globeControl1); frm.ShowDialog(); //try //{ // TreeNode node = layerTree.SelectedNode; // if (node == null) // { // MessageBox.Show("请选择要导出的管线类型!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); // return; // } // if (node.Tag != null) // { // if (node.Tag.ToString().Contains("|")) // { // if (node.Tag.ToString().Split('|')[1].Contains("管线")) // { // try // { // GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(node.Tag.ToString().Split('|')[1]); // layer.Dataset.ImportProjectionRefFromProj4("+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=499885 +y_0=6 +ellps=krass +units=m +no_defs"); // SaveFileDialog dlg = new SaveFileDialog(); // dlg.Filter = "*.dxf|*.dxf"; // if (dlg.ShowDialog() == DialogResult.OK) // { // if (layer.GetAllFeatures().Length <= 0) // { // MessageBox.Show("要导出的图层为空", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); // return; // } // if (layer.GetAllFeatures().Length > 0) // { // layer.SaveAs(dlg.FileName); // MessageBox.Show("导出CAD完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); // } // } // } // catch (Exception ex) // { // LogError.PublishError(ex); // } // } // else // { // MessageBox.Show("请选择要导出的管线类型!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); // return; // } // } // else // { // MessageBox.Show("请选择要导出的管线类型!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); // return; // } // } //} //catch (Exception ex) //{ // MessageBox.Show(ex.Message); // LogError.PublishError(ex); //} } private Boolean MerageToFile(GSOFeatures features, String strDestFile, String strProj4)//图层追加 { if (features == null) { return false; } Boolean bSuccess = false; string strDir = GSOUtility.GetFileDir(strDestFile); string strLPRJFile = GSOUtility.ChangeExt(strDestFile, ".lprj"); string strExt = GSOUtility.GetFileExt(strDestFile); // 如果投影文件存在,投影以投影文件为准 if (File.Exists(strLPRJFile)) { // 如果是dxf,则这样处理 if (strExt.ToLower() == ".dxf") { string strTempSrcFile = strDir + "srcFeatures_dxftmp" + strExt; globeControl1.Globe.DataManager.SaveFeatureData(features, strTempSrcFile, strLPRJFile, 4); bSuccess = GSOUtility.MergeTwoDXFFileFeatures(strDestFile, strTempSrcFile); File.Delete(strTempSrcFile); } else { GSOFeatures srcFeatures = globeControl1.Globe.DataManager.ReadFeatureData(strDestFile); int nCount = features.Length; int i = 0; for (i = 0; i < nCount; i++) { srcFeatures.Add(features[i]); } bSuccess = globeControl1.Globe.DataManager.SaveFeatureData(srcFeatures, strDestFile, strLPRJFile, 4); } } else { // 如果是dxf,则这样处理 if (strExt.ToLower() == ".dxf") { string strTempSrcFile = strDir + "srcFeatures_dxftmp" + strExt; globeControl1.Globe.DataManager.SaveFeatureData(features, strTempSrcFile, strProj4, 0); bSuccess = GSOUtility.MergeTwoDXFFileFeatures(strDestFile, strTempSrcFile); File.Delete(strTempSrcFile); } else { GSOFeatures srcFeatures = globeControl1.Globe.DataManager.ReadFeatureData(strDestFile); int nCount = features.Length; int i = 0; for (i = 0; i < nCount; i++) { srcFeatures.Add(features[i]); } bSuccess = globeControl1.Globe.DataManager.SaveFeatureData(srcFeatures, strDestFile, strProj4, 0); } } return bSuccess; } private void buttonItem64_Click(object sender, EventArgs e) { //Point pt1 = new Point(Convert.ToInt32(e.StartPos.X), Convert.ToInt32(e.StartPos.Y)); //Point pt2 = new Point(Convert.ToInt32(e.EndPos.X), Convert.ToInt32(e.EndPos.Y)); //Point pt = getUpperLeftPoint(pt1, pt2); //Image myImg = new Bitmap(Convert.ToInt32(e.Rect.Width), Convert.ToInt32(e.Rect.Height)); //Graphics g = Graphics.FromImage(myImg); //g.CopyFromScreen(pt, new Point(0, 0), new Size(Convert.ToInt32(e.Rect.Width), Convert.ToInt32(e.Rect.Height))); //SaveFileDialog dlg = new SaveFileDialog(); //dlg.Filter = "输出JPEG(*.jpg)|*.jpg|输出PNG(*.png)|*.png|输出BMP(*.bmp)|*.bmp|输出BMP(*.gif)|*.gif"; //if (dlg.ShowDialog() == DialogResult.OK) //{ // string extension = System.IO.Path.GetExtension(dlg.FileName);//扩展名 // switch (extension) // { // case ".jpg": // myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Jpeg); // break; // case ".png": // myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Png); // break; // case ".bmp": // myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Bmp); // break; // case ".gif": // myImg.Save(dlg.FileName, System.Drawing.Imaging.ImageFormat.Gif); // break; // default: // break; // } //} } private void buttonItem50_Click(object sender, EventArgs e) { buttonItem50.Checked = !buttonItem50.Checked; ribbonBarQY.Visible = buttonItem50.Checked; ribbonBarQY.Location = new Point(0, 0); } int openFrmNum = 0; public static GeoScene.Engine.GSODataSource ds = null; private void buttonItem71_Click(object sender, EventArgs e)//连接数据库 { FrmDatabaseParaSetting frm = new FrmDatabaseParaSetting(globeControl1); if (frm.ShowDialog() == DialogResult.OK) { ds = FrmDatabaseParaSetting.ds; if (ds != null) { ds.IsCloseSaved = false; } switch (openFrmNum) { case 1: openFrmNum = 0; buttonItem65_Click(sender, e); break; case 2: openFrmNum = 0; buttonItem66_Click(sender, e); break; case 3: openFrmNum = 0; buttonItem67_Click(sender, e); break; case 4: openFrmNum = 0; buttonItem79_Click(sender, e); break; } } } private void buttonItem80_Click(object sender, EventArgs e)//数据验证 { FrmValiData frm = new FrmValiData(globeControl1); frm.ShowDialog(); } private void buttonItem65_Click(object sender, EventArgs e)//工井入库 { if (ds == null) { openFrmNum = 1; MessageBox.Show("请先连接数据库", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); buttonItem71_Click(sender, e); return; } FrmAddWellShp frm = new FrmAddWellShp(globeControl1, ds); frm.ShowDialog(); } private void buttonItem66_Click(object sender, EventArgs e)//雨水篦水井入库 { if (ds == null) { openFrmNum = 2; MessageBox.Show("请先连接数据库", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); buttonItem71_Click(sender, e); return; } FrmAddYuBiZiShp yubi = new FrmAddYuBiZiShp(globeControl1, ds); yubi.ShowDialog(); } private void buttonItem67_Click(object sender, EventArgs e)//阀门入库 { if (ds == null) { openFrmNum = 3; MessageBox.Show("请先连接数据库", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); buttonItem71_Click(sender, e); return; } FrmAddValve frm = new FrmAddValve(globeControl1, ds); frm.ShowDialog(); } private void buttonItem79_Click(object sender, EventArgs e)//管线入库 { if (ds == null) { openFrmNum = 4; MessageBox.Show("请先连接数据库", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); buttonItem71_Click(sender, e); return; } Cyberpipe.Forms.FrmPipelineModelDB frm = new Cyberpipe.Forms.FrmPipelineModelDB(globeControl1, ds); frm.ShowDialog(); } private void btnBackDatabase_Click(object sender, EventArgs e)//数据库备份 { if (MessageBox.Show("是否确定要备份数据库文件", "信息", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { try { DateTime currentTime = DateTime.Now; //string Dtime = currentTime.ToShortDateString().ToString("yyyy-MM-dd"); string Dtime = currentTime.GetDateTimeFormats('D')[0].ToString(); string Htime = DateTime.Now.ToString("HH时mm分ss秒").Trim(); string fileName = Dtime + "(" + Htime + ")"; string pathName = ""; string sql = "select filename from master..sysdatabases where name='" + Utility.dbdatabase + "'"; DataTable dt = OledbHelper.ExecuteDataTable(sql); if (dt != null && dt.Rows.Count > 0) { pathName = dt.Rows[0][0].ToString().Trim(); int count = pathName.LastIndexOf("\\") == -1 ? pathName.LastIndexOf("/") : pathName.LastIndexOf("\\"); pathName = pathName.Substring(0, count); } pathName += "\\管网数据库" + fileName + ".bak"; SqlCommand cmdBK = new SqlCommand(); cmdBK.CommandType = CommandType.Text; cmdBK.Connection = connBackup; cmdBK.CommandText = @"backup database " + Utility.dbdatabase + " to disk='" + pathName + "' with init"; connBackup.Open(); cmdBK.ExecuteNonQuery(); MessageBox.Show("数据库文件备份成功", "提示"); } catch (Exception ex) { MessageBox.Show(ex.Message); LogError.PublishError(ex); } finally { connBackup.Close(); } } } private void buttonItem68_Click(object sender, EventArgs e)//缓冲分析 { GSOFeature feat = globeControl1.Globe.SelectedObject; if (feat == null) { MessageBox.Show("请选择一条管线!"); buttonItem97.Checked = false; return; } GSOGeoPolyline3D line1 = feat.Geometry as GSOGeoPolyline3D; if (line1 == null) { MessageBox.Show("请选择一条管线!"); buttonItem97.Checked = false; return; } FrmBufferAnalysis frm = new FrmBufferAnalysis(globeControl1, line1,layerTemp); frm.ShowDialog(); } private void buttonItem70_Click(object sender, EventArgs e)//爆管分析 { ClearCloseValvesAnalysis(); if (globeControl1.Globe.SelObjectCount < 1) { MessageBox.Show("请选中至少一个管线!!"); return; } GSOLayer resLayer = null; GSOFeature resFeature = null; globeControl1.Globe.GetSelectObject(0, out resFeature, out resLayer); GSOGeoPolyline3D line1 = resFeature.Geometry as GSOGeoPolyline3D; if (line1 == null) { MessageBox.Show("请选择管线!!"); return; } GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; if (pipeStyle1 == null) { MessageBox.Show("请选择管线!!"); return; } if (emitterFeature != null) { globeControl1.Globe.MemoryLayer.RemoveFeatureByID(emitterFeature.ID); } GSOPoint3d pt = new GSOPoint3d(); double length = line1.GetSpaceLength(true, 6378137);//线的长度 GSOGeoPolyline3D lineLine = line1.GetSegment(0, length / 2); GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1]; pt.X = point3d.X; pt.Y = point3d.Y; pt.Z = point3d.Z ; pt.Z += pipeStyle1.Radius * 2; globeControl1.Globe.UnderGroundFloor.Visible = true; if (resLayer.Caption.Contains("气")) { AddFire(pt.X, pt.Y, pt.Z); } else if (resLayer.Caption.Contains("给水")) { AddFountain(pt.X, pt.Y, pt.Z); } else if (resLayer.Caption.Contains("热力")) { AddFountain(pt.X, pt.Y, pt.Z); } GSOPoint3d resIntersetPoint = new GSOPoint3d(); if (NetworkBoosterValvesAnalysis(resFeature, resIntersetPoint, resLayer)) { globeControl1.Globe.Action = EnumAction3D.ActionNull; } } GSOFeature emitterFeature; // 添加火苗 private GSOFeature AddFire(double x, double y, double z) { string strResPath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource"; // 烟火粒子示例,由三个发射器构成 GSOGeoParticle geoParticle = new GSOGeoParticle(); geoParticle.SetPosition(x, y, z); // 添加到这个经纬度位置 geoParticle.AltitudeMode = EnumAltitudeMode.RelativeToGround; GSORingParticleEmitter emitter = new GSORingParticleEmitter(); emitter.TexturePath = strResPath + "/ParticleImage/flare1.png";//烟1111111111111 emitter.SetSizeFix(1, 1); emitter.VelFix = 1; emitter.VelRnd = 5; emitter.AngleXYFix = 0; emitter.AngleXYRnd = 180; emitter.AngleXZFix = 90; emitter.AngleXZRnd = 0; emitter.LifeFix = 0.5f; emitter.LifeRnd = 0.0f; emitter.RotFix = 0; emitter.RotRnd = 0; emitter.RotVelFix = 0; emitter.RotVelRnd = 0; emitter.EmitPerSec = 100; emitter.IsLumAdded = true; // 采用线性插值生成粒子的初始颜色 emitter.ColorRndStart = Color.White; emitter.ColorRndEnd = Color.Red; GSOColorParticleEffector effector2 = new GSOColorParticleEffector(); effector2.SetColorChanged(0, -1, -1, 0); effector2.StartTime = 0.0f; effector2.EndTime = -1.0f; emitter.AddEffector(effector2); // 将三个发射器添加到粒子对象中 geoParticle.AddEmitter(emitter); geoParticle.Play(); emitterFeature = new GSOFeature(); emitterFeature.Geometry = geoParticle; globeControl1.Globe.MemoryLayer.AddFeature(emitterFeature); return emitterFeature; } // 添加喷泉 private GSOFeature AddFountain(double x, double y, double z) { string strResPath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource"; GSOGeoParticle geoParticle = new GSOGeoParticle(); geoParticle.SetPosition( x, y, z); // 添加到这个经纬度位置 geoParticle.AltitudeMode = EnumAltitudeMode.RelativeToGround; GSOPointParticleEmitter emitter = new GSOPointParticleEmitter(); emitter.TexturePath = strResPath + "/ParticleImage/test.png"; emitter.SetSizeFix(0.5f, 2); emitter.VelFix = 10; emitter.VelRnd = 2; emitter.GravityAcc = 9.8f; emitter.AngleXYFix = 0; emitter.AngleXYRnd = 180; emitter.AngleXZFix = 88; emitter.AngleXZRnd = 2; //emitter.InnerRadius = 0; // emitter.OuterRadius = 0.03f; emitter.LifeFix = 5.0f; emitter.LifeRnd = 1.0f; emitter.RotFix = 0; emitter.RotRnd = 0; emitter.RotVelFix = 0; emitter.RotVelRnd = 0; emitter.EmitPerSec = 1000; emitter.ColorRndStart = Color.FromArgb(33, 255, 255, 255); emitter.ColorRndEnd = Color.FromArgb(11, 255, 255, 255); emitter.IsLumAdded = false; // 将三个发射器添加到粒子对象中 geoParticle.AddEmitter(emitter); geoParticle.Play(); emitterFeature = new GSOFeature(); emitterFeature.Geometry = geoParticle; globeControl1.Globe.MemoryLayer.AddFeature(emitterFeature); //globeControl1.Globe.FlyToFeature(emitterFeature); return emitterFeature; } private void buttonItem69_Click(object sender, EventArgs e)//附属物分析 { globeControl1.Globe.Action = EnumAction3D.ActionNull; FrmAccessoryAnalysis dlg = new FrmAccessoryAnalysis(globeControl1, layerTemp); dlg.Show(this); } private void 管径分段统计_Click(object sender, EventArgs e) { //Frmpipediameterstatis.ShowForm(globeControl1,pipelineLayerNames); //frm.Show(this); } private void buttonItem93_Click(object sender, EventArgs e)//埋深分段统计 { //FrmpipeDeepstatis.ShowForm(globeControl1,pipelineLayerNames); //frm.Show(this); } private void ribbonTabItem5_Click(object sender, EventArgs e) { } private void buttonItem109_Click(object sender, EventArgs e)//管径分类汇总 { //FrmpipeDiametergather.ShowForm(globeControl1,pipelineLayerNames); //frm.Show(this); } private void buttonItem110_Click(object sender, EventArgs e)//材质分类汇总 { //FrmpipeMaterialGather.ShowForm(globeControl1, pipelineLayerNames); //frm.Show(this); } private void buttonItem97_Click(object sender, EventArgs e)//附属物分类汇总 { //FrmAccessoriesgather.ShowForm(globeControl1,instrumenLayerNames); //frm.Show(this); } GSOFeature startFeature; GSOFeature endFeature; private void buttonItem72_Click(object sender, EventArgs e)//标高标注 { GSOFeature resFeature = null; GSOGeoPolyline3D selLine = isSelectedPipeLine(out resFeature); if (selLine != null) { if (selLine[0].Count > 1) { setMarkerLayerUnVisible("标高标注"); GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("标高标注"); l.Visible = true; GSOGeoPoint3D startPoint = new GSOGeoPoint3D(); startPoint.X = selLine[0][0].X; startPoint.Y = selLine[0][0].Y; startPoint.Z = selLine[0][0].Z; string startLabelName = "起点标高:" + resFeature.GetFieldAsString("起始地面高程") + "米"; startFeature = new GSOFeature(); GSOPoint2d point2d = new GSOPoint2d(0, 80); if (getLabelName(l) != -1) { startFeature = createLabel(l,startFeature, startPoint, startLabelName, (getLabelName(l)+1).ToString(), point2d); l.AddFeature(startFeature); } GSOGeoPoint3D endPoint = new GSOGeoPoint3D(); endPoint.X = selLine[0][selLine[0].Count - 1].X; endPoint.Y = selLine[0][selLine[0].Count - 1].Y; endPoint.Z = selLine[0][selLine[0].Count - 1].Z; string endLabelName = "终点标高:" + resFeature.GetFieldAsString("终止地面高程") + "米"; endFeature = new GSOFeature(); if (getLabelName(l) != -1) { endFeature = createLabel(l,endFeature, endPoint, endLabelName, (getLabelName(l) + 1).ToString(), point2d); l.AddFeature(endFeature); } globeControl1.Refresh(); } } else { MessageBox.Show("请选中一根管线","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning); } }//标高标注 public int getLabelName(GSOLayer layer) { int nid = -1; if (layer.GetAllFeatures().Length > 0) { string id = layer.GetAllFeatures()[layer.GetAllFeatures().Length - 1].Name; int.TryParse(id, out nid); } else { nid = 0; } return nid; } public void setMarkerLayerUnVisible(string layerName) { string[] markerStrs = new string[9]; markerStrs[0] = "标高标注"; markerStrs[1] = "管径标注"; markerStrs[2] = "埋深标注"; markerStrs[3] = "坐标标注"; markerStrs[4] = "坡度标注"; markerStrs[5] = "属性标注"; markerStrs[6] = "自定义标注"; markerStrs[7] = "距离标注"; markerStrs[8] = "红线工具"; for (int i = 0; i < markerStrs.Length; i++) { GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(markerStrs[i]); if (l != null) { if (markerStrs[i] != layerName) { l.Visible = false; if (layerMarkerTree.Nodes[0].Nodes.Count > i) { layerMarkerTree.Nodes[0].Nodes[i].Checked = false; } } else { l.Visible = true; if (layerMarkerTree.Nodes[0].Nodes.Count > i) { layerMarkerTree.Nodes[0].Nodes[i].Checked = true; } } } } } /// <summary> /// 获取选中管线 /// </summary> /// <param name="resFeature">被选中管线所在的feature图层</param> /// <returns>返回一根线</returns> private GSOGeoPolyline3D isSelectedPipeLine(out GSOFeature resFeature) { resFeature = null; if (globeControl1.Globe.SelObjectCount < 1) { return null; } GSOLayer resLayer = null; globeControl1.Globe.GetSelectObject(0, out resFeature, out resLayer); GSOGeoPolyline3D line1 = resFeature.Geometry as GSOGeoPolyline3D; if (line1 == null) { return null; } GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; if (pipeStyle1 == null) { return null; } return line1; } /// <summary> /// 创建label要素 /// </summary> /// <param name="feature">添加label要素的feature</param> /// <param name="point">feature的位置</param> /// <param name="labelName">label要素名字</param> /// <param name="featureName">feature名字</param> /// <param name="point2d">label要素距离点的位置</param> /// <returns></returns> private GSOFeature createLabel(GSOLayer layer,GSOFeature feature, GSOGeoPoint3D point, string labelName, string featureName, GSOPoint2d point2d) { for (int i = layer.GetAllFeatures().Length - 1; i >= 0; i--) { GSOFeature gfeat = layer.GetAt(i); if (gfeat != null && gfeat.Geometry != null && gfeat.Geometry.Type == EnumGeometryType.GeoPoint3D) { GSOGeoPoint3D pointItem = gfeat.Geometry as GSOGeoPoint3D; if (pointItem.X == point.X && pointItem.Y == point.Y && pointItem.Z == point.Z) { layer.RemoveAt(i); break; } } } point.AltitudeMode = EnumAltitudeMode.RelativeToGround; feature.Geometry = point; feature.Name = featureName; GSOLabel newLabel = new GSOLabel(); newLabel.Text = labelName; newLabel.Style = new GSOLabelStyle(); newLabel.Style.Opaque = 0.8; newLabel.Style.OutlineColor = Color.Gray; newLabel.Style.TractionLineEndPos = point2d; newLabel.Style.OutlineWidth = 1; newLabel.Style.TracktionLineWidth = 1; newLabel.Style.TractionLineColor = Color.Green; Color color1 = Color.FromArgb(60, 187, 206, 230); Color color2 = Color.FromArgb(150, 187, 200, 250); newLabel.Style.BackBeginColor = color1; newLabel.Style.BackEndColor = color2; feature.Label = newLabel; return feature; } GSOFeature radiusMarkerFeature; private void buttonItem73_Click(object sender, EventArgs e)//管径标注 { GSOFeature resFeature = null; GSOGeoPolyline3D selLine = isSelectedPipeLine(out resFeature); if (selLine != null) { if (selLine[0].Count > 1) { setMarkerLayerUnVisible("管径标注"); GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("管径标注"); if (l == null) { l = globeControl1.Globe.MemoryLayer; } l.Visible = true; GSOGeoPoint3D pt = new GSOGeoPoint3D(); GSOPoint3d point3d = selLine.GeoCenterPoint; pt.X = point3d.X; pt.Y = point3d.Y; pt.Z = point3d.Z; string radiusLabelName = "管径:" + resFeature.GetFieldAsFloat("管径_毫米") + "毫米"; radiusMarkerFeature = new GSOFeature(); GSOPoint2d point2d = new GSOPoint2d(0, 50); if (l != null) { if (getLabelName(l) != -1) { radiusMarkerFeature = createLabel(l,radiusMarkerFeature, pt, radiusLabelName, (getLabelName(l)+1).ToString(), point2d); l.AddFeature(radiusMarkerFeature); } } globeControl1.Refresh(); } } else { MessageBox.Show("请选中一根管线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } GSOFeature startDeepFeature; GSOFeature endDeepFeature; private void buttonItem74_Click(object sender, EventArgs e)//埋深标注 { GSOFeature resFeature = null; GSOGeoPolyline3D selLine = isSelectedPipeLine(out resFeature); if (selLine != null) { if (selLine[0].Count > 1) { setMarkerLayerUnVisible("埋深标注"); GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("埋深标注"); l.Visible = true; GSOGeoPoint3D startPoint = new GSOGeoPoint3D(); startPoint.X = selLine[0][0].X; startPoint.Y = selLine[0][0].Y; startPoint.Z = selLine[0][0].Z; string startLabelName = "起点埋深:" + resFeature.GetFieldAsString("起始埋深") + "米"; GSOPoint2d point2d = new GSOPoint2d(0, 60); if (l != null) { if (getLabelName(l) != -1) { startDeepFeature = new GSOFeature(); startDeepFeature = createLabel(l,startDeepFeature, startPoint, startLabelName, (getLabelName(l)+1).ToString(), point2d); l.AddFeature(startDeepFeature); } } GSOGeoPoint3D endPoint = new GSOGeoPoint3D(); endPoint.X = selLine[0][selLine[0].Count - 1].X; endPoint.Y = selLine[0][selLine[0].Count - 1].Y; endPoint.Z = selLine[0][selLine[0].Count - 1].Z; string endLabelName = "终点埋深:" + resFeature.GetFieldAsString("终止埋深") + "米"; if (l != null) { if (getLabelName(l) != -1) { endDeepFeature = new GSOFeature(); endDeepFeature = createLabel(l,endDeepFeature, endPoint, endLabelName, (getLabelName(l) + 1).ToString(), point2d); l.AddFeature(endDeepFeature); } } globeControl1.Refresh(); } } else { MessageBox.Show("请选中一根管线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } bool distanceMarker = false; private void buttonItem75_Click(object sender, EventArgs e)//距离标注 { globeControl1.Globe.Action = EnumAction3D.TrackPolyline; //globeControl1.Globe.DistanceRuler.MeasureMode = EnumDistanceMeasureMode.HVSLineMeasure; distanceMarker = true; } GSOFeature startXYFeature; GSOFeature endXYFeature; private void buttonItem76_Click(object sender, EventArgs e)//坐标标注 { GSOFeature resFeature = null; GSOGeoPolyline3D selLine = isSelectedPipeLine(out resFeature); if (selLine != null) { if (selLine[0].Count > 1) { setMarkerLayerUnVisible("坐标标注"); GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("坐标标注"); l.Visible = true; GSOGeoPoint3D startPoint = new GSOGeoPoint3D(); startPoint.X = selLine[0][0].X; startPoint.Y = selLine[0][0].Y; startPoint.Z = selLine[0][0].Z; string startLabelName = "起点坐标:(" + selLine[0][0].X.ToString("0.00") + "," + selLine[0][0].Y.ToString("0.00") + "," + selLine[0][0].Z.ToString("0.00") + ")"; GSOPoint2d point2d = new GSOPoint2d(0, 100); if (l != null) { if (getLabelName(l) != -1) { startXYFeature = new GSOFeature(); startXYFeature = createLabel(l,startXYFeature, startPoint, startLabelName, (getLabelName(l) + 1).ToString(), point2d); l.AddFeature(startXYFeature); } } GSOGeoPoint3D endPoint = new GSOGeoPoint3D(); endPoint.X = selLine[0][selLine[0].Count - 1].X; endPoint.Y = selLine[0][selLine[0].Count - 1].Y; endPoint.Z = selLine[0][selLine[0].Count - 1].Z; string endLabelName = "终点坐标:(" + selLine[0][selLine[0].Count - 1].X.ToString("0.00") + "," + selLine[0][selLine[0].Count - 1].Y.ToString("0.00") + "," + selLine[0][selLine[0].Count - 1].Z.ToString("0.00") + ")"; if (l != null) { if (getLabelName(l) != -1) { endXYFeature = new GSOFeature(); endXYFeature = createLabel(l,endXYFeature, endPoint, endLabelName, (getLabelName(l) + 1).ToString(), point2d); l.AddFeature(endXYFeature); } } globeControl1.Refresh(); } } else { MessageBox.Show("请选中一根管线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } private void buttonItem77_Click(object sender, EventArgs e) { buttonItem77.Checked = !buttonItem77.Checked; buttonItem139.Checked = false; string[] markerStrs = new string[9]; markerStrs[0] = "标高标注"; markerStrs[1] = "管径标注"; markerStrs[2] = "埋深标注"; markerStrs[3] = "坐标标注"; markerStrs[4] = "坡度标注"; markerStrs[5] = "属性标注"; markerStrs[6] = "自定义标注"; markerStrs[7] = "距离标注"; markerStrs[8] = "红线工具"; if (buttonItem77.Checked) { sideBar1.Visible = true; sideBarPanelItem3.Visible = true; buttonItem1.Checked = true; controlContainerItem3.Visible = true; sideBarPanelItem4.Visible = true; sideBarPanelItem4.Text = "标注管理"; panel2.Visible = false; panel1.Visible = false; panel4.Visible = false; panel5.Visible = false; controlContainerItem5.Control = panel3; panel3.Dock = DockStyle.Fill; panel3.Visible = true; sideBar1.ExpandedPanel = sideBarPanelItem4; sideBar1.Refresh(); Refresh(); } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; sideBarPanelItem4.Visible = false; panel3.Visible = false; if (buttonItem1.Checked) { sideBar1.ExpandedPanel = sideBarPanelItem3; } else { sideBar1.Visible = false; } //for (int i = 0; i < markerStrs.Length; i++) //{ // // GSOLayer l = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\标注管理\\" + markerStrs[i] + ".lgd"); // GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(markerStrs[i]); // l.Visible = false; //} Refresh(); } } private bool drawRedPology = false; private void buttonItem36_Click(object sender, EventArgs e)//红线工具 { setMarkerLayerUnVisible("红线工具"); GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("红线工具"); if (l != null) { l.Visible = true; globeControl1.Globe.DestLayerFeatureAdd = l; l.Editable = true; globeControl1.Globe.Action = EnumAction3D.DrawPolygon; drawRedPology = true; } } private void buttonItem4_Click(object sender, EventArgs e) { } private void buttonItem101_Click(object sender, EventArgs e)//空间查询 { trackflag = "pipelinespatialquery1"; globeControl1.Globe.Action = EnumAction3D.TrackPolygon; } private void buttonItem64_Click_1(object sender, EventArgs e)//地表距离 { btnSpaceMeasureHeight.Checked = false; globeControl1.Globe.Action = EnumAction3D.MeasureDistance; globeControl1.Globe.DistanceRuler.SpaceMeasure = false; } private void buttonItem78_Click(object sender, EventArgs e)//水平面积量算 { btnSpaceMeasureHeight.Checked = false; globeControl1.Globe.Action = EnumAction3D.MeasureArea; globeControl1.Globe.AreaRuler.SpaceMeasure = true; } private void buttonItem82_Click(object sender, EventArgs e)//纵断面分析 { if (globeControl1.Globe.SelObjectCount >= 1) { //if (isInterlinked()) GSOFeatures selectFeatures = new GSOFeatures(); for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++) { GSOFeature feature = null; GSOLayer layer = null; globeControl1.Globe.GetSelectObject(i, out feature, out layer); if (feature != null && feature.Geometry != null && feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { selectFeatures.Add(feature); } } if (selectFeatures.Length < 1) { MessageBox.Show("请选择一条或者多条管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } List<GSOFeature> listFeature = new List<GSOFeature>(); if (selectFeatures.Length == 1) { listFeature.Add(selectFeatures[0]); } else { #region 求多条管线纵断面 //求多条管线纵断面 1,2,3 //1 判断管线是否相连、且没有分叉 for (int i = 0; i < selectFeatures.Length; i++) { GSOGeoPolyline3D line = selectFeatures[i].Geometry as GSOGeoPolyline3D; bool isConnect = false; int[] valueCount = new int[2]; valueCount[0] = 0; valueCount[1] = 0; if (line != null && line.PartCount > 0) { for (int j = 0; j < selectFeatures.Length; j++) { if (i == j) { continue; } GSOGeoPolyline3D newLine = selectFeatures[j].Geometry as GSOGeoPolyline3D; if (newLine != null && newLine.PartCount > 0) { int minValueIndex = 0; double limitValue = 1.0; double[] value = new double[4]; value[0] = getDistance(line[line.PartCount - 1][line[line.PartCount - 1].Count - 1], newLine[0][0]); value[1] = getDistance(line[line.PartCount - 1][line[line.PartCount - 1].Count - 1], newLine[newLine.PartCount - 1][newLine[newLine.PartCount - 1].Count - 1]); value[2] = getDistance(line[0][0], newLine[0][0]); value[3] = getDistance(line[0][0], newLine[newLine.PartCount - 1][newLine[newLine.PartCount - 1].Count - 1]); double minValue = value[0]; for (int m = 1; m < value.Length; m++) { if (minValue > value[m]) { minValue = value[m]; minValueIndex = m; } } if (minValue < limitValue) { isConnect = true; if (minValueIndex > 1) { valueCount[1]++; } else { valueCount[0]++; } } } } if (!isConnect || valueCount[0] > 1 || valueCount[1] > 1) { MessageBox.Show("请选择相连接的一条线上的管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } } //2 记录每一条相连接的管线的起点和终点,并添加到一条管线中 for (int p = 0; p < selectFeatures.Length; p++) { GSOGeoPolyline3D line = selectFeatures[p].Geometry as GSOGeoPolyline3D; if (line != null && line.PartCount > 0) { for (int n = 0; n < selectFeatures.Length; n++) { if (p == n) { continue; } GSOGeoPolyline3D newLine = selectFeatures[n].Geometry as GSOGeoPolyline3D; if (newLine != null && newLine.PartCount > 0) { int minValueIndex = 0; double limitValue = 1.0; double[] value = new double[4]; value[0] = getDistance(line[line.PartCount - 1][line[line.PartCount - 1].Count - 1], newLine[0][0]); value[1] = getDistance(line[line.PartCount - 1][line[line.PartCount - 1].Count - 1], newLine[newLine.PartCount - 1][newLine[newLine.PartCount - 1].Count - 1]); value[2] = getDistance(line[0][0], newLine[0][0]); value[3] = getDistance(line[0][0], newLine[newLine.PartCount - 1][newLine[newLine.PartCount - 1].Count - 1]); double minValue = value[0]; for (int m = 1; m < value.Length; m++) { if (minValue > value[m]) { minValue = value[m]; minValueIndex = m; } } if (minValue < limitValue) { GSOFeature featureFromAllSelectedObj = new GSOFeature(); GSOGeoPolyline3D lineFromAllSelectedObj = new GSOGeoPolyline3D(); switch (minValueIndex) { case 0: GSOPoint3ds linePart = new GSOPoint3ds(); for (int i = 0; i < line.PartCount; i++) { for (int j = 0; j < line[i].Count; j++) { linePart.Add(line[i][j]); } } for (int i = 0; i < newLine.PartCount; i++) { for (int j = 0; j < newLine[i].Count; j++) { linePart.Add(newLine[i][j]); } } lineFromAllSelectedObj.AddPart(linePart); break; case 1: linePart = new GSOPoint3ds(); for (int i = 0; i < line.PartCount; i++) { for (int j = 0; j < line[i].Count; j++) { linePart.Add(line[i][j]); } } for (int i = newLine.PartCount - 1; i >= 0; i--) { for (int j = newLine[i].Count - 1; j >= 0; j--) { linePart.Add(newLine[i][j]); } } lineFromAllSelectedObj.AddPart(linePart); break; case 2: linePart = new GSOPoint3ds(); for (int i = line.PartCount - 1; i >= 0; i--) { for (int j = line[i].Count - 1; j >= 0; j--) { linePart.Add(line[i][j]); } } for (int i = 0; i < newLine.PartCount; i++) { for (int j = 0; j < newLine[i].Count; j++) { linePart.Add(newLine[i][j]); } } lineFromAllSelectedObj.AddPart(linePart); break; case 3: linePart = new GSOPoint3ds(); for (int i = line.PartCount - 1; i >= 0; i--) { for (int j = line[i].Count - 1; j >= 0; j--) { linePart.Add(line[i][j]); } } for (int i = newLine.PartCount - 1; i >= 0; i--) { for (int j = newLine[i].Count - 1; j >= 0; j--) { linePart.Add(newLine[i][j]); } } lineFromAllSelectedObj.AddPart(linePart); break; } featureFromAllSelectedObj.Geometry = lineFromAllSelectedObj; selectFeatures.Remove(n); selectFeatures.Remove(p); selectFeatures.Add(featureFromAllSelectedObj); p--; break; } } } } } //3 将合并之后的管线添加到集合中 for (int h = 0; h < selectFeatures.Length; h++) { listFeature.Add(selectFeatures[h]); } #endregion #region 求两条管线纵断面 ////求两条管线纵断面 //GSOFeature featureFromAllSelectedObj = new GSOFeature(); //GSOGeoPolyline3D lineFromAllSelectedObj = new GSOGeoPolyline3D(); //GSOGeoPolyline3D line = selectFeatures[0].Geometry as GSOGeoPolyline3D; //GSOGeoPolyline3D newLine = selectFeatures[1].Geometry as GSOGeoPolyline3D; //if (line != null && line.PartCount > 0 && newLine != null && newLine.PartCount > 0) //{ // double limitValue = 1.0; // double[] value = new double[4]; // value[0] = getDistance(line[line.PartCount - 1][line[line.PartCount - 1].Count - 1], newLine[0][0]); // value[1] = getDistance(line[line.PartCount - 1][line[line.PartCount - 1].Count - 1], newLine[newLine.PartCount - 1][newLine[newLine.PartCount - 1].Count - 1]); // value[2] = getDistance(line[0][0], newLine[0][0]); // value[3] = getDistance(line[0][0], newLine[newLine.PartCount - 1][newLine[newLine.PartCount - 1].Count - 1]); // double minValue = value[0]; // int minValueIndex = 0; // for (int m = 1; m < value.Length; m++) // { // if (minValue > value[m]) // { // minValue = value[m]; // minValueIndex = m; // } // } // if (minValue < limitValue) // { // switch (minValueIndex) // { // case 0: // GSOPoint3ds linePart = new GSOPoint3ds(); // for (int i = 0; i < line.PartCount; i++) // { // for (int j = 0; j < line[i].Count; j++) // { // linePart.Add(line[i][j]); // } // } // for (int i = 0; i < newLine.PartCount; i++) // { // for (int j = 0; j < newLine[i].Count; j++) // { // linePart.Add(newLine[i][j]); // } // } // lineFromAllSelectedObj.AddPart(linePart); // break; // case 1: // linePart = new GSOPoint3ds(); // for (int i = 0; i < line.PartCount; i++) // { // for (int j = 0; j < line[i].Count; j++) // { // linePart.Add(line[i][j]); // } // } // for (int i = newLine.PartCount - 1; i >= 0; i--) // { // for (int j = newLine[i].Count - 1; j >= 0; j--) // { // linePart.Add(newLine[i][j]); // } // } // lineFromAllSelectedObj.AddPart(linePart); // break; // case 2: // linePart = new GSOPoint3ds(); // for (int i = line.PartCount - 1; i >= 0; i--) // { // for (int j = line[i].Count - 1; j >= 0; j--) // { // linePart.Add(line[i][j]); // } // } // for (int i = 0; i < newLine.PartCount; i++) // { // for (int j = 0; j < newLine[i].Count; j++) // { // linePart.Add(newLine[i][j]); // } // } // lineFromAllSelectedObj.AddPart(linePart); // break; // case 3: // linePart = new GSOPoint3ds(); // for (int i = line.PartCount - 1; i >= 0; i--) // { // for (int j = line[i].Count - 1; j >= 0; j--) // { // linePart.Add(line[i][j]); // } // } // for (int i = newLine.PartCount - 1; i >= 0; i--) // { // for (int j = newLine[i].Count - 1; j >= 0; j--) // { // linePart.Add(newLine[i][j]); // } // } // lineFromAllSelectedObj.AddPart(linePart); // break; // } // if (lineFromAllSelectedObj.PartCount > 0) // { // featureFromAllSelectedObj.Geometry = lineFromAllSelectedObj; // listFeature.Add(featureFromAllSelectedObj); // } // } // else // { // MessageBox.Show("请选择两条相连接的管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); // } //} //else //{ // MessageBox.Show("请选择两条管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); //} #endregion } //将选中的管线展示在窗体中 if (listFeature.Count > 0) { FrmProfileAnalysis frm = new FrmProfileAnalysis(globeControl1, listFeature); frm.Show(this); } else { MessageBox.Show("请选择相连接的管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else { MessageBox.Show("请选择一条或者多条管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private double getDistance(GSOPoint3d point1, GSOPoint3d point2) { GSOGeoPolyline3D lineline = new GSOGeoPolyline3D(); GSOPoint3ds point3ds = new GSOPoint3ds(); point3ds.Add(point1); point3ds.Add(point2); lineline.AddPart(point3ds); double distance = lineline.GetSpaceLength(true, 6378137.0); return distance; } public bool isInterlinked() { if (globeControl1.Globe.SelObjectCount < 2) { MessageBox.Show("请选中至少两个管线!!"); btnLTAnalysis.Checked = false; return false; } ClearConnexityAnalysis(); globeControl1.Globe.GetSelectObject(0, out m_ConnexityAnalysisFirstFeature, out m_ConnexityAnalysisFirstLayer); globeControl1.Globe.GetSelectObject(1, out m_ConnexityAnaylsisSecondFeature, out m_COnnexityAnalysisSecondLayer); GSOGeoPolyline3D line1 = m_ConnexityAnalysisFirstFeature.Geometry as GSOGeoPolyline3D; GSOGeoPolyline3D line2 = m_ConnexityAnaylsisSecondFeature.Geometry as GSOGeoPolyline3D; if (line1 == null || line2 == null) { MessageBox.Show("请选择管线!!"); return false; } GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D; if (pipeStyle1 == null || pipeStyle2 == null) { MessageBox.Show("请选择管线!!"); return false; } if (!m_ConnexityAnalysisFirstLayer.IsSameInnerObject(m_COnnexityAnalysisSecondLayer)) { MessageBox.Show("不在同一个图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); ClearConnexityAnalysis(); return false; } else { GSODataset curCAYDataset = m_ConnexityAnalysisFirstLayer.Dataset; string srName = curCAYDataset.Name; GSONetworkDataset curCAYNDataset = curCAYDataset.DataSource.GetDatasetByName(srName + "Network") as GSONetworkDataset; if (curCAYNDataset == null) { MessageBox.Show("该图层没有创建网络拓扑,请先创建网络拓扑信息再进行分析!", "提示"); return false; } int[] arryResID; curCAYNDataset.ConnexityAnalysis(m_ConnexityAnalysisFirstFeature.ID, m_ConnexityAnaylsisSecondFeature.ID, out arryResID, false, true); m_ConnexityAnalyResFeatures = m_ConnexityAnalysisFirstLayer.GetFeaturesByIDs(arryResID); if (m_ConnexityAnalyResFeatures == null || m_ConnexityAnalyResFeatures.Length < 1) { String strLine1 = "管线:" + m_ConnexityAnalysisFirstFeature.ID; String strLine2 = "管线:" + m_ConnexityAnaylsisSecondFeature.ID; MessageBox.Show("请选择两条相通的管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } else { return true; } } } private void buttonItem81_Click(object sender, EventArgs e)//坡度标注 { GSOFeature resFeature = null; GSOGeoPolyline3D selLine = isSelectedPipeLine(out resFeature); if (selLine != null) { if (selLine[0].Count > 1) { setMarkerLayerUnVisible("坡度标注"); GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("坡度标注"); if (l != null) { l.Visible = true; GSOGeoPoint3D pt = new GSOGeoPoint3D(); GSOPoint3d point3d = selLine.GeoCenterPoint; pt.X = point3d.X; pt.Y = point3d.Y; pt.Z = point3d.Z; if (getLabelName(l) != -1) { GSOPoint3ds pts = new GSOPoint3ds(); pts.Add(selLine[0][0]); pts.Add(selLine[0][1]); GSOGeoPolyline3D newLine = new GSOGeoPolyline3D(); newLine.AddPart(pts); double newFeatLen = newLine.GetSpaceLength(true, 6378137.0); double z = selLine[0][1].Z - selLine[0][0].Z; double i = Convert.ToDouble(z / newFeatLen); double a = Math.Atan(i) * 180 / Math.PI; string radiusLabelName = "坡度:" + resFeature.GetFieldAsFloat("管径_毫米"); radiusMarkerFeature = new GSOFeature(); GSOPoint2d point2d = new GSOPoint2d(0, 70); radiusMarkerFeature = createLabel(l, radiusMarkerFeature, pt, "坡度:" + i.ToString("0.0000") + "度 坡角:" + a.ToString("0.0000") + "度", (getLabelName(l) + 1).ToString(), point2d); l.AddFeature(radiusMarkerFeature); globeControl1.Refresh(); } } } } else { MessageBox.Show("请选中一根管线", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } private void buttonItem83_Click(object sender, EventArgs e)//属性标注 { if (globeControl1.Globe.SelectedObject != null) { GSOFeature f = globeControl1.Globe.SelectedObject; if (f.Geometry.Type != EnumGeometryType.GeoPolyline3D) { MessageBox.Show("请选择一条管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } GSOLayer l = globeControl1.Globe.SelectedObjectLayer; if (l.Type == EnumLayerType.FeatureLayer) { GSOFeatureDataset fDataset = l.Dataset as GSOFeatureDataset; if (fDataset != null) { FrmPropertiesMarker frm = new FrmPropertiesMarker(globeControl1, l, f); if (frm.ShowDialog() == DialogResult.OK) { setMarkerLayerUnVisible("属性标注"); l = globeControl1.Globe.Layers.GetLayerByCaption("属性标注"); if (l != null) { l.Visible = true; if (getLabelName(l) != -1) { GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; if (line.PartCount > 0) { GSOGeoPoint3D pt = new GSOGeoPoint3D(); GSOPoint3d point3d = line.GeoCenterPoint; pt.X = point3d.X; pt.Y = point3d.Y; pt.Z = point3d.Z; string radiusLabelName = frm.labelText; GSOFeature newF = new GSOFeature(); GSOPoint2d point2d = new GSOPoint2d(0, 110); newF = createLabel(l,newF, pt, radiusLabelName, (getLabelName(l) + 1).ToString(), point2d); l.AddFeature(newF); globeControl1.Refresh(); } } } } } } } else { MessageBox.Show("请选择一条管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void buttonItem84_Click(object sender, EventArgs e)//自定义标注 { if (globeControl1.Globe.SelObjectCount == 1 && globeControl1.Globe.SelectedObject.Geometry != null && globeControl1.Globe.SelectedObject.Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOFeature f = globeControl1.Globe.SelectedObject; FrmCustomLabel frm = new FrmCustomLabel(globeControl1, globeControl1.Globe.SelectedObjectLayer, f); if (frm.ShowDialog() == DialogResult.OK) { setMarkerLayerUnVisible("自定义标注"); GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption("自定义标注"); if (l != null) { l.Visible = true; if (getLabelName(l) != -1) { GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; if (line.PartCount > 0) { GSOGeoPoint3D pt = new GSOGeoPoint3D(); GSOPoint3d point3d = line.GeoCenterPoint; pt.X = point3d.X; pt.Y = point3d.Y; pt.Z = point3d.Z; string radiusLabelName = frm.labelText; GSOFeature newF = new GSOFeature(); GSOPoint2d point2d = new GSOPoint2d(0, 90); newF = createLabel(l,newF, pt, radiusLabelName, (getLabelName(l) + 1).ToString(), point2d); l.AddFeature(newF); globeControl1.Refresh(); } } } } } else { MessageBox.Show("请选择一条管线!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information); } } private void layerMarkerTree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Button == MouseButtons.Right) { if (e.Node.Text == "标注管理" || e.Node.Text == "传感器管理") { return; } else if (e.Node.Parent.Text == "标注管理") { layerMarkerTree.SelectedNode = e.Node; contextMenuStrip2.Show(layerMarkerTree, e.X, e.Y); contextMenuStrip2.Tag = e.Node; } else if (e.Node.Parent.Text == "传感器管理") { layerSensorTree.SelectedNode = e.Node; contextMenuStrip2.Show(layerSensorTree, e.X, e.Y); contextMenuStrip2.Tag = e.Node; } else { if (e.Node.Tag is GSOFeature) { if (e.Node.Parent.Parent.Text == "标注管理") { layerMarkerTree.SelectedNode = e.Node; contextMenuStrip3.Show(layerMarkerTree, e.X, e.Y); contextMenuStrip3.Tag = e.Node; } else if (e.Node.Parent.Parent.Text == "传感器管理") { layerSensorTree.SelectedNode = e.Node; contextMenuStrip3.Show(layerSensorTree, e.X, e.Y); contextMenuStrip3.Tag = e.Node; } } } } } private void toolStripMenuItem1_Click(object sender, EventArgs e) { TreeNode node = contextMenuStrip2.Tag as TreeNode; TreeNode parentNode = node.Parent; Int32 nIndex = node.Index; if (parentNode.Text == "标注管理" || parentNode.Text == "传感器管理") { RefreshTreeNodeLayerFeatureList(node); } } private void RefreshTreeNodeLayerFeatureList(TreeNode layerTreeNode) { layerTreeNode.Nodes.Clear(); GSOLayer layer = (GSOLayer)layerTreeNode.Tag; // 只将类型为内存数据集的图层列出,如果是其它类型的数据集可能数据量太大,没发显示在树控件中 if (layer.Dataset is GSOFeatureDataset) { VisitFeature3Ds(layer.GetAllFeatures(), layerTreeNode); } } private void toolStripMenuItem2_Click(object sender, EventArgs e) { TreeNode node = contextMenuStrip3.Tag as TreeNode; GSOFeature feature3d = node.Tag as GSOFeature; if (node == null) { return; } if (feature3d != null) { feature3d.Delete(); globeControl1.Globe.Refresh(); node.Remove(); } } private void layerMarkerTree_AfterCheck(object sender, TreeViewEventArgs e) { if (e.Action != TreeViewAction.Unknown) { CheckTreeNode(e.Node, e.Node.Checked); } } private void CheckTreeNode(TreeNode node, Boolean bChecked) { CheckChildTreeNode(node, bChecked); // 对于kml图层,如果当前处理的节点是true,那么要把所有的祖宗节点置为true // 只有所有节点都未false,那么这个节点才为false // CheckFatherTreeNode(node, bChecked); globeControl1.Globe.Refresh(); } private void CheckChildTreeNode(TreeNode node, Boolean bChecked) { if (node == null) { return; } if (node.Tag != null) { if (node.Tag.GetType() == typeof(GSOFeatureFolder) || node.Tag.GetType() == typeof(GSOFeature)) { //((GSOFeature)node.Tag).Visible = bChecked; // 注意不可调用上面的那个方法,因为上面的那个本身也是递归的 // CheckChildTreeNode 是个递归的过程,所以只需要设置调用SetVisibleDirectly // 直接设置Feature自己的可见性即可 ((GSOFeature)node.Tag).SetVisibleDirectly(bChecked); // 注意不可以在这里调用Refresh,Refresh是强制刷新,在这里调用会 // 极大地影响速度,不过可以调用globeControl1.SetNeedRefresh() // 来标记是否需要刷新 //globeControl1.Refresh(); } else { GSOLayer curLayer = node.Tag as GSOLayer; GSOTerrain curTerrain = node.Tag as GSOTerrain; if (curLayer != null) { curLayer.Visible = bChecked; } else if (curTerrain != null) { curTerrain.Visible = bChecked; } } } // 递归处理子节点 for (int i = 0; i < node.Nodes.Count; i++) { node.Nodes[i].Checked = bChecked; CheckChildTreeNode(node.Nodes[i], bChecked); } } private void 删除ToolStripMenuItem1_Click(object sender, EventArgs e) { TreeNode node = contextMenuStrip2.Tag as TreeNode; GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(node.Text); if (l != null) { l.RemoveAllFeature(); node.Nodes.Clear(); globeControl1.Refresh(); } } private void buttonItem83_Click_1(object sender, EventArgs e)//水平净距 { layerTemp.RemoveAllFeature(); clearFeatureHighLight(); globeControl1.Refresh(); sideBar1.Visible = true; sideBarPanelItem3.Visible = true; buttonItem1.Checked = true; controlContainerItem3.Visible = true; sideBarPanelItem4.Visible = true; sideBarPanelItem4.Text = "水平净距分析"; trackflag = "horizontal"; //globeControl1.Globe.Action = EnumAction3D.SelectObject; panel1.Visible = false; panel2.Visible = false; panel3.Visible = false; panelEx1.Visible = false; panel4.Visible = false; controlContainerItem5.Control = panel5; panel5.Dock = DockStyle.Fill; panel5.Visible = true; sideBar1.ExpandedPanel = sideBarPanelItem4; sideBar1.Refresh(); Refresh(); } private void buttonItem85_Click(object sender, EventArgs e)//覆土分析 { layerTemp.RemoveAllFeature(); clearFeatureHighLight(); globeControl1.Refresh(); sideBar1.Visible = true; sideBarPanelItem3.Visible = true; buttonItem1.Checked = true; controlContainerItem3.Visible = true; sideBarPanelItem4.Visible = true; sideBarPanelItem4.Text = "覆土分析"; trackflag = "ftAnalysis"; //globeControl1.Globe.Action = EnumAction3D.SelectObject; panel1.Visible = false; panel3.Visible = false; panel2.Visible = false; panel5.Visible = false; panelEx1.Visible = false; controlContainerItem5.Control = panel4; panel4.Visible = true; panel4.Dock = DockStyle.Fill; sideBar1.ExpandedPanel = sideBarPanelItem4; sideBar1.Refresh(); Refresh(); } private void checkBoxX5_CheckedChanged(object sender, EventArgs e) { clearFeatureHighLight(); if (checkBoxX5.Checked) { globeControl1.Globe.ClearAnalysis(); layerTemp.RemoveAllFeature(); globeControl1.Refresh(); comboBoxEx3.Enabled = false; dataGridViewX6.Rows.Clear(); dataGridViewX7.Rows.Clear(); trackflag = "ftAnalysis"; //globeControl1.Globe.Action = EnumAction3D.TrackPolygonAnalysis; globeControl1.Globe.Action = EnumAction3D.SelectObject; } else { comboBoxEx3.Enabled = true; } } private void checkBoxX6_CheckedChanged(object sender, EventArgs e) { clearFeatureHighLight(); comboBoxEx3.Enabled = checkBoxX6.Checked; if (checkBoxX6.Checked) { globeControl1.Globe.Action = EnumAction3D.ActionNull; textBoxX1.Enabled = true; trackflag = ""; dataGridViewX6.Rows.Clear(); dataGridViewX7.Rows.Clear(); comboBoxEx3.SelectedIndex = -1; } globeControl1.Globe.ClearAnalysis(); layerTemp.RemoveAllFeature(); globeControl1.Refresh(); } private void comboBoxEx3_SelectedIndexChanged(object sender, EventArgs e) { if (comboBoxEx3.SelectedIndex > -1) { //feats_vertical.RemoveAll(); dataGridViewX6.Rows.Clear(); dataGridViewX7.Rows.Clear(); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx3.SelectedItem.ToString()); if (layer == null) return; GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = flayer.GetAllFeatures(); //feats_vertical = feats; for (int i = 0; i < feats.Length; i++) { int idx = dataGridViewX6.Rows.Add(); dataGridViewX6.Rows[idx].Cells[0].Value = comboBoxEx3.SelectedItem.ToString(); dataGridViewX6.Rows[idx].Cells[1].Value = feats[i].Name; } } } private void buttonX9_Click(object sender, EventArgs e)//开始分析 覆土分析 { if (!checkBoxX5.Checked && !checkBoxX6.Checked) { MessageBox.Show("请确定是选择管线还是选择图层!", "提示"); return; } if (textBoxX3.Text.Trim() == "") { MessageBox.Show("覆土深度不能为空!", "提示"); return; } double dFuTuShenDu = 0; if (!double.TryParse(textBoxX3.Text.Trim(), out dFuTuShenDu)) { MessageBox.Show("请输入正确的覆土深度!", "提示"); return; } if (dataGridViewX6.Rows.Count > 0) { layerTemp.RemoveAllFeature(); dataGridViewX7.Rows.Clear(); clearFeatureHighLightIgnoreSelectObject(); if (checkBoxX5.Checked) { for (int i = 0; i < dataGridViewX6.Rows.Count; i++) { GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX6.Rows[i].Cells[0].Value.ToString()); if (l != null) { GSOFeatureLayer flayer = l as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = flayer.GetAllFeatures(); for (int j = 0; j < feats.Length; j++) { string featureName = ""; if(feats[j].GetFieldDefn("编号") !=null) { featureName = feats[j].GetValue("编号").ToString(); } else { featureName = feats[j].Name; } if (featureName == dataGridViewX6.Rows[i].Cells[1].Value.ToString()) { // CollisionAnalysis_Selected(feats[j]); GSOFeature f = feats[j]; GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; if(line ==null) continue; GSOPipeLineStyle3D style = line.Style as GSOPipeLineStyle3D; if (style == null) continue; if (line.PartCount > 0) { GSOPoint3ds pts = line[0]; for (int m = 0; m < pts.Count; m++) { if (Math.Abs(pts[m].Z + (style.Radius / 1000)) < Convert.ToDouble(textBoxX3.Text.Trim())) { f.HighLight = true; int idx = dataGridViewX7.Rows.Add(); dataGridViewX7.Rows[idx].Cells[0].Value = l.Caption; dataGridViewX7.Rows[idx].Cells[1].Value = featureName; dataGridViewX7.Rows[idx].Cells[2].Value = Math.Abs((pts[m].Z + (style.Radius / 1000))).ToString(); break; } } } } } } } } else if (checkBoxX6.Checked) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(comboBoxEx3.SelectedItem.ToString()); if (layer == null) return; GSOFeatureLayer flayer = layer as GSOFeatureLayer; GSOFeatureDataset fdataset = flayer.Dataset as GSOFeatureDataset; GSOFeatures feats = flayer.GetAllFeatures(); for (int i = 0; i < feats.Length; i++) { GSOFeature f = feats[i]; string featureName = ""; if (feats[i].GetFieldDefn("编号") != null) { featureName = feats[i].GetValue("编号").ToString(); } else { featureName = feats[i].Name; } GSOGeoPolyline3D line = f.Geometry as GSOGeoPolyline3D; if (line == null) continue; GSOPipeLineStyle3D style = line.Style as GSOPipeLineStyle3D; if (style == null) continue; if (line.PartCount > 0) { GSOPoint3ds pts = line[0]; for (int m = 0; m < pts.Count; m++) { if (Math.Abs(pts[m].Z + (style.Radius / 1000)) < Convert.ToDouble(textBoxX3.Text.Trim())) { f.HighLight = true; int idx = dataGridViewX7.Rows.Add(); dataGridViewX7.Rows[idx].Cells[0].Value = layer.Caption; dataGridViewX7.Rows[idx].Cells[1].Value = featureName; dataGridViewX7.Rows[idx].Cells[2].Value = Math.Abs((pts[m].Z + (style.Radius / 1000))).ToString(); break; } } } } } globeControl1.Refresh(); if (dataGridViewX7.Rows.Count == 0) { MessageBox.Show("所有管线满足覆土净距标准!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else { MessageBox.Show("请选中要进行覆土分析的管线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); //globeControl1.Globe.Action = EnumAction3D.SelectObject; } } private void dataGridViewX7_MouseDoubleClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { DataGridView.HitTestInfo hittestinfo = dataGridViewX7.HitTest(e.X, e.Y); if (hittestinfo.RowIndex > -1) { string featureName = dataGridViewX7.Rows[hittestinfo.RowIndex].Cells[1].Value.ToString(); featureName = featureName.Trim(); //GSOLayer layer = globeControl1.Globe.Layers.GetLayerByID((int)(Utility.LayerLabel_LayerIDs[currentQueryLayer])); GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(dataGridViewX7.Rows[hittestinfo.RowIndex].Cells[0].Value.ToString()); // GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption("reli"); if (layer != null) { GSOFeatures features = layer.GetFeatureByName(featureName, false); for (int j = 0; j < features.Length; j++) { if (features[j].GetFieldDefn("编号") != null && features[j].GetValue("编号").ToString() == featureName) { m_feature = features[j]; if (m_feature.Geometry != null && m_feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOGeoPolyline3D line = m_feature.Geometry as GSOGeoPolyline3D; double length = line.GetSpaceLength(true, 6378137); GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2); GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1]; globeControl1.Globe.JumpToPosition(point3d, EnumAltitudeMode.Absolute, 5); } else { globeControl1.Globe.JumpToFeature(m_feature, 5); } break; } else if (features[j].Name == featureName) { m_feature = features[j]; if (m_feature.Geometry != null && m_feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOGeoPolyline3D line = m_feature.Geometry as GSOGeoPolyline3D; double length = line.GetSpaceLength(true, 6378137); GSOGeoPolyline3D lineLine = line.GetSegment(0, length / 2); GSOPoint3d point3d = lineLine[lineLine.PartCount - 1][lineLine[lineLine.PartCount - 1].Count - 1]; globeControl1.Globe.JumpToPosition(point3d, EnumAltitudeMode.Absolute, 5); } else { globeControl1.Globe.JumpToFeature(m_feature, 5); } break; } } } } } } private void buttonX10_Click(object sender, EventArgs e) { if (dataGridViewX7.Rows.Count > 0) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "Excel files (*.xls)|*.xls"; dlg.FilterIndex = 0; dlg.RestoreDirectory = true; dlg.Title = "保存为Excel文件"; dlg.FileName = "覆土分析" + "-" + DateTime.Now.ToString("yyyyMMdd") + ".xls"; if (dlg.ShowDialog() == DialogResult.OK) { Stream myStream; myStream = dlg.OpenFile(); StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0)); string columnTitle = ""; try { sw.WriteLine("内容:碰撞分析结果 日期:" + DateTime.Now.ToString("yyyy-MM-dd")); //写入列标题 for (int i = 0; i < dataGridViewX7.ColumnCount; i++) { if (i > 0) { columnTitle += "\t"; } columnTitle += dataGridViewX7.Columns[i].HeaderText; } sw.WriteLine(columnTitle); //写入列内容 for (int j = 0; j < dataGridViewX7.Rows.Count; j++) { string columnValue = ""; for (int k = 0; k < dataGridViewX7.Columns.Count; k++) { if (k > 0) { columnValue += "\t"; } if (dataGridViewX7.Rows[j].Cells[k].Value == null) columnValue += ""; else columnValue += dataGridViewX7.Rows[j].Cells[k].Value.ToString().Trim(); } sw.WriteLine(columnValue); } sw.Close(); myStream.Close(); if (MessageBox.Show("导出Excel文件成功!是否打开?", "提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { System.Diagnostics.Process.Start(dlg.FileName); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { sw.Close(); myStream.Close(); } } } } private void buttonX11_Click(object sender, EventArgs e) { trackflag = ""; globeControl1.Globe.Action = EnumAction3D.ActionNull; sideBarPanelItem4.Visible = false; panel4.Visible = false; checkBoxX5.Checked = false; checkBoxX6.Checked = false; comboBoxEx3.SelectedIndex = -1; dataGridViewX6.Rows.Clear(); dataGridViewX7.Rows.Clear(); if (buttonItem1.Checked) { sideBar1.ExpandedPanel = sideBarPanelItem3; } else { sideBar1.Visible = false; } Refresh(); } private void buttonItem94_Click(object sender, EventArgs e)//双屏对比 { buttonItem94.Checked = !buttonItem94.Checked; splitContainer1.Panel2Collapsed = !buttonItem94.Checked; if (buttonItem94.Checked) { buttonItem95.Enabled = true; buttonItem96.Enabled = true; sideBar1.Visible = false; buttonItem1.Checked = false; for (int i = globeControl2.Globe.Layers.Count - 1; i >= 0 ; i--) { GSOLayer layer = globeControl2.Globe.Layers[i]; if (!layer.Name.Contains("fttp:")) { globeControl2.Globe.Layers.Remove(layer); } } //globeControl2.Globe.Layers.RemoveAll(); FrmDataBaseOpt frm = new FrmDataBaseOpt(globeControl2); frm.Show(this); } else { buttonItem95.Enabled = false; buttonItem96.Enabled = false; sideBar1.Visible = true; buttonItem1.Checked = true; sideBarPanelItem3.Visible = true; layerTree.Visible = true; controlContainerItem3.Visible = true; Refresh(); } } private void buttonItem51_Click(object sender, EventArgs e) { buttonItem51.Checked = !buttonItem51.Checked; ribbonBarMN.Visible = buttonItem51.Checked; ribbonBarMN.Location = new Point(0, 0); } private void buttonItem96_Click(object sender, EventArgs e)//双屏设置 { FrmLayerControl frm = new FrmLayerControl(layerTree,globeControl1,globeControl2); frm.Show(this); } private void buttonItem95_Click(object sender, EventArgs e)//双屏联动 { buttonItem95.Checked = !buttonItem95.Checked; } private void buttonItem108_Click(object sender, EventArgs e)//添加用户仓库 { FrmUserRepo frm = new FrmUserRepo(-1); frm.ShowDialog(); } private void buttonItem111_Click(object sender, EventArgs e)//用户仓库管理 { FrmUserRepoMgr frm = new FrmUserRepoMgr(); frm.ShowDialog(); } private void buttonItem112_Click(object sender, EventArgs e)//添加分系统 { FrmAPP frm = new FrmAPP(-1); frm.ShowDialog(); } private void buttonItem113_Click(object sender, EventArgs e)//分系统管理 { FrmAPPMgr frm = new FrmAPPMgr(); frm.ShowDialog(); } private void buttonItem114_Click(object sender, EventArgs e)//添加操作 { FrmOper frm = new FrmOper(-1); frm.ShowDialog(); } private void buttonItem115_Click(object sender, EventArgs e)//操作管理 { FrmOperMgr frm = new FrmOperMgr(); frm.ShowDialog(); } private void buttonItem116_Click(object sender, EventArgs e)//添加资源 { FrmRESC frm = new FrmRESC(-1); frm.ShowDialog(); } private void buttonItem117_Click(object sender, EventArgs e)//资源管理 { FrmRESCMgr frm = new FrmRESCMgr(); frm.ShowDialog(); } private void buttonItem118_Click(object sender, EventArgs e)//添加权限 { FrmPerm frm = new FrmPerm(-1); frm.ShowDialog(); } private void buttonItem119_Click(object sender, EventArgs e)//权限管理 { FrmPermMgr frm = new FrmPermMgr(); frm.ShowDialog(); } private void buttonItem120_Click(object sender, EventArgs e)//添加访问控制 { FrmAccess frm = new FrmAccess(-1); frm.ShowDialog(); } private void buttonItem121_Click(object sender, EventArgs e)//访问控制管理 { FrmAccessMgr frm = new FrmAccessMgr(); frm.ShowDialog(); } private void buttonItem122_Click(object sender, EventArgs e)//部门类型管理 { FrmRegionTypeMgr frm = new FrmRegionTypeMgr(); frm.ShowDialog(); } private void buttonItem127_Click(object sender, EventArgs e)//添加用户 { FrmUserAdd frm = new FrmUserAdd(-1); frm.ShowDialog(); } private void buttonItem128_Click_1(object sender, EventArgs e)//用户信息管理 { FrmUserManager frm = new FrmUserManager(); frm.ShowDialog(); } private void 添加角色_Click(object sender, EventArgs e)//添加角色 { FrmRole frm = new FrmRole(-1); frm.ShowDialog(); } private void 角色管理_Click(object sender, EventArgs e)//所有角色管理 { FrmRoleMgr frm = new FrmRoleMgr(); frm.ShowDialog(); } private void buttonItem133_Click(object sender, EventArgs e)//部门角色管理 { FrmRegionRoleMgr frm = new FrmRegionRoleMgr(); frm.ShowDialog(); } private void buttonItem130_Click(object sender, EventArgs e)//部门管理 { FrmRegionMgr frm = new FrmRegionMgr(); frm.ShowDialog(); } private void buttonItem131_Click_1(object sender, EventArgs e)//传感器信息查询 { GSOFeature selectedFeature = globeControl1.Globe.SelectedObject; if (selectedFeature == null) { MessageBox.Show("请选择一个传感器对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { if (selectedFeature.Geometry != null && selectedFeature.Geometry.Type == EnumGeometryType.GeoModel) { GSOLayer layer = globeControl1.Globe.SelectedObjectLayer; string tabelName = getTableName(layer.Caption); string eqtID = selectedFeature.Description.Trim(); if (tabelName != "" && eqtID != "") { string fields = getFields(tabelName); if (fields != "") { string sql = "select " + fields + " from " + Utility.sensorDatabase + "." + tabelName + " where EqtID=" + eqtID + " order by RecordDate desc limit 1;"; DataTable dt = MySqlHelper.queryDataTable(sql); if (dt != null && dt.Rows.Count > 0) { FrmQueryMessage.ShowForm(this, dt, layer.Caption); //queryMessage.Show(this); } else { MessageBox.Show("没有查询到相关信息!", "提示"); } } else { MessageBox.Show("配置文件 \"sensorConfig.xml\" 有误!", "提示"); } } else { MessageBox.Show("请选择一个传感器对象!", "提示"); } } else { MessageBox.Show("请选择一个传感器对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } private string getTableName(string name) { string tabelName = ""; if (Utility.sensorMarkerLayers != null) { for (int i = 0; i < Utility.sensorMarkerLayers.Count; i++) { MarkerLayer mLayer = Utility.sensorMarkerLayers[i]; if (mLayer.layerName == name) { tabelName = mLayer.tableName; break; } } } return tabelName; } private string getFields(string tabelName) { string fields = ""; if (Utility.sensorMarkerLayers != null) { for (int i = 0; i < Utility.sensorMarkerLayers.Count; i++) { MarkerLayer mLayer = Utility.sensorMarkerLayers[i]; if (mLayer.tableName.Trim() == tabelName.Trim()) { if (mLayer.fields != null) { foreach (string key in mLayer.fields.Keys) { string value = mLayer.fields[key]; fields += tabelName.Trim() + "." +key + " as " + value + ","; } fields = fields.Remove(fields.Length - 1); } break; } } } return fields; } private void buttonItem132_Click(object sender, EventArgs e)//历史曲线查询 { GSOFeature selectedFeature = globeControl1.Globe.SelectedObject; if (selectedFeature == null) { MessageBox.Show("请选择一个对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { if (selectedFeature.Geometry != null && selectedFeature.Geometry.Type == EnumGeometryType.GeoModel) { GSOLayer layer = globeControl1.Globe.SelectedObjectLayer; string tabelName = getTableName(layer.Caption); string eqtID = selectedFeature.Description; if (tabelName != "" && eqtID != "") { FrmQueryHistory.ShowForm(this, tabelName, eqtID); } else { MessageBox.Show("请选择一个传感器对象!", "提示"); } } else { MessageBox.Show("请选择一个传感器对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } //定时检查传感器的状态 public System.Windows.Forms.Timer timerOfSensor = null; public int alarmValueLiuLiang = 0; public int alarmValueYaLi = 0; public int alarmValueYeTi = 0; public int alarmValueZaoSheng = 0; private void buttonItem134_Click(object sender, EventArgs e)//传感器在线报警 { if (timerOfSensor == null) { timerOfSensor = new System.Windows.Forms.Timer(); timerOfSensor.Interval = 30000; timerOfSensor.Tick += new EventHandler(timerOfSensor_Tick); } FrmQuerySensorAlarm.ShowForm(this); } private void timerOfSensor_Tick(Object sender, EventArgs e)//定时器 { checkSensor(); } private void checkSensor() { if (Utility.sensorMarkerLayers != null) { for (int i = 0; i < Utility.sensorMarkerLayers.Count; i++) { MarkerLayer mLayer = Utility.sensorMarkerLayers[i]; if (mLayer.alarmValue > 0) { string sql = "select *,max(CollectTime) from " + Utility.sensorDatabase + "." + mLayer.tableName + " group by EqtID;";// "select * from " + Utility.sensorDatabase + "." + mLayer.tableName + " order by CollectTime desc limit 1;"; DataTable dt = MySqlHelper.queryDataTable(sql); if (dt != null && dt.Rows.Count > 0) { for (int j = 0; j < dt.Rows.Count; j++) { try { string EqtID = dt.Rows[j]["EqtID"].ToString().Trim(); string RecordDateDATE = dt.Rows[j]["RecordDate"].ToString().Trim(); string RecordTimeTIME = dt.Rows[j]["RecordTime"].ToString().Trim(); string CollectTime = dt.Rows[j]["CollectTime"].ToString().Trim(); string CollectValue = ""; if (mLayer.tableName == "Data_3a") { CollectValue = dt.Rows[j]["InstantValue"].ToString().Trim(); } else { CollectValue = dt.Rows[j]["CollectValue"].ToString().Trim(); } int value = 0; if (int.TryParse(CollectValue, out value)) { if (value > mLayer.alarmValue) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(mLayer.layerName); if (layer != null) { for (int m = 0; m < layer.GetAllFeatures().Length; m++) { GSOFeature f = layer.GetAt(m); if (f != null && f.Description.Trim() == EqtID) { f.HighLight = true; globeControl1.Globe.Refresh(); LogError.PublishAlarmMessage(f.Name, EqtID, CollectValue, CollectTime); break; } } } } } } catch (Exception ex) { continue; } } } } } } } private void buttonItem135_Click(object sender, EventArgs e)//日志管理 { FrmLogManager frm = new FrmLogManager(); frm.ShowDialog(); } private void buttonItem136_Click(object sender, EventArgs e)//用户角色管理 { FrmUserRoleMgr frm = new FrmUserRoleMgr(); frm.ShowDialog(); } private void buttonItem137_Click(object sender, EventArgs e) { globeControl1.Globe.ClearAnalysis(); string[] markerStrs = new string[9]; markerStrs[0] = "标高标注"; markerStrs[1] = "管径标注"; markerStrs[2] = "埋深标注"; markerStrs[3] = "坐标标注"; markerStrs[4] = "坡度标注"; markerStrs[5] = "属性标注"; markerStrs[6] = "自定义标注"; markerStrs[7] = "距离标注"; markerStrs[8] = "红线工具"; for (int i = 0; i < markerStrs.Length; i++) { GSOLayer l = globeControl1.Globe.Layers.GetLayerByCaption(markerStrs[i]); l.RemoveAllFeature(); } globeControl1.Refresh(); } private void buttonItem138_Click(object sender, EventArgs e)//沿线运动 { if (globeControl1.Globe.SelectedObject == null) { MessageBox.Show("请先选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } GSOFeature lineFeature = globeControl1.Globe.SelectedObject; if (lineFeature.Geometry == null || lineFeature.Geometry.Type != EnumGeometryType.GeoPolyline3D) { MessageBox.Show("请先选择一条线!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "*.3ds|*.3ds|*.gcm|*.gcm|*.gse|*.gse|*.obj|*.obj||"; if (dlg.ShowDialog() == DialogResult.OK) { GSOGeoModel model = new GSOGeoModel(); model.FilePath = dlg.FileName; GSOGeoDynamicRoute dynamicRoute = new GSOGeoDynamicRoute(); dynamicRoute.ActorGeometry = model; GSORoute route = new GSORoute(); GSOGeoPolyline3D geoline = (GSOGeoPolyline3D)lineFeature.Geometry; for (int i = 0; i < geoline[0].Count; i++) { route.Add(geoline[0][i]); } route.CircleRoute = false; route.Speed = 30; route.RotateSpeed = 50; route.AltitudeMode = geoline.AltitudeMode; dynamicRoute.Route = route; GSOFeature feature = new GSOFeature(); dynamicRoute.Play(); feature.Geometry = dynamicRoute; //GSOLabel gsoLabel = new GSOLabel(); //gsoLabel.Text = "模型测试"; //feature.Label = gsoLabel; globeControl1.Globe.MinModelVisibleSize = 0; globeControl1.Globe.MemoryLayer.AddFeature(feature); globeControl1.Globe.Refresh(); } } private void buttonItem99_Click(object sender, EventArgs e)//回退 { globeControl1.Globe.UnDoEdit(); } private void buttonItem100_Click(object sender, EventArgs e)//前进 { globeControl1.Globe.ReDoEdit(); } //水平净距 private void textBoxX4_TextChanged(object sender, EventArgs e) { string valueJingJu = textBoxX4.Text.Trim(); if(valueJingJu != "") { double value = 0; bool bl = double.TryParse(valueJingJu,out value); if(bl) { labelX24.Text = "水平净距小于" + value.ToString() +"米的管线有:"; } } } //垂直净距 private void textBoxX2_TextChanged(object sender, EventArgs e) { string valueJingJu = textBoxX2.Text.Trim(); if (valueJingJu != "") { double value = 0; bool bl = double.TryParse(valueJingJu, out value); if (bl) { labelX23.Text = "垂直净距小于" + value.ToString() + "米的管线有:"; } } } //覆土分析 private void textBoxX3_TextChanged(object sender, EventArgs e) { string valueJingJu = textBoxX3.Text.Trim(); if (valueJingJu != "") { double value = 0; bool bl = double.TryParse(valueJingJu, out value); if (bl) { labelX17.Text = "覆土深度小于" + value.ToString() + "米的管线有:"; } } } //管径统计 private void buttonItem全区域_Click(object sender, EventArgs e) { Frmpipediameterstatis.ShowForm(globeControl1, pipelineLayerNames,0); } private void buttonItem绘制区域_Click(object sender, EventArgs e) { Frmpipediameterstatis.ShowForm(globeControl1, pipelineLayerNames,1); } private void buttonItem埋深全区域_Click(object sender, EventArgs e) { FrmpipeDeepstatis.ShowForm(globeControl1, pipelineLayerNames,0); } private void buttonItem埋深绘制区域_Click(object sender, EventArgs e) { FrmpipeDeepstatis.ShowForm(globeControl1, pipelineLayerNames,1); } private void buttonItem附属物全区域_Click(object sender, EventArgs e) { FrmAccessoriesgather.ShowForm(globeControl1, instrumenLayerNames,0); } private void buttonItem附属物绘制区域_Click(object sender, EventArgs e) { FrmAccessoriesgather.ShowForm(globeControl1, instrumenLayerNames,1); } private void buttonItem管径分类全区域_Click(object sender, EventArgs e) { FrmpipeDiametergather.ShowForm(globeControl1, pipelineLayerNames,0); } private void buttonItem管径分类绘制区域_Click(object sender, EventArgs e) { FrmpipeDiametergather.ShowForm(globeControl1, pipelineLayerNames,1); } private void buttonItem材质全区域_Click(object sender, EventArgs e) { FrmpipeMaterialGather.ShowForm(globeControl1, pipelineLayerNames,0); } private void buttonItem材质绘制区域_Click(object sender, EventArgs e) { FrmpipeMaterialGather.ShowForm(globeControl1, pipelineLayerNames,1); } private void buttonItemSensor全区域查询_Click(object sender, EventArgs e) { FrmAccessoriesSensor.ShowForm(globeControl1, instrumenLayerNames, 0); } private void buttonItemSensor绘制区域查询_Click(object sender, EventArgs e)//传感器绘制区域查询 { FrmAccessoriesSensor.ShowForm(globeControl1, instrumenLayerNames, 1); } private void buttonItem139_Click(object sender, EventArgs e)//传感器管理 { buttonItem139.Checked = !buttonItem139.Checked; buttonItem77.Checked = false; if (buttonItem139.Checked) { sideBar1.Visible = true; sideBarPanelItem3.Visible = true; buttonItem1.Checked = true; controlContainerItem3.Visible = true; sideBarPanelItem4.Visible = true; sideBarPanelItem4.Text = "传感器管理"; panel2.Visible = false; panel1.Visible = false; panel4.Visible = false; panel5.Visible = false; panel3.Visible = false; controlContainerItem5.Control = panelEx3; panelEx3.Dock = DockStyle.Fill; panelEx3.Visible = true; sideBar1.ExpandedPanel = sideBarPanelItem4; sideBar1.Refresh(); Refresh(); } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; sideBarPanelItem4.Visible = false; panelEx3.Visible = false; if (buttonItem1.Checked) { sideBar1.ExpandedPanel = sideBarPanelItem3; } else { sideBar1.Visible = false; } Refresh(); } } private void buttonX7_Click_1(object sender, EventArgs e) { trackflag = ""; globeControl1.Globe.Action = EnumAction3D.ActionNull; sideBarPanelItem4.Visible = false; panel2.Visible = false; checkBoxX3.Checked = false; checkBoxX4.Checked = false; comboBoxEx2.SelectedIndex = -1; dataGridViewX4.Rows.Clear(); dataGridViewX5.Rows.Clear(); if (buttonItem1.Checked) { sideBar1.ExpandedPanel = sideBarPanelItem3; } else { sideBar1.Visible = false; } Refresh(); } private void buttonX16_Click(object sender, EventArgs e) { trackflag = ""; globeControl1.Globe.Action = EnumAction3D.ActionNull; //listBox1.Items.Clear(); checkBoxX5.Checked = false; checkBoxX6.Checked = false; comboBoxEx3.SelectedIndex = -1; comboBoxEx3.Enabled = false; layerTemp.RemoveAllFeature(); globeControl1.Refresh(); dataGridViewX6.Rows.Clear(); dataGridViewX7.Rows.Clear(); } } }