You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Forge Viewer中无法查看Revit Rooms的技术求助

解决Forge Viewer中无法访问Revit Rooms的问题

问题根源分析

你的代码存在两个关键限制,导致无法获取到Revit Rooms:

  1. 仅遍历叶子节点:你通过tree.getChildCount(dbId) === 0只处理实例树中的叶子节点,但Revit Rooms属于容器类/非几何元素,在实例树中通常是父节点(带有子元素),因此被过滤掉了。
  2. 默认几何加载的局限性:调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:35:19