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

为何Model的getBulkProperties方法对部分属性无法正常工作?

问题分析与解决方案

可能原因

  1. findProperty方法的索引限制:findProperty依赖Viewer内部的属性索引,部分属性(尤其是IFC模型的元数据类属性)可能未被纳入索引,导致无法通过属性名称直接查询到对应的dbId。
  2. 属性名称/分类的精确匹配问题:Viewer中存储的属性分类或名称可能与Model Derivative API返回的存在细微差异(比如大小写、内部命名规则),导致propFilter或categoryFilter无法命中目标属性。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:07:11