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

28/02/2020

Загрузка нескольких моделей в Forge Viewer V7

В седьмой версии Forge Viewer-а появился новый способ загрузки нескольких моделей с помощью метода loadDocumentNode.

В шестой версии для реализации такого функционала можно было использовать метод loadModel без последующего вызова метода teardown(), но теперь такой метод более не работает.

Теперь для загрузки нескольких моделей просто используйте метод loadDocumentNode, но, начиная со второй модели используйте новую опцию `keepCurrentModels: true` и в версии 7.7 и выше укажите globalOffset.

Вот пример загрузки нескольких URN (моделей) в цикле:

Код - JavaScript: [Выделить]
  1. loadModels([
  2.         { urn: "dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnJwYXJ0eTIvcnN0X2Jhc2ljX3NhbXBsZV9wcm9qZWN0LnJ2dA", xform: {x:-60,y:0,z:0} },
  3.         { urn: "dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnJwYXJ0eTIvNDMyJTIwTmFwYS5ydnQ", xform: {x:60,y:0,z:0} },
  4.         { urn: "dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnJwYXJ0eTEvcmFjLnJ2dA", xform: {x:50,y:0,z:-50} },
  5.         { urn: "dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dnJwYXJ0eTEvcmFjLnJ2dA", xform: {x:-50,y:0,z:-50} },
  6.  ])
  7.  
  8. function loadModels(urns) {
  9.  
  10.     const viewerOptions = {
  11.         env: 'AutodeskProduction',
  12.         accessToken: _adsk.token.access_token,
  13.         extensions:[ ]
  14.     };
  15.  
  16.     Autodesk.Viewing.Initializer(viewerOptions, () => {
  17.  
  18.         const div = document.getElementById('forgeViewer');
  19.         viewer = new Autodesk.Viewing.Private.GuiViewer3D(div);
  20.         viewer.start();
  21.         urns.map((m)=>{
  22.             Autodesk.Viewing.Document.load(`urn:${m.urn}`, (doc) => {
  23.                 var viewables = doc.getRoot().getDefaultGeometry();
  24.                 viewer.loadDocumentNode(doc, viewables,{
  25.                     placementTransform: (new THREE.Matrix4()).setPosition(m.xform),
  26.                     keepCurrentModels: true,
  27.                     globalOffset: {x:0,y:0,z:0}
  28.                 })
  29.                 .then( onLoadFinished );
  30.             });
  31.  
  32.         })
  33.     });
  34.  
  35.     function onLoadFinished(doc) {
  36.         console.log('loaded');
  37.     }

Здесь можете посмотреть рабочий пример: https://wallabyway.github.io/federatedmodels-v7

Полные исходные коды: https://github.com/wallabyway/federatedmodels-v7

Чтобы повернуть модель, просто добавьте вращение по оси Z:

Код - JavaScript: [Выделить]
  1. placementTransform: (new THREE.Matrix4()).makeRotationZ(m.angle).setPosition(m.xform)

Посмотрите документацию по THREE.Matrix4 в Three.js, чтобы разобраться с поворотами моделей.

В новой версии Forge Viewer-а также появился классAggregatedView. Документация доступна на портале Forge. С его помощью намного проще собирать в едином viewer-е модели из разных источников, например, из Navisworks (NWD, NWC), Revit (RVT), из Inventor-а и Fusion 360 (IAM, IPT, F3D, XT), с разными единицами измерения, GPS координатами, разными направлениями up-векторов камер и другими подводными камнями.

UPDATE:  С помощью описанной выше техники, Вы можете разместить 2D листы на 3D сцене. 2D листы по умолчанию будут повернуты так, что они "лежат" на земле. Пример см. на видео выше.

Источник: https://forge.autodesk.com/blog/loading-multiple-models-forge-viewer-v7
Автор перевода: Александр Игнатович
Опубликовано 28.02.2020