using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using GeoScene.Globe; namespace Cyberpipe { public class TreeUtils { /// <summary> /// 构造图层tree,最多解析三层,若地球存在,则只构造指定地球上图层已存在的树节点,若地球不存在,则构造全部 /// </summary> /// <param name="gsoGlobeControl">所属地球</param> /// <param name="treeView">要加载的树</param> /// <param name="viewDatasrc">数据来源,实测数据/施工数据/规划数据/红线数据,为空则展示全部</param> public static void InitLayerTree(GSOGlobeControl gsoGlobeControl, TreeView treeView, string viewDatasrc) { // treeView.Nodes.Clear(); LayerConfig layerConfig = Utility.layerConfig; List<DataSrc> datasrcs = layerConfig.datasrcs; foreach (DataSrc datasrc in datasrcs) { if (viewDatasrc != null && !viewDatasrc.Trim().Equals("") && !datasrc.label.Equals(viewDatasrc)) continue; TreeNode rootNode = treeView.Nodes.Add(datasrc.label); List<LayerType> layerTypes = datasrc.layertypes; foreach (LayerType layerType in layerTypes) { TreeNode secNode = rootNode.Nodes.Add(layerType.label); List<Layer> layers = layerType.layers; foreach (Layer layer in layers) { if (gsoGlobeControl == null) { TreeNode node = new TreeNode(); node.Text = layer.label; secNode.Nodes.Add(node); } else { GSOLayer gsoLayer = gsoGlobeControl.Globe.Layers.GetLayerByCaption(layer.layer); if (gsoLayer == null) continue;//将不存在的去除 TreeNode node = new TreeNode(); node.Tag = gsoLayer; node.Text = layer.label; node.Checked = gsoLayer.Visible; if (gsoLayer.Visible) { secNode.Checked = true; rootNode.Checked = true; } secNode.Nodes.Add(node); } } } } } /// <summary> /// TreeNode选中状态改变,对其子节点和父节点的选中状态做相应改变 /// </summary> /// <param name="globeControl"></param> /// <param name="node"></param> public static void TreeNodeCheckedChange(GSOGlobeControl globeControl, TreeNode node) { if (node.Tag != null) { if (node.Tag is GSOLayer) { GSOLayer layer = node.Tag as GSOLayer; layer.Visible = node.Checked; globeControl.Globe.Refresh(); } else if (node.Tag is GSOTerrain) { GSOTerrain feat = node.Tag as GSOTerrain; feat.Visible = node.Checked; globeControl.Globe.Refresh(); } } CheckParentNode(node); if (node.Nodes.Count > 0) CheckChildrenNode(globeControl, node, node.Checked); } /// <summary> /// 树形结构中,根据parentNode的选中状态,更改其子节点的选中状态 /// </summary> /// <param name="globeControl"></param> /// <param name="parentNode"></param> /// <param name="isChecked"></param> public static void CheckChildrenNode(GSOGlobeControl globeControl, TreeNode parentNode, bool isChecked) { foreach (TreeNode childNode in parentNode.Nodes) { childNode.Checked = isChecked; if (childNode.Tag is GSOLayer) { GSOLayer layer = childNode.Tag as GSOLayer; layer.Visible = isChecked; globeControl.Globe.Refresh(); } else if (childNode.Tag is GSOTerrain) { GSOTerrain feat = childNode.Tag as GSOTerrain; feat.Visible = isChecked; globeControl.Globe.Refresh(); } if (childNode.Nodes.Count > 0) CheckChildrenNode(globeControl, childNode, isChecked); } } /// <summary> /// 子节点则父节点:一选则选,全不选才不选 /// 改变父节点的选中状态,此处为所有子节点不选中时才取消父节点选中,可以根据需要修改 /// </summary> /// <param name="curNode">要检查的节点,更改其父节点状态</param> public static void CheckParentNode(TreeNode curNode) { if (curNode.Parent == null) return; bool bChecked = false; foreach (TreeNode node in curNode.Parent.Nodes) { if (!node.Checked) continue; bChecked = true; break; } curNode.Parent.Checked = bChecked; CheckParentNode(curNode.Parent); } } }