using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using GeoScene.Data; 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;//layertree所在的配置文件 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.Text.Equals("道路")&&node.Tag==null) // {//由于冰箱图层是异步加载的,刚开始执行道路加载不上,故单独处理一下 // node.Tag = globeControl.Globe.Layers.GetLayerByCaption("180fd"); // } 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(); }else if (node.Tag is GSOFeature)//特征点 { GSOFeature feature = node.Tag as GSOFeature; feature.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(); } else if (childNode.Tag is GSOFeature) { GSOFeature feature = childNode.Tag as GSOFeature; feature.Visible = childNode.Checked; 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); } /// <summary> /// 删除指定名称的节点,用于临时图层下的删除 /// </summary> /// <param name="treeNode"></param> /// <param name="nodeText"></param> public static void RemoveNode(TreeNode treeNode,string nodeText) { if(treeNode.Text.Equals(nodeText)) treeNode.Remove(); else if (treeNode.Nodes.Count > 0) { foreach (TreeNode node in treeNode.Nodes) { RemoveNode(node,nodeText); } } } /// <summary> /// 在地球上添加图层时候,在指定节点下方添加该图层的树节点,用于临时图层 /// </summary> /// <param name="tempNode">添加节点的父节点</param> /// <param name="layer">图层</param> public static void AddNodeToManagerNode(TreeNode tempNode, GSOLayer layer) { List<string> managerLayerList = new List<string>(); for (int i = 0; i < tempNode.Nodes.Count; i++)//layerManagerNode 临时图层 { managerLayerList.Add(tempNode.Nodes[i].Text); } if (managerLayerList.Contains(layer.Dataset.Caption)) return; TreeNode node = new TreeNode(); node.Tag = layer; node.Text = layer.Dataset.Caption; node.ImageIndex = 0; node.SelectedImageIndex = 0; node.Checked = layer.Visible; tempNode.Nodes.Insert(0, node); tempNode.Expand(); } /// <summary> /// 创建features对应的树节点,并挂载到node下。标注管理树形图使用 /// </summary> /// <param name="node">父节点</param> /// <param name="features">要素集合</param> public static void AddNodesMatchFeatures(TreeNode node, GSOFeatures features) { for (int i = 0; i < features.Length; i++) { GSOFeature feature = features[i]; if (feature.Type == EnumFeatureType.FeatureFolder) { TreeNode tempnode = new TreeNode(); tempnode.Text = feature.Name; tempnode.ImageIndex = 1; tempnode.SelectedImageIndex = 1; tempnode.Checked = node.Checked && feature.Visible; tempnode.Tag = feature; node.Nodes.Add(tempnode); GSOFeatureFolder featureFolder = (GSOFeatureFolder)feature; AddNodesMatchFeatures(tempnode, featureFolder.Features); } else { TreeNode tempnode = new TreeNode { Text = feature.Name }; if (feature.Geometry != null) { switch (feature.Geometry.Type) { case EnumGeometryType.GeoPoint3D: case EnumGeometryType.GeoMarker: tempnode.ImageIndex = 3; tempnode.SelectedImageIndex = 3; break; case EnumGeometryType.GeoPolyline3D: tempnode.ImageIndex = 4; tempnode.SelectedImageIndex = 4; break; case EnumGeometryType.GeoPolygon3D: tempnode.ImageIndex = 5; tempnode.SelectedImageIndex = 5; break; case EnumGeometryType.GeoModel: case EnumGeometryType.GeoEntity: case EnumGeometryType.GeoGroupEntity: case EnumGeometryType.GeoSphereEntity: case EnumGeometryType.GeoBoxEntity: case EnumGeometryType.GeoEllipsoidEntity: case EnumGeometryType.GeoCylinderEntity: case EnumGeometryType.GeoFrustumEntity: case EnumGeometryType.GeoEllipCylinderEntity: case EnumGeometryType.GeoEllipFrustumEntity: case EnumGeometryType.GeoRangeEllipsoidEntity: case EnumGeometryType.GeoRangeEllipCylinderEntity: case EnumGeometryType.GeoRangeEllipFrustumEntity: tempnode.ImageIndex = 6; tempnode.SelectedImageIndex = 6; break; case EnumGeometryType.GeoGroundOverlay: tempnode.ImageIndex = 7; tempnode.SelectedImageIndex = 7; break; } } tempnode.Checked = node.Checked && feature.Visible; tempnode.Tag = feature; node.Nodes.Add(tempnode); } } } } }