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.Management; using System.Runtime.InteropServices; using System.Xml; using WorldGIS.Forms; using System.Collections; namespace WorldGIS { public partial class MainFrm : DevComponents.DotNetBar.Office2007Form { GeoScene.Globe.GSOGlobeControl globeControl1; GeoScene.Engine.GSODataManager dataMananger1; String m_strWorkSpacePath = ""; String m_strFormTitle = "LSPipeline"; GSOBalloon featureTooltip; GSOBalloon infoBalloon; GSOBalloonEx balloonEx; int m_nWaterPipeDemoTick = 0; //记录沿线飞行设置 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; TreeNode dataManagerNode = null; TreeNode myPlaceNode = null; TreeNode layerManagerNode = null; TreeNode terrainManagerNode = null; bool m_bFullScreen = false; Rectangle m_rcOld=new Rectangle(0,0,0,0); //管线间距分析 private GSOFeature m_DisAnalysisFirstFeature; private GSOFeature m_DisAnalysisSecondFeature; private GSOFeature disFeature = new GSOFeature(); private GSOFeature featureDis = new GSOFeature(); GSOLayer layerTemp; public MainFrm() { InitializeComponent(); globeControl1 = new GeoScene.Globe.GSOGlobeControl(); dataMananger1 = new GeoScene.Engine.GSODataManager(); panelGlobeControl.Controls.Add(globeControl1); globeControl1.Dock = DockStyle.Fill; layerTree.ImageList = treeImageList; layerTree.Dock = DockStyle.Fill; controlContainerItem2.Control = panelFind; panelFind.Dock = DockStyle.Fill; treeFind.ImageList = treeImageList; featureTooltip = new GSOBalloon(globeControl1.Handle); featureTooltip.CacheFilePath = Application.StartupPath + "/GeoScene/Globe/Temp"; featureTooltip.SetSize(EnumSizeIndex.ROUNDED_CX, 0); featureTooltip.SetSize(EnumSizeIndex.ROUNDED_CY, 0); featureTooltip.SetSize(EnumSizeIndex.MARGIN_CX, 3); featureTooltip.SetSize(EnumSizeIndex.MARGIN_CY, 3); featureTooltip.SetSize(EnumSizeIndex.ANCHOR_HEIGHT, 0); featureTooltip.SetSize(EnumSizeIndex.ANCHOR_WIDTH, 0); featureTooltip.SetSize(EnumSizeIndex.ANCHOR_MARGIN, 0); featureTooltip.SetSize(EnumSizeIndex.ANCHOR_OFFSET_CX, 1); featureTooltip.SetSize(EnumSizeIndex.ANCHOR_OFFSET_CY, -1); featureTooltip.SetDirection(EnumToolTipDirection.TD_BOTTOMEDGE_LEFT); featureTooltip.EscapeSequencesEnabled = true; featureTooltip.HyperlinkEnabled = true; featureTooltip.Opaque = 30; //30; featureTooltip.MaxWidth = 300; featureTooltip.SetShadow(0, 0, 50, true, 0, 0); infoBalloon = new GSOBalloon(globeControl1.Handle); infoBalloon.SetColorBkType(EnumBkColorType.SILVER); infoBalloon.SetEffectBk(EnumBkEffect.HBUMP, 0); infoBalloon.SetBorder(Color.FromArgb(255, 171, 171, 171), 1, 1); infoBalloon.SetSize(EnumSizeIndex.ROUNDED_CX, 5); infoBalloon.SetSize(EnumSizeIndex.ROUNDED_CY, 5); infoBalloon.SetSize(EnumSizeIndex.ANCHOR_HEIGHT, 20); infoBalloon.SetSize(EnumSizeIndex.ANCHOR_WIDTH, 12); infoBalloon.SetShadow(3, 3, 50, true, 0, 0); infoBalloon.MaxWidth = 300; infoBalloon.CloseButtonVisible = true; balloonEx = new GSOBalloonEx(globeControl1.Handle); balloonEx.SetSize(EnumSizeIndexEx.ANCHOR_WIDTH, 30); balloonEx.SetColorBkType(EnumBkColorTypeEx.SILVER); balloonEx.SetEffectBk(EnumBkEffectEx.OUTRANGE, 10); balloonEx.CacheFilePath = Application.StartupPath + "/GeoScene/Globe/Temp"; } //工具栏按钮 GSOHudButton navigate = null; GSOHudButton select = null; GSOHudButton line = null; GSOHudButton measure = null; GSOHudButton marker = null; GSOHudButton model = null; GSOHudButton move = null; GSOHudButton rotate = null; GSOHudButton elevate = null; private void MainFrm_Load(object sender, EventArgs e) { this.KeyPreview = true; this.Text = m_strFormTitle; globeControl1.MouseDoubleClick += new MouseEventHandler(sceneControl1_MouseDoubleClick); globeControl1.MouseMove += new MouseEventHandler(sceneControl1_MouseMove); globeControl1.MouseClick += new MouseEventHandler(sceneControl1_MouseClick); globeControl1.MouseDown += new MouseEventHandler(sceneControl1_MouseDown); globeControl1.MouseUp += new MouseEventHandler(sceneControl1_MouseUp); globeControl1.AfterLayerAddEvent += new AfterLayerAddEventHandler(globeControl1_AfterLayerAddEvent); globeControl1.FeatureMouseClickEvent += new FeatureMouseClickEventHandler(sceneControl1_FeatureMouseClick); globeControl1.FeatureMouseHoverEvent += new FeatureMouseHoverEventHandler(sceneControl1_FeatureMouseHover); globeControl1.CameraBeginMoveEvent += new CameraBeginMoveEventHandler(sceneControl1_CameraBeginMove); globeControl1.DrawAddFeatureEvent += new DrawAddFeatureEventHandler(sceneControl1_DrawAddFeature); globeControl1.AfterKeyDownDeleteFeatureEvent += new AfterKeyDownDeleteFeatureEventHandler(sceneControl1_AfterKeyDownDeleteFeatureEvent); globeControl1.TrackPolylineEndEvent += new TrackPolylineEndEventHandler(sceneControl1_TrackPolylineAnalysisEndEvent); globeControl1.TrackPolygonEndEvent += new TrackPolygonEndEventHandler(sceneControl1_TrackPolygonAnalysisEndEvent); globeControl1.AfterNetLayerAddEvent += new AfterNetLayerAddEventHandler(globeControl1_AfterNetLayerAddEvent); globeControl1.KeyDown += new KeyEventHandler(globeControl1_KeyDown); //地面透明背景色 globeControl1.Globe.UserBackgroundColorValid = true; globeControl1.Globe.UserBackgroundColor = Color.White; //globeControl1.Globe.OverviewControl.Visible = false;//鹰眼 globeControl1.Globe.ScalerControl.Visible = false; //比例尺 //自定义工具栏 GSOTextStyle textStyle = new GSOTextStyle(); textStyle.ForeColor = Color.White; textStyle.FontSize = 9; navigate = new GSOHudButton(); navigate.Name = "navigate"; navigate.TextAlign = EnumAlign.BottomCenter; navigate.TextStyle = textStyle; navigate.TextOffset = new GSOPoint2d(0, -10); navigate.SetImage(Application.StartupPath + "/Resource/images/hand36.png"); navigate.MinOpaque = 1; navigate.MaxOpaque = 1; navigate.Align = EnumAlign.BottomCenter; navigate.SetOffset(-270, 30); globeControl1.Globe.AddHudControl(navigate); select = new GSOHudButton(); select.Name = "select"; select.TextAlign = EnumAlign.BottomCenter; select.TextStyle = textStyle; select.TextOffset = new GSOPoint2d(0, -10); select.SetImage(Application.StartupPath + "/Resource/images/select36.png"); select.MinOpaque = 1; select.MaxOpaque = 1; select.Align = EnumAlign.BottomCenter; select.SetOffset(-210, 30); globeControl1.Globe.AddHudControl(select); move = new GSOHudButton(); move.Name = "move"; move.TextAlign = EnumAlign.BottomCenter; move.TextStyle = textStyle; move.TextOffset = new GSOPoint2d(0, -10); move.SetImage(Application.StartupPath + "/Resource/images/move36.png"); move.MinOpaque = 1; move.MaxOpaque = 1; move.Align = EnumAlign.BottomCenter; move.SetOffset(-150, 30); globeControl1.Globe.AddHudControl(move); rotate = new GSOHudButton(); rotate.Name = "rotate"; rotate.TextAlign = EnumAlign.BottomCenter; rotate.TextStyle = textStyle; rotate.TextOffset = new GSOPoint2d(0, -10); rotate.SetImage(Application.StartupPath + "/Resource/images/rotate36.png"); rotate.MinOpaque = 1; rotate.MaxOpaque = 1; rotate.Align = EnumAlign.BottomCenter; rotate.SetOffset(-90, 30); globeControl1.Globe.AddHudControl(rotate); elevate = new GSOHudButton(); elevate.Name = "elevate"; elevate.TextAlign = EnumAlign.BottomCenter; elevate.TextStyle = textStyle; elevate.TextOffset = new GSOPoint2d(0, -10); elevate.SetImage(Application.StartupPath + "/Resource/images/elevate36.png"); elevate.MinOpaque = 1; elevate.MaxOpaque = 1; elevate.Align = EnumAlign.BottomCenter; elevate.SetOffset(-30, 30); globeControl1.Globe.AddHudControl(elevate); line = new GSOHudButton(); line.Name = "line"; line.TextAlign = EnumAlign.BottomCenter; line.TextStyle = textStyle; line.TextOffset = new GSOPoint2d(0, -10); line.SetImage(Application.StartupPath + "/Resource/images/line36.png"); line.MinOpaque = 1; line.MaxOpaque = 1; line.Align = EnumAlign.BottomCenter; line.SetOffset(30, 30); globeControl1.Globe.AddHudControl(line); measure = new GSOHudButton(); measure.Name = "measure"; measure.TextAlign = EnumAlign.BottomCenter; measure.TextStyle = textStyle; measure.TextOffset = new GSOPoint2d(0, -10); measure.SetImage(Application.StartupPath + "/Resource/images/measure36.png"); measure.MinOpaque = 1; measure.MaxOpaque = 1; measure.Align = EnumAlign.BottomCenter; measure.SetOffset(90, 30); globeControl1.Globe.AddHudControl(measure); marker = new GSOHudButton(); marker.Name = "marker"; marker.TextAlign = EnumAlign.BottomCenter; marker.TextStyle = textStyle; marker.TextOffset = new GSOPoint2d(0, -10); marker.SetImage(Application.StartupPath + "/Resource/images/marker36.png"); marker.MinOpaque = 1; marker.MaxOpaque = 1; marker.Align = EnumAlign.BottomCenter; marker.SetOffset(150, 30); globeControl1.Globe.AddHudControl(marker); model = new GSOHudButton(); model.Name = "model"; model.TextAlign = EnumAlign.BottomCenter; model.TextStyle = textStyle; model.TextOffset = new GSOPoint2d(0, -10); model.SetImage(Application.StartupPath + "/Resource/images/model36.png"); model.MinOpaque = 1; model.MaxOpaque = 1; model.Align = EnumAlign.BottomCenter; model.SetOffset(210, 30); globeControl1.Globe.AddHudControl(model); //给工具栏绑定事件 globeControl1.HudControlMouseDownEvent += new HudControlMouseDownEventHandler(globeControl1_HudControlMouseDownEvent); globeControl1.HudControlMouseIntoEvent += new HudControlMouseIntoEventHandler(globeControl1_HudControlMouseIntoEvent); globeControl1.HudControlMouseOutEvent += new HudControlMouseOutEventHandler(globeControl1_HudControlMouseOutEvent); globeControl1.Globe.StatusBar.Visible = true; globeControl1.Globe.LatLonGrid.Visible = GridMenue.Checked = false; MarbleSurfaceMenuItem.Checked = globeControl1.Globe.MarbleVisible; underGroundLockedMenuItem.Checked = globeControl1.Globe.IsUnderGroundLocked; globeControl1.Globe.UnderGroundFloor.Visible = false; globeControl1.Globe.Object2DMouseOverEnable = true; 地下网格ToolStripMenuItem.Checked = false; MenuItem2DObjMouseOverEnable.Checked = true; AtmospherMenue.Checked = true; StatusMenu.Checked = true; NavigationControlMenu.Checked = true; MainToolBarShowMenu.Checked = true; dataManagerNode = new TreeNode(); dataManagerNode.ImageIndex = 0; dataManagerNode.SelectedImageIndex = 0; dataManagerNode.Checked = true; dataManagerNode.Text = "数据管理"; layerTree.Nodes.Add(dataManagerNode); 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); layerManagerNode = new TreeNode(); layerManagerNode.ImageIndex = 0; layerManagerNode.SelectedImageIndex = 0; layerManagerNode.Checked = true; layerManagerNode.Text = "图层管理"; layerTree.Nodes.Add(layerManagerNode); terrainManagerNode = new TreeNode(); terrainManagerNode.ImageIndex = 0; terrainManagerNode.SelectedImageIndex = 0; terrainManagerNode.Checked = true; terrainManagerNode.Text = "地形管理"; layerTree.Nodes.Add(terrainManagerNode); ReadKmlToMemoryLayer(Path.GetDirectoryName(Application.ExecutablePath) + "/MyPlace.kml"); RefreshDataTree(); globeControl1.Globe.FlyAlongLineSpeed = m_dFlyAlongLineSpeed; globeControl1.Globe.FlyAlongLineRotateSpeed = m_dFlyAlongLineRotateSpeed; ActionToolMenuChecked(); //修改状态栏 globeControl1.Globe.StatusBar.SetTextVisible(EnumStatusBarText.ProCoord, false); globeControl1.Globe.StatusBar.SetTextVisible(EnumStatusBarText.TerrainHeight, false); // 加上这句Mouseover、MouseInto、MouseOut才会有反应 globeControl1.Globe.FeatureMouseOverEnable = true; MenuItemMouseOverEventEnable.Checked = true; globeControl1.Globe.FeatureMouseOverHighLight=false; EnableMouseOverHighLightMenu.Checked = false; CameraNavigationMenu.Checked = true; AntiAntialiasingMenuItem.Checked = globeControl1.Globe.Antialiasing; globeControl1.Globe.ModelRenderDetail = EnumRenderDetail.Texture; ModelTextureMenuItem.Checked = true; globeControl1.Globe.HighlightEntityStyle3D.EntityColor = Color.FromArgb(255, 255, 255, 0); // 沿线飞行 globeControl1.Globe.FlyAlongLineSpeed = 50; //单位:m/s globeControl1.Globe.FlyAlongLineRotateSpeed = 50; // 单位:度/s globeControl1.Globe.FlyToPointSpeed = 2 * globeControl1.Globe.FlyToPointSpeed; //状态栏的显示内容 statusStrip1.Items[1].Text = "当前目标图层:" + "我的地标"; } //工具栏事件 void globeControl1_HudControlMouseDownEvent(object sender, HudControlMouseDownEventArgs e) { if (e.HudControl != null) { GSOHudButton button = e.HudControl as GSOHudButton; switch (e.HudControl.Name) { case "navigate": globeControl1.Globe.Action = EnumAction3D.ActionNull; break; case "select": globeControl1.Globe.Action = EnumAction3D.SelectObject; break; case "move": globeControl1.Globe.Action = EnumAction3D.MoveObject; break; case "rotate": globeControl1.Globe.Action = EnumAction3D.RotateObject; break; case "elevate": globeControl1.Globe.Action = EnumAction3D.ElevateObject; break; case "measure": globeControl1.Globe.Action = EnumAction3D.MeasureDistance; break; case "marker": AddPlaceMarkMenu_Click(sender, e); break; case "line": globeControl1.Globe.Action = EnumAction3D.DrawPolyline; break; case "model": AddModelMenu_Click(sender, e); break; } ActionToolMenuChecked(); } } void globeControl1_HudControlMouseIntoEvent(object sender, HudControlMouseIntoEventArgs e) { if (e.HudControl != null) { GSOHudButton button = e.HudControl as GSOHudButton; switch (e.HudControl.Name) { case "navigate": button.SetImage(Application.StartupPath + "/Resource/images/hand48.png"); button.Text = " 浏览对象"; break; case "select": button.SetImage(Application.StartupPath + "/Resource/images/select48.png"); button.Text = " 选中对象"; break; case "move": button.SetImage(Application.StartupPath + "/Resource/images/move48.png"); button.Text = " 平移对象"; break; case "rotate": button.SetImage(Application.StartupPath + "/Resource/images/rotate48.png"); button.Text = " 旋转对象"; break; case "elevate": button.SetImage(Application.StartupPath + "/Resource/images/elevate48.png"); button.Text = " 升降对象"; break; case "measure": button.SetImage(Application.StartupPath + "/Resource/images/measure48.png"); button.Text = " 测量距离"; break; case "marker": button.SetImage(Application.StartupPath + "/Resource/images/marker48.png"); button.Text = " 添加标注"; break; case "line": button.SetImage(Application.StartupPath + "/Resource/images/line48.png"); button.Text = " 绘制线"; break; case "model": button.SetImage(Application.StartupPath + "/Resource/images/model48.png"); button.Text = " 添加模型"; break; } } } void globeControl1_HudControlMouseOutEvent(object sender, HudControlMouseOutEventArgs e) { if (e.HudControl != null) { GSOHudButton button = e.HudControl as GSOHudButton; switch (e.HudControl.Name) { case "navigate": button.SetImage(Application.StartupPath + "/Resource/images/hand36.png"); button.Text = ""; break; case "select": button.SetImage(Application.StartupPath + "/Resource/images/select36.png"); button.Text = ""; break; case "move": button.SetImage(Application.StartupPath + "/Resource/images/move36.png"); button.Text = ""; break; case "rotate": button.SetImage(Application.StartupPath + "/Resource/images/rotate36.png"); button.Text = ""; break; case "elevate": button.SetImage(Application.StartupPath + "/Resource/images/elevate36.png"); button.Text = ""; break; case "measure": button.SetImage(Application.StartupPath + "/Resource/images/measure36.png"); button.Text = ""; break; case "marker": button.SetImage(Application.StartupPath + "/Resource/images/marker36.png"); button.Text = ""; break; case "line": button.SetImage(Application.StartupPath + "/Resource/images/line36.png"); button.Text = ""; break; case "model": button.SetImage(Application.StartupPath + "/Resource/images/model36.png"); button.Text = ""; break; } } } //调转管线方向的快捷键的事件 void globeControl1_KeyDown(object sender, KeyEventArgs e) { if (e.Modifiers == Keys.Control && e.KeyCode == Keys.G) { ReverseDirection(); } } 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.Insert(0, node); } layerManagerNode.Expand(); terrainManagerNode.Expand(); } private void ActionToolMenuChecked() { 平面距离量算ToolStripMenuItem.Checked = (globeControl1.Globe.Action == EnumAction3D.MeasureDistance && !globeControl1.Globe.DistanceRuler.SpaceMeasure); 距地面高度量算ToolStripMenuItem.Checked = (globeControl1.Globe.Action == EnumAction3D.MeasureHeight && !globeControl1.Globe.HeightRuler.SpaceMeasure); 平面面积量算ToolStripMenuItem.Checked = (globeControl1.Globe.Action == EnumAction3D.MeasureArea && !globeControl1.Globe.AreaRuler.SpaceMeasure); 空间距离量算ToolStripMenuItem.Checked = (globeControl1.Globe.Action == EnumAction3D.MeasureDistance && globeControl1.Globe.DistanceRuler.SpaceMeasure); 空间高度量算ToolStripMenuItem.Checked = (globeControl1.Globe.Action == EnumAction3D.MeasureHeight && globeControl1.Globe.HeightRuler.SpaceMeasure); 空间面积量算ToolStripMenuItem.Checked = (globeControl1.Globe.Action == EnumAction3D.MeasureArea && globeControl1.Globe.AreaRuler.SpaceMeasure); 框选删除ToolStripMenuItem.Checked = (globeControl1.Globe.Action == EnumAction3D.TrackPolygon); 横断面分析toolStripMenuItem3.Checked = (globeControl1.Globe.Action == EnumAction3D.TrackPolyline); SelObjMenu.Checked = (globeControl1.Globe.Action == EnumAction3D.SelectObject); MoveObjMenu.Checked = (globeControl1.Globe.Action == EnumAction3D.MoveObject); ScaleObjMenu.Checked = (globeControl1.Globe.Action == EnumAction3D.ScaleObject); RotateObjMenu.Checked = (globeControl1.Globe.Action == EnumAction3D.RotateObject); ElevateMenu.Checked = (globeControl1.Globe.Action == EnumAction3D.ElevateObject); ActionBrowseMenu.Checked = (globeControl1.Globe.Action == EnumAction3D.ActionNull); AddLineMenu.Checked = (globeControl1.Globe.Action == EnumAction3D.DrawPolyline); DrawWaterMenuItem.Checked = (globeControl1.Globe.Action == EnumAction3D.DrawWater); DrawPolygonMenuItem.Checked = (globeControl1.Globe.Action == EnumAction3D.DrawPolygon); QuickFlyMenu.Checked = (m_nFlyMode == 1); MidSpeedFlyMenu.Checked = (m_nFlyMode == 2); SlowFlyMenu.Checked = (m_nFlyMode == 3); SelLevel1MenuItem.Checked=(globeControl1.Globe.SelLevel==0); SelLevel2MenuItem.Checked = (globeControl1.Globe.SelLevel == 1); SelLevel3MenuItem.Checked = (globeControl1.Globe.SelLevel == 2); SetSelLevelMenuItem.Checked = (globeControl1.Globe.SelLevel > 2); if (globeControl1.Globe.Action != EnumAction3D.TrackPolyline) { ProfileAnalysisMenuItem.Checked = false; BaselineProfileAnalysisMenuItem.Checked = false; LineDigPitMenuItem.Checked = false; } if (globeControl1.Globe.Action != EnumAction3D.TrackPolygon) { DigFillAnalysisMenuItem.Checked = false; NoSourceFloodSubmergeMenuItem.Checked = false; PolygonDigPitMenuItem.Checked = false; } string currentAction = ""; switch(globeControl1.Globe.Action) { case EnumAction3D.ActionNull: currentAction = "浏览对象"; break; case EnumAction3D.DrawPolygon: currentAction = "绘制面"; break; case EnumAction3D.DrawPolyline: currentAction = "绘制线"; break; case EnumAction3D.DrawWater: currentAction = "绘制水面"; break; case EnumAction3D.ElevateObject: currentAction = "升降对象"; break; case EnumAction3D.MeasureArea: currentAction = "测量面积"; break; case EnumAction3D.MeasureDistance: currentAction = "测量距离"; break; case EnumAction3D.MeasureHeight: currentAction = "测量高度"; break; case EnumAction3D.MoveObject: currentAction = "平移对象"; break; case EnumAction3D.RotateObject: currentAction = "旋转对象"; break; case EnumAction3D.ScaleObject: currentAction = "缩放对象"; break; case EnumAction3D.SelectObject: currentAction = "选择对象"; break; case EnumAction3D.TrackPolygon: currentAction = "填挖方分析"; break; case EnumAction3D.TrackPolyline: currentAction = "剖面分析"; break; case EnumAction3D.ViewEnvelopeAnalysis: currentAction = "可视包络分析"; break; case EnumAction3D.ViewshedAnalysis: currentAction = "可视域分析"; break; case EnumAction3D.VisibilityAnalysis: currentAction = "空间通视分析"; break; default: break; } statusStrip1.Items[0].Text = "当前鼠标状态:" + currentAction; } private void LookSelobjAttribute(GSOLayer layer,GSOFeature feature) { if (feature != null) { FrmFeatureInfo dlg = new FrmFeatureInfo(feature,layer,globeControl1,false); dlg.Show(this); } } private void LookSelobjAttribute(GSOFeature feature) { if (feature != null) { FrmFeatureInfo dlg = new FrmFeatureInfo(feature, null, globeControl1,false); dlg.Show(this); } } 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); } } 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; } private object AddLayerData(string strDataPath) { object objRes = null; if (Path.GetExtension(strDataPath).ToLower().Equals(".kml")) { GSOLayer layer = globeControl1.Globe.Layers.Add(strDataPath); objRes = layer; } 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.Insert(0, node); } } else { GSOLayer layer = globeControl1.Globe.Layers.Add(strDataPath); objRes = layer; } RefreshDataTree(); return objRes; } 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.Multiselect = true; if (dlg.ShowDialog() == DialogResult.OK) { for (int i = 0; i < dlg.FileNames.Length; i++) { AddLayerData(dlg.FileNames[i]); } } } 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) { 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); } } } void sceneControl1_MouseMove(object sender, MouseEventArgs e) { if (featureTooltip.IsVisible()) { featureTooltip.HideBalloon(); } } void sceneControl1_FeatureMouseHover(object sender, FeatureMouseHoverEventArgs e) { if (e.Feature.Name != "") { featureTooltip.ShowBalloon((int)e.MousePos.X, (int)e.MousePos.Y, e.Feature.Name); } } void sceneControl1_FeatureMouseClick(object sender, FeatureMouseClickEventArgs e) { if (e.Feature.Description != "") { featureTooltip.HideBalloon(); infoBalloon.HideBalloon(); balloonEx.HideBalloon(); GSOBalloonParam balloonParam = balloonEx.ParseParam(e.Feature.Description); if (balloonParam.ShowMode == EnumShowModeEx.BALLOON) { infoBalloon.ShowBalloon((int)e.MousePos.X, (int)e.MousePos.Y, balloonParam.Content); } else { balloonEx.ShowBalloonEx((int)e.MousePos.X, (int)e.MousePos.Y, balloonParam); } } } void sceneControl1_CameraBeginMove(object sender, CameraBeginMoveEventArgs e) { if (featureTooltip.IsVisible()) { featureTooltip.HideBalloon(); } if (infoBalloon.IsVisible()) { infoBalloon.HideBalloon(); } if (balloonEx.IsVisible()) { balloonEx.HideBalloon(); } } void sceneControl1_MouseDoubleClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (globeControl1.Globe.Action == EnumAction3D.SelectObject) { GSOLayer layer = globeControl1.Globe.SelectedObjectLayer; GSOFeature feature = globeControl1.Globe.SelectedObject; LookSelobjAttribute(layer,feature); } } } void sceneControl1_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { 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); } GSOPoint3d pt = new GSOPoint3d(); pt.X = point.X; pt.Y = point.Y; pt.Z = point.Z; if (addfitflag) { WorldGIS.Forms.FrmAddPipeFitting frm = new WorldGIS.Forms.FrmAddPipeFitting(globeControl1, pt, globeControl1.Globe.DestLayerFeatureAdd); frm.Show(this); addfitflag = false; } } } void sceneControl1_MouseDown(object sender, MouseEventArgs e) { rMouseUpContextMenuStrip.Hide(); if (e.Button == MouseButtons.Right) { m_pntRMouseDown.X = e.X; m_pntRMouseDown.Y = e.Y; } } GSOFeature featureMouseRightClickAttr = null; void sceneControl1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { if (e.X - m_pntRMouseDown.X == 0 && e.Y - m_pntRMouseDown.Y == 0) { featureMouseRightClickAttr = globeControl1.Globe.HitTest(e.X, e.Y, false, false); if (featureMouseRightClickAttr != null && featureMouseRightClickAttr.Geometry != null) { rMouseUpContextMenuStrip.Items["属性ToolStripMenuItem1"].Visible = true; if (featureMouseRightClickAttr.Geometry.Type == EnumGeometryType.GeoPolygon3D) { rMouseUpContextMenuStrip.Items["框选导出图层ToolStripMenuItem"].Visible = true; } } else { rMouseUpContextMenuStrip.Items["属性ToolStripMenuItem1"].Visible = false; rMouseUpContextMenuStrip.Items["框选导出图层ToolStripMenuItem"].Visible = false; } rMouseUpContextMenuStrip.Show(globeControl1, e.X, e.Y); } } } void sceneControl1_DrawAddFeature(object sender, DrawAddFeatureEventArgs e) { if(e.Layer!=null) { TreeNode node = FindTreeNodeByLayer(e.Layer); if(node!=null) { RefreshTreeNodeLayerFeatureList(node); } } } void sceneControl1_AfterKeyDownDeleteFeatureEvent(object sender, AfterKeyDownDeleteFeatureEventArgs e) { if(e.Layer!=null) { TreeNode node = FindTreeNodeByLayer(e.Layer); if (node != null) { RefreshTreeNodeLayerFeatureList(node); } } } void sceneControl1_TrackPolylineAnalysisEndEvent(object sender, TrackPolylineEndEventArgs e) { if (e.Polyline != null) { // 如果是剖面分析 if (ProfileAnalysisMenuItem.Checked) { GSOPoint3d pntMax,pntMin,pntStart,pntEnd; GSOPoint3ds pnt3ds; double dLineLength; globeControl1.Globe.Analysis3D.ProfileAnalyse(e.Polyline, 100, out pnt3ds, out dLineLength, out pntMax, out pntMin, out pntStart, out pntEnd); FrmAnalysisProfile dlg=new FrmAnalysisProfile(); dlg.m_pnt3ds = pnt3ds; dlg.m_pntMax = pntMax; dlg.m_pntMin = pntMin; dlg.m_pntStart = pntStart; dlg.m_pntEnd = pntEnd; dlg.m_dXTotalLength = dLineLength; dlg.m_dSphereLength = e.Polyline.GetSphereLength(6378137.0); dlg.m_dSpaceLength = e.Polyline.GetSpaceLength(false,6378137.0); dlg.m_dGroundLength = globeControl1.Globe.Analysis3D.GetGroundLength(e.Polyline,false,0); dlg.Show(this); } else if (BaselineProfileAnalysisMenuItem.Checked) //基线剖面分析 { FrmBaseLineProfillAnalysis dlg = new FrmBaseLineProfillAnalysis(); dlg.m_globe = globeControl1.Globe; dlg.m_geopolyline = e.Polyline; dlg.Show(this); } else if (LineDigPitMenuItem.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(); } else if (横断面分析toolStripMenuItem3.Checked) { ArrayList arraylistPoint = new ArrayList(); ArrayList arraylistLine = new ArrayList(); for (int i = 0; i < globeControl1.Globe.Layers.Count; i++) { GSOLayer layer = globeControl1.Globe.Layers[i]; if (layer == null) { return; } if (layer.Visible == false) { continue; } GSOFeatureLayer featurelayer = layer as GSOFeatureLayer; if (featurelayer != null) { GSOFeatures feats = featurelayer.GetAllFeatures(); //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) { GSOPoint3d pntIntersect1; GSOPoint3d pntIntersect2; double dHonLen; double dVerLen; double dNoIntersectStartRatio = 0; bool isIntersect = globeControl1.Globe.Analysis3D.IsTwoGeoPolylineIntersect2D(e.Polyline, geoline); if (isIntersect) { double dDist = globeControl1.Globe.Analysis3D.ComputeTwoGeoPolylineDistance(e.Polyline, geoline, out pntIntersect1, out pntIntersect2, out dHonLen, out dVerLen, false, false, dNoIntersectStartRatio); if (dDist > -1) { arraylistPoint.Add(pntIntersect2); arraylistLine.Add(feateline); } } globeControl1.Globe.Action = EnumAction3D.ActionNull; } } } } FrmAnalysisHengDuanMian frm = FrmAnalysisHengDuanMian.GetForm(arraylistPoint, arraylistLine, e.Polyline, globeControl1); if (!frm.isShowFirst) { frm.Show(this); } frm.LoadChartEvent(); globeControl1.Globe.ClearAnalysis(); } } globeControl1.Globe.Action = EnumAction3D.ActionNull; ActionToolMenuChecked(); } void sceneControl1_TrackPolygonAnalysisEndEvent(object sender, TrackPolygonEndEventArgs e) { if (e.Polygon != null) { // 如果是剖面分析 if (DigFillAnalysisMenuItem.Checked) { FrmAnalysisDigFill dlg = new FrmAnalysisDigFill(); dlg.m_globe = globeControl1.Globe; dlg.m_polygon3D = e.Polygon; dlg.Show(this); } else if (NoSourceFloodSubmergeMenuItem.Checked) { FrmFloodSubmergeAnalysis dlg = new FrmFloodSubmergeAnalysis(); dlg.m_globe = globeControl1.Globe; dlg.m_polygon3D = e.Polygon; dlg.Show(this); } else if (PolygonDigPitMenuItem.Checked) { GSOGeoPit geoPit=new GSOGeoPit(); if (m_bDigPitByDepth) { geoPit.PitDepth = m_dDigPitValue; geoPit.PitDepthUsing = true; } else { geoPit.PitBottomAlt = m_dDigPitValue; geoPit.PitDepthUsing = false; } geoPit.PitPolygon = e.Polygon; globeControl1.Globe.AddPit("", geoPit); // 清除当前TrackPolygonAnalysis的痕迹 globeControl1.Globe.ClearLastTrackPolygon(); globeControl1.Globe.ClearLastTrackPolyline(); } else if (trackPolygonEndFunction == "polygonOpenAttributes") { TreeNode node = layerNodeContexMenu.Tag as TreeNode; GSOLayer layer = node.Tag as GSOLayer; if (layer != null) { GSOFeatures features = layer.FindFeaturesInPolygon(e.Polygon,false); if (features == null || features.Length <= 0) { MessageBox.Show("选中的对象为空,请重新选择!","提示"); return; } FrmEditLayerAttributesByTable frm_editor = FrmEditLayerAttributesByTable.GetForm(layer, features, globeControl1); frm_editor.SetDataTable(); if (!frm_editor.isShow) { return; } if (!frm_editor.isShowFirst) { frm_editor.Show(this); } } globeControl1.Globe.ClearLastTrackPolygon(); globeControl1.Globe.Refresh(); trackPolygonEndFunction = ""; } else if (trackPolygonEndFunction == "polygonDelete") { GSOLayer layer = globeControl1.Globe.DestLayerFeatureAdd; if (layer != null) { GSOFeatures fs = layer.FindFeaturesInPolygon(e.Polygon, false); if (fs != null && fs.Length > 0) { for (int i = 0; i < fs.Length; i++) { fs[i].Delete(); } } } globeControl1.Globe.ClearLastTrackPolygon(); globeControl1.Globe.Refresh(); return; } } globeControl1.Globe.Action = EnumAction3D.ActionNull; ActionToolMenuChecked(); } private TreeNode FindTreeNodeByLayer(GSOLayer layer) { if (globeControl1.Globe.MemoryLayer.IsSameInnerObject(layer)) { return myPlaceNode; } for (Int32 i = 0; i < layerManagerNode.Nodes.Count;i++ ) { GSOLayer tempLayer = layerManagerNode.Nodes[i].Tag as GSOLayer; if (tempLayer.IsSameInnerObject(layer)) { return layerManagerNode.Nodes[i]; } } return null; } private void SaveFiles(string filename, string filecontent) { FileStream fs = null; try { fs = File.Create(filename); byte[] content = new UTF8Encoding(true).GetBytes(filecontent); fs.Write(content, 0, content.Length); fs.Flush(); } catch (Exception ex) { Log.PublishTxt(ex); MessageBox.Show(ex.Message,"提示"); } finally { if (fs != null) { fs.Close(); } } } 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 = feature.Visible; 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 = feature.Visible; tempnode.Tag = feature; node.Nodes.Add(tempnode); } } } private void CheckTreeNode(TreeNode node, Boolean bChecked) { CheckChildTreeNode(node, bChecked); globeControl1.Globe.Refresh(); } private void CheckFatherTreeNode(TreeNode node, Boolean bChecked) { TreeNode fatherNode = node.Parent; if (bChecked) { while (fatherNode != null) { fatherNode.Checked = true; fatherNode = fatherNode.Parent; } } else { while (fatherNode != null) { Boolean bHasVisible = false; for (int i = 0; i < fatherNode.Nodes.Count; i++) { if (fatherNode.Nodes[i].Checked) { bHasVisible = true; break; } } fatherNode.Checked = bHasVisible; fatherNode = fatherNode.Parent; } } } private void CheckChildTreeNode(TreeNode node, Boolean bChecked) { if (node == null) { return; } if (node.Tag != null) { if (node.Tag.GetType() == typeof(GSOFeatureFolder) || node.Tag.GetType() == typeof(GSOFeature)) { ((GSOFeature)node.Tag).SetVisibleDirectly(bChecked); } else { GSOLayer curLayer = node.Tag as GSOLayer; GSOTerrain curTerrain = node.Tag as GSOTerrain; if (curLayer != null) { curLayer.Visible = bChecked; } else if (curTerrain != null) { curTerrain.Visible = bChecked; } } } // 递归处理子节点 for (int i = 0; i < node.Nodes.Count; i++) { node.Nodes[i].Checked = bChecked; CheckChildTreeNode(node.Nodes[i], bChecked); } } private void layerTree_AfterCheck(object sender, TreeViewEventArgs e) { //防止该事件被多次引发 if (e.Action != TreeViewAction.Unknown) { CheckTreeNode(e.Node, e.Node.Checked); } } private void toolOpenFile_Click(object sender, EventArgs e) { AddLayerData(); } private void MeasureDistance_Click(object sender, EventArgs e) { MeasureDistMenu_Click(sender, e); } private void MeasureHeight_Click(object sender, EventArgs e) { MesureHeightMenu_Click(sender, e); } private void AddPalceMark_Click(object sender, EventArgs e) { AddPlaceMarkMenu_Click(sender, e); } private void layerTree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { layerTree.SelectedNode = e.Node; if (e.Button == MouseButtons.Right) { if (e.Node == myPlaceNode) { atrributeToolStripMenuItem.Visible = false; MyplaceEditableMenuItem.Checked = globeControl1.Globe.MemoryLayer.Editable; MyPlaceSelectableMenuItem.Checked = globeControl1.Globe.MemoryLayer.Selectable; MyPlaceFeatureAddLayerMenuItem.Checked = globeControl1.Globe.MemoryLayer.IsDestLayerFeatureAdd(); myPlaceContextMenu.Show(layerTree, e.X, e.Y); } // 如果是图层节点 else if (e.Node.Parent == layerManagerNode || e.Node.Parent == terrainManagerNode) { if (e.Node.Parent == layerManagerNode) { if (e.Node.Tag is GSOFeatureLayer) { //layerNodeContexMenu.Items["改变图层风格ToolStripMenuItem"].Visible = false; GSOFeatureLayer featurelayer = e.Node.Tag as GSOFeatureLayer; GSOFeatureDataset dataset = featurelayer.Dataset as GSOFeatureDataset; //if (dataset.FieldCount <= 0) //{ // layerNodeContexMenu.Items["字段编辑ToolStripMenuItem"].Visible = false; //} //else { layerNodeContexMenu.Items["字段编辑ToolStripMenuItem"].Visible = true; } } GSOLayer layer = e.Node.Tag as GSOLayer; LayerEditableMenuItem.Checked = layer.Editable; LayerSelectableMenuItem.Checked = layer.Selectable; FeatureAddLayerMenuItem.Checked = layer.IsDestLayerFeatureAdd(); LayerEditableMenuItem.Visible = true; LayerSelectableMenuItem.Visible = true; FeatureAddLayerMenuItem.Visible = true; } else { layerNodeContexMenu.Items["改变图层风格ToolStripMenuItem"].Visible = false; layerNodeContexMenu.Items["字段编辑ToolStripMenuItem"].Visible = false; layerNodeContexMenu.Items["打开属性表ToolStripMenuItem"].Visible = false; LayerEditableMenuItem.Visible = false; LayerSelectableMenuItem.Visible = false; FeatureAddLayerMenuItem.Visible = false; /* // 如果是地形那么可选择和可编辑就不显示了 treeContexMenue.Items[3].Visible = false; treeContexMenue.Items[4].Visible = false; * */ } layerNodeContexMenu.Show(layerTree, e.X, e.Y); layerNodeContexMenu.Tag = e.Node; } else if (e.Node.Tag != null) { GSOFeature feature = e.Node.Tag as GSOFeature; if (feature != null) { if (feature.Geometry != null && feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { FlyAlongWithLineMenuItem.Visible = true; } else { FlyAlongWithLineMenuItem.Visible = false; } if (feature.Geometry != null && feature.Geometry.Type == EnumGeometryType.GeoPolygon3D) { ConvertToWaterMenuItem.Visible = true; } else { ConvertToWaterMenuItem.Visible = false; } if (feature.Geometry != null && feature.Geometry.Type == EnumGeometryType.GeoModel) { ShowSingleModelTreeMenuItem.Visible = true; } else { ShowSingleModelTreeMenuItem.Visible = false; } treeContexMenue.Show(layerTree, e.X, e.Y); treeContexMenue.Tag = e.Node; } } } } private void toolStripButton1_Click(object sender, EventArgs e) { AddModelMenu_Click(sender, e); } private void FlyTo_Click(object sender, EventArgs e) { FlyToPlaceMenu_Click(sender, e); } private void LatLonGrid_Click(object sender, EventArgs e) { GridMenue_Click(sender, e); } private void SelModel_Click(object sender, EventArgs e) { SelObjMenu_Click(sender, e); } private void MoveModel_Click(object sender, EventArgs e) { MoveObjMenu_Click(sender, e); } private void scaleModel_Click(object sender, EventArgs e) { ScaleObjMenu_Click(sender, e); } private void RotateModel_Click(object sender, EventArgs e) { RotateObjMenu_Click(sender, e); } private void elvateModel_Click(object sender, EventArgs e) { ElevateMenu_Click(sender, e); } private void BrowsModel_Click(object sender, EventArgs e) { ActionBrowseMenu_Click(sender, e); } private void ExtraTerrain_Click(object sender, EventArgs e) { TerrainExtraMenu_Click(sender, e); } private void Delete_Click(object sender, EventArgs e) { TreeNode node = treeContexMenue.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 Rename_Click(object sender, EventArgs e) { TreeNode node = treeContexMenue.Tag as TreeNode; if (node != null) { layerTree.LabelEdit = true; node.BeginEdit(); } } private void layerTree_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) { TreeNode node = treeContexMenue.Tag as TreeNode; if (node == null) { return; } GSOFeature feature3d = node.Tag as GSOFeature; if (feature3d != null && e.Label != null) { feature3d.Name = e.Label; globeControl1.Refresh(); } layerTree.LabelEdit = false; } private void MainFrm_FormClosing(object sender, FormClosingEventArgs e) { if (CloseWorkSpace()) { globeControl1.Globe.MemoryLayer.SaveAs(Path.GetDirectoryName(Application.ExecutablePath) + "/MyPlace.kml"); } else { e.Cancel = true; } } private void clearMeasure_Click(object sender, EventArgs e) { ClearMeasureMenu_Click(sender, e); } private void aboutButton_Click(object sender, EventArgs e) { AboutUsMenu_Click(sender, e); } private void atrributeToolStripMenuItem_Click(object sender, EventArgs e) { TreeNode node = treeContexMenue.Tag as TreeNode; GSOLayer layer = node.Parent.Tag as GSOLayer; GSOFeature feature = node.Tag as GSOFeature; LookSelobjAttribute(layer,feature); } //大气层 private void AtmospherMenue_Click(object sender, EventArgs e) { globeControl1.Globe.Atmosphere.Visible = !globeControl1.Globe.Atmosphere.Visible; AtmospherMenue.Checked = globeControl1.Globe.Atmosphere.Visible; globeControl1.Refresh(); } //经纬网 private void GridMenue_Click(object sender, EventArgs e) { globeControl1.Globe.LatLonGrid.Visible = !globeControl1.Globe.LatLonGrid.Visible; GridMenue.Checked = globeControl1.Globe.LatLonGrid.Visible; globeControl1.Globe.Refresh(); } private void 地下网格ToolStripMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.UnderGroundFloor.Visible = !globeControl1.Globe.UnderGroundFloor.Visible; 地下网格ToolStripMenuItem.Checked = globeControl1.Globe.UnderGroundFloor.Visible; globeControl1.Globe.Refresh(); } //状态条 private void StatusMenu_Click(object sender, EventArgs e) { globeControl1.Globe.StatusBar.Visible = !globeControl1.Globe.StatusBar.Visible; StatusMenu.Checked = globeControl1.Globe.StatusBar.Visible; globeControl1.Globe.Refresh(); } private void StatusBarTool_Click(object sender, EventArgs e) { StatusMenu_Click(sender, e); } //控制面板 private void NavigationControlMenu_Click(object sender, EventArgs e) { globeControl1.Globe.ControlPanel.Visible = !globeControl1.Globe.ControlPanel.Visible; NavigationControlMenu.Checked = globeControl1.Globe.ControlPanel.Visible; globeControl1.Refresh(); } //工具条 private void MainToolBarShowMenu_Click(object sender, EventArgs e) { navigate.Visible = !navigate.Visible; select.Visible = !select.Visible; line.Visible = !line.Visible; measure.Visible = !measure.Visible; move.Visible = !move.Visible; rotate.Visible = !rotate.Visible; elevate.Visible = !elevate.Visible; marker.Visible = !marker.Visible; model.Visible = !model.Visible; MainToolBarShowMenu.Checked = navigate.Visible; globeControl1.Globe.Refresh(); } //平面距离量算 private void MeasureDistMenu_Click(object sender, EventArgs e) { if (globeControl1.Globe.Action == EnumAction3D.MeasureDistance) { if (!globeControl1.Globe.DistanceRuler.SpaceMeasure) { globeControl1.Globe.Action = EnumAction3D.ActionNull; } else { globeControl1.Globe.DistanceRuler.SpaceMeasure = false; } } else { globeControl1.Globe.Action = EnumAction3D.MeasureDistance; globeControl1.Globe.DistanceRuler.SpaceMeasure = false; } ActionToolMenuChecked(); } //平面面积量算 private void MesureAreaMenu_Click(object sender, EventArgs e) { if (globeControl1.Globe.Action == EnumAction3D.MeasureArea) { if (!globeControl1.Globe.AreaRuler.SpaceMeasure) { globeControl1.Globe.Action = EnumAction3D.ActionNull; } else { globeControl1.Globe.AreaRuler.SpaceMeasure = false; } } else { globeControl1.Globe.Action = EnumAction3D.MeasureArea; globeControl1.Globe.AreaRuler.SpaceMeasure = false; } ActionToolMenuChecked(); } //距地面高度量算 private void MesureHeightMenu_Click(object sender, EventArgs e) { if (globeControl1.Globe.Action == EnumAction3D.MeasureHeight) { if (!globeControl1.Globe.HeightRuler.SpaceMeasure) { globeControl1.Globe.Action = EnumAction3D.ActionNull; } else { globeControl1.Globe.HeightRuler.SpaceMeasure = false; } } else { globeControl1.Globe.Action = EnumAction3D.MeasureHeight; globeControl1.Globe.HeightRuler.SpaceMeasure = false; } ActionToolMenuChecked(); } //清除量算 private void ClearMeasureMenu_Click(object sender, EventArgs e) { globeControl1.Globe.ClearMeasure(); globeControl1.Refresh(); } //关于我们 private void AboutUsMenu_Click(object sender, EventArgs e) { globeControl1.Globe.UserBackgroundColorValid = true; globeControl1.Globe.UserBackgroundColor = Color.White; FrmAboutUs frm = new FrmAboutUs(); frm.ShowDialog(); } private void FlyToPlaceMenu_Click(object sender, EventArgs e) { FrmFlyToLatLonPos frm = new FrmFlyToLatLonPos(); if (frm.ShowDialog() == DialogResult.OK) { if (frm.m_strLon.Trim() != "" && frm.m_strLat.Trim() != "") { GSOPoint3d point3d = new GSOPoint3d(); point3d.X = Convert.ToSingle(frm.m_strLon); point3d.Y = Convert.ToSingle(frm.m_strLat); if (frm.m_strAlt.Trim() == "") { point3d.Z = 2000; } else { point3d.Z = Convert.ToSingle(frm.m_strAlt); } globeControl1.Globe.FlyToPosition(point3d, EnumAltitudeMode.RelativeToGround); } } } //选中对象 private void SelObjMenu_Click(object sender, EventArgs e) { globeControl1.Globe.Action = EnumAction3D.SelectObject; ActionToolMenuChecked(); } //平移对象 private void MoveObjMenu_Click(object sender, EventArgs e) { globeControl1.Globe.Action = EnumAction3D.MoveObject; ActionToolMenuChecked(); } //缩放对象 private void ScaleObjMenu_Click(object sender, EventArgs e) { globeControl1.Globe.Action = EnumAction3D.ScaleObject; ActionToolMenuChecked(); } //浏览对象 private void ActionBrowseMenu_Click(object sender, EventArgs e) { globeControl1.Globe.Action = EnumAction3D.ActionNull; ActionToolMenuChecked(); } //旋转对象 private void RotateObjMenu_Click(object sender, EventArgs e) { globeControl1.Globe.Action = EnumAction3D.RotateObject; ActionToolMenuChecked(); } //升降对象 private void ElevateMenu_Click(object sender, EventArgs e) { globeControl1.Globe.Action = EnumAction3D.ElevateObject; ActionToolMenuChecked(); } //绘制线 private void AddLineMenu_Click(object sender, EventArgs e) { globeControl1.Globe.Action = EnumAction3D.DrawPolyline; ActionToolMenuChecked(); } private void LookAttrMenu_Click(object sender, EventArgs e) { if (globeControl1.Globe.SelectedObject == null) { MessageBox.Show("对不起,您没有选中对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } LookSelobjAttribute(globeControl1.Globe.SelectedObjectLayer,globeControl1.Globe.SelectedObject); } private void TerrainExtraMenu_Click(object sender, EventArgs e) { FrmTerrainExtra dlg = new FrmTerrainExtra(); if (dlg.ShowDialog() == DialogResult.OK) { if (dlg.m_strTerrainExtra.Trim() != "") { float selselvel = 0; bool bl = float.TryParse(dlg.m_strTerrainExtra.Trim(), out selselvel); if (bl) { globeControl1.Globe.TerrainExra = selselvel; globeControl1.Globe.Refresh(); } } } } private void LockSceneMenu_Click(object sender, EventArgs e) { globeControl1.Globe.MouseRoamingEnable = !globeControl1.Globe.MouseRoamingEnable; LockSceneMenu.Checked = !globeControl1.Globe.MouseRoamingEnable; } 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 QuickFlyMenu_Click(object sender, EventArgs e) { GSOGeoPolyline3D line = getSelectObject(); if (line == null) { MessageBox.Show("请先选中一条线!"); return; } m_dFlyAlongLineSpeed = 500; m_dFlyAlongLineRotateSpeed = 200; globeControl1.Globe.FlyAlongLineSpeed = m_dFlyAlongLineSpeed; globeControl1.Globe.FlyAlongLineRotateSpeed = m_dFlyAlongLineRotateSpeed; m_nFlyMode = 1; ActionToolMenuChecked(); globeControl1.Globe.FlyEyeAlongWithLine(line, 2, 85, true, 0, false); } //中速飞行 private void MidSpeedFlyMenu_Click(object sender, EventArgs e) { GSOGeoPolyline3D line = getSelectObject(); if (line == null) { MessageBox.Show("请先选中一条线!"); return; } m_dFlyAlongLineSpeed = 50; m_dFlyAlongLineRotateSpeed = 50; globeControl1.Globe.FlyAlongLineSpeed = m_dFlyAlongLineSpeed; globeControl1.Globe.FlyAlongLineRotateSpeed = m_dFlyAlongLineRotateSpeed; m_nFlyMode = 2; ActionToolMenuChecked(); globeControl1.Globe.FlyEyeAlongWithLine(line, 2, 85, true, 0, false); } //慢速飞行 private void SlowFlyMenu_Click(object sender, EventArgs e) { GSOGeoPolyline3D line = getSelectObject(); if (line == null) { MessageBox.Show("请先选中一条线!"); return; } m_dFlyAlongLineSpeed = 10; m_dFlyAlongLineRotateSpeed = 10; globeControl1.Globe.FlyAlongLineSpeed = m_dFlyAlongLineSpeed; globeControl1.Globe.FlyAlongLineRotateSpeed = m_dFlyAlongLineRotateSpeed; m_nFlyMode = 3; ActionToolMenuChecked(); globeControl1.Globe.FlyEyeAlongWithLine(line, 2, 85, true, 0, false); } private void AddLine_Click(object sender, EventArgs e) { TreeNode featureAddLayerTreeNode = GetDestLayerFeatureAddTreeNode(); if (featureAddLayerTreeNode == null) { MessageBox.Show("没有设置目标图层,请先设置", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } GSOLayer layer = featureAddLayerTreeNode.Tag as GSOLayer; if (!layer.Visible || !layer.Selectable || !layer.Editable) { MessageBox.Show("请确保目标图层可视、可选、可编辑!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } AddLineMenu_Click(sender, e); } private void DefineFlyLineMenu_Click(object sender, EventArgs e) { GSOGeoPolyline3D line = getSelectObject(); if (line == null) { MessageBox.Show("请先选中一条线!"); return; } FrmSetFlyParams dlg = new FrmSetFlyParams(); 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 void goFindButton_Click_1(object sender, EventArgs e) { treeFind.Nodes.Clear(); if (placeNameEBox.Text.Trim().Length == 0) { MessageBox.Show("请输入名称后再查询", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } TreeNode node = new TreeNode(); node.Text = "查询结果"; node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Checked = true; treeFind.Nodes.Add(node); for (int i = 0; i < globeControl1.Globe.Layers.Count; i++) { GSOLayer layer = globeControl1.Globe.Layers[i]; if (layer.Type == EnumLayerType.FeatureLayer) { if (comboBoxCondition.Text == "包含") { GSOFeatures features = layer.GetFeatureByName(placeNameEBox.Text, false); VisitFeature3Ds(features, treeFind.Nodes[0]); } else { GSOFeatures features = layer.GetFeatureByName(placeNameEBox.Text, true); VisitFeature3Ds(features, treeFind.Nodes[0]); } } } // 内存图层也查一下吧 if (comboBoxCondition.Text == "包含") { GSOFeatures features = globeControl1.Globe.MemoryLayer.GetFeatureByName(placeNameEBox.Text, false); VisitFeature3Ds(features, treeFind.Nodes[0]); } else { GSOFeatures features = globeControl1.Globe.MemoryLayer.GetFeatureByName(placeNameEBox.Text, true); VisitFeature3Ds(features, treeFind.Nodes[0]); } treeFind.Nodes[0].Expand(); if (treeFind.Nodes[0].Nodes.Count == 0) { treeFind.Nodes.Clear(); MessageBox.Show("没有发现要查询对象", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } private void treeFind_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Node.Tag != null && e.Node.Tag.GetType() == typeof(GSOFeature)) { GSOFeature feature = e.Node.Tag as GSOFeature; if (feature.CameraState != null) { globeControl1.Globe.CameraState = feature.CameraState; } else { globeControl1.Globe.FlyToFeature(feature); } globeControl1.Refresh(); } } //移除所有 private void RemoveAllFeature_Click(object sender, EventArgs e) { globeControl1.Globe.MemoryLayer.RemoveAllFeature(); myPlaceNode.Nodes.Clear(); globeControl1.Globe.Refresh(); } private void SaveMyPlaceAs_Click(object sender, EventArgs e) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "*.lgd|*.lgd|GoogleEarth KML数据(*.kml)|*.kml|*.shp|*.shp|*.dxf|*.dxf"; if (dlg.ShowDialog() == DialogResult.OK) { globeControl1.Globe.MemoryLayer.SaveAs(dlg.FileName); } } private void MoveDown_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; Int32 nIndex = node.Index; TreeNode parentNode = node.Parent; if (nIndex < parentNode.Nodes.Count - 1) { TreeNode newNode = (TreeNode)node.Clone(); parentNode.Nodes.RemoveAt(nIndex); parentNode.Nodes.Insert(nIndex + 1, newNode); } if (parentNode == layerManagerNode) { globeControl1.Globe.Layers.MoveDown(nIndex); } else { globeControl1.Globe.Terrains.MoveDown(nIndex); } globeControl1.Globe.Refresh(); } //移除图层 private void RemoveLayer_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; if (node == null) { return; } TreeNode parentNode = node.Parent; Int32 nIndex = node.Index; if (parentNode == layerManagerNode) { string layername = globeControl1.Globe.Layers[nIndex].Name; globeControl1.Globe.Layers.Remove(nIndex); globeControl1.Globe.DataManager.DeleteDataSourceByName(layername); // 1, 多次添加同一个图层, lrp不行, kml可以。 2, datamanager removeby 3.remove delete difference } else { globeControl1.Globe.Terrains.Remove(nIndex); } node.Remove(); globeControl1.Globe.Refresh(); } private void 移除所有要素toolStripMenuItem3_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; if (node == null || node.GetNodeCount(false) < 1) { return; } TreeNode parentNode = node.Parent; Int32 nIndex = node.Index; if (parentNode == layerManagerNode) { GSOLayer layer = globeControl1.Globe.Layers[nIndex]; if (layer != null) { layer.RemoveAllFeature(); for (int i = node.Nodes.Count - 1;i>=0;i--) { node.Nodes[i].Remove(); } } } } private void MoveUp_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; Int32 nIndex = node.Index; TreeNode parentNode = node.Parent; if (nIndex > 0) { TreeNode newNode = (TreeNode)node.Clone(); parentNode.Nodes.RemoveAt(nIndex); parentNode.Nodes.Insert(nIndex - 1, newNode); } if (parentNode == layerManagerNode) { globeControl1.Globe.Layers.MoveUp(nIndex); } else { globeControl1.Globe.Terrains.MoveUp(nIndex); } globeControl1.Globe.Refresh(); } //浏览模式 private void CameraNavigation_Click(object sender, EventArgs e) { //globeControl1.Globe.CameraMode = EnumCameraMode.Navigation; CameraNavigationMenu.Checked = true; CameraWalkMenu.Checked = false; CameraUnderGroundMenu.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 CameraWalk_Click(object sender, EventArgs e) { globeControl1.Globe.CameraMode = EnumCameraMode.Walk; CameraWalkMenu.Checked = true; CameraNavigationMenu.Checked = false; CameraUnderGroundMenu.Checked = false; } //地下模式 private void CameraUnderGroundMenu_Click(object sender, EventArgs e) { //globeControl1.Globe.CameraMode = EnumCameraMode.UnderGround; CameraUnderGroundMenu.Checked = true; CameraNavigationMenu.Checked = false; CameraWalkMenu.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 GroundTransSetMenu_Click(object sender, EventArgs e) { FrmSetGroundOpaque dlg = new FrmSetGroundOpaque(); dlg.globe = globeControl1.Globe; dlg.Show(this); } private void EnableMouseOverHighLightMenu_Click(object sender, EventArgs e) { EnableMouseOverHighLightMenu.Checked = !EnableMouseOverHighLightMenu.Checked; } private void EnableMouseOverHighLightMenu_CheckedChanged(object sender, EventArgs e) { globeControl1.Globe.FeatureMouseOverHighLight = EnableMouseOverHighLightMenu.Checked; } private void ClearWorkSpace() { globeControl1.Globe.Layers.RemoveAll(); globeControl1.Globe.Terrains.RemoveAll(); globeControl1.Globe.DataManager.RemoveAllDataSources(); terrainManagerNode.Nodes.Clear(); layerManagerNode.Nodes.Clear(); dataManagerNode.Nodes.Clear(); globeControl1.Globe.Refresh(); } private bool CloseWorkSpace() { if (globeControl1.Globe.Layers.Count > 0 || globeControl1.Globe.Terrains.Count>0) { DialogResult result = MessageBox.Show("是否保存数据?", "关闭工程", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (result == DialogResult.Yes || result == DialogResult.No) { if (result == DialogResult.Yes) { SaveAllData(); } this.Text = m_strFormTitle; m_strWorkSpacePath = ""; ClearWorkSpace(); return true; } else { return false; } } return true; } //打开工程 private void OpenWorkSpaceMenuItem_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "工程文件(*.gws)|*.gws|*.*|*.*||"; if (dlg.ShowDialog() == DialogResult.OK) { if (CloseWorkSpace()) { globeControl1.Globe.OpenWorkSpace(dlg.FileName); m_strWorkSpacePath = dlg.FileName; this.Text = m_strFormTitle + " - " + dlg.FileName; RefreshLayerAndTerrainTree(); globeControl1.Globe.Refresh(); } } } //关闭工程 private void MenuItemCloseWorkSpace_Click(object sender, EventArgs e) { CloseWorkSpace(); } //保存工程 private void SaveWorkSpaceMenuItem_Click(object sender, EventArgs e) { if (m_strWorkSpacePath == "") { MenuItemSaveAsWorkSpace_Click(sender, e); } else { SaveAllData(); globeControl1.Globe.SaveAsWorkSpace(m_strWorkSpacePath); } } //另存工程 private void MenuItemSaveAsWorkSpace_Click(object sender, EventArgs e) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "工程文件(*.gws)|*.gws|*.*|*.*||"; if (dlg.ShowDialog() == DialogResult.OK) { SaveAllData(); globeControl1.Globe.SaveAsWorkSpace(dlg.FileName); m_strWorkSpacePath = dlg.FileName; this.Text = m_strFormTitle + " - " + dlg.FileName; } } //保存所有数据 private void SaveAllToolStripMenuItem_Click(object sender, EventArgs e) { SaveAllData(); } private void 连接服务器toolStripMenuItem3_Click(object sender, EventArgs e) { FrmConnectServer connectServer = new FrmConnectServer(); if (connectServer.ShowDialog() == DialogResult.OK) { if (!Utility.isNetworkConnectionSuccess(connectServer.m_strIP)) { MessageBox.Show("网络连接失败!", "提示"); return; } if (globeControl1.Globe.ConnectServer(connectServer.m_strIP, connectServer.m_nPort, connectServer.m_strUser, connectServer.m_strPsw)) { } } } private void 连接数据库ToolStripMenuItem_Click(object sender, EventArgs e) { FrmDatabaseParaSettingSqlServer frm = new FrmDatabaseParaSettingSqlServer(globeControl1); frm.ShowDialog(); } //添加数据 private void AddLayerDataMenu_Click(object sender, EventArgs e) { AddLayerData(); } //判断球中是否已经添加过数据源 private bool isGlobeContainsDataSource() { bool isGlobeContainsDataSource = false; for (int i = 0; i < globeControl1.Globe.DataManager.DataSourceCount; i++) { if (globeControl1.Globe.DataManager.GetDataSourceAt(i).Type == EnumDataSourceType.SqlServer || globeControl1.Globe.DataManager.GetDataSourceAt(i).Type == EnumDataSourceType.Oracle) { isGlobeContainsDataSource = true; break; } } if (isGlobeContainsDataSource == false) { FrmMessageBox frmMessage = new FrmMessageBox(); DialogResult result = frmMessage.ShowDialog(); if (result == DialogResult.OK) { 连接数据库ToolStripMenuItem_Click("", null); } else if (result == DialogResult.No) { 连接Oracle数据库toolStripMenuItem6_Click("", null); } else { return isGlobeContainsDataSource; } } for (int i = 0; i < globeControl1.Globe.DataManager.DataSourceCount; i++) { if (globeControl1.Globe.DataManager.GetDataSourceAt(i).Type == EnumDataSourceType.SqlServer || globeControl1.Globe.DataManager.GetDataSourceAt(i).Type == EnumDataSourceType.Oracle) { isGlobeContainsDataSource = true; break; } } return isGlobeContainsDataSource; } //添加数据库图层 private void toolStripMenuItem1_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } WorldGIS.Forms.FrmAddLayerFromDB frm = new WorldGIS.Forms.FrmAddLayerFromDB(globeControl1); frm.ShowDialog(); } //添加地形 private void AddTerrainMenuItem_Click(object sender, EventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "支持格式(*.lrp,*.dem)|*.lrp;*.dem|LocaSpace栅格数据(*.lrp)|*.lrp|其它格式(*.*)|*.*||"; dlg.Multiselect = true; if (dlg.ShowDialog() == DialogResult.OK) { for (int i = 0; i < dlg.FileNames.Length; i++) { AddTerrainData(dlg.FileNames[i]); } } } //新建图层 private void CreateNewDataMenuItem_Click(object sender, EventArgs e) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "KML数据(*.kml)|*.kml|矢量数据(*.lgd)|*.lgd||"; if (dlg.ShowDialog() == DialogResult.OK) { object obj = AddLayerData(dlg.FileName); GSOLayer layer = obj as GSOLayer; if (layer != null) { DialogResult result = MessageBox.Show("是否将新图层设置为目标图层?", "新建图层", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { layer.Editable = true; globeControl1.Globe.DestLayerFeatureAdd = layer; if (globeControl1.Globe.DestLayerFeatureAdd != null || globeControl1.Globe.DestLayerFeatureAdd.Caption == "") { myPlaceNode.NodeFont = new Font(layerTree.Font, FontStyle.Regular); } else { for (int i = 0; i < layerManagerNode.Nodes.Count; i++) { if (layerManagerNode.Nodes[i].Text == globeControl1.Globe.DestLayerFeatureAdd.Caption) { layerManagerNode.Nodes[i].NodeFont = new Font(layerTree.Font, FontStyle.Regular); } } } if (layerManagerNode.Nodes[0].Text == layer.Caption) { layerManagerNode.Nodes[0].NodeFont = new Font(layerTree.Font, FontStyle.Bold); } statusStrip1.Items[1].Text = "当前目标图层:" + layer.Caption; } } } } //框选导出图层 private void 框选导出图层toolStripMenuItem3_Click(object sender, EventArgs e) { if (globeControl1.Globe.SelObjectCount <= 0) { MessageBox.Show("请先选中一个面对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } List<GSOGeoPolygon3D> list = new List<GSOGeoPolygon3D>(); GSOLayer newlayer = new GSOFeatureLayer(); for (int i = 0; i < globeControl1.Globe.SelObjectCount; i++) { GSOFeature newfeature = new GSOFeature(); globeControl1.Globe.GetSelectObject(0, out newfeature, out newlayer); if (newfeature.Geometry.Type == EnumGeometryType.GeoPolygon3D) { GSOGeoPolygon3D polygon = (GSOGeoPolygon3D)newfeature.Geometry; list.Add(polygon); } } if (list.Count > 0) { FrmParticalExportLayer exportLayer = new FrmParticalExportLayer(globeControl1, list); exportLayer.Show(this); } else { MessageBox.Show("请选中一个或者多个面对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } private void 日志管理ToolStripMenuItem_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } FrmLogManager logManager = new FrmLogManager(globeControl1); logManager.Show(this); } //退出系统 private void ExitMenuItem_Click(object sender, EventArgs e) { this.Close(); } private void RefreshLayerAndTerrainTree() { int nLayerCount = globeControl1.Globe.Layers.Count; int nTerrainCount = globeControl1.Globe.Terrains.Count; terrainManagerNode.Nodes.Clear(); layerManagerNode.Nodes.Clear(); int i = 0; for (i = 0; i < nLayerCount; i++) { GSOLayer layer = globeControl1.Globe.Layers[i]; if (layer != null) { if (layer.Type == EnumLayerType.ImageLayer) { TreeNode node = new TreeNode(); node.Tag = layer; node.Text = layer.Caption; node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Checked = layer.Visible; // 注意要用add layerManagerNode.Nodes.Add(node); } else { TreeNode node = new TreeNode(); node.Tag = layer; node.Text = layer.Caption; node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Checked = layer.Visible; // 注意要用add layerManagerNode.Nodes.Add(node); VisitFeature3Ds(layer.GetAllFeatures(), node); } } } for (i = 0; i < nTerrainCount; i++) { GSOTerrain terrain = globeControl1.Globe.Terrains[i]; if (terrain != null) { TreeNode node = new TreeNode(); node.Tag = terrain; node.Text = terrain.Caption; node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Checked = terrain.Visible; // 注意要用add terrainManagerNode.Nodes.Add(node); } } // 展开 layerManagerNode.Expand(); terrainManagerNode.Expand(); RefreshDataTree(); } private void AntiAntialiasingMenuItem_Click(object sender, EventArgs e) { AntiAntialiasingMenuItem.Checked = !AntiAntialiasingMenuItem.Checked; } private void AntiAntialiasingMenuItem_CheckedChanged(object sender, EventArgs e) { globeControl1.Globe.Antialiasing = AntiAntialiasingMenuItem.Checked; globeControl1.Refresh(); } private void ShaderAtmosphereMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.Atmosphere.ShaderUsing = !globeControl1.Globe.Atmosphere.ShaderUsing; ShaderAtmosphereMenuItem.Checked = !ShaderAtmosphereMenuItem.Checked; globeControl1.Refresh(); } private void ModelWireFrameMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.ModelRenderDetail = EnumRenderDetail.WireFrame; ModelWireFrameMenuItem.Checked = true; ModelTextureMenuItem.Checked = false; ModelSolidMenuItem.Checked = false; } //模型点模式 private void ModelPointMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.ModelRenderDetail = EnumRenderDetail.Points; ModelWireFrameMenuItem.Checked = false; //ModelPointMenuItem.Checked = true; ModelTextureMenuItem.Checked = false; ModelSolidMenuItem.Checked = false; } private void ModelSolidMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.ModelRenderDetail = EnumRenderDetail.Solid; ModelWireFrameMenuItem.Checked = false; //ModelPointMenuItem.Checked = false; ModelTextureMenuItem.Checked = false; ModelSolidMenuItem.Checked = true; } private void ModelTextureMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.ModelRenderDetail = EnumRenderDetail.Texture; ModelWireFrameMenuItem.Checked = false; ModelTextureMenuItem.Checked = true; ModelSolidMenuItem.Checked = false; } private void SaveAllData() { globeControl1.Globe.MemoryLayer.SaveAs(Path.GetDirectoryName(Application.ExecutablePath) + "/MyPlace.kml"); int nCount = globeControl1.Globe.Layers.Count; for (int i = 0; i < nCount; i++) { GSOLayer layer = globeControl1.Globe.Layers[i]; if (layer != null) { layer.Save(); } } } private void FlyAlongWithLineMenuItem_Click(object sender, EventArgs e) { TreeNode node = treeContexMenue.Tag as TreeNode; GSOFeature feature = node.Tag as GSOFeature; if (feature != null && feature.Geometry != null && feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { // globeControl1.Globe.FlyEyeAlongWithLine((GSOGeoPolyline3D)feature.Geometry, 0, 0, 85); globeControl1.Globe.FlyEyeAlongWithLine((GSOGeoPolyline3D)feature.Geometry, m_dFlyAboveLine, 85, true, 0, false); globeControl1.Globe.CurFlyID = 4; } } private void FlyAroundCenterToolStripMenuItem_Click(object sender, EventArgs e) { // 永久旋转 //globeControl1.Globe.FlyAroundCenter(); // 旋转720度 // globeControl1.Globe.FlyAroundCenter(720,EnumFlyRepeatValueType.Degrees); // 旋转10秒钟 globeControl1.Globe.FlyAroundCenter(10000, EnumFlyRepeatValueType.MiliSeconds); globeControl1.Globe.CurFlyID = 1; } private void FlyAroundEyeMenuItem_Click(object sender, EventArgs e) { //globeControl1.Globe.FlyAroundEye(); globeControl1.Globe.FlyAroundEye(720, EnumFlyRepeatValueType.Degrees); globeControl1.Globe.CurFlyID = 2; } private void RotateAroundObjectMenuItem_Click(object sender, EventArgs e) { TreeNode node = treeContexMenue.Tag as TreeNode; GSOFeature feature = node.Tag as GSOFeature; if (feature != null) { // globeControl1.Globe.FlyEyeAlongWithLine((GSOGeoPolyline3D)feature.Geometry, 0, 0, 85); globeControl1.Globe.FlyAroundFeature(feature, true, 0, EnumFlyRepeatValueType.Degrees); globeControl1.Globe.CurFlyID = 3; } } private void DynamicCarMenuItem_Click(object sender, EventArgs e) { GSORoute route = new GSORoute(); route.Add(116.601, 39.901, 0); route.Add(116.602, 39.901, 0); route.Add(116.603, 39.901, 0); route.Add(116.603, 39.902, 0); route.Add(116.603, 39.903, 0); route.Add(116.603, 39.904, 0); route.Speed = 50; route.RotateSpeed = 50; route.AltitudeMode = EnumAltitudeMode.ClampToGround; GSOGeoModel geoModel = new GSOGeoModel(); geoModel.FilePath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource/model/tank.3ds"; GSOGeoDynamicRoute geoDynamicRoute = new GSOGeoDynamicRoute(); geoDynamicRoute.TimerInterval = 20; geoDynamicRoute.Route = route; geoDynamicRoute.ActorGeometry = geoModel; geoDynamicRoute.Play(); GSOFeature feature = new GSOFeature(); feature.Geometry = geoDynamicRoute; GSOLabel gsoLabel = new GSOLabel(); gsoLabel.Text = "中-59"; feature.Label = gsoLabel; globeControl1.Globe.MemoryLayer.AddFeature(feature); GSOCameraState cameraState = new GSOCameraState(); cameraState.Longitude = 116.601; cameraState.Latitude = 39.901; cameraState.Altitude = 900; cameraState.Tilt = 0; cameraState.Heading = 0; globeControl1.Globe.FlyToCameraState(cameraState); } private void CopterMenuItem_Click(object sender, EventArgs e) { GSORoute route = new GSORoute(); route.Add(116.601, 39.901, 1000); route.Add(116.603, 39.901, 1000); route.Add(116.605, 39.901, 1000); route.Add(116.605, 39.901, 1000); route.Add(116.605, 39.901, 1000); route.Add(116.605, 39.901, 1000); route.Add(116.605, 39.903, 1000); route.Add(116.605, 39.905, 1000); route.Add(116.605, 39.907, 1000); route.Speed = 200; route.RotateSpeed = 50; route.AltitudeMode = EnumAltitudeMode.Absolute; route.CircleRoute = true; GSOGeoModel geoModel = new GSOGeoModel(); geoModel.FilePath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource/model/客机.3ds"; geoModel.RotateZ = -90; geoModel.SetScale(0.1, 0.1, 0.1); GSOGeoDynamicRoute geoDynamicRoute = new GSOGeoDynamicRoute(); geoDynamicRoute.TimerInterval = 20; geoDynamicRoute.Route = route; geoDynamicRoute.ActorGeometry = geoModel; geoDynamicRoute.Play(); GSOFeature feature = new GSOFeature(); feature.Geometry = geoDynamicRoute; GSOLabel gsoLabel = new GSOLabel(); gsoLabel.Text = "国航A9"; feature.Label = gsoLabel; globeControl1.Globe.MemoryLayer.AddFeature(feature); GSOCameraState cameraState = new GSOCameraState(); cameraState.Longitude = 116.601; cameraState.Latitude = 39.901; cameraState.Altitude = 2500; cameraState.Tilt = 0; cameraState.Heading = 0; globeControl1.Globe.FlyToCameraState(cameraState); } private void MissileMenuItem_Click(object sender, EventArgs e) { GSORoute route = new GSORoute(); route.Add(116.601, 39.902, 100); route.Add(116.602, 39.902, 150); route.Add(116.603, 39.902, 200); route.Add(116.603, 39.902, 200); route.Add(116.603, 39.902, 200); route.Add(116.603, 39.902, 200); route.Add(116.604, 39.902, 250); route.Add(116.605, 39.902, 300); route.Add(116.606, 39.902, 250); route.Add(116.607, 39.902, 200); route.Add(116.608, 39.902, 150); route.Add(116.609, 39.902, 100); route.Speed = 500; route.RotateSpeed = 200; route.AltitudeMode = EnumAltitudeMode.Absolute; route.CircleRoute=false; GSOGeoModel geoModel = new GSOGeoModel(); geoModel.FilePath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource/model/aim9.3ds"; geoModel.SetScale(30, 30, 30); GSOGeoDynamicRoute geoDynamicRoute = new GSOGeoDynamicRoute(); geoDynamicRoute.TimerInterval = 20; geoDynamicRoute.Route = route; geoDynamicRoute.ActorGeometry = geoModel; geoDynamicRoute.Play(); GSOFeature feature = new GSOFeature(); feature.Geometry = geoDynamicRoute; GSOLabel gsoLabel = new GSOLabel(); gsoLabel.Text = "爱国者"; feature.Label = gsoLabel; globeControl1.Globe.MemoryLayer.AddFeature(feature); GSOCameraState cameraState = new GSOCameraState(); cameraState.Longitude = 116.605; cameraState.Latitude = 39.902; cameraState.Altitude = 100; cameraState.Tilt = 85; cameraState.Heading = 0; globeControl1.Globe.FlyToCameraState(cameraState); } private void SaveLayerMenuItem_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; TreeNode parentNode = node.Parent; Int32 nIndex = node.Index; if (parentNode == layerManagerNode) { GSODataset dateSet = globeControl1.Globe.Layers[nIndex].Dataset; if (dateSet != null) { dateSet.Save(); } } else { //globeControl1.Globe.Terrains[nIndex].Save(); } } private void SaveAsLayerMenuItem_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; TreeNode parentNode = node.Parent; Int32 nIndex = node.Index; if (parentNode == layerManagerNode) { GSOLayer layer = globeControl1.Globe.Layers[nIndex]; if (layer.Type == EnumLayerType.FeatureLayer && layer.Name.EndsWith(".shp") && layer.GetAt(0) != null && layer.GetAt(0).Geometry.Type == EnumGeometryType.GeoPoint3D) { WorldGIS.Forms.FrmShp2KML frm = new WorldGIS.Forms.FrmShp2KML(globeControl1, nIndex); frm.ShowDialog(); return; } if (layer.Type == EnumLayerType.FeatureLayer) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "*.lgd|*.lgd|*.kml|*.kml|*.shp|*.shp|*.dxf|*.dxf|*.tab|*.tab|*.dgn|*.dgn|*.gml|*.gml|*.*|*.*||"; if (dlg.ShowDialog() == DialogResult.OK) { layer.SaveAs(dlg.FileName); } } } } private void WaterPipeMenuItem_Click(object sender, EventArgs e) { GSOLayer layer = globeControl1.Globe.Layers["WaterPipeDemo"]; if (layer != null) { GSOCameraState cameraState = new GSOCameraState(); cameraState.Longitude = 120.122613878251; cameraState.Latitude = 37.3997895601905; cameraState.Altitude = 3.21685825381428; cameraState.Heading = 30.3528709511283; cameraState.Tilt = 84.361905816876; globeControl1.Globe.FlyToCameraState(cameraState); timerWaterPipe.Start(); } } private void timerWaterPipe_Tick(object sender, EventArgs e) { m_nWaterPipeDemoTick++; GSOStyle style3d = null; GSOEntityStyle3D modeStyle3d = null; GSOLayer layer = globeControl1.Globe.Layers["WaterPipeDemo"]; if (layer != null) { GSOFeatures features = layer.GetAllFeatures(); GSOFeatures tempFeatures = ((GSOFeatureFolder)features[0]).Features; GSOFeature feature = tempFeatures[24]; feature.Visible = false; for (int i = 25; i < tempFeatures.Length - 1; i++) { feature = tempFeatures[i]; int nCurIndex = m_nWaterPipeDemoTick % 6; if ((i - 25) == nCurIndex) { feature.Visible = true; style3d = feature.Geometry.Style; if (style3d == null) { style3d = new GSOEntityStyle3D(); } modeStyle3d = (GSOEntityStyle3D)style3d; modeStyle3d.UsingSingleColor = true; modeStyle3d.EntityColor = Color.FromArgb(200, 0, 0, 255); feature.Geometry.Style = modeStyle3d; } else if (((GSOGeoModel)feature.Geometry).IsLoaded()) { feature.Visible = false; } } feature = tempFeatures[tempFeatures.Length - 1]; feature.Visible = true; style3d = feature.Geometry.Style; if (style3d == null) { style3d = new GSOEntityStyle3D(); } modeStyle3d = (GSOEntityStyle3D)style3d; modeStyle3d.UsingSingleColor = true; modeStyle3d.EntityColor = Color.FromArgb(100, 128, 128, 128); feature.Geometry.Style = modeStyle3d; globeControl1.Refresh(); } } private void DrawPolygonMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.Action = EnumAction3D.DrawPolygon; ActionToolMenuChecked(); } private void RefreshMyplaceListMenuItem_Click(object sender, EventArgs e) { myPlaceNode.Nodes.Clear(); VisitFeature3Ds(globeControl1.Globe.MemoryLayer.GetAllFeatures(), myPlaceNode); } private void MyplaceEditableMenuItem_Click(object sender, EventArgs e) { MyplaceEditableMenuItem.Checked = !MyplaceEditableMenuItem.Checked; globeControl1.Globe.MemoryLayer.Editable = MyplaceEditableMenuItem.Checked; } private void MyPlaceSelectableMenuItem_Click(object sender, EventArgs e) { MyPlaceSelectableMenuItem.Checked = !MyPlaceSelectableMenuItem.Checked; globeControl1.Globe.MemoryLayer.Selectable = MyPlaceSelectableMenuItem.Checked; } private void LayerEditableMenuItem_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; TreeNode parentNode = node.Parent; if (parentNode == layerManagerNode) { GSOLayer layer = node.Tag as GSOLayer; LayerEditableMenuItem.Checked = !LayerEditableMenuItem.Checked; layer.Editable = LayerEditableMenuItem.Checked; } } private void LayerSelectableMenuItem_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; TreeNode parentNode = node.Parent; Int32 nIndex = node.Index; if (parentNode == layerManagerNode) { GSOLayer layer = globeControl1.Globe.Layers[nIndex]; LayerSelectableMenuItem.Checked = !LayerSelectableMenuItem.Checked; layer.Selectable = LayerSelectableMenuItem.Checked; } } private void RefreshTreeNodeLayerFeatureList(TreeNode layerTreeNode) { layerTreeNode.Nodes.Clear(); GSOLayer layer = (GSOLayer)layerTreeNode.Tag; // 只将类型为内存数据集的图层列出,如果是其它类型的数据集可能数据量太大,没发显示在树控件中 if (layer.Dataset is GSOFeatureDataset) { VisitFeature3Ds(layer.GetAllFeatures(), layerTreeNode); } } private void RefreshLayerFeatureListMenuItem_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; TreeNode parentNode = node.Parent; Int32 nIndex = node.Index; if (parentNode == layerManagerNode) { RefreshTreeNodeLayerFeatureList(node); } } private void DrawPolygonToolButton_Click(object sender, EventArgs e) { TreeNode featureAddLayerTreeNode = GetDestLayerFeatureAddTreeNode(); if (featureAddLayerTreeNode == null) { MessageBox.Show("没有设置目标图层,请先设置!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } GSOLayer layer =featureAddLayerTreeNode.Tag as GSOLayer; if (!layer.Visible || !layer.Selectable || !layer.Editable) { MessageBox.Show("请确保目标图层可视、可选、可编辑!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } DrawPolygonMenuItem_Click(sender, e); } private TreeNode GetDestLayerFeatureAddTreeNode() { if (myPlaceNode.Tag != null && ((GSOLayer)myPlaceNode.Tag).IsDestLayerFeatureAdd()) { return myPlaceNode; } for (int i = 0; i < layerManagerNode.Nodes.Count; i++) { TreeNode tempNode = layerManagerNode.Nodes[i]; if (tempNode.Tag != null && ((GSOLayer)tempNode.Tag).IsDestLayerFeatureAdd()) { return tempNode; } } return null; } private void AddMultiModeMenuItem_Click(object sender, EventArgs e) { FrmAddMultiModel dlg = new FrmAddMultiModel(); if (dlg.ShowDialog() == DialogResult.OK) { TreeNode featureAddLayerTreeNode = GetDestLayerFeatureAddTreeNode(); if (featureAddLayerTreeNode != null) { GSOLayer featureAddLayer = (GSOLayer)featureAddLayerTreeNode.Tag; int nSelFileNum = dlg.m_arryFileSel.Count; for (int i = 0; i < nSelFileNum; i++) { string strFilePath = dlg.m_arryFileSel[i].ToString(); string strFileExt = Path.GetExtension(strFilePath).ToLower(); string strFileName = Path.GetFileName(strFilePath); int nIndex = strFileName.LastIndexOf('.'); string strTitle = strFileName.Substring(0, nIndex); GSOFeature f = new GSOFeature(); GSOGeoModel model = new GSOGeoModel(); model.FilePath = strFilePath; if (strFileExt == ".gcm") // 如果是gcm需要提前加载坐标信息 { model.LoadGCMCoordInfo(); if (!model.IsCoordInfoValid()) { GSOPoint3d pt = new GSOPoint3d(); pt.X = globeControl1.Globe.CameraState.Longitude; pt.Y = globeControl1.Globe.CameraState.Latitude; pt.Z = model.Position.Z; // 注意z值还是要保留下来的 model.Position = pt; } model.AltitudeMode = EnumAltitudeMode.RelativeToGround; } else { GSOPoint3d pt = new GSOPoint3d(); pt.X = globeControl1.Globe.CameraState.Longitude; pt.Y = globeControl1.Globe.CameraState.Latitude; pt.Z = 0; model.Position = pt; model.AltitudeMode = EnumAltitudeMode.ClampToGround; } f.Geometry = model; f.Name = strTitle; featureAddLayer.AddFeature(f); } RefreshTreeNodeLayerFeatureList(featureAddLayerTreeNode); globeControl1.Globe.Refresh(); } } } private void MyPlaceFeatureAddLayerMenuItem_Click(object sender, EventArgs e) { if (!MyPlaceFeatureAddLayerMenuItem.Checked) { MyPlaceFeatureAddLayerMenuItem.Checked = true; globeControl1.Globe.DestLayerFeatureAdd = globeControl1.Globe.MemoryLayer; for (int i = 0; i < layerManagerNode.Nodes.Count; i++) { layerManagerNode.Nodes[i].NodeFont = new Font(layerTree.Font, FontStyle.Regular); } myPlaceNode.NodeFont = new Font(layerTree.Font, FontStyle.Bold); statusStrip1.Items[1].Text = "当前目标图层:" + myPlaceNode.Text; } } private void FeatureAddLayerMenuItem_Click(object sender, EventArgs e) { if (!FeatureAddLayerMenuItem.Checked) { if (globeControl1.Globe.DestLayerFeatureAdd == null || globeControl1.Globe.DestLayerFeatureAdd.Caption == "") { myPlaceNode.NodeFont = new Font(layerTree.Font, FontStyle.Regular); } else { for (int i = 0; i < layerManagerNode.Nodes.Count; i++) { if (layerManagerNode.Nodes[i].Text == globeControl1.Globe.DestLayerFeatureAdd.Caption) { layerManagerNode.Nodes[i].NodeFont = new Font(layerTree.Font, FontStyle.Regular); } } } TreeNode node = layerNodeContexMenu.Tag as TreeNode; FeatureAddLayerMenuItem.Checked = true; globeControl1.Globe.DestLayerFeatureAdd = (GSOLayer)node.Tag; node.NodeFont = new Font(layerTree.Font, FontStyle.Bold); statusStrip1.Items[1].Text = "当前目标图层:" + node.Text; } } private void ShowAddFeatureDlg(GSOFeature newFeature) { TreeNode featureAddLayerTreeNode = GetDestLayerFeatureAddTreeNode(); if (featureAddLayerTreeNode == null) { MessageBox.Show("添加失败!没有设置目标图层,请先设置", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } // 先添加到图层中,这样可以预览效果 GSOLayer featureAddLayer = (GSOLayer)featureAddLayerTreeNode.Tag; featureAddLayer.AddFeature(newFeature); globeControl1.Refresh(); FrmFeatureInfo dlg = new FrmFeatureInfo(newFeature, featureAddLayer, globeControl1,true); DialogResult result = dlg.ShowDialog(this); if (result == DialogResult.OK) { RefreshTreeNodeLayerFeatureList(featureAddLayerTreeNode); } else { newFeature.Delete(); } } private void AddPlaceMarkMenu_Click(object sender, EventArgs e) { GSOFeature newFeature = new GSOFeature(); GSOGeoMarker p = new GSOGeoMarker(); GSOMarkerStyle3D style = new GSOMarkerStyle3D(); style.IconPath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource/DefaultIcon.png"; p.Style = style; p.X = globeControl1.Globe.CameraState.Longitude; p.Y = globeControl1.Globe.CameraState.Latitude; newFeature.Geometry = p; newFeature.Name = "我的地标"; ShowAddFeatureDlg(newFeature); } private void AddModelMenu_Click(object sender, EventArgs e) { GSOFeature newFeature = new GSOFeature(); GSOGeoModel model = new GSOGeoModel(); GSOPoint3d pt = new GSOPoint3d(); pt.X = globeControl1.Globe.CameraState.Longitude; pt.Y = globeControl1.Globe.CameraState.Latitude; pt.Z = 0; model.Position = pt; newFeature.Geometry = model; newFeature.Name = "我的模型"; ShowAddFeatureDlg(newFeature); } private void MenuItemAddDynamicMarker_Click(object sender, EventArgs e) { GSOFeature newFeature = new GSOFeature(); GSOGeoDynamicMarker geoDynamicMarker = new GSOGeoDynamicMarker(); GSOCameraState cameraState = globeControl1.Globe.CameraState; geoDynamicMarker.SetPosition(cameraState.Longitude, cameraState.Latitude, 0); geoDynamicMarker.TimerInterval = 20; geoDynamicMarker.Play(); GSOMarkerStyle3D style3d = new GSOMarkerStyle3D(); style3d.IconPath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource/gif/flag1.gif"; style3d.IconScale = 2; geoDynamicMarker.Style = style3d; newFeature.Geometry = geoDynamicMarker; newFeature.Name = "动态地标"; ShowAddFeatureDlg(newFeature); } private void AddNewEntity(GSOGeoEntity geoEntity, string strName) { GSOFeature newFeature = new GSOFeature(); GSOPoint3d pt = new GSOPoint3d(); pt.X = globeControl1.Globe.CameraState.Longitude; pt.Y = globeControl1.Globe.CameraState.Latitude; pt.Z = 0; geoEntity.Position = pt; newFeature.Geometry = geoEntity; newFeature.Name = strName; ShowAddFeatureDlg(newFeature); } private void menuItemAddBoxEntity_Click(object sender, EventArgs e) { AddNewEntity(new GSOGeoBoxEntity(), "长方体"); } private void menuItemAddSphereEntity_Click(object sender, EventArgs e) { AddNewEntity(new GSOGeoSphereEntity(), "球"); } private void menuItemAddCylinderEntity_Click(object sender, EventArgs e) { AddNewEntity(new GSOGeoCylinderEntity(), "柱"); } private void menuItemAddFrustumEntity_Click(object sender, EventArgs e) { AddNewEntity(new GSOGeoFrustumEntity(), "台"); } private void menuItemAddEllipsoidEntity_Click(object sender, EventArgs e) { AddNewEntity(new GSOGeoEllipsoidEntity(), "椭球"); } private void menuItemAddEllipCylinderEntity_Click(object sender, EventArgs e) { AddNewEntity(new GSOGeoEllipCylinderEntity(), "椭圆柱"); } private void menuItemAddEllipFrustumEntity_Click(object sender, EventArgs e) { AddNewEntity(new GSOGeoEllipFrustumEntity(), "椭圆台"); } private void menuItemAddRangeEllipsoidEntity_Click(object sender, EventArgs e) { AddNewEntity(new GSOGeoRangeEllipsoidEntity(), "缺口椭球"); } private void menuItemAddRangeEllipCylinderEntity_Click(object sender, EventArgs e) { AddNewEntity(new GSOGeoRangeEllipCylinderEntity(), "缺口椭圆柱"); } private void menuItemAddRangeEllipFrustumEntity_Click(object sender, EventArgs e) { AddNewEntity(new GSOGeoRangeEllipFrustumEntity(), "缺口椭圆台"); } private void buttonClearFind_Click(object sender, EventArgs e) { treeFind.Nodes.Clear(); } private void ConvertToWaterMenuItem_Click(object sender, EventArgs e) { TreeNode node = treeContexMenue.Tag as TreeNode; GSOFeature feature = node.Tag as GSOFeature; if (feature != null && feature.Geometry!=null && feature.Geometry.Type==EnumGeometryType.GeoPolygon3D) { GSOGeoPolygon3D geoPolygon3d = (GSOGeoPolygon3D)feature.Geometry; GSOGeoWater geoWater=geoPolygon3d.ConvertToGeoWater(); // 水一般都是绝对高度模式 //geoWater.Altitude = EnumAltitudeMode.Absolute; feature.Delete(); GSOFeature newFeature = new GSOFeature(); geoWater.Play(); newFeature.Geometry = geoWater; while (node!=null && node.Parent!=null) { if (node.Parent==layerManagerNode) { GSOLayer layer= node.Tag as GSOLayer; layer.AddFeature(newFeature); RefreshTreeNodeLayerFeatureList(node); break; } if (node.Parent==myPlaceNode) { globeControl1.Globe.MemoryLayer.AddFeature(newFeature); RefreshTreeNodeLayerFeatureList(myPlaceNode); break; } node = node.Parent; } globeControl1.Refresh(); } } private void DrawWaterMenuItem_Click(object sender, EventArgs e) { TreeNode featureAddLayerTreeNode = GetDestLayerFeatureAddTreeNode(); if (featureAddLayerTreeNode == null) { MessageBox.Show("没有设置目标图层,请先设置!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } GSOLayer layer = featureAddLayerTreeNode.Tag as GSOLayer; if (!layer.Visible || !layer.Selectable || !layer.Editable) { MessageBox.Show("请确保目标图层可视、可选、可编辑!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } globeControl1.Globe.Action = EnumAction3D.DrawWater; ActionToolMenuChecked(); } private void addRouteObjectMenuItem_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 MarbleSurfaceMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.MarbleVisible = !globeControl1.Globe.MarbleVisible; MarbleSurfaceMenuItem.Checked = globeControl1.Globe.MarbleVisible; } private void testToolStripMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.Layers.RemoveAll(); } private void MenuItemMouseOverEventEnable_Click(object sender, EventArgs e) { globeControl1.Globe.FeatureMouseOverEnable = !globeControl1.Globe.FeatureMouseOverEnable; MenuItemMouseOverEventEnable.Checked = globeControl1.Globe.FeatureMouseOverEnable; } private void SceneLightSet_Click(object sender, EventArgs e) { FrmSetSceneLight dlg = new FrmSetSceneLight(); dlg.light = globeControl1.Globe.SceneLight; dlg.globeControl = globeControl1; if (dlg.ShowDialog() == DialogResult.OK) { } } private void MenuItemEditSnapObject_Click(object sender, EventArgs e) { globeControl1.Globe.EditSnapObject = !globeControl1.Globe.EditSnapObject; MenuItemEditSnapObject.Checked = !MenuItemEditSnapObject.Checked; } private void SpaceHeightMeasureMenuItem_Click(object sender, EventArgs e) { if (globeControl1.Globe.Action != EnumAction3D.MeasureHeight) { globeControl1.Globe.Action = EnumAction3D.MeasureHeight; globeControl1.Globe.HeightRuler.SpaceMeasure = true; } else { if (globeControl1.Globe.HeightRuler.SpaceMeasure) { globeControl1.Globe.Action = EnumAction3D.ActionNull; } else { globeControl1.Globe.HeightRuler.SpaceMeasure = true; } } ActionToolMenuChecked(); } private void SpaceMeasureDistanceMenuItem_Click(object sender, EventArgs e) { if (globeControl1.Globe.Action != EnumAction3D.MeasureDistance) { globeControl1.Globe.Action = EnumAction3D.MeasureDistance; globeControl1.Globe.DistanceRuler.SpaceMeasure = true; } else { if (globeControl1.Globe.DistanceRuler.SpaceMeasure) { globeControl1.Globe.Action = EnumAction3D.ActionNull; } else { globeControl1.Globe.DistanceRuler.SpaceMeasure = true; } } ActionToolMenuChecked(); } private void SpaceAreaMeasureMenuItem_Click(object sender, EventArgs e) { if (globeControl1.Globe.Action != EnumAction3D.MeasureArea) { globeControl1.Globe.Action = EnumAction3D.MeasureArea; globeControl1.Globe.AreaRuler.SpaceMeasure = true; } else { if (globeControl1.Globe.AreaRuler.SpaceMeasure) { globeControl1.Globe.Action = EnumAction3D.ActionNull; } else { globeControl1.Globe.AreaRuler.SpaceMeasure = true; } } ActionToolMenuChecked(); } private void SpaceVisibilityAnalysisMenuItem_Click(object sender, EventArgs e)//空间通视分析 { globeControl1.Globe.Action = EnumAction3D.VisibilityAnalysis; } private void ViewshedAnalysisMenuItem_Click(object sender, EventArgs e)//可视域分析 { globeControl1.Globe.Action = EnumAction3D.ViewshedAnalysis; } private void ViewEnvelopeAnalysisMenuItem_Click(object sender, EventArgs e)//可视包络分析 { globeControl1.Globe.Action = EnumAction3D.ViewEnvelopeAnalysis; } private void RefreshAnalysisMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.RefreshAnalysis(); } private void ClearAnalysisMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.ClearAnalysis(); } private void ProfileAnalysisMenuItem_Click(object sender, EventArgs e)//剖面分析 { if (!ProfileAnalysisMenuItem.Checked) { globeControl1.Globe.Action = EnumAction3D.TrackPolyline; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true; ProfileAnalysisMenuItem.Checked = true; BaselineProfileAnalysisMenuItem.Checked = false; LineDigPitMenuItem.Checked = false; } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; ProfileAnalysisMenuItem.Checked = false; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = false; } ActionToolMenuChecked(); } private void BaselineProfileAnalysisMenuItem_Click(object sender, EventArgs e)//基线剖面分析 { if (!BaselineProfileAnalysisMenuItem.Checked) { globeControl1.Globe.Action = EnumAction3D.TrackPolyline; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true; BaselineProfileAnalysisMenuItem.Checked = true; ProfileAnalysisMenuItem.Checked = false; LineDigPitMenuItem.Checked = false; } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; BaselineProfileAnalysisMenuItem.Checked = false; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = false; } ActionToolMenuChecked(); } private void LineDigPitMenuItem_Click(object sender, EventArgs e) { if (!LineDigPitMenuItem.Checked) { globeControl1.Globe.Action = EnumAction3D.TrackPolyline; LineDigPitMenuItem.Checked = true; ProfileAnalysisMenuItem.Checked = false; BaselineProfileAnalysisMenuItem.Checked = false; } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; LineDigPitMenuItem.Checked = false; } ActionToolMenuChecked(); } private void DigFillAnalysisMenuItem_Click(object sender, EventArgs e)//填挖方分析 { if (!DigFillAnalysisMenuItem.Checked) { globeControl1.Globe.Action = EnumAction3D.TrackPolygon; DigFillAnalysisMenuItem.Checked = true; PolygonDigPitMenuItem.Checked = false; NoSourceFloodSubmergeMenuItem.Checked = false; } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; DigFillAnalysisMenuItem.Checked = false; } ActionToolMenuChecked(); } private void NoSourceFloodSubmergeMenuItem_Click(object sender, EventArgs e)//无源淹没分析 { if (!NoSourceFloodSubmergeMenuItem.Checked) { globeControl1.Globe.Action = EnumAction3D.TrackPolygon; NoSourceFloodSubmergeMenuItem.Checked = true; PolygonDigPitMenuItem.Checked = false; DigFillAnalysisMenuItem.Checked = false; } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; NoSourceFloodSubmergeMenuItem.Checked = false; } ActionToolMenuChecked(); } private void PolygonDigPitMenuItem_Click(object sender, EventArgs e) { if (!PolygonDigPitMenuItem.Checked) { globeControl1.Globe.Action = EnumAction3D.TrackPolygon; PolygonDigPitMenuItem.Checked = true; DigFillAnalysisMenuItem.Checked = false; NoSourceFloodSubmergeMenuItem.Checked = false; } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; PolygonDigPitMenuItem.Checked = false; } ActionToolMenuChecked(); } private void DigPitSettingMenuItem_Click(object sender, EventArgs e) { FrmSetDigPit dlg = new FrmSetDigPit(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; } } private void ClearLastPitMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.RemoveLastPit(); } private void ClearPitsMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.RemoveAllPits(); } private void FullScreen() { if (!m_bFullScreen) { SetFullScreen(true, ref m_rcOld); Rectangle rcControlScreen1=globeControl1.RectangleToScreen(globeControl1.Bounds); Rectangle rcFormScreen1 = this.RectangleToScreen(this.Bounds); this.mainMenu.Visible = false; expandableSplitter1.Expanded = false; expandableSplitter1.Visible = false; statusStrip1.Visible = false; this.ShowInTaskbar = false; this.FormBorderStyle = FormBorderStyle.None; this.WindowState = FormWindowState.Maximized; FullScreenMenuItem.Checked = true; m_bFullScreen = true; } else { SetFullScreen(false, ref m_rcOld); this.mainMenu.Visible = true; expandableSplitter1.Expanded = true; expandableSplitter1.Visible = true; statusStrip1.Visible = true; this.ShowInTaskbar = true; this.FormBorderStyle = FormBorderStyle.Sizable; this.WindowState = FormWindowState.Maximized; m_bFullScreen = false; FullScreenMenuItem.Checked = false; } } private void FullScreenMenuItem_Click(object sender, EventArgs e) { FullScreen(); } 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; } } [DllImport("user32.dll", EntryPoint = "ShowWindow")] private static extern int ShowWindow(int hWnd, int _value); [DllImport("user32.dll", EntryPoint = "SystemParametersInfo")] private static extern int SystemParametersInfo( int uAction, int uParam, ref Rectangle lpvParam, int fuWinIni ); public const int SPI_SETWORKAREA = 47; public const int SPI_GETWORKAREA = 48; public const int SW_HIDE = 0; public const int SW_SHOW = 5; public const int SPIF_UPDATEINIFILE = 0x0001; /// <summary> /// 设置全屏或取消全屏 /// </summary> /// <param name="fullscreen">true:全屏 false:恢复 </param> /// <param name="rectOld">设置的时候,此参数返回原始尺寸,恢复时用此参数设置恢复 </param> /// <returns>设置结果 </returns> public static bool SetFullScreen(bool fullscreen, ref Rectangle rectOld) { if (fullscreen) { Rectangle rectFull = Screen.PrimaryScreen.Bounds; SystemParametersInfo(SPI_GETWORKAREA, 0, ref rectOld, SPIF_UPDATEINIFILE);//get SystemParametersInfo(SPI_SETWORKAREA, 0, ref rectFull, SPIF_UPDATEINIFILE);//set } else { SystemParametersInfo(SPI_SETWORKAREA, 0, ref rectOld, SPIF_UPDATEINIFILE); } return true; } private void MenuItemShowSingleModel_Click(object sender, EventArgs e)//展示单个模型 { if (globeControl1.Globe.SelectedObject == null) { MessageBox.Show("请先选择一个模型!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } GSOFeature modelFeature = globeControl1.Globe.SelectedObject; if (modelFeature.Geometry == null || modelFeature.Geometry.Type != EnumGeometryType.GeoModel) { MessageBox.Show("请先选择一个模型!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } FrmShowSingleModel dlg = new FrmShowSingleModel(); dlg.Show(this); GSOFeature newFeature = modelFeature.Clone(); newFeature.Geometry.LatLonCoord = false; newFeature.HighLight = false; ((GSOGeoModel)newFeature.Geometry).SetPosition(0, 0, 0); dlg.plane3DControl.Plane3DScene.AddFeature(newFeature); } GSOFeatures featuresFaGuang = new GSOFeatures(); private void 对象闪烁ToolStripMenuItem_Click(object sender, EventArgs e) { if (globeControl1.Globe.SelObjectCount > 0) { featuresFaGuang.RemoveAll(); 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.Geometry != null) { featuresFaGuang.Add(f); } f.HighLight = false; globeControl1.Globe.Refresh(); } globeControl1.Globe.Action = EnumAction3D.ActionNull; globeControl1.Globe.Action = EnumAction3D.SelectObject; globeControl1.Globe.Refresh(); timerFeatureFaGuang.Start(); } } private void 闪烁发光ToolStripMenuItem_Click(object sender, EventArgs e) { featuresFaGuang.RemoveAll(); TreeNode node = treeContexMenue.Tag as TreeNode; GSOLayer layer = node.Parent.Tag as GSOLayer; GSOFeature f = node.Tag as GSOFeature; featuresFaGuang.Add(f); timerFeatureFaGuang.Start(); } int count_FaGuang = 0; private void timerFeatureFaGuang_Tick(object sender, EventArgs e) { if (count_FaGuang < 20) { count_FaGuang++; if (count_FaGuang % 2 != 0) { for (int i = 0; i < featuresFaGuang.Length; i++) { GSOFeature f = featuresFaGuang[i]; if (f != null && f.Geometry != null) { if (f.Geometry.Style != null) { ((GSOStyle3D)f.Geometry.Style).UsingBlur = true; } else { switch (f.Geometry.Type) { case EnumGeometryType.GeoPoint3D: case EnumGeometryType.GeoDynamicPoint3D: { f.Geometry.Style = new GSOPointStyle3D(); } break; case EnumGeometryType.GeoMarker: case EnumGeometryType.GeoDynamicMarker: { f.Geometry.Style = new GSOMarkerStyle3D(); } break; case EnumGeometryType.GeoPolyline3D: { f.Geometry.Style = new GSOLineStyle3D(); } break; case EnumGeometryType.GeoPolygon3D: case EnumGeometryType.GeoWater: { f.Geometry.Style = new GSOPolygonStyle3D(); } break; default: { f.Geometry.Style = new GSOEntityStyle3D(); } break; } if (f.Geometry.Style != null) { ((GSOStyle3D)f.Geometry.Style).UsingBlur = true; } } } } } else { for (int i = 0; i < featuresFaGuang.Length; i++) { GSOFeature f = featuresFaGuang[i]; if (f != null && f.Geometry != null) { if (f.Geometry.Style != null) { ((GSOStyle3D)f.Geometry.Style).UsingBlur = false; } else { switch (f.Geometry.Type) { case EnumGeometryType.GeoPoint3D: case EnumGeometryType.GeoDynamicPoint3D: case EnumGeometryType.GeoMarker: case EnumGeometryType.GeoDynamicMarker: { f.Geometry.Style = new GSOMarkerStyle3D(); } break; case EnumGeometryType.GeoPolyline3D: { f.Geometry.Style = new GSOLineStyle3D(); } break; case EnumGeometryType.GeoPolygon3D: case EnumGeometryType.GeoWater: { f.Geometry.Style = new GSOPolygonStyle3D(); } break; default: { f.Geometry.Style = new GSOEntityStyle3D(); } break; } if (f.Geometry.Style != null) { ((GSOStyle3D)f.Geometry.Style).UsingBlur = false; } } } } } globeControl1.Globe.Refresh(); } else { timerFeatureFaGuang.Stop(); count_FaGuang = 0; } } private void ShowSingleModelTreeMenuItem_Click(object sender, EventArgs e) { TreeNode node = treeContexMenue.Tag as TreeNode; GSOFeature feature = node.Tag as GSOFeature; if (feature != null && feature.Geometry != null && feature.Geometry.Type == EnumGeometryType.GeoModel) { FrmShowSingleModel dlg = new FrmShowSingleModel(); dlg.Show(this); GSOFeature newFeature = feature.Clone(); newFeature.Geometry.LatLonCoord = false; newFeature.HighLight = false; ((GSOGeoModel)newFeature.Geometry).SetPosition(0, 0, 0); dlg.plane3DControl.Plane3DScene.AddFeature(newFeature); } } private void SelLevel1MenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.SelLevel = 0; ActionToolMenuChecked(); } private void SelLevel2MenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.SelLevel = 1; ActionToolMenuChecked(); } private void SelLevel3MenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.SelLevel = 2; ActionToolMenuChecked(); } private void MenuItemLayerVisibleAlt_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; GSOLayer layer = node.Tag as GSOLayer; if (layer != null) { FrmSetLayerVisibleAltitude dlg = new FrmSetLayerVisibleAltitude(); dlg.m_dMaxVisibleAlt = layer.MaxVisibleAltitude; dlg.m_dMinVisibleAlt = layer.MinVisibleAltitude; if (dlg.ShowDialog() == DialogResult.OK) { layer.MaxVisibleAltitude = dlg.m_dMaxVisibleAlt; layer.MinVisibleAltitude = dlg.m_dMinVisibleAlt; } } } private void MenuItemObjectVisibleDist_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; GSOLayer layer = node.Tag as GSOLayer; if (layer!=null) { FrmSetObjectVisibleDistance dlg=new FrmSetObjectVisibleDistance() ; dlg.m_dMaxVisibleDist = layer.ObjectMaxVisibleDistance; dlg.m_dMinVisibleDist = layer.ObjectMinVisibleDistance; if (dlg.ShowDialog()==DialogResult.OK) { layer.ObjectMaxVisibleDistance= dlg.m_dMaxVisibleDist; layer.ObjectMinVisibleDistance= dlg.m_dMinVisibleDist; } } } private void MenuItemVisiblePixelSize_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; GSOLayer layer = node.Tag as GSOLayer; if (layer != null) { FrmSetObjectVisiblePixelSize dlg = new FrmSetObjectVisiblePixelSize(); dlg.m_dMaxVisiblePixelSize = layer.ObjectMaxVisiblePixelSize; dlg.m_dMinVisiblePixelSize = layer.ObjectMinVisiblePixelSize; if (dlg.ShowDialog() == DialogResult.OK) { layer.ObjectMaxVisiblePixelSize = dlg.m_dMaxVisiblePixelSize; layer.ObjectMinVisiblePixelSize = dlg.m_dMinVisiblePixelSize; } } } private void MyPlaceVisibleDistMenuItem_Click(object sender, EventArgs e) { GSOLayer layer = (GSOLayer)globeControl1.Globe.MemoryLayer; if (layer != null) { FrmSetObjectVisibleDistance dlg = new FrmSetObjectVisibleDistance(); dlg.m_dMaxVisibleDist = layer.ObjectMaxVisibleDistance; dlg.m_dMinVisibleDist = layer.ObjectMinVisibleDistance; if (dlg.ShowDialog() == DialogResult.OK) { layer.ObjectMaxVisibleDistance = dlg.m_dMaxVisibleDist; layer.ObjectMinVisibleDistance = dlg.m_dMinVisibleDist; } } } private void MyPlaceVisiblePixelSizeMenuItem_Click(object sender, EventArgs e) { GSOLayer layer = (GSOLayer)globeControl1.Globe.MemoryLayer; if (layer != null) { FrmSetObjectVisiblePixelSize dlg = new FrmSetObjectVisiblePixelSize(); dlg.m_dMaxVisiblePixelSize = layer.ObjectMaxVisiblePixelSize; dlg.m_dMinVisiblePixelSize = layer.ObjectMinVisiblePixelSize; if (dlg.ShowDialog() == DialogResult.OK) { layer.ObjectMaxVisiblePixelSize = dlg.m_dMaxVisiblePixelSize; layer.ObjectMinVisiblePixelSize = dlg.m_dMinVisiblePixelSize; } } } private void LayerOpaqueMenuItem_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; GSOLayer layer = node.Tag as GSOLayer; if (layer != null) { FrmSetLayerOpaque dlg = new FrmSetLayerOpaque(); dlg.globe = globeControl1.Globe ; dlg.layer = layer; dlg.Show(this); } } private void MyPlaceLayerOpaqueMenuItem_Click(object sender, EventArgs e) { GSOLayer layer = (GSOLayer)globeControl1.Globe.MemoryLayer; if (layer != null) { FrmSetLayerOpaque dlg = new FrmSetLayerOpaque(); dlg.globe = globeControl1.Globe; dlg.layer = layer; dlg.Show(this); } } private void MoveModelLayerMenuItem_Click(object sender, EventArgs e) { FrmAdjustLayer frm = new FrmAdjustLayer(globeControl1); frm.Show(this); } private void menuItemElevateLayerModels_Click(object sender, EventArgs e) { FrmElevateLayer frm = new FrmElevateLayer(globeControl1); frm.Show(this); } private void ConvertToPowerLineMenuItem_Click(object sender, EventArgs e) { GSOFeature fLineToPowerLine = globeControl1.Globe.SelectedObject; if (fLineToPowerLine != null) { if (fLineToPowerLine.Geometry.Type == EnumGeometryType.GeoPolyline3D) { FrmLineToPowerLine fm = new FrmLineToPowerLine(globeControl1, fLineToPowerLine); fm.Show(this); } else { MessageBox.Show("请选中线对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } else { MessageBox.Show("请先选中一条线对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } private void panelGlobeControl_MouseMove(object sender, MouseEventArgs e) { MessageBox.Show("请选中线对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } private void fullExtentMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.FullExtent(); } private void pauseFlyMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.PauseFly(); } private void continueFlyMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.ContinueFly(); } private void rmuPauseFlyMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.PauseFly(); } private void rmuContinueFlyMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.ContinueFly(); } private void rmuStopFlyMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.StopFly(); } private void rmuFullExtentMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.FullExtent(); } private void rmuRotateEyeFlyMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.FlyAroundEye(); } private void rmuRotateCenterFlyMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.FlyAroundCenter(); } private void UnderGroundFloorMenuItem_Click(object sender, EventArgs e) { FrmUnderGroundFloorSetting dlg = new FrmUnderGroundFloorSetting(); dlg.m_globe = globeControl1.Globe; dlg.Show(this); } private void featureLabelMenuItem_Click(object sender, EventArgs e) { if (globeControl1.Globe.SelectedObject == null) { MessageBox.Show("请先选中一个待标注要素!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } else { FrmLabel frm = new FrmLabel(globeControl1); frm.ShowDialog(); } } private void underGroundLockedMenuItem_Click(object sender, EventArgs e) { globeControl1.Globe.IsUnderGroundLocked = !globeControl1.Globe.IsUnderGroundLocked; underGroundLockedMenuItem.Checked = globeControl1.Globe.IsUnderGroundLocked; globeControl1.Refresh(); } private object AddTerrainData(string strDataPath) { object objRes = null; GSOTerrain terrain = globeControl1.Globe.Terrains.Add(strDataPath); objRes = terrain; if (terrain != null) { CheckDatasetGeoReference(terrain.Dataset); 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); terrainManagerNode.Nodes.Insert(0, node); } terrainManagerNode.Expand(); RefreshDataTree(); return objRes; } private void MenuItem2DObjMouseOverEnable_Click(object sender, EventArgs e) { globeControl1.Globe.Object2DMouseOverEnable = !globeControl1.Globe.Object2DMouseOverEnable; MenuItem2DObjMouseOverEnable.Checked = !MenuItem2DObjMouseOverEnable.Checked; } private void rmuFullScreenMenuItem_Click(object sender, EventArgs e) { FullScreen(); rmuFullScreenMenuItem.Checked = !rmuFullScreenMenuItem.Checked; } private void rmuCameraNavigation_Click(object sender, EventArgs e) { ActionBrowseMenu_Click(sender, e); globeControl1.Globe.CameraMode = EnumCameraMode.Navigation; CameraNavigationMenu.Checked = true; CameraWalkMenu.Checked = false; CameraUnderGroundMenu.Checked = false; } private void 投影ToolStripMenuItem_Click(object sender, EventArgs e) { FrmProject frm = new FrmProject(); frm.Show(this); } //批量生成模型 private void menuAddModelBat_Click(object sender, EventArgs e) { if (globeControl1.Globe.Layers.Count <= 0) { MessageBox.Show("请先添加图层!"); return; } FrmBatchCreateModel frm = new FrmBatchCreateModel(globeControl1); frm.ShowDialog(); } //批量生成管线 private void menuLine2PipelineModel_Click(object sender, EventArgs e) { FrmBatchCreatePipeline frm = new FrmBatchCreatePipeline(globeControl1); frm.ShowDialog(); } private void 批量生成管孔ToolStripMenuItem_Click(object sender, EventArgs e) { FrmBatchCreatePore frm = new FrmBatchCreatePore(globeControl1); frm.ShowDialog(); } private void 批量生成管沟ToolStripMenuItem_Click(object sender, EventArgs e) { FrmBatchCreatePipeDitch frm = new FrmBatchCreatePipeDitch(globeControl1); frm.ShowDialog(); } private void 批量修改颜色ToolStripMenuItem_Click(object sender, EventArgs e) { FrmBatchUpadateColor frm = new FrmBatchUpadateColor(globeControl1); frm.Show(this); } private void 批量修改字体ToolStripMenuItem_Click(object sender, EventArgs e) { FrmBatchUpadateFontOfMarkers frm = new FrmBatchUpadateFontOfMarkers(globeControl1); frm.Show(this); } private void 批量修改字段值ToolStripMenuItem_Click(object sender, EventArgs e) { FrmBatchUpdateFieldValue frm = new FrmBatchUpdateFieldValue(globeControl1); frm.Show(this); } private void 批量修改要素集模型路径toolStripMenuItem_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } FrmBacthUpdateModelPath frm = new FrmBacthUpdateModelPath(globeControl1); frm.ShowDialog(); } private void 新建数据库数据集ToolStripMenuItem_Click(object sender, EventArgs e) { WorldGIS.Forms.FrmNewDBFeatureDataset frm = new WorldGIS.Forms.FrmNewDBFeatureDataset(globeControl1); frm.ShowDialog(); } //shp格式文件转换为lgd或者kml格式文件 private void shp2KMLToolStripMenuItem_Click(object sender, EventArgs e) { WorldGIS.Forms.FrmShp2KML frm = new WorldGIS.Forms.FrmShp2KML(globeControl1); frm.ShowDialog(); } private void 字段编辑ToolStripMenuItem_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; GSOLayer layer = node.Tag as GSOLayer; if (layer != null) { FrmEditLayerAttributes frm_editor = new FrmEditLayerAttributes(layer, globeControl1); frm_editor.Show(this); } } private void 打开属性表ToolStripMenuItem_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; GSOLayer layer = node.Tag as GSOLayer; if (layer != null) { GSOFeatures features = layer.GetAllFeatures(); if(features == null) { MessageBox.Show("图层中对象总数为null!","提示"); return; } FrmEditLayerAttributesByTable frm_editor = FrmEditLayerAttributesByTable.GetForm(layer,features, globeControl1); frm_editor.SetDataTable(); if (!frm_editor.isShow) { return; } if (!frm_editor.isShowFirst) { frm_editor.Show(this); } } } private bool addfitflag =false; private void 添加管件ToolStripMenuItem_Click(object sender, EventArgs e) { addfitflag = true; } private void 管线对接设置ToolStripMenuItem_Click(object sender, EventArgs e) { FrmSetPipelineJointParams dlg = new FrmSetPipelineJointParams(globeControl1.Globe); dlg.ShowDialog(); } private void 对接选中管线ToolStripMenuItem_Click(object sender, EventArgs e) { if (globeControl1.Globe.SelObjectCount < 2) { MessageBox.Show("对不起,请至少选中2个对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } globeControl1.Globe.ButtjointSelPipeline(); } private void 对接选中图层ToolStripMenuItem_Click(object sender, EventArgs e) { FrmPipelineLayerButtjoint dlg = new FrmPipelineLayerButtjoint(globeControl1); dlg.ShowDialog(); } private void 生成连接管ToolStripMenuItem_Click(object sender, EventArgs e) { if (globeControl1.Globe.SelObjectCount < 2) { MessageBox.Show("对不起,请至少选中2个对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } globeControl1.Globe.InsertJointPipeline(false); } private void 选中节点添加模型ToolStripMenuItem_Click(object sender, EventArgs e) { if(globeControl1.Globe.HasSelNode) { GSOPoint3d pt3d = globeControl1.Globe.SelNodePos; WorldGIS.Forms.FrmAddPipeFitting frm = new WorldGIS.Forms.FrmAddPipeFitting(globeControl1, pt3d,globeControl1.Globe.DestLayerFeatureAdd); frm.Show(this); } } private void 取消选中对接ToolStripMenuItem_Click(object sender, EventArgs e) { if (globeControl1.Globe.SelObjectCount < 1) { MessageBox.Show("没有选中的对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } globeControl1.Globe.CancelSelPipelineJoint(true, true); } private void 取消整个图层对接ToolStripMenuItem_Click(object sender, EventArgs e) { WorldGIS.Forms.FrmCancelLayerjoint frm = new WorldGIS.Forms.FrmCancelLayerjoint(globeControl1); frm.ShowDialog(); } private void 复制数据库要素集结构ToolStripMenuItem_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } WorldGIS.Forms.FrmCloneFeatureDatasetStructure frm = new WorldGIS.Forms.FrmCloneFeatureDatasetStructure(globeControl1); frm.ShowDialog(); } private void 管孔方沟入库ToolStripMenuItem_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } WorldGIS.Forms.FrmMultiPipelineModelDB frm = new WorldGIS.Forms.FrmMultiPipelineModelDB(globeControl1); frm.ShowDialog(); } private void 工井入库ToolStripMenuItem_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } WorldGIS.Forms.FrmAddWellShp frm = new WorldGIS.Forms.FrmAddWellShp(globeControl1); frm.ShowDialog(); } private void 排水入库ToolStripMenuItem_Click_1(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } WorldGIS.Forms.FrmPaiShui2DB frm = new WorldGIS.Forms.FrmPaiShui2DB(globeControl1); frm.ShowDialog(); } //阀门入库 private void 阀门入库ToolStripMenuItem_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } WorldGIS.Forms.FrmAddValve frm = new WorldGIS.Forms.FrmAddValve(globeControl1); frm.ShowDialog(); } private void 雨水篦子入库ToolStripMenuItem_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } Forms.FrmAddYuBiZiShp frm = new WorldGIS.Forms.FrmAddYuBiZiShp(globeControl1); frm.ShowDialog(); } private void 管线入库ToolStripMenuItem_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } WorldGIS.Forms.FrmPipelineModelDB frm = new WorldGIS.Forms.FrmPipelineModelDB(globeControl1); frm.ShowDialog(); } //创建拓扑 private void 创建拓扑ToolStripMenuItem_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } FrmCreateGenTopo frm = new FrmCreateGenTopo(globeControl1); frm.Show(this); } //流向显示 private void tooltripItemFlow_Click(object sender, EventArgs e) { FrmAnalysisFlow flow = new FrmAnalysisFlow(globeControl1); flow.Show(); } //复制数据库要素集到另一数据库中 private void toolstripItem_CopyDataSet_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } FrmCopyFeatureDataset CopyFeatureDataSet = new FrmCopyFeatureDataset(globeControl1); CopyFeatureDataSet.Show(); } //合并数据库要素集 private void tooltripItem_UnionDataSet_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } FrmUnionFeatureDataset frm = new FrmUnionFeatureDataset(globeControl1); frm.Show(); } private void attributeMappingToolStripMenuItem_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } GSOFeature feature = (GSOFeature)layerTree.SelectedNode.Tag; GSOLayer layer = (GSOLayer)layerTree.SelectedNode.Parent.Tag; FrmAtrributeMapping1 attriMap = new FrmAtrributeMapping1(globeControl1,layer,feature); attriMap.Show(this); } private void 修改数据库管线颜色ToolStripMenuItem_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } FrmBatchUpdatePipelineColor form = new FrmBatchUpdatePipelineColor(globeControl1); form.Show(this); } private void 查看管线属性ToolStripMenuItem_Click(object sender, EventArgs e) { GSOFeature feature = globeControl1.Globe.SelectedObject; if (feature != null) { FrmShowAtrributesByTable attriMap = new FrmShowAtrributesByTable(globeControl1, feature); attriMap.Show(this); } } private void 种树ToolStripMenuItem_Click(object sender, EventArgs e) { FrmPlantTrees plantTree = new FrmPlantTrees(globeControl1); plantTree.Show(this); } private void 改变图层风格ToolStripMenuItem_Click(object sender, EventArgs e) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(layerTree.SelectedNode.Text); FrmUpdateLayoutColor updateLayoutColor = new FrmUpdateLayoutColor(globeControl1,layer); updateLayoutColor.Show(this); } private void globeControl1_AfterNetLayerAddEvent(object sender, AfterNetLayerAddEventArgs e) { RefreshDataTree(); RefreshLayerAndTerrainTree(); globeControl1.Globe.Refresh(); } int count = 0; private void 属性ToolStripMenuItem_Click(object sender, EventArgs e) { TreeNode node = (TreeNode)layerNodeContexMenu.Tag; if (node != null) { string name = node.Text; string path = ""; string type = ""; double opaque = 0.0d; bool isEdit = false; if (node.Parent == layerManagerNode) { GSOLayer layer = (GSOLayer)node.Tag; if (layer != null) { if (layer.Dataset != null && layer.Dataset.DataSource != null) { GSODataSource ds = layer.Dataset.DataSource; if (ds.Type == EnumDataSourceType.SqlServer) { path = ds.Name.Substring(0, ds.Name.IndexOf("_")); } else if (ds.Type == EnumDataSourceType.Oracle) { path = ds.Name.Substring(0, ds.Name.IndexOf("/")); } } else { path = layer.Name; } GSOFeatures feats = new GSOFeatures(); count = 0; GetReallyFeature(layer.GetAllFeatures()); type = layer.Type.ToString(); opaque = layer.Opaque; isEdit = layer.Editable; MessageBox.Show("图层名称:" + name + "\n\n路径:" + path + "\n\n类型:" + type + "\n\n不透明度:" + opaque.ToString() + "\n\n可编辑:" + isEdit.ToString() + "\n\n共有 " + count.ToString() + " 条记录", "属性", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } } private void GetReallyFeature(GSOFeatures features) { if (features != null && features.Length > 0) { for (int i = 0; i < features.Length; i++) { if (features[i].Type == EnumFeatureType.FeatureFolder) { GetReallyFeature(((GSOFeatureFolder)features[i]).Features); } else { count++; } } } } private void 属性ToolStripMenuItem1_Click(object sender, EventArgs e) { if (featureMouseRightClickAttr != null) { LookSelobjAttribute(featureMouseRightClickAttr); } } private void 反转方向ToolStripMenuItem_Click(object sender, EventArgs e) { ReverseDirection(); } void ReverseDirection() { GSOFeature feature = globeControl1.Globe.SelectedObject; if (feature == null) { MessageBox.Show("没有选中对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } GSOGeoPolyline3D geopolyline = feature.Geometry as GSOGeoPolyline3D; if (geopolyline == null || feature.Geometry.Style == null) { MessageBox.Show("对象无效!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } GSOPipeLineStyle3D pipeLineStyle = feature.Geometry.Style as GSOPipeLineStyle3D; if (pipeLineStyle == null) { MessageBox.Show("对象无效!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } GSOPipeJointParam newTailParam = null; GSOPipeJointParam newHeadParam = null; //先调换接头 if (pipeLineStyle.HeadJointParam != null) { newTailParam = new GSOPipeJointParam(pipeLineStyle.HeadJointParam); } if (pipeLineStyle.TailJointParam != null) { newHeadParam = new GSOPipeJointParam(pipeLineStyle.TailJointParam); } pipeLineStyle.HeadJointParam = newHeadParam; pipeLineStyle.TailJointParam = newTailParam; //调换线数据 geopolyline.Reverse(); pipeLineStyle.ArrowVisible = false; pipeLineStyle.ArrowVisible = true; globeControl1.Refresh(); } private void 管线导出CADToolStripMenuItem_Click_1(object sender, EventArgs e) { TreeNode node = (TreeNode)layerNodeContexMenu.Tag; if (node == null) { MessageBox.Show("请在左侧节点集中选择要导出的图层", "提示"); return; } GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(node.Text.Trim()); string strProjectName = Utility.GetProjectName(); if (strProjectName != "") { layer.Dataset.ImportProjectionRefFromProj4(strProjectName); SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "*.dxf|*.dxf"; dlg.FileName = layer.Caption; if (dlg.ShowDialog() == DialogResult.OK) { GSOLayer newlayer = globeControl1.Globe.Layers.Add(dlg.FileName); if (layer.GetAllFeatures().Length <= 0) { MessageBox.Show("要导出的图层为空", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } for (int i = 0; i < layer.GetAllFeatures().Length; i++) { GSOFeature feature = layer.GetFeatureByCustomID(i); if (feature != null && feature.Geometry != null) { if (feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { newlayer.AddFeature(feature); } } } if (newlayer.GetAllFeatures().Length > 0) { newlayer.SaveAs(dlg.FileName); MessageBox.Show("导出CAD完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } } private void 合并lgd和kml图层toolStripMenuItem3_Click(object sender, EventArgs e) { FrmMergeLayerLgdAndKml merge = new FrmMergeLayerLgdAndKml(globeControl1); merge.Show(this); } private void 选中管线缩进接头ToolStripMenuItem_Click(object sender, EventArgs e) { GSOFeature feature = globeControl1.Globe.SelectedObject; if (feature == null) { MessageBox.Show("没有选中的对象!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } if (feature.Geometry == null || feature.Geometry.Style == null) { MessageBox.Show("对象无效!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } GSOPipeLineStyle3D pipeLineStyle = feature.Geometry.Style as GSOPipeLineStyle3D; if (pipeLineStyle == null) { MessageBox.Show("对象无效!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } FrmDecjointPipeline dlg = new FrmDecjointPipeline(globeControl1.Globe, pipeLineStyle); dlg.Show(this); } private void undoToolStripMenuItem_Click(object sender, EventArgs e)//回退 { globeControl1.Globe.UnDoEdit(); } private void 前进ToolStripMenuItem_Click(object sender, EventArgs e)//前进 { globeControl1.Globe.ReDoEdit(); } private void 烟火ToolStripMenuItem_Click(object sender, EventArgs e) { GSOFeature newFeature = new GSOFeature(); newFeature = AddFireSmoke(); ShowAddFeatureDlg(newFeature); } private void 火苗ToolStripMenuItem_Click(object sender, EventArgs e) { GSOFeature newFeature = new GSOFeature(); newFeature = AddFire(); ShowAddFeatureDlg(newFeature); } private void 烟花ToolStripMenuItem_Click(object sender, EventArgs e) { GSOFeature newFeature = new GSOFeature(); newFeature = AddFireSpark(); ShowAddFeatureDlg(newFeature); } private void 水柱ToolStripMenuItem_Click(object sender, EventArgs e) { GSOFeature newFeature = new GSOFeature(); newFeature = AddWaterLine(); ShowAddFeatureDlg(newFeature); } private void 喷泉MenuItemAddFountain_Click(object sender, EventArgs e) { GSOFeature newFeature = new GSOFeature(); newFeature = AddFountain(); ShowAddFeatureDlg(newFeature); } private void 粒子系统ToolStripMenuItem_Click(object sender, EventArgs e) { GSOFeature newFeature1 = new GSOFeature(); newFeature1 = AddFireSmoke(); GSOFeature newFeature2 = new GSOFeature(); newFeature2 = AddFire(); GSOFeature newFeature3 = new GSOFeature(); newFeature3 = AddFireSpark(); GSOFeature newFeature4 = new GSOFeature(); newFeature4 = AddWaterLine(); GSOFeature newFeature5 = new GSOFeature(); newFeature5 = AddFountain(); TreeNode featureAddLayerTreeNode = GetDestLayerFeatureAddTreeNode(); if (featureAddLayerTreeNode == null) { MessageBox.Show("添加失败!没有设置目标图层,请先设置", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } // 先添加到图层中,这样可以预览效果 GSOLayer featureAddLayer = (GSOLayer)featureAddLayerTreeNode.Tag; featureAddLayer.AddFeature(newFeature1); featureAddLayer.AddFeature(newFeature2); featureAddLayer.AddFeature(newFeature3); featureAddLayer.AddFeature(newFeature4); featureAddLayer.AddFeature(newFeature5); globeControl1.Refresh(); } //烟火 private GSOFeature AddFireSmoke() { // 烟火示例 string strResPath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource"; // 烟火粒子示例,由三个发射器构成 GSOGeoParticle geoParticle = new GSOGeoParticle(); geoParticle.SetPosition(116.31, 39.84, 0); // 添加到这个经纬度位置 GSORingParticleEmitter emitter = new GSORingParticleEmitter(); emitter.TexturePath = strResPath + "/ParticleImage/烟1111111111111.png"; emitter.SetSizeFix(20, 20); //20,20 emitter.VelFix = 70; //70 emitter.AccFix = -3.0f; //-0.3f emitter.AngleXYFix = 0; emitter.AngleXYRnd = 180; emitter.AngleXZFix = 85; emitter.AngleXZRnd = 5; emitter.InnerRadius = 0; emitter.OuterRadius = 30; emitter.LifeFix = 2.0f; emitter.LifeRnd = 1.0f; emitter.RotFix = 0; emitter.RotRnd = 10; emitter.RotVelFix = 0; emitter.RotVelRnd = 180; emitter.EmitPerSec = 60; emitter.ColorRndStart = Color.Black; emitter.ColorRndEnd = Color.Black; emitter.IsLumAdded = false; GSOScaleParticleEffector effector1 = new GSOScaleParticleEffector(); effector1.SetScale(4, 4); //4,4 effector1.StartTime = 0; effector1.EndTime = 1.8f; // 添加效果器 emitter.AddEffector(effector1); GSOColorParticleEffector effector2 = new GSOColorParticleEffector(); effector2.SetColorChanged(0.6f, 0.6f, 0.6f, 0); effector2.StartTime = 0; effector2.EndTime = -1; // 负数表示整个粒子生命结束 emitter.AddEffector(effector2); GSOColorParticleEffector effector3 = new GSOColorParticleEffector(); effector3.SetColorChanged(0, 0, 0, -1); effector3.StartTime = 0.5f; effector3.StartTimeType = EnumEffectorTimeType.ToDeadSeconds; // 距离粒子生命结束0.5秒 effector3.EndTime = 0; effector3.EndTimeType = EnumEffectorTimeType.ToDeadSeconds; // 距离粒子生命结束0秒 emitter.AddEffector(effector3); GSORingParticleEmitter emitter2 = new GSORingParticleEmitter(); emitter2.TexturePath = strResPath + "/ParticleImage/fire_final_2.png"; emitter2.SetSizeFix(8, 8); //8,8 emitter2.VelFix = 30; //30 emitter2.GravityAcc = -3.0f; // 重力加速度 -3.0 emitter2.AngleXYFix = 0; emitter2.AngleXYRnd = 180; emitter2.AngleXZFix = 90; emitter2.AngleXZRnd = 5; emitter2.InnerRadius = 0; emitter2.OuterRadius = 30; //30 emitter2.LifeFix = 2.0f; emitter2.LifeRnd = 0.5f; emitter2.RotFix = 0; emitter2.RotRnd = 30; emitter2.RotVelFix = 0; emitter2.RotVelRnd = 60; emitter2.EmitPerSec = 300; emitter2.ColorRndStart = Color.FromArgb(255, 255, (int)(0.38 * 255), 0); emitter2.ColorRndEnd = Color.FromArgb(255, 255, (int)(0.404 * 255), 0); GSOColorParticleEffector effector4 = new GSOColorParticleEffector(); effector4.SetColorChanged(-1, -1, -1, 0); effector4.StartTime = 1; effector4.StartTimeType = EnumEffectorTimeType.ToDeadSeconds; // 距离粒子生命结束0.5秒 effector4.EndTime = 0; effector4.EndTimeType = EnumEffectorTimeType.ToDeadSeconds; // 距离粒子生命结束0秒 emitter2.AddEffector(effector4); GSORingParticleEmitter emitter3 = (GSORingParticleEmitter)emitter2.Clone(); emitter3.TexturePath = strResPath + "/ParticleImage/fire_final_1.png"; emitter3.GravityAcc = -2.0f; // 重力加速度 -2.0f // 将三个发射器添加到粒子对象中 geoParticle.AddEmitter(emitter); geoParticle.AddEmitter(emitter2); geoParticle.AddEmitter(emitter3); geoParticle.Play(); GSOFeature feature = new GSOFeature(); feature.Geometry = geoParticle; //globeControl1.Globe.MemoryLayer.AddFeature(feature); globeControl1.Globe.FlyToFeature(feature); return feature; } // 烟花 private GSOFeature AddFireSpark() { // 烟火示例 string strResPath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource"; // 烟火粒子示例,由三个发射器构成 GSOGeoParticle geoParticle = new GSOGeoParticle(); geoParticle.SetPosition(116.312, 39.84, 200); // 添加到这个经纬度位置 geoParticle.AltitudeMode = EnumAltitudeMode.RelativeToGround; GSORingParticleEmitter emitter = new GSORingParticleEmitter(); emitter.TexturePath = strResPath + "/ParticleImage/flare3.png"; emitter.SetSizeFix(8, 8); emitter.VelFix = 70; emitter.AccFix = -2.0f; emitter.GravityAcc = 9.8f; // 重力加速度 emitter.AngleXYFix = 0; emitter.AngleXYRnd = 180; emitter.AngleXZFix = 0; emitter.AngleXZRnd = 90; emitter.LifeFix = 5.0f; emitter.LifeRnd = 0.0f; emitter.EmitPerSec = 99999; emitter.MaxCount = 300; // 采用线性插值生成粒子的初始颜色 emitter.ColorRndStart = Color.White; emitter.ColorRndEnd = Color.Red; emitter.IsLumAdded = true; // 例子颜色亮度叠加 GSOIncreaseSizeParticleEffector effector1 = new GSOIncreaseSizeParticleEffector(); effector1.SetIncreasePerSecond(-2, -2); effector1.StartTime = 0; effector1.EndTime = -1; // 负数表示整个粒子生命结束 // 添加效果器 emitter.AddEffector(effector1); GSOColorParticleEffector effector2 = new GSOColorParticleEffector(); effector2.SetColorChanged(0, 0, 0, -1); effector2.StartTime = 0.8f; effector2.EndTime = 1.5f; emitter.AddEffector(effector2); // 将三个发射器添加到粒子对象中 geoParticle.AddEmitter(emitter); geoParticle.Play(); GSOFeature feature = new GSOFeature(); feature.Geometry = geoParticle; globeControl1.Globe.FlyToFeature(feature); return feature; } // 添加火苗 private GSOFeature AddFire() { // 烟火示例 string strResPath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource"; // 烟火粒子示例,由三个发射器构成 GSOGeoParticle geoParticle = new GSOGeoParticle(); geoParticle.SetPosition(116.313, 39.84, 200); // 添加到这个经纬度位置 geoParticle.AltitudeMode = EnumAltitudeMode.RelativeToGround; GSORingParticleEmitter emitter = new GSORingParticleEmitter(); emitter.TexturePath = strResPath + "/ParticleImage/flare.png"; emitter.SetSizeFix(8, 8); emitter.VelFix = 25; emitter.VelRnd = 20; 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.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(); GSOFeature feature = new GSOFeature(); feature.Geometry = geoParticle; globeControl1.Globe.FlyToFeature(feature); return feature; } // 添加喷泉 private GSOFeature AddFountain() { string strResPath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource"; GSOGeoParticle geoParticle = new GSOGeoParticle(); geoParticle.SetPosition(116.314, 39.84, 0); // 添加到这个经纬度位置 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.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(); GSOFeature feature = new GSOFeature(); feature.Geometry = geoParticle; globeControl1.Globe.FlyToFeature(feature); return feature; } // 添加水柱 private GSOFeature AddWaterLine() { string strResPath = Path.GetDirectoryName(Application.ExecutablePath) + "/Resource"; GSOGeoParticle geoParticle = new GSOGeoParticle(); geoParticle.SetPosition(116.308, 39.84, 0); // 添加到这个经纬度位置 GSOPointParticleEmitter emitter = new GSOPointParticleEmitter(); emitter.TexturePath = strResPath + "/ParticleImage/drop3.png"; geoParticle.TimerInterval = 1; emitter.SetSizeFix(2.0f, 2.0f); emitter.VelFix = 50; emitter.VelRnd = 2; emitter.GravityAcc = 9.8f; emitter.AngleXYFix = 0; emitter.AngleXYRnd = 2; emitter.AngleXZFix = 60; emitter.AngleXZRnd = 2; emitter.LifeFix = 5.0f; emitter.LifeRnd = 1.0f; emitter.RotFix = 0; emitter.RotRnd = 0; emitter.RotVelFix = 0; emitter.RotVelRnd = 0; emitter.EmitPerSec = 1500; emitter.ColorRndStart = Color.FromArgb(100, 222, 222, 222); emitter.ColorRndEnd = Color.FromArgb(50, 222, 222, 222); // 将三个发射器添加到粒子对象中 geoParticle.AddEmitter(emitter); geoParticle.Play(); GSOFeature feature = new GSOFeature(); feature.Geometry = geoParticle; globeControl1.Globe.FlyToFeature(feature); return feature; } private void 帮助ToolStripMenuItem_Click(object sender, EventArgs e) { Help.ShowHelp(this, Application.StartupPath + "/LSPipeline用户使用手册.chm"); } private void 管线高级查询ToolStripMenuItem_Click(object sender, EventArgs e) { FrmQueryPipelineBySQL sqlQuery = new FrmQueryPipelineBySQL(globeControl1); sqlQuery.Show(this); } private void 显示漏出地面管线ToolStripMenuItem_Click(object sender, EventArgs e) { GSOLayers layers = globeControl1.Globe.Layers; if (layers.Count <= 0) { MessageBox.Show("请先添加图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } FrmOutEarth frm = new FrmOutEarth(globeControl1); frm.Show(this); } public static string filename = Application.StartupPath + "\\FormText.xml"; private static bool LoadConfig() { if (File.Exists(filename)) { XmlTextReader XmlReader = new XmlTextReader(filename); try { while (XmlReader.Read()) { if (XmlReader.Name == "queryfield") { Utility.Query_Fields.Add(XmlReader["label"], XmlReader.ReadElementString()); } } return true; } catch { return false; } finally { XmlReader.Close(); } } else { MessageBox.Show("配置文件不存在!", "提示"); return false; } } private void 管线碰撞分析ToolStripMenuItem_Click(object sender, EventArgs e) { FrmAnalysisCollision collisionAnalysis = new FrmAnalysisCollision(globeControl1); collisionAnalysis.Show(this); } //创建拓扑 private void generateTopoDataMenuItem_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { return; } FrmCreateGenTopo frm = new FrmCreateGenTopo(globeControl1); frm.Show(this); } //连通性分析 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_CloseValvesAnalyResFeatures; ArrayList m_CloseValvesList = new ArrayList();//声明集合存储阀门分析的阀门Feature对象 private void ConnexityAnalysisMenuItem_Click(object sender, EventArgs e)//连通性分析 { if (globeControl1.Globe.SelObjectCount < 2) { MessageBox.Show("请选中至少两个管线!!"); 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("请选择管线!!"); return; } GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D; if (pipeStyle1 == null || pipeStyle2 == null) { MessageBox.Show("请选择管线!!"); return; } if (!m_COnnexityAnalysisSecondLayer.IsSameInnerObject(m_COnnexityAnalysisSecondLayer)) { MessageBox.Show("不在同一个图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); ClearConnexityAnalysis(); } else { ConnexityAnalysis(); } } 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; GSOGeoPolyline3D effectLine = new GSOGeoPolyline3D(); GSOPoint3ds effectPart = new GSOPoint3ds(); for (int i = 0; i < nCount; i++) { m_ConnexityAnalyResFeatures[i].HighLight = true; GSOGeoPolyline3D geoline = m_ConnexityAnalyResFeatures[i].Geometry as GSOGeoPolyline3D; if (geoline != null) { //管线显示流动效果 for (int j = 0; j < geoline.PartCount; j++) { effectLine.AddPart(geoline[j]); } } } effectLine.SmoothToSpline(); GSOFeature feature = new GSOFeature(); feature.Geometry = effectLine; if (feature.Geometry.Style == null) { feature.Geometry.Style = new GSOSimpleLineStyle3D(); } feature.Geometry.AltitudeMode = EnumAltitudeMode.RelativeToGround; ((GSOStyle3D)feature.Geometry.Style).UsingBlur = true; globeControl1.Globe.MemoryLayer.AddFeature(feature); GSOAniFeature featureAnimation = new GSOAniFeature();//动画的类型--要素动画 featureAnimation.Feature = feature; //动画的关联对象 GSOGeoMarker marker = new GSOGeoMarker(0, 0, 0,""); GSOMarkerStyle3D markerStyle = new GSOMarkerStyle3D(); markerStyle.IconPath = Application.StartupPath + "/Resource/image/star4.bmp"; marker.Style = markerStyle; marker.AltitudeMode = EnumAltitudeMode.RelativeToGround; GSOFeature markerFeature = new GSOFeature(); markerFeature.Geometry = marker; GSOAniEffectLineGrow effect = new GSOAniEffectLineGrow();//动画效果-线增长动画 effect.StartValue = 0; effect.EndValue = 1; effect.FrameCount = 1200; effect.RepeatCount = 1; effect.IsSmooth = false; effect.ActorFeature = markerFeature; GSOAniKeyFrame keyFream = new GSOAniKeyFrame(); //关键帧 keyFream.Frame = 0; keyFream.AddEffect(effect); //给关键帧添加动画效果 GSOAniObjTimeLine timeLine = new GSOAniObjTimeLine();//动画对象 timeLine.Name = "线增长动画对象"; timeLine.AniObject = featureAnimation; //动画对象的动画类型 timeLine.AddKeyFrame(keyFream); //给动画对象添加关键帧 GSOAnimationPage page = new GSOAnimationPage(); //动画 page.FPS = 60; //动画--帧率 page.FrameCount = 20 * 60; //动画时长 * 帧率 //动画--帧总数 page.Name = "线增长动画"; page.AddObjTimeLine(timeLine); //给动画添加动画对象 globeControl1.Globe.AnimationPages.Add(page); globeControl1.Globe.AnimationPages.GetAt(globeControl1.Globe.AnimationPages.Length - 1).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 CloseValvesAnalysisMenuItem_Click(object sender, EventArgs e)//关阀分析 { ClearCloseValvesAnalysisMenuItem_Click(sender,e); 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; } GSOPoint3d resIntersetPoint = new GSOPoint3d(); if (NetworkCloseValvesAnalysis(resFeature, resIntersetPoint, resLayer)) { //btnGFFX.Checked = false; globeControl1.Globe.Action = EnumAction3D.ActionNull; } } 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) { return false; } string srName = curCAYDataset.Name; GSONetworkDataset curCAYNDataset = curCAYDataset.DataSource.GetDatasetByName(srName + "Network") as GSONetworkDataset; if (curCAYNDataset == null) { MessageBox.Show("该图层没有创建网络拓扑,请先创建网络拓扑信息再进行分析!", "提示"); return false; } ClearCloseValvesAnalysisMenuItem_Click(null, null); int[] arryResNodeID; int[] arryResValveID; curCAYNDataset.CloseValveAnalysis(lineFeature.ID, out arryResNodeID, out arryResValveID, false, true); if (arryResValveID != null) { if (lineFeature.GetFieldAsInt32("管线编码") >= 6000 && lineFeature.GetFieldAsInt32("管线编码") <= 6203) // 6100是热力管线的编码 { GSOLayer ValveLayer = globeControl1.Globe.Layers.GetLayerByCaption("热力阀门"); if (ValveLayer != null) { m_CloseValvesAnalyResFeatures = ValveLayer.GetFeaturesByIDs(arryResValveID); } } else if (lineFeature.GetFieldAsInt32("管线编码") >= 5000 && lineFeature.GetFieldAsInt32("管线编码") <= 5200) // 5000是燃气管线的编码 { GSOLayer ValveLayer = globeControl1.Globe.Layers.GetLayerByCaption("燃气阀门"); if (ValveLayer != null) { m_CloseValvesAnalyResFeatures = ValveLayer.GetFeaturesByIDs(arryResValveID); } } else if (lineFeature.GetFieldAsInt32("管线编码") >= 3000 && lineFeature.GetFieldAsInt32("管线编码") <= 3513) // 3000是给水管线的编码 { GSOLayer ValveLayer = globeControl1.Globe.Layers.GetLayerByCaption("给水阀门"); if (ValveLayer != null) { m_CloseValvesAnalyResFeatures = ValveLayer.GetFeaturesByIDs(arryResValveID); } } } if (m_CloseValvesAnalyResFeatures == null || m_CloseValvesAnalyResFeatures.Length < 1) { MessageBox.Show("没有找到要关闭的阀门!"); } else { int nCount = m_CloseValvesAnalyResFeatures.Length; if (nCount > 0) { FrmShowValvesNeedClose frm = FrmShowValvesNeedClose.getForm(globeControl1, m_CloseValvesAnalyResFeatures, m_CloseValvesList); frm.setLstValvesName(); if (!frm.Visible) { frm.Show(this); } } } return true; } private void TraceUpMenuItem_Click(object sender, EventArgs e)//上游追踪 { ClearUpDownTraceMenuItem_Click(sender, e); NetworkTraceUpDown(true); } private void TraceDownMenuItem_Click(object sender, EventArgs e)//下游追踪 { ClearUpDownTraceMenuItem_Click(sender, e); NetworkTraceUpDown(false); } private void ClearUpDownTraceMenuItem_Click(object sender, EventArgs e)//清除追踪结果 { 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 ClearCloseValvesAnalysisMenuItem_Click(object sender, EventArgs e)//清除关阀分析结果 { 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 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) { 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(); } } } //动画 //GSOLayer layer = globeControl1.Globe.Layers.Add(Application.StartupPath + "/MyPlace.kml"); //if (layer != null) //{ // GSOAnimationPage page = new GSOAnimationPage(); //动画 // page.FPS = 60; //动画--帧率 // page.FrameCount = 20 * 60; //动画时长 * 帧率 //动画--帧总数 // page.Name = "线增长动画"; // GSOAniObjTimeLine timeLine = new GSOAniObjTimeLine();//动画对象 // timeLine.Name = "线增长动画对象"; // for (int i = 0; i < nCount; i++) // { // m_TraceUpDownAnalyResFeatures[i].HighLight = false; // GSOGeoPolyline3D geoline = m_TraceUpDownAnalyResFeatures[i].Geometry as GSOGeoPolyline3D; // if (geoline != null && geoline.PartCount > 0) // { // GSOPoint3d endPoint = geoline[0][0]; // if (endPoint != null) // { // GSOFeatures featuresInPolygon = getFeatureByPolygon(layer, m_TraceUpDownAnalyResFeatures, endPoint, 0.1); // if (featuresInPolygon != null && featuresInPolygon.Length == 0) // { // timeLine = createKeyFrame(timeLine, m_TraceUpDownAnalyResFeatures[i]); // endPoint = geoline[geoline.PartCount - 1][geoline[geoline.PartCount - 1].Count - 1]; // } // } // } // } // page.AddObjTimeLine(timeLine); // globeControl1.Globe.AnimationPages.Add(page); // globeControl1.Globe.AnimationPages.GetAt(globeControl1.Globe.AnimationPages.Length - 1).Play(); // globeControl1.Refresh(); //} //else //{ // MessageBox.Show("没有动画演示需要的临时图层MyPlace","提示"); //} globeControl1.Refresh(); } } private GSOFeatures getFeatureByPolygon(GSOLayer layer,GSOFeatures features, GSOPoint3d point, double allowValue) { if (layer == null || point == null || allowValue <= 0) { return null; } GSOGeoPolyline3D bufferLine = new GSOGeoPolyline3D(); GSOPoint3ds points = new GSOPoint3ds(); points.Add(point); GSOPoint3d newPoint = new GSOPoint3d(); newPoint.X = point.X + 0.00001; newPoint.Y = point.Y; newPoint.Z = point.Z; points.Add(newPoint); bufferLine.AddPart(points); GSOGeoPolygon3D polygon = bufferLine.CreateBuffer(allowValue, true, 12, false, false); layer.RemoveAllFeature(); layer.AddFeatures(features); GSOFeatures featuresInPolygon = layer.FindFeaturesInPolygon(polygon, false); return featuresInPolygon; } private GSOAniObjTimeLine createKeyFrame(GSOAniObjTimeLine timeLine, GSOFeature featureAboutAnimation) { if (timeLine == null || featureAboutAnimation == null || featureAboutAnimation.Geometry == null) { return null; } GSOFeature feature = featureAboutAnimation.Clone(); if (feature.Geometry.Style == null || feature.Geometry.Style is GSOSimpleLineStyle3D) { feature.Geometry.Style = new GSOPipeLineStyle3D(); } feature.Geometry.AltitudeMode = EnumAltitudeMode.RelativeToGround; ((GSOGeoPolyline3D)feature.Geometry).SmoothToSpline(); ((GSOStyle3D)feature.Geometry.Style).UsingBlur = true; globeControl1.Globe.MemoryLayer.AddFeature(feature); GSOAniFeature featureAnimation = new GSOAniFeature();//动画的类型--要素动画 featureAnimation.Feature = feature; //动画的关联对象 GSOAniEffectLineGrow effect = new GSOAniEffectLineGrow();//动画效果-线增长动画 effect.StartValue = 0; effect.EndValue = 1; effect.FrameCount = 1200; effect.RepeatCount = 1; //effect.IsSmooth = false; GSOAniKeyFrame keyFream = new GSOAniKeyFrame(); //关键帧 keyFream.Frame = 0; keyFream.AddEffect(effect); //给关键帧添加动画效果 timeLine.AddKeyFrame(keyFream); return timeLine; } private void 更改要素的名字toolStripMenuItem3_Click(object sender, EventArgs e) { FrmUpdateFeatureNames updateNames = new FrmUpdateFeatureNames(globeControl1); updateNames.Show(this); } string trackPolygonEndFunction = ""; private void 框选删除ToolStripMenuItem_Click(object sender, EventArgs e) { string caption = "我的地标"; GSOLayer layer = globeControl1.Globe.DestLayerFeatureAdd; if(layer != null) { caption = layer.Caption; } DialogResult result = MessageBox.Show("框选删除针对当前目标图层:" + caption, "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); if (result == DialogResult.OK) { globeControl1.Globe.Action = EnumAction3D.TrackPolygon; ActionToolMenuChecked(); trackPolygonEndFunction = "polygonDelete"; } } private void 横断面分析toolStripMenuItem3_Click(object sender, EventArgs e) { if (!横断面分析toolStripMenuItem3.Checked) { globeControl1.Globe.Action = EnumAction3D.TrackPolyline; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = true; 横断面分析toolStripMenuItem3.Checked = true; } else { globeControl1.Globe.Action = EnumAction3D.ActionNull; globeControl1.Globe.TrackPolylineTool.VerticalLineVisible = false; 横断面分析toolStripMenuItem3.Checked = false; } ActionToolMenuChecked(); } private void 管线间距分析ToolStripMenuItem_Click(object sender, EventArgs e) { if (globeControl1.Globe.SelObjectCount < 2) { MessageBox.Show("请选中至少两个管线!!"); return; } if (disFeature.ID != 0) { globeControl1.Globe.MemoryLayer.RemoveFeatureByID(disFeature.ID); } if (featureDis.ID != 0) { globeControl1.Globe.MemoryLayer.RemoveFeatureByID(featureDis.ID); } GSOLayer reslayer; globeControl1.Globe.GetSelectObject(0, out m_DisAnalysisFirstFeature, out reslayer); globeControl1.Globe.GetSelectObject(1, out m_DisAnalysisSecondFeature, out reslayer); if (m_DisAnalysisSecondFeature != null && m_DisAnalysisSecondFeature != null) { GSOGeoPolyline3D line1 = m_DisAnalysisFirstFeature.Geometry as GSOGeoPolyline3D; GSOGeoPolyline3D line2 = m_DisAnalysisSecondFeature.Geometry as GSOGeoPolyline3D; if (line1 == null || line2 == null) { MessageBox.Show("请选择管线!!"); return; } GSOPipeLineStyle3D pipeStyle1 = line1.Style as GSOPipeLineStyle3D; GSOPipeLineStyle3D pipeStyle2 = line2.Style as GSOPipeLineStyle3D; if (pipeStyle1 == null || pipeStyle2 == null) { MessageBox.Show("请选择管线!!"); return; } GSOPoint3d pntIntersect1; GSOPoint3d pntIntersect2; double dHonLen; double dVerLen; double dNoIntersectStartRatio = 0; // 计算两条线的距离和交点,若果失败返回-1 // 若在同一直线上,并且有交点,返回0 // 若不在同一平面,返回最近两点的距离,并且计算最近两点 double dDist = globeControl1.Globe.Analysis3D.ComputeTwoGeoPolylineDistance(line1, line2, out pntIntersect1, out pntIntersect2, out dHonLen, out dVerLen, false, false, dNoIntersectStartRatio); if (dDist > -1) { if (dDist == 0) { MessageBox.Show("管线在同一水平面,距离为0"); return; } else { dDist = dDist - pipeStyle1.Radius - pipeStyle2.Radius; GSOGeoPolyline3D disline = new GSOGeoPolyline3D(); GSOPoint3ds point3ds = new GSOPoint3ds(); point3ds.Add(pntIntersect1); point3ds.Add(pntIntersect2); disline.AddPart(point3ds); GSOSimpleLineStyle3D style = new GSOSimpleLineStyle3D(); //创建线的风格 //设置透明度及颜色,FromArgb()中的四个参数分别为alpha、red、green、blue,取值范围为0到255 style.LineColor = Color.GreenYellow; style.LineWidth = 3; //设置线的宽度为3 style.VertexVisible = true; //显示线的节点 disline.Style = style; //把风格添加到线上 disline.AltitudeMode = EnumAltitudeMode.Absolute; 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; featureDis.Geometry = markerDis; layerTemp = globeControl1.Globe.Layers.Add(Application.StartupPath + "\\tempLgdData.lgd"); layerTemp.AddFeature(featureDis); layerTemp.AddFeature(disFeature); globeControl1.Refresh(); } } else { MessageBox.Show("没有交点!!"); return; } } } private void MainFrm_HelpButtonClicked(object sender, CancelEventArgs e) { SendKeys.Send("{F1}"); } private void 更改图片路径ToolStripMenuItem_Click(object sender, EventArgs e) { GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption("china"); GSOFeatures fe = layer.GetAllFeatures(); for (int i = 0; i < fe.Length; i++) { GSOFeature f = fe[i]; GSOGeoPoint3D p = f.Geometry as GSOGeoPoint3D; GSOPointStyle3D style = p.Style as GSOPointStyle3D; } } private void SetSelLevelMenuItem_Click(object sender, EventArgs e) { FrmSetSelectLevel dlg = new FrmSetSelectLevel(); dlg.m_strTerrainExtra = globeControl1.Globe.SelLevel.ToString(); if (dlg.ShowDialog() == DialogResult.OK) { if (dlg.m_strTerrainExtra.Trim() != "") { int selselvel = 0; bool bl = int.TryParse(dlg.m_strTerrainExtra.Trim(), out selselvel); if (bl) { globeControl1.Globe.SelLevel = selselvel; globeControl1.Globe.Refresh(); ActionToolMenuChecked(); } } } } private void 清除连通分析结果ToolStripMenuItem_Click(object sender, EventArgs e) { ClearConnexityAnalysis(); } private void 备份数据库toolStripMenuItem3_Click(object sender, EventArgs e) { if (isGlobeContainsDataSource() == false) { FrmMessageBox frmMessage = new FrmMessageBox(); DialogResult result = frmMessage.ShowDialog(); if (result == DialogResult.OK) { 连接数据库ToolStripMenuItem_Click(sender, e); } else if (result == DialogResult.No) { 连接Oracle数据库toolStripMenuItem6_Click(sender, e); } else { return; } } if (isGlobeContainsDataSource() == false) { return; } FrmBackupDatabase frm = new FrmBackupDatabase(globeControl1); frm.Show(this); } private void 面转为水面ToolStripMenuItem_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; GSOLayer layer = node.Tag as GSOLayer; GSOFeatures features = layer.GetAllFeatures(); if (features.Length <= 0) { MessageBox.Show("图层中没有对象"); return; } FrmPolygonToWater polygonToWater = new FrmPolygonToWater(globeControl1,layer); if (polygonToWater.ShowDialog(this) == DialogResult.OK) { RefreshTreeNodeLayerFeatureList(node); } } private void toolStripMenuItem条件删除管线_Click(object sender, EventArgs e) { FrmDeleteLines frmDeleteLines = new FrmDeleteLines(globeControl1); frmDeleteLines.Show(this); } private void 数据验证toolStripMenuItem3_Click(object sender, EventArgs e) { FrmValiData frm = new FrmValiData(globeControl1); frm.Show(this); } private void 求解假东假北ToolStripMenuItem_Click(object sender, EventArgs e) { FrmFalseEastNorth frm = new FrmFalseEastNorth(); frm.Show(this); } private void 线增长动画ToolStripMenuItem_Click(object sender, EventArgs e) { if (globeControl1.Globe.SelectedObject != null) { GSOFeature feature = globeControl1.Globe.SelectedObject; feature.HighLight = false; globeControl1.Globe.Refresh(); if (feature.Geometry != null && feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { if (feature.Geometry.Style == null) { feature.Geometry.Style = new GSOSimpleLineStyle3D(); } feature.Geometry.AltitudeMode = EnumAltitudeMode.RelativeToGround; ((GSOGeoPolyline3D)feature.Geometry).SmoothToSpline(); ((GSOStyle3D)feature.Geometry.Style).UsingBlur = true; globeControl1.Globe.MemoryLayer.AddFeature(feature); GSOAniFeature featureAnimation = new GSOAniFeature();//动画的类型--要素动画 featureAnimation.Feature = feature; //动画的关联对象 GSOAniEffectLineGrow effect = new GSOAniEffectLineGrow();//动画效果-线增长动画 effect.StartValue = 0; effect.EndValue = 1; effect.FrameCount = 1200; effect.RepeatCount = 1; //effect.IsSmooth = false; GSOAniKeyFrame keyFream = new GSOAniKeyFrame(); //关键帧 keyFream.Frame = 0; keyFream.AddEffect(effect); //给关键帧添加动画效果 GSOAniObjTimeLine timeLine = new GSOAniObjTimeLine();//动画对象 timeLine.Name = "线增长动画对象"; timeLine.AniObject = featureAnimation; //动画对象的动画类型 timeLine.AddKeyFrame(keyFream); //给动画对象添加关键帧 GSOAnimationPage page = new GSOAnimationPage(); //动画 page.FPS = 60; //动画--帧率 page.FrameCount = 20 * 60; //动画时长 * 帧率 //动画--帧总数 page.Name = "线增长动画"; page.AddObjTimeLine(timeLine); //给动画添加动画对象 globeControl1.Globe.AnimationPages.Add(page); globeControl1.Globe.AnimationPages.GetAt(globeControl1.Globe.AnimationPages.Length - 1).Play(); globeControl1.Refresh(); } else { MessageBox.Show("请选中一条线!","提示"); } } } private void 管线自动缩进toolStripMenuItem3_Click_1(object sender, EventArgs e) { FrmPipelineIndented frm = new FrmPipelineIndented(globeControl1); frm.Show(this); } private void 选中发光ToolStripMenuItem_Click(object sender, EventArgs e) { if (globeControl1.Globe.SelObjectCount < 1) { MessageBox.Show("请选中要发光的对象!","提示"); return; } 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.Style != null) { feature.HighLight = false; ((GSOStyle3D)feature.Geometry.Style).UsingBlur = true; } } globeControl1.Globe.Action = EnumAction3D.ActionNull; globeControl1.Globe.Action = EnumAction3D.SelectObject; globeControl1.Globe.Refresh(); } private void MainFrm_Resize(object sender, EventArgs e) { int alllength = statusStrip1.Width; int leftlength = statusStrip1.Items[0].Width; statusStrip1.Items[1].Width = alllength - leftlength - 20; } private void 更新图层字段值ToolStripMenuItem_Click(object sender, EventArgs e) { FrmUpdateLayerFieldValues frm = new FrmUpdateLayerFieldValues(globeControl1); frm.Show(this); } private void toolStripMenuItem5_Click(object sender, EventArgs e) { FrmBatchExportLayerByZ frm = new FrmBatchExportLayerByZ(globeControl1); frm.Show(this); } private void 检查图层ToolStripMenuItem_Click(object sender, EventArgs e) { GSOLayer layer = globeControl1.Globe.DestLayerFeatureAdd; if (layer != null && layer.ID == globeControl1.Globe.MemoryLayer.ID) { MessageBox.Show("请先设置目标图层!","提示"); return; } if (layer.Dataset != null && layer.Dataset.IsFeatureDataset == true) { GSOFeatureDataset dataset = layer.Dataset as GSOFeatureDataset; for (int i = 0; i < dataset.GetAllFeatures().Length; i++) { GSOFeature feature = dataset.GetFeatureAt(i); if (feature != null && feature.GetFieldCount() < dataset.FieldCount) { for (int j = 0; j < dataset.FieldCount; j++) { GSOFieldAttr field = dataset.GetField(j); if (field != null && feature.GetFieldDefn(field.Name) == null) { GSOFieldDefn defn = new GSOFieldDefn(); defn.Name = field.Name; defn.Type = field.Type; defn.Width = field.Width; feature.AddField(defn); } } } } MessageBox.Show("检查完毕!","提示"); } } //框选部分feature对象进行属性字段编辑 private void 框选打开属性表toolStripMenuItem6_Click(object sender, EventArgs e) { globeControl1.Globe.Action = EnumAction3D.TrackPolygon; trackPolygonEndFunction = "polygonOpenAttributes"; } //去除管线对象中多余的节点 private void 检查管线节点ToolStripMenuItem_Click(object sender, EventArgs e) { GSOLayer layer = globeControl1.Globe.DestLayerFeatureAdd; if (layer != null && layer.ID == globeControl1.Globe.MemoryLayer.ID) { MessageBox.Show("请先设置目标图层!", "提示"); return; } FrmCheckPipelinePoint frm = new FrmCheckPipelinePoint(); if (frm.ShowDialog() == DialogResult.OK && layer.GetAllFeatures().Length > 0) { double distance = frm.pointDistance; for (int i = 0; i < layer.GetAllFeatures().Length; i++) { GSOFeature feature = layer.GetAt(i); if (feature != null && feature.Geometry != null && feature.Geometry.Type == EnumGeometryType.GeoPolyline3D) { GSOGeoPolyline3D line = feature.Geometry as GSOGeoPolyline3D; //获取管线中所有节点 GSOPoint3ds allPoint = new GSOPoint3ds(); for (int j = 0; j < line.PartCount; j++) { GSOPoint3ds points = line[j]; if (points != null) { for (int m = 0; m < points.Count; m++) { GSOPoint3d point = points[m]; allPoint.Add(point); } } } if (allPoint.Count > 2) { for (int j = 0; j < allPoint.Count - 1; j++) { GSOPoint3d point = allPoint[j]; GSOPoint3d point1 = allPoint[j + 1]; GSOPoint3ds points = new GSOPoint3ds(); points.Add(point); points.Add(point1); GSOGeoPolyline3D newLine = new GSOGeoPolyline3D(); newLine.AddPart(points); double length = newLine.GetSpaceLength(false, 6378137.0); if (length < distance) { if (j == allPoint.Count - 2) { allPoint.Remove(j); } else { allPoint.Remove(j + 1); } if (allPoint.Count < 3) { break; } j--; } } } line.Clear(); line.AddPart(allPoint); feature.Geometry = line; globeControl1.Refresh(); } } } MessageBox.Show("检查完毕!", "提示"); } private void 连接Oracle数据库toolStripMenuItem6_Click(object sender, EventArgs e) { FrmDatabaseParaSettingOracle frm = new FrmDatabaseParaSettingOracle(globeControl1); frm.ShowDialog(); } private void RulerDistanceItem_Click(object sender, EventArgs e) { if (globeControl1.Globe.Action != EnumAction3D.MeasureDistance) { globeControl1.Globe.Action = EnumAction3D.MeasureDistance; globeControl1.Globe.DistanceRuler.MeasureMode = EnumDistanceMeasureMode.HVSLineMeasure; } else { if (globeControl1.Globe.DistanceRuler.MeasureMode == EnumDistanceMeasureMode.HVSLineMeasure) { globeControl1.Globe.Action = EnumAction3D.ActionNull; } else { globeControl1.Globe.DistanceRuler.MeasureMode = EnumDistanceMeasureMode.HVSLineMeasure; } } ActionToolMenuChecked(); } private void ChooseFeatureItem_Click(object sender, EventArgs e) { globeControl1.Globe.Action = EnumAction3D.SelectObject; ActionToolMenuChecked(); } private void MoveFeatureItem_Click(object sender, EventArgs e) { globeControl1.Globe.Action = EnumAction3D.MoveObject; ActionToolMenuChecked(); } private void layerTree_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Node.Tag != null) { if (e.Node.Tag.GetType() == typeof(GSOFeature)) { GSOFeature feature = e.Node.Tag as GSOFeature; if (feature.Geometry == null || feature.Geometry.CameraState == null) { globeControl1.Globe.FlyToFeature(feature); } else { globeControl1.Globe.FlyToCameraState(feature.Geometry.CameraState); } } else { GSORect2d rcBounds = new GSORect2d(); GSOLayer tempLayer = e.Node.Tag as GSOLayer; if (tempLayer != null) { rcBounds = tempLayer.LatLonBounds; } else if (e.Node.Tag.GetType() == typeof(GSOTerrain)) { GSOTerrain tempTerrain = e.Node.Tag as GSOTerrain; rcBounds = tempTerrain.LatLonBounds; } if (!rcBounds.IsEmpty()) { GSOPoint2d pntCenter = rcBounds.Center; GSOPoint3d pntPostion = new GSOPoint3d(); pntPostion.X = pntCenter.X; pntPostion.Y = pntCenter.Y; Double dMaxGeoLen = Math.Max(rcBounds.Width, rcBounds.Height); Double dSize = dMaxGeoLen * Math.PI * 6378137 / 360; pntPostion.Z = dSize; globeControl1.Globe.FlyToPosition(pntPostion, EnumAltitudeMode.Absolute); } } } } private void treeFind_NodeMouseDoubleClick_1(object sender, TreeNodeMouseClickEventArgs e) { if (e.Node.Tag != null) { if (e.Node.Tag.GetType() == typeof(GSOFeature)) { GSOFeature feature = e.Node.Tag as GSOFeature; if (feature.Geometry == null || feature.Geometry.CameraState == null) { globeControl1.Globe.FlyToFeature(feature); } else { globeControl1.Globe.FlyToCameraState(feature.Geometry.CameraState); } } else { GSORect2d rcBounds = new GSORect2d(); GSOLayer tempLayer = e.Node.Tag as GSOLayer; if (tempLayer != null) { rcBounds = tempLayer.LatLonBounds; } else if (e.Node.Tag.GetType() == typeof(GSOTerrain)) { GSOTerrain tempTerrain = e.Node.Tag as GSOTerrain; rcBounds = tempTerrain.LatLonBounds; } if (!rcBounds.IsEmpty()) { GSOPoint2d pntCenter = rcBounds.Center; GSOPoint3d pntPostion = new GSOPoint3d(); pntPostion.X = pntCenter.X; pntPostion.Y = pntCenter.Y; Double dMaxGeoLen = Math.Max(rcBounds.Width, rcBounds.Height); Double dSize = dMaxGeoLen * Math.PI * 6378137 / 360; pntPostion.Z = dSize; globeControl1.Globe.FlyToPosition(pntPostion, EnumAltitudeMode.Absolute); } } } } private void treeFind_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Button==MouseButtons.Right&& e.Node.Tag != null) { if (e.Node.Tag.GetType() == typeof(GSOFeature)) { treeFindMenuStrip.Tag = e.Node; treeFindMenuStrip.Show(treeFind, e.X, e.Y); } } } private void SaveasToolStripMenuItem_Click(object sender, EventArgs e) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "矢量数据(*.lgd)|*.lgd|KML数据(*.kml)|*.kml||"; if (dlg.ShowDialog() == DialogResult.OK) { GSOLayer layer= globeControl1.Globe.Layers.Add(dlg.FileName); GSOFeatures features = new GSOFeatures(); if (treeFind.Nodes.Count > 0) { ErgodicTreeView(treeFind.Nodes[0], features); } layer.AddFeatures(features); layer.Save(); MessageBox.Show("导出成功"); //dlg.FileName } } void ErgodicTreeView(TreeNode tn,GSOFeatures fs) { if (tn == null) return; if(tn.Text=="查询结果"){} foreach(TreeNode n in tn.Nodes) { if(n.Tag!=null&&n.Tag.GetType() == typeof(GSOFeature)) { GSOFeature f=n.Tag as GSOFeature; fs.Add(f); } ErgodicTreeView(n,fs); } } private void delFeatureToolStripMenuItem_Click(object sender, EventArgs e) { TreeNode node = treeFindMenuStrip.Tag as TreeNode; if (node != null) { if (node.Tag != null && node.Tag.GetType() == typeof(GSOFeature)) { ((GSOFeature)node.Tag).Delete(); } node.Remove(); } globeControl1.Globe.Refresh(); } private void delAllFeatureToolStripMenuItem_Click(object sender, EventArgs e) { if (treeFind.Nodes.Count > 0) { TreeNode node = treeFind.Nodes[0]; for (int i = 0; i < node.Nodes.Count; i++) { if (node.Nodes[i].Tag != null && node.Nodes[i].Tag.GetType() == typeof(GSOFeature)) { ((GSOFeature)node.Nodes[i].Tag).Delete(); } } treeFind.Nodes[0].Nodes.Clear(); } globeControl1.Globe.Refresh(); } private void ModelPathItem_Click(object sender, EventArgs e) { TreeNode node = layerNodeContexMenu.Tag as TreeNode; GSOLayer layer = node.Tag as GSOLayer; changeModelPathDlg dlg = new changeModelPathDlg(layer); dlg.Show(this); } } }