**
鼠标拾取
**
一、 鼠标拾取原理
鼠标可以通过点选和框选的方式实现拾取渲染对象,并支持通过按住Ctrl键实现多选。 IRenderControl的MouseSelectObjectMask属性可以设置哪些类型的对象参与鼠标拾取,注意是按对象的类型过滤。如果想设置具体某个对象是否参与鼠标拾取可以通过IRenderable对象的MouseSelectMask属性来设置。鼠标可以拾取的对象有多种类型,并分别对应于不同的拾取对象类型,如地理要素图层gviObjectFeatureLayer的鼠标拾取对象为IFeatureLayerPickResult。
参与鼠标拾取的对象类型gviMouseSelectObjectMask
枚举值:
gviSelectNone 空对象,当定义的某些节点,并不希望进行绘制绘制求交等操作可以指定该类型
gviSelectFeatureLayer 场景数据(默认值)
gviSelectTerrain 地形数据
gviSelectReferencePlane 基准面
gviSelectTerrainHole 地形挖洞拾取
gviSelectTileLayer 3DTileLayer
gviSelectLable 标注(TableLable、Label共用此项)
gviSelectParticleEffect 粒子系统(ParticleEffect、ComplexParticleEffect共用此项)
gviSelectRenderGeometry 渲染对象.
gviSelectSkinnedMesh 骨骼动画
gviSelectTileHole 三维瓦片挖洞
gviSelectOverlayLabel 界面悬浮标注.
gviSelectTerrainObject 地形对象.
gviSelectTerrainVideo 贴地视频(TerrainVideo, Viewshed共用此项)
注意:不能单独只拾取TerrainVideo或Viewshed,必须允许拾取到底下衬的瓦片或地形或FeatureLayer,才能反算出TerrainVideo或Viewshed是否被拾取。
gviSelectObjectOnEverything 所有表面附着对象
gviSelectAll 所有对象
鼠标拾取可通过3步实现。
1)设置鼠标交互模式为gviInteractSelect,并设置鼠标拾取触发方式MouseSelectMode(Click、Drag)
2)注册控件拾取事件(点选或框选事件)并设置鼠标拾取对象类型过滤器MouseSelectObjectMask
3)实现拾取事件(点选或框选)
通过HighlightFeature可以将拾取到的对象进行高亮显示,通过查询可取到拾取对象的属性信息等,效果如下图
二、 实现代码
1. .net代码
/*注册点击事件*/
private void RegisterClientEvent(AxRenderControl rendercontrol)
{
//设置交互模式为InterSelect
rendercontrol.InteractMode = gviInteractMode.gviInteractSelect;
//设置鼠标拾取对象类型为 所有对象
rendercontrol.MouseSelectObjectMask = gviMouseSelectObjectMask.gviSelectAll;
// 设置鼠标拾取触发方式为Click或Drag
rendercontrol.MouseSelectMode = gviMouseSelectMode.gviMouseSelectClick | gviMouseSelectMode.gviMouseSelectDrag;
// 注册控件拾取事件,点选
rendercontrol.RcMouseClickSelect += new Gvitech.CityMaker.Controls._IRenderControlEvents_RcMouseClickSelectEventHandler(axRenderControl1_RcMouseClickSelect);
// 注册控件框选事件
rendercontrol.RcMouseDragSelect += new Gvitech.CityMaker.Controls._IRenderControlEvents_RcMouseDragSelectEventHandler(axRenderControl1_RcMouseDragSelect);
}
/*框选事件*/
void axRenderControl1_RcMouseDragSelect(object sender, _IRenderControlEvents_RcMouseDragSelectEvent e)
{
IPickResultCollection prc = e.pickResults;//框选范围内的所有集合
if (prc == null)
return;
if (e.mask != gviModKeyMask.gviModKeyCtrl) //判断是否Control键按下
{}
if (prc != null)
{
for (int i = 0; i < prc.Count; i++)
{
IPickResult pr = prc[i];
switch (pr.Type)
{
case gviObjectType.gviObjectFeatureLayer:
IFeatureLayerPickResult flpr = pr as IFeatureLayerPickResult;
int fid = flpr.FeatureId;
IFeatureLayer fl = flpr.FeatureLayer;
fl.HighlightFeature(fid, 0xffff0000);//高亮拾取对象
MessageBox.Show(fid.ToString());
break;
case gviObjectType.gviObjectLabel: