using System; using System.Windows.Forms; using DevComponents.DotNetBar; using GeoScene.Data; using GeoScene.Globe; using GeoScene.Engine; using System.Xml; namespace Cyberpipe { public partial class FrmLayerControl : Office2007Form { GSOGlobeControl globeControl1; GSOGlobeControl globeControl2; TreeNode terrainManagerNode = null; TreeNode layerManagerNode = null; TreeNode terrainManagerNode1 = null; TreeNode layerManagerNode1 = null; public FrmLayerControl(GSOGlobeControl ctl1,GSOGlobeControl ctl2) { InitializeComponent(); globeControl1 = ctl1; globeControl2 = ctl2; } private void initLayerTree(out TreeNode treeNode, string strTreeNodeText) { treeNode=new TreeNode(); treeNode.ImageIndex = 0; treeNode.SelectedImageIndex = 0; treeNode.Checked = false; treeNode.Text = strTreeNodeText; } // private void initTreeView() // { // layerTree1.Nodes.Clear(); // layerTree2.Nodes.Clear(); // // //加载layertree2 // initLayerTree(out layerManagerNode1, "图层管理"); // layerTree1.Nodes.Add(layerManagerNode1); // initLayerTree(out terrainManagerNode1, "地形管理"); // layerTree1.Nodes.Add(terrainManagerNode1); // // initLayerTree(out layerManagerNode, "图层管理"); // layerTree2.Nodes.Add(layerManagerNode); // initLayerTree(out terrainManagerNode, "地形管理"); // layerTree2.Nodes.Add(terrainManagerNode); // } #region wxl重构树形结构代码 private TreeNode treeNode(string strTreeNodeText) { TreeNode treeNode = new TreeNode(); treeNode.ImageIndex = 0; treeNode.SelectedImageIndex = 0; treeNode.Checked = false; treeNode.Text = strTreeNodeText; return treeNode; } // private void appendToParent(TreeNodeCollection treeNodeCollection, ) #endregion private void initTreeView() { layerTree1.Nodes.Clear(); layerTree2.Nodes.Clear(); //加载layertree2 initLayerTree(out layerManagerNode1, "图层管理"); layerTree1.Nodes.Add(layerManagerNode1); initLayerTree(out terrainManagerNode1, "地形管理"); layerTree1.Nodes.Add(terrainManagerNode1); initLayerTree(out layerManagerNode, "图层管理"); layerTree2.Nodes.Add(layerManagerNode); initLayerTree(out terrainManagerNode, "地形管理"); layerTree2.Nodes.Add(terrainManagerNode); } private void initNode(string nodeName) { TreeNode nodeGroupElse1 = new TreeNode(); nodeGroupElse1.Text = nodeName; layerTree1.Nodes[0].Nodes.Add(nodeGroupElse1); TreeNode nodeGroupElse = new TreeNode(); nodeGroupElse.Text = nodeName == "供电" ? "电力" : nodeName; layerTree2.Nodes[0].Nodes.Add(nodeGroupElse); } private void initTreeNode(XmlNodeList Params) { foreach (XmlNode paramsNode in Params) //layers { foreach (XmlNode layerNode in paramsNode) //layer { initNode(layerNode.Attributes["label"].Value); } } initNode("基础图层"); initNode("其他"); } private void FrmLayerControl_Load(object sender, EventArgs e) { initTreeView(); try { XmlDocument doc = new XmlDocument(); doc.Load(Application.StartupPath + "\\双屏设置.xml"); XmlNodeList Params = doc.SelectNodes("/Params/layers"); initTreeNode(Params); } catch (Exception ex) { LogError.PublishError(ex); } RefreshLayerAndTerrainTree(); } private void addLayerTreeNode(int nLayerCount, int nTerrainCount, GSOGlobeControl globcontrol, TreeView layerTree) { try { for (int i = 0; i < nLayerCount; i++) { GSOLayer layer = globcontrol.Globe.Layers[i]; if (layer == null) continue; string layerName = layer.Name; TreeNode node = new TreeNode(); node.Tag = layer; node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Text = layer.Caption; node.Checked = layer.Visible; bool isContains = false; for (int j = 0; j < layerTree.Nodes[0].Nodes.Count; j++) { if (!layerName.Contains("fttp:")) { switch (layerTree.Name) { case "layerTree1": if (!layerName.Contains(layerTree.Nodes[0].Nodes[j].Text.Trim()) || layerName.Contains("施工") || layerName.Contains("规划")) continue; break; case "layerTree2": if (!layerName.Contains(layerTree.Nodes[0].Nodes[j].Text.Trim())) continue; break; default: break; } layerTree.Nodes[0].Nodes[j].Nodes.Add(node); isContains = true; break; } else { layerTree.Nodes[0].Nodes[layerTree.Nodes[0].Nodes.Count - 2].Nodes.Add(node); isContains = true; break; } } switch (layerTree.Name) { case "layerTree1": if (layerName.Contains("tempLgdData") || layerName.Contains("城市") || layerName.Contains("标注") || isContains == true || layerName.Contains("施工") || layerName.Contains("规划") || layerName.Contains("景观") || layerName.Contains("红线")) continue; break; case "layerTree2": if (isContains != false || layerName.Contains("tempLgdData2")) continue; break; default: break; } layerTree.Nodes[0].Nodes[layerTree.Nodes[0].Nodes.Count - 1].Nodes.Add(node); } for (int i = 0; i < nTerrainCount; i++) { GSOTerrain terrain = globcontrol.Globe.Terrains[i]; if (terrain == null) continue; TreeNode node = new TreeNode(); node.Tag = terrain; node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Text = terrain.Caption; node.Checked = terrain.Visible; switch (layerTree.Name) { case "layerTree1": terrainManagerNode1.Nodes.Add(node); break; case "layerTree2": terrainManagerNode.Nodes.Add(node); break; default: break; } } } catch (Exception ex) { LogError.PublishError(ex); } } private void initTreeNodeCheckedStatus(TreeView layerTreeView) { //节点选中状态控制 foreach (TreeNode node in layerTreeView.Nodes[0].Nodes) { foreach (TreeNode childNode in node.Nodes) { GSOLayer layer = childNode.Tag as GSOLayer; if (layer == null || layer.Visible != true) continue; node.Checked = true; break; } } foreach (TreeNode node in layerTreeView.Nodes[0].Nodes) { if (node.Checked != true) continue; layerTreeView.Nodes[0].Checked = true; break; } foreach (TreeNode node in layerTreeView.Nodes[1].Nodes) { foreach (TreeNode childNode in node.Nodes) { GSOTerrain layer = childNode.Tag as GSOTerrain; if (layer == null || layer.Visible != true) continue; node.Checked = true; break; } } } void exPandTreeNode() { layerManagerNode1.Expand(); terrainManagerNode1.Expand(); layerManagerNode.Expand(); terrainManagerNode.Expand(); } /// <summary> /// 刷新节点树 /// </summary> private void RefreshLayerAndTerrainTree() { int nLayerCount1 = globeControl1.Globe.Layers.Count;//图层 int nTerrainCount1 = globeControl1.Globe.Terrains.Count;//地形 addLayerTreeNode(nLayerCount1, nTerrainCount1, globeControl1, layerTree1); initTreeNodeCheckedStatus(layerTree1); int nLayerCount = globeControl2.Globe.Layers.Count; int nTerrainCount = globeControl2.Globe.Terrains.Count; addLayerTreeNode(nLayerCount, nTerrainCount, globeControl2, layerTree2); initTreeNodeCheckedStatus(layerTree2); // 展开 exPandTreeNode(); } /// <summary> /// 节点树复选框选中状态改变事件处理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void layerTree2_AfterCheck(object sender, TreeViewEventArgs e) { if (e.Action != TreeViewAction.Unknown) { if (e.Node.Tag != null) { if (e.Node.Tag is GSOLayer) { GSOLayer layer = e.Node.Tag as GSOLayer; if (layer != null) { layer.Visible = e.Node.Checked; globeControl2.Globe.Refresh(); } } if (e.Node.Tag is GSOTerrain) { GSOTerrain feat = e.Node.Tag as GSOTerrain; feat.Visible = e.Node.Checked; globeControl2.Globe.Refresh(); } } CheckParentNode(e.Node); if (e.Node.Nodes.Count > 0) checkChildrenNodeLayertree2(e.Node, e.Node.Checked); } } /// <summary> /// 改变指定节点的子节点的选中状态 /// </summary> /// <param name="parentNode"></param> /// <param name="isChecked"></param> private void checkChildrenNodeLayertree1(TreeNode parentNode, bool isChecked) { foreach (TreeNode childNode in parentNode.Nodes) { childNode.Checked = isChecked; GSOLayer layer = childNode.Tag as GSOLayer; if (layer != null) { layer.Visible = isChecked; globeControl1.Globe.Refresh(); } if (childNode.Tag is GSOTerrain) { GSOTerrain feat = childNode.Tag as GSOTerrain; feat.Visible = isChecked; globeControl1.Globe.Refresh(); } if (childNode.Nodes.Count > 0) checkChildrenNodeLayertree1(childNode, isChecked); } } /// <summary> /// 改变指定节点的子节点的选中状态 /// </summary> /// <param name="parentNode"></param> /// <param name="isChecked"></param> private void checkChildrenNodeLayertree2(TreeNode parentNode, bool isChecked) { foreach (TreeNode childNode in parentNode.Nodes) { childNode.Checked = isChecked; GSOLayer layer = childNode.Tag as GSOLayer; if (layer != null) { layer.Visible = isChecked; globeControl2.Globe.Refresh(); } if (childNode.Tag is GSOTerrain) { GSOTerrain feat = childNode.Tag as GSOTerrain; feat.Visible = isChecked; globeControl2.Globe.Refresh(); } if (childNode.Nodes.Count > 0) checkChildrenNodeLayertree2(childNode, isChecked); } } /// <summary> /// 节点树选中状态改变事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void layerTree1_AfterCheck(object sender, TreeViewEventArgs e) { if (e.Action != TreeViewAction.Unknown) { if (e.Node.Tag != null) { if (e.Node.Tag is GSOLayer) { GSOLayer layer = e.Node.Tag as GSOLayer; if (layer != null) { layer.Visible = e.Node.Checked; globeControl1.Globe.Refresh(); } } if (e.Node.Tag is GSOTerrain) { GSOTerrain feat = e.Node.Tag as GSOTerrain; feat.Visible = e.Node.Checked; globeControl1.Globe.Refresh(); } } CheckParentNode(e.Node); if (e.Node.Nodes.Count > 0) checkChildrenNodeLayertree1(e.Node, e.Node.Checked); } } /// <summary> /// 改变父节点的选中状态,此处为所有子节点不选中时才取消父节点选中,可以根据需要修改 /// </summary> /// <param name="curNode"></param> private void CheckParentNode(TreeNode curNode) { bool bChecked = false; if (curNode.Parent != null) { foreach (TreeNode node in curNode.Parent.Nodes) { if (node.Checked) { bChecked = true; break; } } if (bChecked) { curNode.Parent.Checked = true; CheckParentNode(curNode.Parent); } else { curNode.Parent.Checked = false; CheckParentNode(curNode.Parent); } } } } }