#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-й (по общим координатам).
- Происхождение к происхождению: Примените
globalOffset
1 — ю модель к другим. Проверить MultipleModelUtil/MultipleModelUtil.js для демонстрации - От центра к центру: способ просмотра по умолчанию.
- По общим координатам: установите 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 Спасибо, что указал на это. Обновлен фрагмент кода. Приношу свои извинения за опечатку.