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

       }

    }
}