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

非Revit NWC模型获取标高时搜索dbId返回0的问题咨询

问题原因排查
  • 参数配置错误:viewer.model.search 方法的参数逻辑为:第一个参数是要匹配的属性值,第四个参数是指定要搜索的属性名称范围。你当前代码设置的是搜索Icon属性值为Layer的对象,完全不符合找标高图层的需求,自然返回空结果。
  • 变量未定义:代码中声明了空数组levels,但实际存储数据时用的是未初始化的levelsGeo,即使搜索到结果也会抛出引用错误。
  • 调用时机错误:如果在模型属性数据库未完全加载时执行搜索,也会返回空结果,需要等待PROPERTY_DB_LOADED事件触发后再调用该方法。
  • 模型属性差异:不同导出配置的NWC等非Revit模型,标高相关的属性不一定存储在Icon字段下,属性结构存在差异会导致匹配失败。
修正方案
  1. 调整搜索逻辑,改用遍历属性的方式获取所有带图层属性的节点,或者修正search参数匹配你的模型属性结构
  2. 修正变量命名错误
  3. 调整调用时机,确保属性库加载完成后再执行搜索

修正后的参考代码如下:

async function findLevels(model) {
    return new Promise((resolve, reject) => {
        // 校验属性库是否加载完成
        if (!model.getPropertyDb()) {
            return reject(new Error('属性库未加载完成'))
        }
        const levelsGeo = [];
        const tree = model.getInstanceTree();
        // 遍历所有节点匹配图层/标高属性
        tree.enumNodeChildren(tree.getRootId(), (dbId) => {
            model.getProperties(dbId, (props) => {
                // 可根据你的模型实际属性调整匹配规则
                const targetProp = props.properties?.find(p => 
                    p.attributeName === 'Layer' 
                    || p.displayName.includes('标高') 
                    || p.displayName.includes('Level')
                );
                if (!targetProp) return;
                const name = tree.getNodeName(dbId);
                if (name.includes('<No level>')) return;
                levelsGeo.push({
                    guid: dbId,
                    name,
                    dbId,
                    extension: {
                        buildingStory: true,
                        structure: false,
                        computationHeight: 0,
                        groundPlane: false,
                        hasAssociatedViewPlans: false,
                    }
                });
            })
        }, true);
        // 此处可改用Promise.all优化异步遍历逻辑,避免固定延迟
        setTimeout(() => resolve(levelsGeo), 500);
    });
}

// 调用示例:属性库加载完成后再执行搜索
viewer.addEventListener(Autodesk.Viewing.PROPERTY_DB_LOADED, async () => {
    const levels = await findLevels(viewer.model);
    console.log('获取到的标高数据', levels);
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:15:03