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();
        }

相关文章
实现强制刷新网页的代码
实现强制刷新网页的代码
|
缓存 开发者
强制清理、刷新浏览器缓存
强制清理、刷新浏览器缓存
204 1
|
缓存 监控 测试技术
<5>SpringcloudConfig中configClient端不重启项目,手动刷新同步
上一篇博客搭建ConfigClient端写了configClient端从configServer端获取到数据,但是它会放到缓存中,不重启服务是不会重新去configClient获取的。
|
缓存 Linux
缓存区的刷新及配置
缓存区的刷新及配置
174 0
|
缓存 前端开发 JavaScript
网页中F5刷新与ctrl + F5强制刷新的区别?
网页中F5刷新与ctrl + F5强制刷新的区别?
网页中F5刷新与ctrl + F5强制刷新的区别?
IDEA 底下的indexing一直自动刷新刷新刷新刷新的解决方案
IDEA 底下的indexing一直自动刷新刷新刷新刷新的解决方案
1172 0
IDEA 底下的indexing一直自动刷新刷新刷新刷新的解决方案
|
Web App开发 缓存 JavaScript
vue vue-router 完美实现前进刷新,后退不刷新。附scrollBehavior源码解析
需求:在一个vue的项目中,我们需要从一个列表页面点击列表中的某一个详情页面,从详情页面返回不刷新列表,而从列表的上一个页面重新进入列表页面则需要刷新列表。   而浏览器的机制则是每一次的页面打开都会重新执行所有的程序,所以这个功能并不能直接实现。
4213 0