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

