ADN Open CIS
Сообщество программистов Autodesk в СНГ

31/01/2021

Forge viewer: Ожидаем несколько событий Viewer-а

В жизни разработчика Forge viewer рано или поздно возникает необходимость работы с событиями Viewer-а, например, дождаться загрузки геометрии модели перед тем, как получить доступ к объекту instanceTree.

Иногда же возникает необходимость дождаться вызова нескольких событий перед тем, как запускать собственный код. Мы ранее уже обсуждали одну из возможных реализаций ожидания событий GEOMETRY_LOADED_EVENT и OBJECT_TREE_CREATED_EVENT в статье: Asynchronous viewer events notification

В этой статье мы покажем несколько полезных функций для ожидания нескольких событий при помощи javascript async.

Forge Viewer сам использует объекты Promise, чем мы можем воспользоваться следующим образом:

Код - JavaScript: [Выделить]
  1. function afterViewerEvents(viewer, events) {
  2.     let promises = [];
  3.     events.forEach(function (event) {
  4.         promises.push(new Promise(function (resolve, reject) {
  5.             let handler = function () {
  6.                 viewer.removeEventListener(event, handler);
  7.                 console.log(`Removed event listener for ${event}`)
  8.                 resolve();
  9.             }
  10.             viewer.addEventListener(event, handler);
  11.             console.log(`Added event listener for ${event}`)
  12.         }));
  13.     });
  14.  
  15.     return Promise.all(promises)
  16. }

С помощью ключевого слова await перед вызовом этой функции ожидаем вызова всех перечисленных событий:

Код - JavaScript: [Выделить]
  1. viewer.loadDocumentNode(doc, items[0], {}).then(async function (model) {
  2.   await afterViewerEvents(
  3.     viewer,
  4.     [
  5.       Autodesk.Viewing.GEOMETRY_LOADED_EVENT,
  6.       Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT
  7.     ]
  8.   );
  9.   // полезная нагрузка метода
  10. });

Viewer также имеет специальные вспомогательные функции, которые можно использовать вместо кода, показанного выше, т.е., если Вы хотите дождаться вызова события GEOMETRY_LOADED_EVENT, Вы можете использовать функцию waitUntilGeometryLoaded:

Код - JavaScript: [Выделить]
  1. viewer.loadDocumentNode(doc, items[0], {}).then(async function (model) {  
  2.   await Autodesk.Viewing.EventUtils.waitUntilGeometryLoaded(viewer);
  3.   // полезная нагрузка метода
  4. });

Теперь же добавилась еще одна полезная функция: waitForLoadDone(include)

Она позволяет указать модель (или модели), загрузку которой Вы хотите дождаться.

Также можно указать, загрузку какой именно информации Вы хотите дождаться перед исполнением собственного кода: геометрии, базы данных свойств, текстур.

Источник: https://forge.autodesk.com/blog/wait-events-viewer

Автор перевода: Александр Игнатович
Опубликовано 31.01.2021
Отредактировано 31.01.2021 в 19:53:00