多次使用 Data Visualization Extension

Use Data Visualization Extension multiple times

我有两个独立的扩展程序,用于可视化来自不同领域的不同“数据点”(温度、湿度等测量值……和图像位置)。这些分机应该保持分开(并且不应该彼此认识)。

使用相互独立的扩展没有问题。但是,如果在 Forge Viewer 中同时使用两个扩展(对于同一模型),就会出现问题。

两个扩展都尝试获取 DataVis 扩展的现有实例,如果扩展不可用则加载该扩展(在每个自定义扩展中调用 viewer.loadExtension 没有区别)。 扩展创建 ViewableData 并向其添加可视项(共享 ViewableData 的单个实例没有区别)。

添加可视项后 await viewableData.finish() 被调用,DataVis 扩展的 addViewables 方法被调用。

主要问题之一是,该方法 changeOcclusion 仅更改最后添加的可视项的遮挡。其他可视项随时保持可见。 可能是因为每次调用 addViewables 扩展时,DataVis 扩展中的 pointMaterial 都会被覆盖。

有没有办法多次实例化扩展,从而保证在不同的自定义扩展中使用它时没有副作用?或者其他机制?

在咨询了我们的工程团队后,我们提交了一份问题报告,LMV-6574,用于跟踪此问题。请注意 LMV 前缀 id 以进行跟踪。我们欢迎将来通过将问题 ID 发送至 forge (DOT) help (AT) autodesk (DOT) com.

来请求更新

但是,我们不想停止您的开发,所以这里有一个解决方法。

我在上面评论区提到的,SpriteViewable's constructor accepts an argument, ViewableStyles, that is used to set up the sprite icon. So, you don't need to call DataVisualization.addViewables(data) twice. Before finishing the ViewableData, you can add viewables with different ViewableStyles毫无疑问。

回到你的用例,你想为不同的数据源重用 DataVisualization 扩展。为此,我建议您单独存储设备(传感器)数据(例如设备容器)。当您需要 add/remove 设备时,只需修改设备容器,清除可视项,然后在您的设备容器中添加新的视图数据。

这里有一些代码片段展示了这个想法:

  • 初始化示例代码:
let sensorStyleDefinitions = {
    co2: {
        url: "http://localhost:3000/assets-1/images/co2.svg",
        color: 0xffffff,
    },
    temperature: {
        url: "http://localhost:3000/assets-1/images/thermometer.svg",
        color: 0xffffff,
    },
    default: {
        url: "http://localhost:3000/assets-1/images/circle.svg",
        color: 0xffffff,
    },
};

// Create model-to-style map from style definitions.
let styleMap = {};

Object.entries(sensorStyleDefinitions).forEach(([type, styleDef]) => {
    styleMap[type] = new Autodesk.DataVisualization.Core.ViewableStyle(
        Autodesk.DataVisualization.Core.ViewableType.SPRITE,
        new THREE.Color(styleDef.color),
        styleDef.url
    );
});

let devices = [
    {
        id: "Hall I",
        position: {
            x: -14.297511041164398,
            y: -77.6432056427002,
            z: 11.31889820098877,
        },
        type: "temperature",
        sensorTypes: ["temperature"],
    },
    {
        id: "Hall IV",
        position: {
            x: 60.53697395324707,
            y: -74.6432056427002,
            z: 11.31889820098877,
        },
        type: "co2",
        sensorTypes: ["co2"],
    },
];

const viewableData = new Autodesk.DataVisualization.Core.ViewableData();
viewableData.spriteSize = 16;

// Add viewables
devices.forEach((device, index) => {
    const style = styleMap[device.type] || styleMap["default"];
    const viewable = new Autodesk.DataVisualization.Core.SpriteViewable(
        device.position,
        style,
        index + 1
    );

    viewableData.addViewable(viewable);
});

await viewableData.finish();
dataVizExt.addViewables(viewableData);

  • 添加设备(传感器)的示例代码
devices.push({
    id: "Hall XII",
    position: {
        x: -15,
        y: -70,
        z: 50,
    },
    type: "temperature",
    sensorTypes: ["temperature"],
});

// Remove existing sprites
dataVizExt.removeAllViewables();

const viewableData = new Autodesk.DataVisualization.Core.ViewableData();
viewableData.spriteSize = 16;

// re-add viewables
devices.forEach((device, index) => {
    const style = styleMap[device.type] || styleMap["default"];
    const viewable = new Autodesk.DataVisualization.Core.SpriteViewable(
        device.position,
        style,
        index + 1
    );

    viewableData.addViewable(viewable);
});

await viewableData.finish();
dataVizExt.addViewables(viewableData);
  • 删除设备(传感器)的示例代码
devices = devices.splice(1, 1);

// Remove existing sprites
dataVizExt.removeAllViewables();

const viewableData = new Autodesk.DataVisualization.Core.ViewableData();
viewableData.spriteSize = 16;

// re-add viewables
devices.forEach((device, index) => {
    const style = styleMap[device.type] || styleMap["default"];
    const viewable = new Autodesk.DataVisualization.Core.SpriteViewable(
        device.position,
        style,
        index + 1
    );

    viewableData.addViewable(viewable);
});

await viewableData.finish();
dataVizExt.addViewables(viewableData);