在用C#进行三维Gis(伟景行Citymaker)地下管廊开发时,为更好的体现效果增加用户体验,需要根据应用场景从地上直接切到地下模式或者从地上能够透视到地下的管廊、管线等设备。对于地下模式具体的实现是控制图层的显隐来进行的,模型数据需要有地上和地下数据的区分。具体的代码如下:
一、地下模式代码实现:
写了一个控制图层显示的方法:
privatevoidSetLayerVisiable(Guidid,boolflag)
{
Guidguid = AxRenderControl.ProjectTree.GetNextItem(id, 11);
//循环获得项目树下的图层
while(guid != null && guid != Guid.Empty)
{
IRenderablelayer = AxRenderControl.ObjectManager.GetObjectById(guid)asIRenderable;
if(layer == null)
continue;
if(flag)
{
layer.VisibleMask =gviViewportMask.gviViewAllNormalView;
}
else
{
layer.VisibleMask =gviViewportMask.gviViewNone;
}
guid =AxRenderControl.ProjectTree.GetNextItem(guid, 13);
}
}
地下模式调用(隐藏地面数据):
Guidguid =AxRenderControl.ProjectTree.FindItem("地面图层");//获得地面数据Guid
SetLayerVisiable(guid,false);//
地上模式调用(显示地面数据):
Guidguid =AxRenderControl.ProjectTree.FindItem("地面图层");
SetLayerVisiable(guid, true);//
二、透视模式具体实现:
透视模式的实现和地下模式的实现方式不一样,地下模式是通过控制地面数据图层的显隐来进行控制,透视模式则是控制地面数据图层Symbol的渲染模式来控制,具体代码:
privatevoidSetGeometryRender(Guidid,boolflag)
{
Guidguid = AxRenderControl.ProjectTree.GetNextItem(id, 11);
while(guid != null&&guid!=Guid.Empty)
{
IFeatureLayerlayer = AxRenderControl.ObjectManager.GetFeatureLayer(guid);
if(layer != null && layer.GetGeometryRender() !=null)
{
ISimpleGeometryRenderrender = layer.GetGeometryRender()asISimpleGeometryRender;
IModelPointSymbolsymbol = render.Symbol as IModelPointSymbol;
if(symbol != null)
{
symbol.EnableColor = flag;
}
render.Symbol = symbol;
layer.SetGeometryRender(render);
}
guid =AxRenderControl.ProjectTree.GetNextItem(guid, 13);
}
}
透视模式调用:
///透视效果
Guidguid =AxRenderControl.ProjectTree.FindItem("地上图层");
SetGeometryRender(guid,true);
guid =AxRenderControl.ProjectTree.FindItem("管线图层");
SetGeometryRender(guid,true);
恢复地面模式:
Guidguid =AxRenderControl.ProjectTree.FindItem("地面图层");
SetGeometryRender(guid,false);
具体效果如下:
非透视效果:
透视效果图:
地下模式: