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

26/12/2017

Получение всех DbId без перечисления иерархии модели

В большинстве случаев нам нужно получить все DbId модели при работе с веб-приложением Forge Viewer.  Это связано с тем, что большинство методов API для манипулирования объектами, требуют аргумент DbId (или массив аргументов), таких как изоляция, скрытие, выделение и т.д. С помощью массива DbId мы строим карту с узлом иерархии модели или с каким-то уникальным идентификатором. 

Одним из типичных способов получения всего массива DbId является итерация по иерархии модели instanceTree.enumNodeChildren в случае, когда геометрия готова (Autodesk.Viewing.GEOMETRY_LOADED_EVENT). В двух блогах ниже предоставлено больше информации. Для простой модели этот рабочий процесс работает хорошо, но для сложной огромной модели, завершение итерации потребует много времени. 

https://forge.autodesk.com/blog/enumerating-leaf-nodes-viewer

https://forge.autodesk.com/cloud_and_mobile/2016/03/breaking-change-in-accessing-model-instance-tree-with-view-data-api.html

Способ 1: при помощи API Forge Viewer

Собственно, свойства instanceTree предоставляет массивы DbId и узлов модели. Это:

  • instanceTree.nodeAccess.dbIdToIndex - содержит все dbId, но это словарь, который хранит соответствие DbId массиву instanceTree.nodeAccess.names. 
  • instanceTree.nodeAccess.names - содержит индекс узла модели для instanceTree.nodeAccess.strings
  • instanceTree.nodeAccess.strings - хранит отображаемое имя узла модели Если есть специальный суффикс, его нужно будет вывести из instanceTree.nodeAccess.nameSuffixes. Например, на изображении ниже, [105545] является суффиксом.
  • instanceTree.nodeAccess.nameSuffixes - хранит строки суффикса

 

Таким образом, мы без проблем можем разобрать все DbId из instanceTree.nodeAccess.dbIdToIndex. Предположим, мы получаем DbId и хотим получить отображаемое имя соответствующего узла модели. Фрагмент кода ниже демонстрирует эту обработку.

Код - JavaScript: [Выделить]
  1. var dbid = 1854;
  2. var it = NOP_VIEWER.model.getData().instanceTree;
  3. var indexinNames = it.nodeAccess.dbIdToIndex[dbid];
  4. var indexinStrings = it.nodeAccess.names[indexinNames];
  5. var nodeMainString = it.nodeAccess.strings[indexinStrings];
  6. var nodeSuffixString = it.nodeAccess.nameSuffixes[indexinStrings];
  7. // окончательное отображаемое имя узла модели
  8. var nodeFinalName = nodeMainString+nodeSuffixString + ']'
  9. Фактически, API Forge Viewer предоставил прямой метод:
  10. var dbid = 1854;
  11. var it = NOP_VIEWER.model.getData().instanceTree;
  12. // окончательное отображаемое имя узла модели
  13. var nodeFinalName = it.getNodeName(dbid);

If we have known the display name of a model node, we could trim its suffix string,  find its index from instanceTree.nodeAccess.strings, get map index from instanceTree.nodeAccess.names, and get out the DbId from instanceTree.nodeAccess.dbIdToIndex.

 

Способ 2: при помощи Model Derivative 

Как известно, для просмотра модели в браузере, нам нужно запросить Model Derivative API о преобразовании исходного файла. После преобразования, иерархия модели, DbId и свойства объекта управляются в конкретной базе данных в облаке Forge. Мы можем просто запросить их в формате Json:

1. запрос на получение метаданных по https://developer.api.autodesk.com/modelderivative/v2/designdata/:urn/metadata.  Этот вызов вернет список идентификаторов модели (метаданных) для модели проекта. Идентификатор метаданных позволяет конечным пользователям выбирать дерево объектов и свойства для определенного вида модели. Например, снимок показывает GUID трехмерного вида одной модели.

 

 

2. Для получения иерархии модели и DbId, сделайте запрос с помощью https://developer.api.autodesk.com/modelderivative/v2/designdata/:urn/metadata/:guid, вводя GUID, который мы получили на шаге 1. Как сказано, после преобразования, данные управляются в конкретной базе данных, но они не существуют в формате Json ровно до тех пор, пока разработчик их не запросит. Поэтому после запроса в первый раз, код ответа является 202, что означает, что Forge принял задание и подготовит данные Json.  Нам нужно будет снова вызвать тот же API, чтобы проверить, готовы данные Json или нет. После того, как код ответа будет равен 200, мы увидим ответ, указывающий иерархию модели и DbIds.

Затем мы можем вывести все DbId из строки Json.

 

 

Источник: https://forge.autodesk.com/blog/get-all-dbid-without-enumerating-model-hierarchy

 

Автор перевода: Дмитрий Емельянов

Обсуждение: http://adn-cis.org/forum/index.php?topic=8225

Опубликовано 26.12.2017