跳转到主要内容
元素的假设要么被找到,要么未被找到。通常,被找到的假设是基于一个或多个图像对象或其片段构建的(例外情况是 White Gap 元素,它可能完全不包含任何图像对象)。 简单元素的已找到假设始终是一个连续区域。White Gap、Separator 和 Barcode 元素的假设始终是单个矩形。 如果假设是基于一组检测到的图像对象构建的(例如 Paragraph 元素的假设),则该假设的区域将基于这些检测到对象的矩形数组生成。以这种方式创建的区域可以通过假设的 Region 方法获取。在将假设区域显示到图像上,或基于该假设创建块时,该区域的边界不会严格沿每个矩形的边界绘制。相反,为了获得更好的可视化效果,搜索区域的边界会被平滑处理。以这种方式创建的区域可以通过假设的 SimplifiedRegion 方法获取。RegionSimplifiedRegion 方法既可以在 搜索条件 部分中使用(用于描述元素的搜索区域),也可以在描述块的属性并使用已找到的元素时使用。 如果假设未被找到,则它与其搜索区域的模糊矩形相重合。在图像上显示未找到的假设时,程序将绘制该模糊矩形的外接矩形。 任何假设的 Left、top、Right 和 Bottom 边界都是范围。对于每个已找到的假设,该范围会退化为一个点,即 Left.Start = Left.Endtop.Start = top.End 等等。对于未找到的假设,其边界的范围与其搜索区域的范围相重合。 在块和元素的相应对话框的代码中访问生成的假设及其属性,为配置 FlexiLayout 提供了额外的工具。元素假设可以通过元素名称进行访问。要在 假设评估 部分访问当前元素的假设,只需使用属性名称即可。 对假设及其属性的访问是只读的。可以在 搜索条件假设评估 部分以及字段的 Code Editor 部分访问元素的假设。在 搜索条件 中,可以访问元素树中位于当前元素之上的所有元素的生成假设(及其属性)。在 假设评估 中,可以访问元素树中位于当前元素之上的元素的生成假设以及当前元素本身的假设。在字段的 Code Editor 中,可以访问所有元素的假设(及其属性)。 下表列出了适用于所有类型元素的假设属性。
PropertyDescription
Logic IsNull()此假设是否为 null 假设(如果检测到该元素,假设的 IsNull 属性为 True)。
Logic IsFound()假设是否为非 null(如果未检测到该元素,假设的 IsNull 属性为 False)。等价于 IsNull
XInterval Left()假设的左边界,在全局坐标中的水平范围。
YInterval top()假设的上边界,在全局坐标中的垂直范围。
XInterval Right()假设的右边界,在全局坐标中的水平范围。
YInterval Bottom()假设的下边界,在全局坐标中的垂直范围。
XInterval XCenter()假设中心的 X 坐标,在全局坐标中的水平范围。
YInterval YCenter()假设中心的 Y 坐标,在全局坐标中的垂直范围。
DistInterval Width()假设在全局坐标中的宽度,距离范围。
DistInterval Height()假设在全局坐标中的高度,距离范围。
FuzzyRect FuzzyRect()假设在全局坐标中的模糊矩形。
Rect Rect()在全局坐标中外接该假设的矩形。与模糊矩形的外部矩形重合。
Region Region()假设在全局坐标中的区域。该方法不支持 Group 元素。
Region SimplifiedRegion()假设在全局坐标中的区域,经简化以获得更好的可视化效果。该方法不支持 Group 元素。
ImageObjectSet Set()构成该假设的图像对象。
ImageObjectSet ExcludeSet()位于通过 Exclude 类型方法从搜索区域中排除的区域内的图像对象。
RectArray Rects()包含在该假设中的矩形数组。对于大多数元素,它与包围已检测对象的矩形数组相同。对于 White Gap 和 Region 元素,不包含任何对象。
Int HypothesesCount()在搜索区域中可为该元素构建的假设数量。仅当文档的最小和最大页面数都设置为 1 时才能使用该函数,即检测到的文档只有一个页面。如果将此函数用于多页面文档,为其匹配 FlexiLayout 将返回错误。
PageInterval Pages()要在其中查找该假设的页面范围。
PageArea PageAreaGlobal( Int PageNumber )返回在给定页面上、以全局坐标表示的那部分假设。
PageArea PageAreaLocal( Int PageNumber )返回在给定页面上、以该页面的本地坐标表示的那部分假设。

调用假设属性的示例代码

在访问简单元素或 Group 元素中某个假设的属性之前,请先确保该假设不是空假设(调用其 IsNull 属性)。访问空假设(对应未检测到的元素)的属性会导致错误。 假设在你的文档上有一个以条形码形式表示的标识符,并且你希望 FlexiLayout 只匹配那些条形码值为 1556897142240 的文档。要实现这一结果,请执行以下操作:在描述该条形码属性和搜索约束的元素的 Hypotheses Evaluation 部分中,编写以下代码:
if value != "1556897142240" then Quality: 0;
点击 ApplyCheck Code。编译器不会检测到任何语法错误,看起来代码是正确的。然而,如果你尝试将该 FlexiLayout 与 Sample 1 中的任意页面进行匹配,将会显示如下错误消息:“Error in element “MainGroup.IdentityNumber”, Advanced relations section: Attempt to access undefined hypothesis MainGroup.IdentityNumber.” 错误原因如下。程序会为条码元素找到一个假设,然后将该条码的值与代码中指定的值进行比较。如果两个值不同,Quality: 0; 代码会将该假设的 Quality 值重置为 0。随后会为该元素生成一个空假设,程序同样会为其检查条件 value != "1556897142240"。由于现在不允许访问空假设的值(它没有该属性),程序会给出 “…undefined hypothesis…” 的错误消息。 因此,你需要对代码进行如下调整:
if not IsNull then {
if value != "1556897142240" then Quality: 0;
}
上述代码仅适用于必需元素。对于可选元素,需要将代码调整为如下形式:
if not IsNull then {
if value != "1556897142240" then Quality: 0;
}
else {Quality: 0;}
否则,只有实际假设的质量值会被重置为 0。这将导致程序生成一个空假设,对于该空假设,对应的 “if not IsNull” 将不会被执行。因此,最终(空)假设的质量值将保持与元素属性中指定的数值相同(如果保留默认值,则为 0.97),并且即使缺少该元素,程序也会继续匹配该 FlexiLayout。 如果在代码中添加 else {Quality: 0;},则这段代码会对所有假设(包括空假设)执行,FlexiLayout 的匹配将被停止,因为在该元素处整条假设链的质量值也会被重置为 0。

方法 Region Region() 和 Region SimplifiedRegion() 比较

方法 Region Region()Region SimplifiedRegion() 都用于获取元素的区域,但方法 Region Region() 获取的是精确区域,而方法 Region SimplifiedRegion() 获取的是基于边界坐标创建的 Rectangle。