如何在Autodesk Forge中仅加载主模型(ReactJS实现)
仅加载Forge主模型的React实现方案
要实现只加载主模型、跳过关联模型,核心是通过Autodesk.Viewing.Document获取主模型节点,再用loadDocumentNode加载该节点,而非默认加载整个文档的所有模型。以下是具体实现步骤和React代码示例:
核心思路
- 先加载文档(而非直接加载模型),获取文档的根节点
- 从根节点中筛选出主模型节点(通过
isPrimary属性判断) - 调用
viewer.loadDocumentNode仅加载该主模型节点
React代码示例
import React, { useEffect, useRef } from 'react'; function ForgeViewer() { const viewerContainer = useRef(null); let viewer = null; useEffect(() => { if (!viewerContainer.current) return; // 初始化Forge Viewer const initOptions = { env: 'AutodeskProduction', getAccessToken: (callback) => { // 替换为你的Token获取逻辑(比如调用后端接口) fetch('/api/forge/token') .then(res => res.json()) .then(data => callback(data.accessToken, data.expiresIn)); } }; Autodesk.Viewing.Initializer(initOptions, () => { viewer = new Autodesk.Viewing.GuiViewer3D(viewerContainer.current); viewer.start(); // 加载目标模型(替换为你的模型URN) loadPrimaryModelOnly('your-model-urn'); }); // 组件卸载时清理Viewer return () => { if (viewer) { viewer.finish(); viewer = null; } }; }, []); const loadPrimaryModelOnly = (modelUrn) => { const onDocLoadSuccess = (doc) => { // 获取文档根节点 const rootNode = doc.getRoot(); // 搜索主模型节点(isPrimary标记为true的节点) const primaryModelNode = rootNode.search({ isPrimary: true })[0]; if (primaryModelNode) { // 仅加载主模型节点 viewer.loadDocumentNode(doc, primaryModelNode, { keepCurrentModels: false }) .then(() => { console.log('主模型加载完成'); }) .catch(err => { console.error('主模型加载失败:', err); }); } else { // 备选:遍历子节点找第一个可加载的几何模型节点 const geometryNodes = rootNode.search({ type: 'geometry' }); if (geometryNodes.length > 0) { viewer.loadDocumentNode(doc, geometryNodes[0]); } else { console.error('未找到可加载的主模型节点'); } } }; const onDocLoadError = (err) => { console.error('文档加载失败:', err); }; // 加载文档(URN需要加前缀"urn:") Autodesk.Viewing.Document.load(`urn:${modelUrn}`, onDocLoadSuccess, onDocLoadError); }; return ( <div ref={viewerContainer} style={{ width: '100%', height: '90vh', border: '1px solid #eee' }} /> ); } export default ForgeViewer;
关键说明
isPrimary属性:Forge会给主模型节点标记isPrimary: true,这是最可靠的筛选方式- 备选筛选逻辑:如果某些场景下
isPrimary不生效,可以通过搜索type: 'geometry'的节点,取第一个作为主模型加载 - 避免默认加载:不要使用
viewer.loadModel方法,它会自动加载文档下所有关联模型 - React生命周期:组件卸载时必须调用
viewer.finish()释放资源,防止内存泄漏
内容的提问来源于stack exchange,提问作者dattm
相关产品推荐
相关产品推荐

