Установите instanceTree для пользовательского узла в Forge 3D Viewer - PullRequest
0 голосов
/ 22 октября 2018

Допустим, я работаю с 3D-файлом, который представляет собой комбинацию одной архитектурной модели и одной структурной модели.Дерево экземпляра или Обозреватель моделей выглядит следующим образом

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

Я хочу отобразить только уровень 01.
Итак, я:

  1. Выполнено в учебнике Viewer
  2. Добавление прослушивателя событий для обоих Autodesk.Viewing.GEOMETRY_LOADED_EVENT & Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT
  3. Когда запускаются 2, я использую код в этой статье , чтобы отобразить только уровень 01 безghosting.

У меня 2 проблемы с этим подходом

  1. Мне нужно дождаться загрузки всей модели, прежде чем я смогу отфильтровать уровень
  2. После фильтрации уровня, если я нажимаю на Обозреватель моделей, я все равно вижу всю структуру модели (но со всем скрытым, кроме Уровня 01).Как я могу установить дерево экземпляров, чтобы иметь только то, что ниже?

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

EDIT
В какой момент я должен переопределить 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 голосов
/ 28 октября 2018

Поскольку я не мог понять, как использовать ModelStructurePanel, я переопределил Autodesk.Viewing.ViewingApplication.selectItem, чтобы изменить только options, которые либо передаются loadDocumentNode, либо startWithDocumentNode, как показано ниже:

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

С leafIDs является массивом идентификаторов объектов для отображения.Я смог построить его:

  1. , запрашивая ModelDerivativeAPI, используя GET :urn/metadata/:guid
  2. , просматривая дерево, чтобы найти интересующие меня идентификаторы.

Возможно, есть более элегантный способ сделать это, но это лучшее, что я мог сделать до сих пор.

0 голосов
/ 22 октября 2018

Относительно # 1: дерево объектов хранится во внутренней базе данных файла, которая - из соображений производительности - загружается только после фактической геометрии.

Относительно # 2: вы можете создать подкласскласс ModelStructurePanel и добавьте свое собственное поведение, например, переопределив метод ModelStructurePanel # shouldInclude .

...