【二次开发】CityMaker交互操作——高亮/闪烁

**

高亮、闪烁对象

**

一、 高亮,闪烁原理

所有可渲染对象,都继承于IRenderable对象,例如,IFeatureLayer、IRenderGeometry、ISkinnedMesh、ITerrainModifier等。IRenderable提供了高亮Highlight与取消高亮Unhighlight的方法。所有可渲染对象均可通过调用Highlight()与Unhighlight()实现高亮与取消高亮。

要素图层IFeatureLayer提供了根据FeatureId高亮与取消高亮某一指定要素的方法HighlightFeature、UnhighlightFeature,以及根据FeatureId的集合高亮若干要素的方法HighlightFeatures,并提供取消所有高亮的方法UnhighlightAll。

IFeatureManager作为可视化矢量管理接口,同样提供了在三维窗口里Feature对象是否高亮显示等方法。

另外,工程树IProjectTree提供了HighlightGroup()方法,可以高亮指定组内所有对象。

继承IRenderable的渲染几何对象IRenderGeometry提供闪烁方法Glow,可实现渲染几何对象的闪烁效果,闪光使用物体当前颜色,Symbol和Highlight均可影响光色。

可实现高亮的对象包括所有渲染对象,IRenderable及继承其的子类,如下图:
【二次开发】CityMaker交互操作——高亮/闪烁
  可实现闪烁的对象为渲染几何对象IRenderGeometry,如下图:
【二次开发】CityMaker交互操作——高亮/闪烁

二、实现代码

1. .net

1、工程树下高亮组,实现整个工程树下所有渲染对象高亮

IProjectTree pTree = this.axRenderControl1.ObjectManager.GetProjectTree();
        pTree.HighlightGroup(pTree.RootID, 0xffff0000);

2、点选,实现拾取对象的高亮或闪烁

 void axRenderControl1_RcMouseClickSelect(object sender, Gvitech.CityMaker.Controls._IRenderControlEvents_RcMouseClickSelectEvent e)
    {
        IPickResult pr = e.pickResult;
        if (pr == null && e.mask == gviModKeyMask.gviModKeyCtrl)
            return;

        if (e.eventSender == gviMouseSelectMode.gviMouseSelectClick)
        {
            if (e.pickResult != null)
            {
                switch (pr.Type)
                {
                    case gviObjectType.gviObjectFeatureLayer:
                        IFeatureLayerPickResult flpr = pr as IFeatureLayerPickResult;
                        int fid = flpr.FeatureId;
                        IFeatureLayer fl = flpr.FeatureLayer;  

                        fl.HighlightFeature(fid, 0xffff0000);//(1)FeatureLayer高亮拾取到的图层对象   
                        IFeatureClass fc = this.GetFeatureClass(fl.FeatureClassInfo);  
                        //this.axRenderControl1.FeatureManager.HighlightFeature(fc, fid, 0xffff0000);   //(2)FeatureManager高亮拾取到的图层对象 
                        IRowBuffer fdeRow = fc.GetRow(fid)
                        int nPos = fdeRow.FieldIndex("Geometry");
                        if (nPos != -1 && !fdeRow.IsNull(nPos))
                        {
                             IModelPoint mp = fdeRow.GetValue(nPos) as IModelPoint;
                             GlowModelPoint(mp);//闪烁
                        }
                        break;
                  }
                 }
               }
            }
    //闪烁
    void GlowModelPoint(IModelPoint mp,IFeatureClass fc)
    {
        IModelPointSymbol symbol = new ModelPointSymbol();
        symbol.Color = 0xffff0000;//symbol颜色影响到闪烁的光色
        symbol.SetResourceDataSet(fc.FeatureDataSet);//引用外部FeatureDataSet里的资源,包括模型和贴图
        IRenderModelPoint rmp = this.axRenderControl1.ObjectManager.CreateRenderModelPoint(mp, symbol, this.axRenderControl1.ObjectManager.GetProjectTree().RootID);
        rmp.Highlight(0xff00ff00);
        rmp.MaxVisibleDistance = 1000000;
        rmp.VisibleMask = gviViewportMask.gviViewAllNormalView;
        rmp.Glow(2000);//闪烁2000毫秒
        this.axRenderControl1.ObjectManager.DelayDelete(rmp.Guid, 2000); //延迟2秒删除RenderModelPoint对象
    }

2. JS

function fnMouseClickSelect(pickResult, intersectPoint, mask, eventSender) {
	  if (pickResult == null)
	      return;
	  if (pickResult != null) {
		      switch (pickResult.type)
		      {
		          case gviObjectType.gviObjectFeatureLayer:
		              var fid = pickResult.featureId;
		              var fl = pickResult.featureLayer;//高亮图层
		              fl.highlightFeature(fid, 0xffff0000);
		              var fc = GetFeatureClass(fl.featureClassInfo);
		             // __g.featureManager.highlightFeature(fc, fid, 0xffff0000);
		              var filter = __g.new_QueryFilter;
		              filter.whereClause = "oid="+fid;
		              var cursor = null;
		              cursor = fc.search(filter, false);
		              if (cursor != null)
		              {
		                  var fdeRow = null;
		                  if ((fdeRow = cursor.nextRow()) != null)
		                  {
		                      var nPos = fdeRow.fieldIndex("Geometry");
		                      if (nPos != -1 )
		                      {
		                          var mp = fdeRow.getValue(nPos);  // 从库中读取ModelPoint
		                           GlowModelPoint( mp,fc);//实现闪烁
		                      }
		                  }
		              }
		           break;
		      }
	  }
}
//闪烁
function GlowModelPoint( mp,fc)
{
   var symbol = __g.new_ModelPointSymbol;   
   symbol.setResourceDataSet(fc.featureDataSet);//引用外部FeatureDataSet里的资源,包括模型和贴图
   var rmp = __g.objectManager.createRenderModelPoint(mp, symbol,"");
   if (rmp != null)
   {
       rmp.glow(2000); // 闪烁
       __g.objectManager.delayDelete(rmp.guid, 2000);//延迟2s删除
   }
}

注意事项
1、 颜色取值为如下十六进制形式:0xAARRGGBB,从后往前第一个字节表示蓝色在颜色中的比重,第二个字节表示绿色在颜色中的比重,第三个字节表示红色在颜色中的比重。

2、闪光使用物体当前颜色,Symbol和Highlight均可影响光色。

3、当无法出现闪烁效果时,请检查显卡驱动版本。如果是有独立显卡的笔记本,检查是否使用了高性能显卡。