ArcEngine+C# TIN相关三维功能模块介绍(三)
——TreeView控件控制TIN颜色
1.简介
本篇介绍如何写一个带复选框及颜色指示图标的TreeView控件,该控件与TIN模型分级设色方案中的各级颜色相关联。通过该TreeView控件复选框的勾选状态决定TIN模型对应颜色层的显示与隐藏,再结合颜色选择下拉框控件,双击TreeView中的颜色图标,弹出颜色选择对话框,选择颜色后即可实时改变TIN模型中对应分级的颜色,效果图如下。注意观察TreeView中复选框为空的颜色层对应TIN的样式,此外,那个蓝色和紫色的层是经过修改过后的结果:
颜色选择对话框
运行效果界面截图
2.思路分析
编写TIN颜色关联TreeView控件过程同上篇的编写颜色控件类似,先在项目下添加一个新的UserControl控件,再拖一个TreeView控件到UserControl上,将TreeView的Dock属性设为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>
/// 模仿ArcGIS的TOCControl控件,对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);
}
}