我正在创建一个使用Autodesk Forge-模型衍生API将revit模型转换为IFC文件格式的解决方案。该API向我提供了一个具有转换后的模型层次结构的JSON文件,以及一个包含所有单独的对象及其属性的JSON文件。
转换模型后,我需要分析模型各部分的特定属性。但是,并非我需要的所有信息都存储在对象的属性中。我还需要使用对象的XYZ坐标来获取真实结果,但我相信模型派生API不会生成XYZ数据。
我已经搜索了对象的所有属性,以查看它们是否包含与其他对象相比有关其位置的任何类型的数据,但是它们不包含该信息。我在寻找其他方法来从Revit中提取几何图形/坐标,但是还没有找到真正的解决方案。
https://forge.autodesk.com/en/docs/model-derivative/v2/tutorials/extract-metadata-from-source-file/
在本教程的第5步中,您可以看到我拥有的数据(每个对象的属性)。
答案 0 :(得分:1)
无法按照您希望的方式从Model Derivative API获取XYZ数据。
我还要说的是,如果您希望转换为 IFC ,则在Model Derivative API中已经有针对该转换的服务。但是,如果您确实需要自定义文件格式,请按以下方法获取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!');
}
}
访问查看器后,下面是一些代码,您可以通过我成功使用的dbId获取一个或多个元素的边界框。
/**
* 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;
}
从此THound.Box3对象的BoundingBox中,可以获得有关元素的XYZ信息。另外,这里有使用“片段”的代码,如果您需要定义的XYZ更有用,则可以更具体地获得不同的元素几何。