在Forge 3D查看器中将instanceTree设置为自定义节点

时间:2018-10-22 08:59:59

标签: autodesk-forge autodesk-viewer

可以说我正在使用3D文件,该文件是一个建筑模型和一个结构模型的组合。 实例树或模型浏览器看起来像这样

root/
    Arch/
        Level 01/
        Level 02/
        ...
    Str/
        Level 01/
        Level 02/
        ...

我只想显示级别01。
所以我:

  1. 遵循了Viewer教程中的步骤
  2. 将事件监听器同时添加到Autodesk.Viewing.GEOMETRY_LOADED_EVENTAutodesk.Viewing.OBJECT_TREE_CREATED_EVENT
  3. 发射2时,我使用此article中的代码仅显示Level 01,而不会出现重影。

这种方法有2个问题

  1. 我必须等到整个模型加载完毕才能过滤级别
  2. 在过滤级别之后,如果单击“模型浏览器”,我仍然可以看到整个模型结构(但除了级别01以外,其他所有内容都被隐藏了)。如何将实例树设置为仅包含以下内容?

    root/
        Arch/
           Level 01/
        Str/
           Level 01/
    

编辑
我应该在什么时候覆盖shouldInclude()函数?
我已经尝试过并设置一个断点,但似乎它从未被调用过……我也曾试图将其移动,但徒劳。

const start = Date.now();
Autodesk.Viewing.UI.ModelStructurePanel.shouldInclude = (node) => {
  Logger.log(node);
  return true;
};
Autodesk.Viewing.Initializer(options, () => {
  Logger.log(`Viewer initialized in ${Date.now() - start}ms`);
  const config = {};
  // prettier-ignore
  Autodesk.Viewing.theExtensionManager.registerExtension('MyAwesomeExtension', MyAwesomeExtension);
  viewerApp = new Autodesk.Viewing.ViewingApplication('MyViewerDiv');
  viewerApp.registerViewer(viewerApp.k3D, Autodesk.Viewing.Private.GuiViewer3D, config);
  loadDocumentStart = Date.now();
  // prettier-ignore
  viewerApp.loadDocument(documentId, onDocumentLoadSuccess, onDocumentLoadFailure);
});

2 个答案:

答案 0 :(得分:1)

关于#1:对象树存储在文件的内部数据库中,出于性能原因,该文件仅在实际几何体之后加载。

关于#2:您可以继承ModelStructurePanel类,并通过例如覆盖ModelStructurePanel#shouldInclude方法来添加自己的行为。

答案 1 :(得分:0)

由于我无法理解如何使用ModelStructurePanel,因此我改写了Autodesk.Viewing.ViewingApplication.selectItem,仅修改了options或{{1} }},如下所示:

loadDocumentNode

其中startWithDocumentNode是要显示的objectID的数组。我能够通过以下方式构建它:

  1. 使用const options = { ids: leafIDs.length > 0 ? leafIDs : null, // changed this line acmSessionId: this.myDocument.acmSessionId, loadOptions, useConsolidation: this.options.useConsolidation, consolidationMemoryLimit: this.options.consolidationMemoryLimit || 100 * 1024 * 1024, // 100 MB };
  2. 查询ModelDerivativeAPI
  3. 遍历树以查找我感兴趣的ID。

也许有一种更优雅的方法可以做到这一点,但这是迄今为止我能做到的最好的方法。