【问题标题】:Revit shared coordinates to Forge viewerRevit 将坐标共享到 Forge 查看器
【发布时间】:2021-06-27 22:02:56
【问题描述】:

在 Forge 坐标和 Revit 的共享坐标之间进行转换的正确过程是什么?我知道有 globalOffset,但它是引用 Revit 项目内部坐标系还是共享坐标?

【问题讨论】:

    标签: autodesk-forge autodesk-viewer


    【解决方案1】:

    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种(通过共享坐标)。

    1. Origin to origin:将第一个模型的globalOffset 应用到其他模型。查看MultipleModelUtil/MultipleModelUtil.js 以获取演示
    2. 居中:查看器的默认方式。
    3. shared coordinates:设置 applyRefpoint: true 并将 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

    【讨论】:

    • 一个明确的问题:为什么 refPoint Z 值为 0.0?不应该与测量点的高程相匹配吗?
    • 我认为选项对象应该是{ applyRefpoint: true, globalOffset: globalOffset , keepCurrentModels: true } 否则变量globalOffset 将不会被使用
    • 嗨@Yasser 感谢您指出这一点。更新了代码 sn-p。我为错字道歉。
    猜你喜欢
    • 2021-10-16
    • 2019-11-24
    • 2018-02-16
    • 2019-12-10
    • 2018-11-08
    • 2020-11-02
    • 2019-02-17
    • 2022-11-01
    • 2021-07-08
    相关资源
    最近更新 更多