Невозможно получить данные XYZ из API-интерфейса "Производное модели" так, как вы ожидаете.
Я бы также сказал, что если вы хотите конвертировать в IFC , для этого уже есть служба конвертации в API производных моделей. Но если вам действительно нужен пользовательский формат файла, вот как вы можете получить XYZ, ниже.
Есть еще два варианта, которые вы можете рассмотреть.
- Во-первых, это использовать Automation Design для Revit API. Вы сможете создать надстройку, которая извлекает необходимые данные из безголовой среды Revit.
- Другой вариант - запустить приложение Forge Viewer без головы и получить оттуда данные XYZ модели.
Безголовый зритель - это учебное руководство в документации Viewer API, которое вы можете просмотреть. Вот код из этого (v6) для справки.
var viewerApp;
var options = {
env: 'AutodeskProduction',
accessToken: ''
};
var documentId = 'urn:<YOUR_URN_ID>';
Autodesk.Viewing.Initializer(options, onInitialized);
function onInitialized() {
viewerApp = new Autodesk.Viewing.ViewingApplication('MyViewerDiv');
viewerApp.registerViewer(viewerApp.k3D, Autodesk.Viewing.Viewer3D);
viewerApp.loadDocument(documentId, onDocumentLoaded);
}
function onDocumentLoaded(lmvDoc) {
var modelNodes = viewerApp.bubble.search(av.BubbleNode.MODEL_NODE); // 3D designs
var sheetNodes = viewerApp.bubble.search(av.BubbleNode.SHEET_NODE); // 2D designs
var allNodes = modelNodes.concat(sheetNodes);
if (allNodes.length) {
viewerApp.selectItem(allNodes[0].data);
if (allNodes.length === 1){
alert('This tutorial works best with documents with more than one viewable!');
}
} else {
alert('There are no viewables for the provided URN!');
}
}
Как только вы получаете доступ к средству просмотра, вот некоторый код, с помощью которого вы можете получить ограничивающую рамку элемента или элементов по dbIds, которые я успешно использовал.
/**
* Uses dbId element fragments to build boundingbox of element
* @param {Array<number>} dbIds dbIds of element to find boundingBox
* @return {THREE.Box3} dbId elements bounding box
*/
getBoundingBox(dbIds) {
const totalBox = new THREE.Box3();
dbIds.forEach((dbId) => {
const fragBox = new THREE.Box3();
const fragIds = [];
const instanceTree = viewer3D.model.getInstanceTree();
instanceTree.enumNodeFragments(dbId, function(fragId) {
fragIds.push(fragId);
});
const fragList = viewer3D.model.getFragmentList();
fragIds.forEach(function(fragId) {
fragList.getWorldBounds(fragId, fragBox);
totalBox.union(fragBox);
});
});
return totalBox;
}
Из этого BoundingBox, который является объектом THREE.Box3, вы можете получить некоторую XYZ-информацию об элементах. Кроме того, здесь есть код, использующий «фрагменты», который позволит вам более конкретно получить различную геометрию элемента, если это более полезно для XYZ, который вам нужно определить.