APS Viewer扩展开发:userFunction中能否调用getBulkProperties方法?
APS Viewer扩展:userFunction中属性查询与优化方案
核心问题解答
- userFunction内无法调用model.getBulkProperties()/getBulkProperties2():userFunction运行在PropertyDatabase的隔离执行环境中,只能使用该类暴露的方法(比如
getAttrDefs、getProperties等),无法直接访问Model实例的方法。
属性过滤的高效方式
不需要完全依赖attrDef手动过滤,有两种更高效的思路:
- 调用executeUserFunction时提前限定属性范围
在调用viewer.model.getPropertyDb().executeUserFunction()时,通过传入props参数指定需要获取的属性名称数组,PropertyDatabase只会返回你需要的属性数据,大幅减少处理的数据量。示例代码:viewer.model.getPropertyDb().executeUserFunction( function (pdb) { // 处理获取到的目标属性 }, ['设备ID', '所属区域'] // 指定要拉取的属性名称 ); - 在userFunction内利用PropertyDatabase方法快速筛选
若需要动态按属性组过滤,可在userFunction内部调用pdb.getAttrDefs()获取所有属性定义,再通过属性的category字段快速筛选目标组。示例代码:viewer.model.getPropertyDb().executeUserFunction(function (pdb) { const targetGroup = '电气组件'; const relevantAttrDefs = pdb.getAttrDefs().filter(def => def.category === targetGroup); // 基于筛选后的属性定义获取对应元素属性 });
额外优化建议
- 缩小查询的dbId范围:先通过
viewer.search()或Viewer的选择工具定位目标组元素,再针对这些dbId执行属性查询,避免全量遍历。 - 拆分异步任务:如果处理超大数据量,可将复杂逻辑拆分为多个小的userFunction调用,结合异步执行进一步降低主线程负载。
内容的提问来源于stack exchange,提问作者Andrés Martínez
相关产品推荐
相关产品推荐

