首页 > 解决方案 > DM-Script:提取变量/未知结构的标记组

问题描述

我的任务似乎很简单:使用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?

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

(实际上我写了自己的 dummy 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

编辑:示例数据可以在这个后续问题帖子中找到

标签: nulltagsdm-script

解决方案


使用“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...命令返回一个布尔值,指示操作成功或失败。


推荐阅读