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
相关产品推荐
相关产品推荐

