在Forge Viewer中无法查看Revit Rooms的技术求助
解决Forge Viewer中无法访问Revit Rooms的问题
问题根源分析
你的代码存在两个关键限制,导致无法获取到Revit Rooms:
- 仅遍历叶子节点:你通过
tree.getChildCount(dbId) === 0只处理实例树中的叶子节点,但Revit Rooms属于容器类/非几何元素,在实例树中通常是父节点(带有子元素),因此被过滤掉了。 - 默认几何加载的局限性:调用
doc.getRoot().getDefaultGeometry()仅加载模型的核心几何图形,Rooms这类空间元素默认可能未被包含在这个集合中,需要显式加载。
解决方案
1. 修改节点遍历逻辑,移除叶子节点限制
去掉对tree.getChildCount(dbId) === 0的判断,遍历所有节点,并通过类别筛选出Rooms:
export function getAllProperties(viewer, setData) { var tree = viewer.model.getInstanceTree() if (tree === undefined) { setTimeout(() => { getAllProperties(viewer, setData) }, 500) return } var categories = {} var promises = [] // 遍历所有节点,不再限制叶子节点 tree.enumNodeChildren(tree.getRootId(), function (dbId) { var promise = new Promise(function (resolve, reject) { viewer.getProperties(dbId, function (props) { var elementData = { dbId: dbId, name: props.name, externalId: props.externalId, } // 查找当前元素的类别 var categoryProp = props.properties.find(p => p.displayName === 'Category'); if (categoryProp && categoryProp.displayValue === 'Rooms') { // 处理房间元素,比如加入categories集合 categories['Rooms'] = categories['Rooms'] || []; categories['Rooms'].push(elementData); } resolve(); }, (err) => reject(err)); }); promises.push(promise); }); // 所有Promise完成后更新数据 Promise.all(promises).then(() => { setData(categories); }).catch(err => console.error('获取属性失败:', err)); }
2. 调整模型加载逻辑,确保包含Rooms元素
如果默认几何未包含Rooms,可改为加载所有3D几何节点,确保非几何元素被加载:
updateViewerState(prevProps) { if (!prevProps || (this.props.urn && this.props.urn !== prevProps.urn)) { Autodesk.Viewing.Document.load( this.props.urn, (doc) => { // 查找所有3D几何节点 doc.getRoot().search({ 'type': 'geometry', 'role': '3d' }).then(nodes => { // 加载所有找到的节点 return Promise.all(nodes.map(node => viewer.loadDocumentNode(doc, node))); }).then(() => { getAllProperties(this.viewer, this.props.setData); }); }, (code, message, errors) => { console.error('加载模型错误:', code, message, errors); toast.error("加载模型失败,请返回重新加载页面"); } ); } }
3. 验证模型转换是否包含Rooms
如果上述修改后仍无法找到Rooms,需确认Forge转换Revit模型时是否包含了该元素:
- 打开Forge Viewer的模型浏览器(Model Browser),手动查找是否存在"Rooms"类别节点。
- 若模型浏览器中也没有Rooms,说明转换时可能排除了该元素,需调整Revit导出或Forge转换的设置,确保空间元素被包含。
内容的提问来源于stack exchange,提问作者Alejandro Capra
相关产品推荐
相关产品推荐

