将点从 DWG 模型坐标转换为 Autodesk Forge 查看器坐标

Posted

技术标签:

【中文标题】将点从 DWG 模型坐标转换为 Autodesk Forge 查看器坐标【英文标题】:Transform point from DWG model coordinates to autodesk forge viewer coordinates 【发布时间】:2018-11-08 07:55:18 【问题描述】:

我正在尝试在 Autodesk forge 查看器中显示的模型上显示一个点。但是我无法弄清楚如何转换这一点。

答案Aligning Coordinate Systems in Autodesk Forge Viewer 对我不起作用,因为viewer.model.getData() 没有globalOffset 属性。

我已经在https://github.com/umarmohammed/forgeviewerdemo这里上传了一些示例代码以及原始 dwg 文件

【问题讨论】:

请接受我们对迟到的诚挚歉意,我们的资源目前不正常。我正在研究,这需要我很多次才能找到解决方案,请多多包涵! 我找到了一种方法来做你想要的点变换,但这个方法似乎还有另一个问题,所以我正在与我们的工程团队核实,并会尽快让你回来。谢谢! @EasonKang 感谢您对此进行调查。有进一步的更新吗? 【参考方案1】:

抱歉,我没有收到我们工程团队的任何回复。似乎没有其他方法可以获取当前二维视图的viewportId,并且这里可能存在浮动精度问题,这就是我上面提到的问题。我会继续要求他们。所以,这是我发现从 DWG 坐标系到查看器的点变换的方法。

    通过VertexBufferReader获取当前视口ID,但您必须在加载的视图中指定一个二维项目(dbId)才能从中读取viewportId

    var viewportId = null;
    function GeometryCallback(viewer) 
        this.viewer = viewer;
    
    
    GeometryCallback.prototype.onLineSegment = function(x1, y1, x2, y2, vpId) 
        viewportId = vpId;
    
    
    var fragId = 0;
    var m = viewer.impl.getRenderProxy(viewer.model, fragId);
    var vbr = new Autodesk.Viewing.Private.VertexBufferReader(m.geometry, viewer.impl.use2dInstancing);
    vbr.enumGeomsForObject(dbId, new GeometryCallback());
    

    将 DWG 点投影回查看器坐标系。

    var vpXform = viewer.model.getPageToModelTransform(viewportId).clone();
    var invVpXform = new WGS.LmvMatrix4(true);
    
    invVpXform.getInverse(vpXform, true);
    
    var ptInCadX = ...;
    var ptInCadY = ...;
    var verticesInViewer = new THREE.Vector3().set(ptInCadX, ptInCadY, 0).applyMatrix4(invVpXform);
    

希望对你有帮助。

【讨论】:

我不确定如何获取 dbId 和 fragId。在我的示例中,正确的 dbId 是否为viewer.model.getData().instanceTree.nodeAccess.rootId?如何从 dbId 中获取 fragId? 在 Viewer 的 2D 视图中选择一个项目,然后调用 viewer.getSelection() 获取 dbId。之后,var it = viewer.model.getData().instanceTree; it.enumNodeFragments( dbId, function( fragId ) console.log( fragId ) ) 还有另一种获取instancTree的方法,viewer.getObjectTree(function( it ) console.log( it ) , functio( code, msg ) console.error( code, msg ) ) Autodesk.Viewing.SELECTION_CHANGED_EVENT 处理程序中获取 dbId 和 fragId 效果很好。但是我需要在加载模型时执行转换。我这样做的方法是在Autodesk.Viewing.OBJECT_TREE_CREATED_EVENT 中调用viewer.select(dbId, Autodesk.Viewing.SelectionMode.REGULAR)。我已经更新了我的 github 存储库中的代码来演示这一点。然而,这是一种非常复杂的方式。加载模型时是否有更简单的方法来进行转换?最好不要先选择一个项目。 如果你想在加载时转换模型,你可以尝试将此选项传递给Viewer3D#loadModel:const modelOpts = placementTransform: new THREE.Matrix4().makeTranslation( x1, y1, z1 ), globalOffset: x: 0, y: 0, z: 0 ;

以上是关于将点从 DWG 模型坐标转换为 Autodesk Forge 查看器坐标的主要内容,如果未能解决你的问题,请参考以下文章

将 Autodesk .dwg 和 .dwf 文件转换为 three.js json 格式

CGPoint 相对于视图

Autodesk Forge 从转换后的 DWG 获取清单和元数据

Autodesk forge viewer api v7.* 对齐多个 2d dwg 模型

无法在 Forge Viewer 中检索二维 DWG 文件的地理参考或坐标

如何在 Javascript AutoDesk 中获取模型对象元数据属性