**
高亮、闪烁对象
**
一、 高亮,闪烁原理
所有可渲染对象,都继承于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及继承其的子类,如下图:
可实现闪烁的对象为渲染几何对象IRenderGeometry,如下图:
二、实现代码
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、当无法出现闪烁效果时,请检查显卡驱动版本。如果是有独立显卡的笔记本,检查是否使用了高性能显卡。