开发者问题收集

DM-Script:提取变量/未知结构的标签组

2020-03-26
128

我的任务似乎非常简单:使用 TagGroup 并将树结构和 未知 结构的数据提取到结果日志中。因此,我想获取名称和值以及要在结果中显示的所有子项的名称和值。我该怎么做?


我有以下(示例)标签结构:

示例标签结构

文档介绍了 TagGroup ,还包含一个使用 TagGroupGetTagType() 的示例。然后可以使用返回的值来查找结构。我编写并执行了以下脚本:

for(number i = 0; i < tg.TagGroupCountTags(); i++){
    String label = tg.TagGroupGetTagLabel(i);
    number type = tg.TagGroupGetTagType(i, 0);

    result("\nName: " + label + ", Type: " + type);
}

结果为

Name: Acquisition, Type: 3 // <- should be 0?
Name: Calibration, Type: 3
Name: DataBar, Type: 3 // <- should be 0?
Name: GMS Version, Type: 3 // <- should be 0?
Name: Microscope Info, Type: 3 // <- should be 0?
Name: Session Info, Type: 3 // <- should be 0?

根据文档, TagGroup 的类型为 0。这对于我的示例来说并不正确。如图所示, Acquisition 有子项,因此它应该具有类型 0,但它的类型为 3。其他索引(大多数)也一样。类型 3 是 long。

(实际上,我编写了自己的虚拟 TagGroup 。我用我知道的数据类型填充它,然后测试了返回值 TagGroupGetTagType() 。为此,文档似乎是正确的。)

我更改了脚本,以始终强制检查标签组是否有子项,假设 TagGroupCountTags() 将为空标签返回 0,但事实并非如此:

void showTags(tg){
    for(number i = 0; i < tg.TagGroupCountTags(); i++){
        String label = tg.TagGroupGetTagLabel(i);
        number type = tg.TagGroupGetTagType(i, 0);

        result("\nName: " + label + ", Type: " + type);

        TagGroup child_tg;
        tg.TagGroupGetIndexedTagAsTagGroup(i, child_tg);

        // if(child_tg != NULL){ // <- this does not work either
        showTags(child_tg);
        // }
    }
}

此脚本崩溃是因为 child_tg 在某些时候为 null 。但我也无法测试 null ,因为不允许进行比较( 错误“无法将此参数列表与任何现有函数匹配” )。

文档始终知道其标签结构,因此它们仅使用路径来获取其值。我还尝试寻找其他方法,以了解 TagGroup 是否有子级。但似乎没有 hasChildren() 或任何等效函数。那么如何获取 TagGroup 的结构?

编辑:示例数据可在此 后续问题帖子

中找到
2个回答

所以我找到了某种答案。我现在正在使用

try{
    showTags(child_tg);
}
catch{
    break;
}

这有效,但我仍然不太满意。有没有办法与 null 进行比较或检查对象类(是否有某种 instanceof )?

miile7
2020-03-26

使用“IsValid()”方法测试任何脚本对象是否为“NULL”。这可能看起来很奇怪(NULL 怎么会有方法?)但这就是它的工作原理。

因此,您有:

  • image img --> img.ImageIsValid()
  • imageDocument doc --> doc.ImageDocumentIsValid()
  • ROI r --> r.ROIIsValid()
  • TagGroup tg --> tg.TagGroupIsValid()
  • 等等。等等。
  • 还有: object ob --> ob.ScriptObjectIsValid()

但解决您的问题的一个更简单的方法是使用:

TagGroup child_tg;
if ( tg.TagGroupGetIndexedTagAsTagGroup(i, child_tg) )
    showTags(child_tg);

Get... 命令返回一个布尔值,表示操作成功或失败。

BmyGuest
2020-03-26