将点从 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 格式
Autodesk Forge 从转换后的 DWG 获取清单和元数据
Autodesk forge viewer api v7.* 对齐多个 2d dwg 模型