**
鼠标拾取
**
一、 鼠标拾取原理
鼠标可以通过点选和框选的方式实现拾取渲染对象,并支持通过按住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){//设置交互模式为InterSelectrendercontrol.InteractMode = gviInteractMode.gviInteractSelect;//设置鼠标拾取对象类型为 所有对象 rendercontrol.MouseSelectObjectMask = gviMouseSelectObjectMask.gviSelectAll;// 设置鼠标拾取触发方式为Click或Dragrendercontrol.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(