700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【二次开发】CityMaker交互操作——拾取

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

时间:2020-02-19 00:20:16

相关推荐

【二次开发】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(

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。