跳转到主要内容
元素的假设可为已找到或未找到。通常,已找到的假设是基于一个或多个图像对象或其片段形成的(例外是 White Gap 元素,它可能完全不包含图像对象)。 简单元素的已找到假设始终是连续区域。White Gap、Separator 和 Barcode 元素的假设始终为单个矩形。 如果假设基于一组检测到的图像对象(例如 Paragraph 元素的假设),则其区域将根据这些对象的矩形数组构建。通过假设的 Region 方法可以获得以此方式创建的区域。在图像上显示该假设区域,或基于该假设创建块时,区域边界不会精确贴合每个矩形的边界;为更好地可视化,搜索区域的边界会被平滑化。通过假设的 SimplifiedRegion 方法可以获得以此方式创建的区域。RegionSimplifiedRegion 方法既可在 Search Conditions 部分(描述元素的搜索区域时)使用,也可在描述块属性并使用已找到的元素时使用。 如果未找到假设,则它与其搜索区域的模糊矩形相一致。在图像上显示未找到的假设时,程序将绘制该模糊矩形的外接矩形。 任何假设的 Left、top、Right 和 Bottom 边界都是区间。对于每个已找到的假设,区间会退化为一个点,即 Left.Start = Left.Endtop.Start = top.End 等。对于未找到的假设,其边界区间与其搜索区域的区间相同。 在相应的块和元素对话框的代码中访问生成的假设及其属性,可为设置 FlexiLayout 提供更多手段。可以按元素名称访问元素的假设。要在 Hypotheses Evaluation 部分访问当前元素的假设,仅需使用属性名称。 只能以唯讀方式访问假设及其属性。可在 Search ConditionsHypotheses Evaluation 两个部分以及 field 的 Code Editor 部分访问元素的假设。在 Search Conditions 中,可访问位于 Elements 树中当前元素之上的所有元素的生成假设(及其属性)。在 Hypotheses Evaluation 中,可访问位于 Elements 树中当前元素之上的元素的生成假设以及当前元素本身的假设。在 field 的 Code Editor 中,可访问所有元素的假设(及其属性)。 下表列出了适用于所有元素类型的假设属性。
PropertyDescription
Logic IsNull()此假设是否为 null(如果已检测到该元素,假设的 IsNull 属性为 True)。
Logic IsFound()此假设是否非空(如果未检测到该元素,假设的 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; 代码会将该假设的质量重置为 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。