如何使用Autodesk360获取网页iframe中3D模型选中构件的GUID ID
嘿,很高兴帮你解决这个问题!我之前也处理过类似的Autodesk模型嵌入需求,要实现点击3D构件获取GUID,核心是利用Autodesk Forge Viewer的事件监听机制,结合iframe的跨域通信逻辑(如果必须用iframe的话)。下面分两种常见场景给你详细方案:
方案一:自定义嵌入Viewer页面(推荐)
如果能自己搭建加载模型的页面(基于Forge Viewer)再嵌入iframe,这是最灵活可控的方式:
在自定义Viewer页面里监听构件选择事件
当Viewer初始化完成后,添加selectionChanged事件监听,用户点击构件时,获取它的GUID并通过postMessage传给父页面:// 先初始化Viewer并加载模型 const viewer = new Autodesk.Viewing.GuiViewer3D(document.getElementById('viewer')); viewer.start(); viewer.loadDocumentNode(doc, viewableId); // 监听构件选择事件 viewer.addEventListener(Autodesk.Viewing.SELECTION_CHANGED_EVENT, (event) => { // 只处理选中单个构件的情况 if (event.dbIdArray.length > 0) { const targetDbId = event.dbIdArray[0]; // 通过dbId获取构件属性,其中externalId就是RVT里的GUID viewer.model.getProperties(targetDbId, (props) => { const componentGuid = props.externalId; // 发送给父页面,记得把*换成你的父页面域名更安全 window.parent.postMessage({ type: 'componentSelected', guid: componentGuid }, '*'); }); } });在父页面接收GUID
父页面监听message事件,接收iframe发来的GUID并处理:window.addEventListener('message', (event) => { // 建议验证来源域名,避免恶意消息 // if (event.origin !== '你的Viewer页面域名') return; if (event.data.type === 'componentSelected') { console.log('选中构件的GUID:', event.data.guid); // 这里写你拿到GUID后的业务逻辑,比如展示详情、存储等 } });
方案二:直接嵌入Autodesk 360共享页面
如果必须直接用Autodesk 360的官方共享链接嵌入iframe,由于跨域限制没法直接操作内部的Viewer,但可以换用Autodesk官方的Embed SDK来实现:
- 首先确保你的Autodesk 360共享模型开启了API访问权限(在共享设置里配置)
- 用Embed SDK替代原生iframe,它提供了官方的交互接口,能直接监听选择事件:
这种方式不需要iframe,直接在你的页面加载Viewer,交互起来更顺畅。// 初始化Embed SDK,需要提前获取有效的访问令牌 const embedViewer = new Autodesk.Embed.Viewer({ accessToken: '你的Forge访问令牌', urn: '模型的URN(可从Autodesk 360获取)', container: document.getElementById('viewer-container') }); // 监听构件选择事件 embedViewer.addEventListener('viewerSelectionChanged', (event) => { if (event.selection.length > 0) { const componentGuid = event.selection[0].externalId; console.log('选中构件的GUID:', componentGuid); } });
几个关键提醒
- GUID对应字段:Viewer里的
externalId就是RVT文件中构件的GUID,别和dbId搞混了,dbId是Viewer内部的临时ID,重启会变。 - 跨域安全:用
postMessage时,尽量不要用*作为目标域名,换成你父页面的具体域名,防止安全风险。 - 访问令牌:不管用哪种方案,都需要有效的Forge访问令牌,权限要包含
viewables:read,可以通过Autodesk开发者平台申请。
内容的提问来源于stack exchange,提问作者amin dad shah
相关产品推荐
相关产品推荐

