首页 / 浏览问题 / 桌面GIS / 问题详情
GeoStyle3D中setLineSymbolID方法,如何才能生效?
2EXP 2023年07月18日

使用产品:supermap idesktop 11i,操作系统:win10 x64

问题详细描述:在三维场景中,使用GeoStyle3D中setLineSymbolID方法不生效,我已经正确在场景中获取到三维线段图层,我把代码截图放在下边,不知代码是否写的有误

IForm form = Application.getActiveApplication().getActiveForm();
IFormScene formScene = (IFormScene)form;
Layer3D[] activeLayer3Ds = formScene.getActiveLayer3Ds();

GeoStyle3D geoStyle3D = Layer3DUtilities.getGeoStyle3D(activeLayer3Ds[0]);
geoStyle3D.setLineSymbolID(962048);
Layer3D activeLayer3D = activeLayer3Ds[0];
Layer3DUtilities.setGeoStyle3D(activeLayer3D,geoStyle3D);
System.out.println(activeLayer3D.getName());
activeLayer3D.updateData();
formScene.getSceneControl().getScene().refresh();

1个回答

您好, setLineSymbolID 接口设置是有效果的,上述代码有 2 点需要注意的地方:

  1. 检查当前工作空间的线符号库,确保存在 962048 编号的符号;
  2. 刷新当前场景的时候需要放到 UI 线程,可参考 C# Invoke 和 Delegate 的使用方式。
override public void Run()
{
    IFormScene formManagerActiveForm = (IFormScene)Application.ActiveApplication.MainForm.FormManager.ActiveForm;
    DesktopSceneControl desktopSceneControl = formManagerActiveForm.SceneControl;
    Layer3DDataset sceneLayer = (Layer3DDataset)desktopSceneControl.Scene.Layers[0];
    Layer3DSettingVector additionalSetting = (Layer3DSettingVector)sceneLayer.AdditionalSetting;
    GeoStyle3D style3D = additionalSetting.Style;
    style3D.LineSymbolID = 964510;
    additionalSetting.Style = style3D;
    sceneLayer.UpdateData();

    sceneRefresh sceneRefresh = new sceneRefresh(refresh);
    desktopSceneControl.Invoke(sceneRefresh);
}

delegate void sceneRefresh(DesktopSceneControl scene);

void refresh(DesktopSceneControl scene)
{
    scene.Refresh();
}

希望可以帮到您。

2,253EXP 2023年07月18日
谢谢,抱歉,我刚刚忘记说了,我使用的是java代码开发,不知是否有与此相关的java代码可以参考,谢谢

您好,一样的方式,改成 iDesktopX 和 iObjects Java 提供的接口就行,放到 UI 线程的逻辑改为以下接口调用

SwingUtilities.invokeLater(()->{

});

谢谢。不过这两日经过我多次测试,以及更新新版本(11.1)后的测试,我发现setLineSymbolID方法还是没有生效,我多次对比了符号编号,也没有发现错误(以下有线符号的截图),但是我使用GeoStyle这个类修改颜色和宽度却是有效果的。我猜测如果设施三维线符号,是不是只添加setLineSymbolID不行,是否还需添加其他的参数?谢谢

您好,建议参考我最开始回复您的第一点需要注意的地方:检查当前工作空间的线符号库,确保存在 962048 编号的符号。

您截图中的显示的是三维符号库的内容,不是工作空间符号库的内容。setLineSymbolID 接口要起作用,必要条件是当前工作空间符号库中有对应设置的符号库符号。

...