【二次开发】CityMaker交互操作——拾取

**

鼠标拾取

**

一、 鼠标拾取原理

鼠标可以通过点选和框选的方式实现拾取渲染对象,并支持通过按住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(


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部