【发布时间】:2021-06-27 22:02:56
【问题描述】:
在 Forge 坐标和 Revit 的共享坐标之间进行转换的正确过程是什么?我知道有 globalOffset,但它是引用 Revit 项目内部坐标系还是共享坐标?
【问题讨论】:
标签: autodesk-forge autodesk-viewer
在 Forge 坐标和 Revit 的共享坐标之间进行转换的正确过程是什么?我知道有 globalOffset,但它是引用 Revit 项目内部坐标系还是共享坐标?
【问题讨论】:
标签: autodesk-forge autodesk-viewer
2021 年 6 月 11 日更新
现在我的MultipleModelUtil.js 支持我在下面分享的对齐方式。此外,我们可以很容易地告诉 Forge Viewer 使用 By shared coordinates 来聚合模型。这是sn-p的代码,你可以查看here了解支持的对齐方式
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支持Revit链接方式如下3种,大家可以看看第3种(通过共享坐标)。
globalOffset 应用到其他模型。查看MultipleModelUtil/MultipleModelUtil.js 以获取演示globalOffset 设置为 refPoint。 此方法正是您要寻找的方法。
refPoint 是 Revit 内部坐标系内的 Revit 测量点位置。可通过AecModelData 访问。同时,您可以利用AggregatedView 来使用此对齐选项。这是一个说明如何使用 AggregatedView 的示例:
https://gist.github.com/yiskang/c404af571ba4d631b5929c777503891e
如果你想直接在 Viewer 类中使用这个逻辑,这里有一段代码 sn-p 供你使用:
let globalOffset = null;
const aecModelData = bubbleNode.getAecModelData();
const tf = aecModelData && 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 && 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
【讨论】:
{ applyRefpoint: true, globalOffset: globalOffset , keepCurrentModels: true } 否则变量globalOffset 将不会被使用