现在的位置: 首页 > 综合 > 正文

ArcEngine+C# TIN相关三维功能模块介绍(三)

2013年02月26日 ⁄ 综合 ⁄ 共 3150字 ⁄ 字号 评论关闭

ArcEngine+C#  TIN相关三维功能模块介绍(三)

——TreeView控件控制TIN颜色

作者:刘志远

 
PDF浏览    控件下载

1.简介

 本篇介绍如何写一个带复选框及颜色指示图标的TreeView控件,该控件与TIN模型分级设色方案中的各级颜色相关联。通过该TreeView控件复选框的勾选状态决定TIN模型对应颜色层的显示与隐藏,再结合颜色选择下拉框控件,双击TreeView中的颜色图标,弹出颜色选择对话框,选择颜色后即可实时改变TIN模型中对应分级的颜色,效果图如下。注意观察TreeView中复选框为空的颜色层对应TIN的样式,此外,那个蓝色和紫色的层是经过修改过后的结果:



颜色选择对话框


运行效果界面截图

2.思路分析

 编写TIN颜色关联TreeView控件过程同上篇的编写颜色控件类似,先在项目下添加一个新的UserControl控件,再拖一个TreeView控件到UserControl上,将TreeViewDock属性设为Fill,,最后加入代码。

  TIN模型颜色可以通过ITinRenderer渲染器接口设置,ITinColorRampRenderer接口控制渲染器中的色带,通过遍历获取或设置ITinColorRampRenderer中的颜色值,再将改变后的ITinRenderer重新赋给TIN模型就行了。隐藏效果只是将对应层的颜色值设为NullColor即可。

         再稍微解释一下TreeView中颜色图标的实时联动更新。我是先生成一个动态的Image图片对象,该Image的颜色就是从TIN模型或颜色对话框中获得的颜色值,再依次将这些颜色图片存入一个ImageList对象中,再将该ImageList对象赋给TreeView,通过ImageList中图片的索引与TreeView中的节点(Node)相关联,这样就达到实时更新显示的效果。

3.完整代码

 下面是该控件的完整代码,具体的解释见代码注释:

using System;

using System.Drawing;

using System.Windows.Forms;

using ESRI.ArcGIS.Carto;

using ESRI.ArcGIS.Display;

using ESRI.ArcGIS.Controls;

using ESRI.ArcGIS.Analyst3D;

namespace CaseAnalyse

{

    /// <summary>

    /// 模仿ArcGISTOCControl控件,对TIN模型分级渲染颜色进行关联,

    /// 并通过复选框的勾选状态控制对应色带的显隐,

    /// 同时可双击颜色图标,实时修改对应层的颜色

    /// </summary>

    public partial class ColorControlView : UserControl

    {

        /// <summary>

        /// 颜色图标清单

        /// </summary>

        private ImageList pImageList;

 

        /// <summary>

        /// 激活的节点

        /// </summary>

        private TreeNode pTreeNode;

 

        /// <summary>

        /// 含有TIN的三维控件

        /// </summary>

        static private AxSceneControl _pSceneControl;

 

        //构造函数

        public ColorControlView()

        {

            InitializeComponent();

            treeView1.CheckBoxes = true;

        }

 

        /// <summary>

        /// 初始化,关联TIN图层颜色列表与TreeView控件

        /// </summary>

        /// <param name="pSceneControl">TIN图层的AxSceneControl控件</param>

        public void IniColorTree(AxSceneControl pSceneControl)

        {

            _pSceneControl = pSceneControl;

 

            ITinLayer pTinLayer = getTinLayer(_pSceneControl);

            if (pTinLayer == null)

                return;

 

            treeView1.Nodes.Clear();

            //TreeView绑定一个图片列表控件,该控件记录着所有的颜色图片

            pImageList = new ImageList();

            pImageList.ImageSize = new Size(16, 15);

            treeView1.ImageList = pImageList;

            //获得TIN模型的渲染器,这里假设只有一个渲染层

            ITinRenderer pRenderNew = pTinLayer.GetRenderer(0);

            ITinColorRampRenderer pElevRenderer = pRenderNew as ITinColorRampRenderer;

            if (pElevRenderer == null)

                return;

            ISimpleFillSymbol pSymbol = null;

 

            Color pColor = new Color();

            string lable = "";

            //遍历渲染层的分级颜色,并用生成动态临时图标,将其加入ImageList中,以备TreeView调用

            for (int i = 0; i < pElevRenderer.BreakCount; i++)

            {

                lable = pElevRenderer.get_Label(i);

                pSymbol = pElevRenderer.get_Symbol(i) as ISimpleFillSymbol;

                pColor = ColorTranslator.FromOle(pSymbol.Color.RGB);

 

                Image pImage = getImage(pColor);

                pImageList.Images.Add(pImage);

 

                TreeNode pTN = new TreeNode();

                pTN.Text = lable;

                pTN.Checked = true;

                pTN.ImageIndex = pImageList.Images.Count - 1;

                pTN.Tag = pColor;

 

                treeView1.Nodes.Add(pTN);

            }

        }

 

抱歉!评论已关闭.