Newer
Older
GHFX_REFACTOR / TreeUtils.cs
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);
                }
            }
        }
    }
}