axSceneControl和axGlobeControl的刷新问题

简介:  AE中的三维开发,主要是SceneControl和GlobeControl,它们的表现方式和二维MapControl有比较大的差别,所以在三维下往往有些“束缚”的感觉。

 AE中的三维开发,主要是SceneControl和GlobeControl,它们的表现方式和二维MapControl有比较大的差别,所以在三维下往往有些“束缚”的感觉。像在刷新这块就比较难受,可能我们更新了控件里的场景内容,但无论怎样操作都不能让更新显示出来。其实只是平常习惯了的二维下的map没有了,取而代之的是3D View,AE里也提供了一些刷新的方法,大多是刷新viewer的,基本上还是可以满足要求的。
比如我们修改了控件里某个图层的渲染,一般会调用RefreshViewers方法去刷新(Scene下面是ISceneGraph,Globe下是IGlobeDisplay),但实际上控件里的图层不会发生变化,这里就是刷新的问题,需要对图层进行刷新。
下面是两个修改图层渲染的例子:

Public Sub TextureLineSymbol()  'Scene下VBA测试修改图层渲染
Dim pSxDoc As ISxDocument
Set pSxDoc = ThisDocument

Dim pTextureSym As ITextureLineSymbol
Set pTextureSym = New TextureLineSymbol

pTextureSym.CreateLineSymbolFromFile "f:\states.jpg"
pTextureSym.Width = 0.02

Dim pSimpLineSym As ISimpleLineSymbol
Set pSimpLineSym = New SimpleLineSymbol

pSimpLineSym.Style. = esriSLSDashDot
Dim pLineSym As ILineSymbol
Set pLineSym = pSimpLineSym
pSimpLineSym.Width = 0.02

Dim pSimpRender As ISimpleRenderer
Set pSimpRender = New SimpleRenderer
pSimpRender.Label = "道路名称"
Set pSimpRender.Symbol = pSimpLineSym   ' pTextureSym

Dim pGeoLyr As IGeoFeatureLayer
Dim pScene As IScene
Set pScene = pSxDoc.Scene
Set pGeoLyr = pScene.Layer(0)
Set pGeoLyr.Renderer = pSimpRender
pSxDoc.UpdateContents
Dim pSG As ISceneGraph
Set pSG = pScene.SceneGraph
'这样刷新是可以的
pSG.Invalidate pGeoLyr, True, False
'pScene.SceneGraph.ActiveViewer.Redraw True
pSG.RefreshViewers

'以下两种方式刷新不出错,但效果并不变
'pSG.RefreshViewers
'
'Dim pActView As IActiveView
'Set pActView = pScene
'pActView.PartialRefresh esriViewGeography, Nothing, Nothing     '这个支持,但refresh方法不支持
End Sub

Globe中的刷新:
pGlobe.AddLayerType pFeatLyr, esriGlobeLayerTypeDraped, True

'Dim pSceneGraph As ISceneGraph
'Set pSceneGraph = pScene.SceneGraph        '这样会出错,获取的pSceneGraph 为空
'pSceneGraph.Invalidate pFeatLyr, True, True

pGlobe.GlobeDisplay.RefreshViewers

//C#工程里测试修改Globe图层渲染
        private void button1_Click(object sender, EventArgs e)  //改变Globe layer的渲染
        {
            IScene pScene = this.axGlobeControl1.Globe as IScene;
            ILayer pLayer = pScene.get_Layer(0);
            MessageBox.Show(pLayer.Name);
            IGeoFeatureLayer pGeoLyr = pLayer as IGeoFeatureLayer;
            ISimpleLineSymbol pLineSym = new SimpleLineSymbolClass();
            IRgbColor pColor=new RgbColorClass();
            pColor.Blue=0;
            pColor.Green=0;
            pColor.Red=255;
            pLineSym.Color = pColor as IColor;
            ISimpleRenderer pSimpleRender = new SimpleRendererClass();
            pSimpleRender.Symbol = pLineSym as ISymbol;
            pGeoLyr.Renderer = pSimpleRender as IFeatureRenderer;
            IGlobeDisplay pGlobeDisp = this.axGlobeControl1.GlobeDisplay;

            //以下几种方式刷新都不会变化
            pGlobeDisp.RefreshViewers();
            IActiveView pActView = this.axGlobeControl1.Globe as IActiveView;
            pActView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null);

            //下面这种方式刷新才有效,无论是vector 3d图层,还是栅格化后的矢量图层都可以这样修改渲染
            IGlobeDisplayLayers2 pGDispLyrs = pGlobeDisp as IGlobeDisplayLayers2;
            pGDispLyrs.RefreshLayer(pLayer);
            this.axTOCControl1.Update();
        }

相关文章
|
缓存 开发者
强制清理、刷新浏览器缓存
强制清理、刷新浏览器缓存
225 1
|
缓存 Linux
缓存区的刷新及配置
缓存区的刷新及配置
206 0
|
缓存 前端开发 JavaScript
网页中F5刷新与ctrl + F5强制刷新的区别?
网页中F5刷新与ctrl + F5强制刷新的区别?
网页中F5刷新与ctrl + F5强制刷新的区别?
IDEA 底下的indexing一直自动刷新刷新刷新刷新的解决方案
IDEA 底下的indexing一直自动刷新刷新刷新刷新的解决方案
1281 0
IDEA 底下的indexing一直自动刷新刷新刷新刷新的解决方案
|
存储 缓存 算法
CPU缓存刷新的误解
即使是资深的技术人员,我经常听到他们谈论某些操作是如何导致一个CPU缓存的刷新。看来这是关于CPU缓存如何工作和缓存子系统如何与执行核心交互的一个常见误区。本文将致力于解释CPU缓存的功能以及执行程序指令的CPU核心如何与缓存交互。我将以最新的Intel x86 CPU为例进行说明,其他CPU也使用相似技术以达到相同目的。
221 0
CPU缓存刷新的误解