forge-viewer如何不渲染模型查询属性且不改动原viewer实例
Forge Viewer 无渲染加载额外模型查询属性实现方案
完全可以实现,不需要改动现有正在用于展示的viewer实例状态,也不会将待查询的模型渲染到可见视图中。
你之前用的viewer.loadDocumentNode方法本身就是将模型挂载到当前viewer的渲染管线中,必然会触发模型渲染显示,不适合属性查询的离线加载场景。
实现思路
创建一个完全独立的离屏viewer实例,挂载到用户不可见的DOM容器上,关闭所有非必要的渲染、交互配置降低性能消耗,专门用于加载待查询的模型、调用内置属性查询方法。这个实例和你现有业务使用的viewer完全隔离,不会产生任何状态干扰。
实现代码
// 1. 创建不可见的离屏DOM容器,不需要插入到可见文档流 const offscreenContainer = document.createElement('div'); offscreenContainer.style.cssText = 'position:fixed;left:-99999px;width:1px;height:1px;overflow:hidden;'; // 2. 初始化轻量化离屏viewer let offscreenViewer: Autodesk.Viewing.GuiViewer3D; await new Promise<void>((resolve) => { Autodesk.Viewing.Initializer({ getAccessToken: yourTokenFetchFunction }, () => { offscreenViewer = new Autodesk.Viewing.GuiViewer3D(offscreenContainer, { headless: true, disableBrowserContextMenu: true, disabledExtensions: ['*'], // 禁用所有扩展,减少资源占用 canvasAlpha: true, antialias: false, progressiveRendering: false, groundShadow: false, groundReflection: false, lightPreset: 0 }); offscreenViewer.start(); resolve(); }); }); // 3. 加载待查询属性的模型,不会渲染到可见视图 const targetDoc = await myLoadDocumentFunction("urn:another-model-urn"); const geomNode = targetDoc.getRoot().getDefaultGeometry(); const queryModel: Autodesk.Viewing.Model = await offscreenViewer.loadDocumentNode(targetDoc, geomNode, { // 仅查询属性时可关闭几何加载,进一步降低资源消耗、提升加载速度 loadGeometry: false, isAEC: false }); // 4. 正常调用内置属性查询方法即可 const targetProps = await new Promise((resolve) => { queryModel.getProperties(/* 填入要查询的构件dbId */, (result) => { resolve(result); }); });
注意事项
- 离屏viewer和现有业务viewer完全独立,不会修改原有viewer的任何状态,也不会把待查询模型显示到用户可见的画布上
- 如果后续不再需要查询该模型属性,可调用
offscreenViewer.finish()、移除对应DOM节点,释放占用的内存 - 不要尝试脱离viewer上下文单独创建
Autodesk.Viewing.Model实例,该类强依赖viewer内部的资源加载、数据管理管线,脱离上下文无法正常工作。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

