为何Model的getBulkProperties方法对部分属性无法正常工作?
问题分析与解决方案
可能原因
findProperty方法的索引限制:findProperty依赖Viewer内部的属性索引,部分属性(尤其是IFC模型的元数据类属性)可能未被纳入索引,导致无法通过属性名称直接查询到对应的dbId。- 属性名称/分类的精确匹配问题:Viewer中存储的属性分类或名称可能与Model Derivative API返回的存在细微差异(比如大小写、内部命名规则),导致
propFilter或categoryFilter无法命中目标属性。 - IFC模型的属性结构特殊性:IFC模型导出到Viewer时,部分元数据属性(如GUID)可能被归类到特殊内部结构中,常规属性查询方法无法直接访问。
解决方案
方案1:手动遍历所有元素属性筛选
如果findProperty无法找到目标属性,可先获取模型所有元素的属性,再筛选出包含GUID属性的元素:
// 获取模型所有dbId viewer.model.getObjectTree(function(tree) { const allDbIds = tree.getRootId() ? tree.getDescendants() : []; // 批量获取所有属性(不使用filter,确保拿到全部) viewer.model.getBulkProperties2(allDbIds, {}, (results) => { // 筛选包含GUID属性的结果 const guidResults = results.filter(item => { return item.properties.some(prop => prop.displayName === 'GUID' && prop.category === 'Item'); }); console.log('包含GUID的元素:', guidResults); }, (err) => { console.error('获取属性失败:', err); }); });
方案2:验证Viewer中属性的实际结构
先获取单个已知包含GUID的dbId(比如Model Derivative返回的dbId 1)的属性,确认Viewer中该属性的实际名称和分类:
viewer.model.getBulkProperties2([1], {}, (result) => { console.log('dbId 1的属性详情:', result[0]); });
根据输出结果调整propFilter和categoryFilter的参数,确保与Viewer内部存储的属性名称、分类完全匹配。
方案3:使用Viewer的搜索API替代findProperty
Viewer的search方法可更全面地搜索属性,支持匹配属性名称:
viewer.search('GUID', (dbIds) => { console.log('找到含GUID属性的dbId:', dbIds); // 批量获取这些dbId的GUID属性 viewer.model.getBulkProperties2(dbIds, { propFilter: ['GUID'], categoryFilter: ['Item'] }, (results) => { console.log('属性结果:', results); }); }, (err) => { console.error('搜索失败:', err); }, { searchPropertyNames: true });
searchPropertyNames: true表示搜索属性名称,而非属性值,能找到所有包含名为"GUID"属性的元素。
内容的提问来源于stack exchange,提问作者user17096286
相关产品推荐
相关产品推荐

