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

本文详细介绍了CityMaker软件中鼠标拾取的原理,包括点选和框选方式,以及如何设置对象参与鼠标拾取。通过IRenderControl的MouseSelectObjectMask属性和IRenderable对象的MouseSelectMask属性进行对象类型过滤。文章还提供了.NET和JS代码示例,指导开发者实现鼠标拾取功能,并提醒注意拾取事件触发条件的变化。
摘要由CSDN通过智能技术生成

**

鼠标拾取

**

一、 鼠标拾取原理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值