簡體   English   中英

Revit 共享坐標到 Forge 查看器

[英]Revit shared coordinates to Forge viewer

在 Forge 坐標和 Revit 的共享坐標之間進行轉換的正確過程是什么? 我知道有 globalOffset,但它參考的是 Revit 項目內部坐標系還是共享坐標?

2021 年 6 月 11 日更新

現在我的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 支持 Revit 鏈接方式如下 3 種,大家可以看看第 3 種(通過共享坐標)。

  1. Origin to origin : 將第一個globalOffset的 globalOffset 應用到其他人。 檢查MultipleModelUtil/MultipleModelUtil.js以獲取演示
  2. Center to center :查看器的默認方式。
  3. 通過共享坐標:設置 applyRefpoint: true 並將globalOffset設置為refPoint 此方法是您正在尋找的方法。

refPoint是 Revit 內部坐標系內的 Revit 測量點位置。 它可以通過AecModelData訪問。 同時,您可以利用AggregatedView來使用此對齊選項。 這是一個說明如何使用 AggregatedView 的示例: https://gist.github.com/yiskang/c404af571ba4d631b5929c777503891e

如果您想直接將此邏輯與查看器 class 一起使用,這里有一個代碼片段:

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/c404af571ba4d631b5929c777503871e#file-index-html-L

// 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

我還發現成功地將refPointTransformation饋送到 matrix4 中。

這樣,模型的方向也被考慮在內。 (這是基於Eason 的回答)。

const bubbleNode = doc.getRoot().getDefaultGeometry();
await doc.downloadAecModelData();
const aecModelData = bubbleNode.getAecModelData();
const tf = aecModelData && aecModelData.refPointTransformation;
const matrix4 = new THREE.Matrix4()
  .makeBasis(
    new THREE.Vector3(tf[0], tf[1], tf[2]),
    new THREE.Vector3(tf[3], tf[4], tf[5]),
    new THREE.Vector3(tf[6], tf[7], tf[8])
  )
  .setPosition(new THREE.Vector3(tf[9], tf[10], tf[11]))

viewer.loadDocumentNode(doc, viewables, {
  placementTransform: matrix4,
  keepCurrentModels: true,
  globalOffset: {
    "x": 0,
    "y": 0,
    "z": 0
  },
  applyRefpoint: true,
  applyScaling: 'ft',
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM