Общие координаты Revit для просмотра подделок

#autodesk-forge #autodesk-viewer

Вопрос:

Каков правильный процесс для получения преобразования между координатами Forge и общими координатами Revit? Я знаю, что есть globalOffset, но ссылается ли он на внутреннюю систему координат проекта Revit или на общие координаты?

Ответ №1:

Обновление от 11 июня 2021 года

Теперь мой MultipleModelUtil.js поддерживает выравнивания, которыми я поделился ниже. Кроме того, мы можем легко указать Forge Viewer для использования по общим координатам для агрегирования моделей. Вот фрагмент кода, и вы можете ознакомиться здесь, чтобы узнать о поддерживаемых выравниваниях

 const util = new MultipleModelUtil( viewer );

util.options = {
  alignment: MultipleModelAlignmentType.ShareCoordinates
};

const models = [
  { name: '1.rvt', urn: 'urn:dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLlNpaHgxOTVuUVJDMHIyWXZUSVRuZFE_dmVyc2lvbj0x' },
  { name: '2.rvt', urn: 'urn:dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLldVRHJ4ajZ6UTBPLTRrbWZrZ3ZoLUE_dmVyc2lvbj0x' },
  { name: '3.rvt', urn: 'urn:dXJuOmFkc2sud2lwcHJvZDpmcy5maWxlOnZmLjRyZW5HRTNUU25xNHhYaW5xdWtyaWc_dmVyc2lvbj0x' }
];

util.processModels( models );
 

==================

Во-первых, Forge Viewer поддерживает 3 вида методов ссылок Revit, как показано ниже, и вы можете взглянуть на 3-й (по общим координатам).

  1. Происхождение к происхождению: Примените globalOffset 1 — ю модель к другим. Проверить MultipleModelUtil/MultipleModelUtil.js для демонстрации
  2. От центра к центру: способ просмотра по умолчанию.
  3. По общим координатам: установите applyRefpoint: true и перейдите globalOffset к refPoint . Этот метод-тот, который вы ищете.

refPoint Это местоположение точки съемки Revit внутри внутренней системы координат Revit. Он доступен с помощью AecModelData. Тем временем вы можете воспользоваться преимуществами AggregatedView, чтобы использовать эту опцию выравнивания. Вот пример того, как использовать AggregatedView: https://gist.github.com/yiskang/c404af571ba4d631b5929c777503891e

Если вы хотите использовать эту логику непосредственно с классом Viewer, вот фрагмент кода для вас:

 let globalOffset = null;

const aecModelData = bubbleNode.getAecModelData();
const tf = aecModelData amp;amp; aecModelData.refPointTransformation; // Matrix4x3 as array[12]
const refPoint = tf ? { x: tf[9], y: tf[10], z: 0.0 } : { x: 0, y: 0, z: 0 };

// Check if the current globalOffset is sufficiently close to the refPoint to avoid inaccuracies.
const MaxDistSqr = 4.0e6;
const distSqr    = globalOffset amp;amp; THREE.Vector3.prototype.distanceToSquared.call(refPoint, globalOffset);
if (!globalOffset || distSqr > MaxDistSqr) {
    globalOffset = new THREE.Vector3().copy(refPoint);
}

viewer.loadDocumentNode(doc, bubbleNode, { applyRefpoint: true, globalOffset: globalOffset, keepCurrentModels: true });
 

Это bubbleNode может быть одно из следующих:

 bubbleNode = doc.getRoot().getDefaultGeometry()

//Or

const viewables = viewerDocument.getRoot().search({'type':'geometry'});
bubbleNode = viewables[0];
 

Чтобы получить AecModelData , пожалуйста, обратитесь к моей сути: https://gist.github.com/yiskang/c404af571ba4d631b5929c777503891e#file-index-html-L67

 // Call this line before using AecModelData
await doc.downloadAecModelData();

// doc.downloadAecModelData(() => resolve(doc));
 

Смотрите здесь подробную информацию о данных AecModelData: https://forge.autodesk.com/blog/consume-aec-data-which-are-model-derivative-api

Комментарии:

1. Один уточняющий вопрос: почему значение точки отсчета Z равно 0,0? Разве это не должно соответствовать высоте точки съемки?

2. Я думаю, что объект options должен быть { applyRefpoint: true, globalOffset: globalOffset , keepCurrentModels: true } , иначе переменная globalOffset не использовалась бы

3. Привет @Yasser Спасибо, что указал на это. Обновлен фрагмент кода. Приношу свои извинения за опечатку.