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

Autodesk Forge中获取RVT所有嵌套族DbId问题及解决方案咨询

解决Viewer中无法获取嵌套族宿主节点DbId的问题

问题原因

你当前的getAllLeafComponents函数只收集叶子节点(即子节点数为0的节点),而Revit中的宿主族节点包含嵌套的构件子节点,因此tree.getChildCount(dbId)不为0,不会被加入结果数组。如果需要获取所有层级的节点(包括宿主族自身),需要调整遍历逻辑。

解决方案

方案1:获取所有节点DbId(包括父节点和子节点)

去掉叶子节点的判断逻辑,直接递归遍历所有节点并收集DbId:

function getAllComponents() {
    return new Promise((resolve, reject) => {
        try {
            viewer.getObjectTree(function (tree) {
                const allDbIds = [];
                // 递归遍历所有后代节点
                tree.enumNodeChildren(tree.getRootId(), function (dbId) {
                    allDbIds.push(dbId);
                }, true);
                resolve(allDbIds);
            });
        } catch (error) {
            reject(error);
        }
    });
}

方案2:手动递归遍历(更灵活的节点控制)

如果需要包含根节点,或自定义过滤规则,可以用手动递归的方式:

function getAllComponents() {
    return new Promise((resolve, reject) => {
        try {
            viewer.getObjectTree(function (tree) {
                const allDbIds = [];
                
                function traverseNode(dbId) {
                    allDbIds.push(dbId);
                    // 遍历当前节点的直接子节点,手动递归
                    tree.enumNodeChildren(dbId, (childId) => {
                        traverseNode(childId);
                    }, false);
                }
                
                traverseNode(tree.getRootId());
                // 可选:过滤掉根节点(通常DbId为0)
                const filteredIds = allDbIds.filter(id => id !== tree.getRootId());
                resolve(filteredIds);
            });
        } catch (error) {
            reject(error);
        }
    });
}

补充说明

  • Viewer中的Revit嵌套族结构为:根节点 → 宿主族节点 → 嵌套构件节点,宿主族节点因存在子节点,会被原逻辑判定为非叶子节点而跳过。
  • 如果仍需仅收集叶子节点,你的原逻辑已经可以覆盖嵌套族内的所有叶子,但宿主族本身不属于叶子节点,所以不会被包含。

内容的提问来源于stack exchange,提问作者Madhusudhan D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:42:44