Autodesk Forge查看器基于dbId/externalId获取图元属性值的实现语法
Forge查看器基于dbId、externalId的BIM工程属性查询实现
基础逻辑说明
查询周长、面积、体积这类和属性面板同源的工程属性,不需要额外对接远端接口拉取数据,所有可展示的属性值都会在模型前端加载阶段完成缓存,直接调用查看器内置接口即可获取,和属性面板的取数逻辑没有差异。
基于dbId的直接属性查询
dbId是查看器内部遍历构件的原生唯一标识,不需要额外做转换,可直接作为查询入参:
- 前置准备:在模型加载完成的回调中保存当前加载的模型对象引用
viewer.model - 核心调用方法:调用模型内置的
getProperties异步接口,返回的数据结构和属性面板展示的数据源完全一致
// 替换为实际获取到的目标构件dbId const targetDbId = 12345; viewer.model.getProperties(targetDbId, (props) => { // props.attributes 数组包含构件全部可查询属性,涵盖周长、面积、体积、标高、材质、系统分类等 const propList = props.attributes; // 示例:提取构件体积属性 const volumeProp = propList.find(item => item.displayName.includes('体积') || item.displayName.includes('Volume')); if(volumeProp) { console.log(`构件体积:${volumeProp.displayValue} 单位:${volumeProp.units}`); } }, (error) => { console.error('属性查询失败:', error); });
基于externalId的属性查询
externalId是源BIM文件自带的构件原生全局ID,不属于查看器内部遍历标识,需要先完成ID映射转换为对应的dbId,再复用上述dbId查询流程:
- 适配逻辑:调用模型内置的
getExternalIdMapping异步接口,获取全量externalId与dbId的映射关系
// 替换为实际获取到的目标构件externalId const targetExternalId = "Room_2F_East_001"; viewer.model.getExternalIdMapping((idMap) => { // 从映射表中匹配目标externalId对应的dbId const mappedDbId = idMap[targetExternalId]; if(!mappedDbId) { console.warn('未匹配到对应externalId的构件,请检查ID值是否属于当前加载的模型范围'); return; } // 复用dbId的查询逻辑获取全量属性 viewer.model.getProperties(mappedDbId, (props) => { console.log('构件全量属性列表:', props.attributes); }); }, (error) => { console.error('ID映射查询失败:', error); });
实操注意要点
- 批量查询多构件属性时,不要循环单条调用
getProperties,可替换使用getBulkProperties接口,传入dbId数组和需要筛选的属性名列表,减少重复异步调用的性能损耗 - 查询周长、面积、体积这类工程属性时,不要硬编码纯中文显示名做匹配,不同源BIM文件导出的属性名可能存在多语言差异,匹配时同时兼容中英文关键词,或直接遍历属性项的数值类型做筛选
- 针对嵌套链接模型内的构件做查询时,不能直接使用顶层全局模型引用
viewer.model调用接口,需要替换为对应嵌套层级的模型实例对象,否则会出现查询空值的问题 - 如果遇到属性列表返回为空的情况,优先检查传入的dbId/externalId是否存在拼写错误、是否属于当前已加载的模型范围,避免传入其他文件的ID导致匹配失败
内容的提问来源于stack exchange,提问作者Hoz.Coder
相关产品推荐
相关产品推荐

