ダミー要素が制約条件を満たしていることを示すしくみ
この補助要素は、DontFind() 関数 (つまり「検索を停止する」) がアクティブ化されていない限り、画像上で常に何らかのものを検出できるように作成されます。仮説の数は多くなりすぎないようにする必要があります。多すぎると、仮説ツリーが過度に拡張され、FlexiLayout のマッチング時間が長くなるためです。
これを実現するには、たとえば Object Collection 型または Paragraph 型の要素を使用できます。これらの要素は常に 1 つの仮説を生成し、その仮説には検索領域内にある指定型のすべてのオブジェクトが含まれます。
ダミー要素の Advanced pre-search relations セクションには、プロジェクトツリー内でダミー要素より下にある一部の要素について確認するための条件セットが含まれています。すべての条件が満たされると、ダミー要素に対して DontFind() 関数が呼び出されます。
この場合、ダミー要素に対してヌル仮説が生成され、FlexiLayout Studio が他の要素の検索を開始する際に、すべての条件が満たされたことを示すマーカーとして機能します。これにより、複数の要素に対して同じ複雑な制約条件をチェックする代わりに、ダミー要素の IsNull チェックだけを実行するようになります。
このメソッドを使うと、コードの記述がよりわかりやすくなります。さらに、制約条件を編集する必要がある場合も、ダミー要素の説明だけを修正すれば済みます。コードを複製する際に、論理エラーや構文エラーが発生する可能性を低減できます。
将来の製品バージョンでは、グループのサブ要素領域で変数を作成できるようになる予定です。そうなれば、制約条件の確認結果は異なる変数の値に保存されるようになります。現在のメソッドは一時的な解決策 (workaround) であり、現行バージョンの FlexiLayout Studio で Advanced セクションのコードを簡潔にするのに役立ちます。
sample プロジェクト内の2種類の請求書レイアウト
プロジェクト1.fsp (フォルダー %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Auxiliary element) では、このメソッドがどのように機能するかを示しています。
これらの画像では、次のfieldを見つけることが目的です: 「請求書番号」、「請求日」、「会社名」、「会社住所」。
2種類の異なる請求書を処理する必要があるとします:
- 「会社名」と「会社住所」のfieldは、「請求書番号」のfieldより上にあります。
- 「会社名」と「会社住所」のfieldは、「請求書番号」のfieldより下にあります。
2組の制約条件を使用して日付フィールドを検索する
このプロジェクトには、要素 InvoiceHeader、InvoiceNum、DateHeader を含む グループ要素 InvoiceGroup と、グループ要素 DateGroup があります。これらのサブ要素は、field名、および field “請求書番号” と “請求日” を検出するために必要です。日付検索の方法について詳しくは、高品質または低品質の認識後の日付検索を参照してください。このセクションでは、現在のプロジェクトにおける日付検索の制約条件のみを説明します。
if not DateHeader.IsNull がチェックされる場合) 、検索は日付フィールド名を基準に実行されます。つまり、名前の右側で、同じ水準上にあり、縦方向のずれにはある程度の許容範囲を設けて検索します。
簡単のため、画像は高品質で、field “請求書番号” とその名前は常に検出されるものとします。実際には、これらの要素のプロパティを呼び出す前に、
IsNull チェックを実行する必要があります。要素が検出されない場合、その後の検索は対応する要素の検索領域を基準に実行されるためです。
請求書のfieldから離れた日付の仮説にペナルティを適用する
Date 要素のAdvanced post-search relations sectionには、次のコードがあります。これらの関数の使用方法について詳しくは、Nearest と FuzzyQuality を使用した要素の検索を参照してください。
DateAsString 要素の検索制約
DateAsString 要素にも同じ検索制約が指定されていますが、その Advanced post-search relations セクションでは、先ほど示したコードにさらに 1 行追加されています。RestrictSearchArea (Date.Rect); を指定しています。つまり、要素 DateAsString の object を、要素 Date の Fuzzy Rectangle の領域内で検索するよう FlexiLayout Studio に指示することになります。要素 Date の検索領域は、矩形の array として表すことができます。
要素 Date に対してヌル仮説が生成されると、検索領域を囲む矩形が現在の要素の矩形 (Rect) として扱われます。下の画像からわかるように、この矩形には要素 InvoiceNum で表される field “請求書番号” も含まれます。
条件によっては (たとえば日付フィールドのノイズが非常に多い場合) 、日付 field ではなく、要素 DateAsString が請求書番号の field を検出してしまうことがあります。これは、この要素に指定された文字 (数字を含む) には書式上の制約がないためです。

ShamElement 補助要素で field の配置を確認する
field “請求書番号” と “請求日” を検索するために必要な要素を記述したら、次は field “会社名” と “会社住所” を検索します。 このプロジェクトでは、ShamElement という名前の Paragraph 要素を使用します。この要素は補助要素として機能し、field “請求書番号” と “請求日” の相対的な位置関係を確認するためだけに使用されます。 補助要素の Advanced pre-search relations セクションには、次のコードが含まれています。
invoice fieldsを基準に会社名を検索する
会社の詳細を検出するため、このProjectではグループ要素 CompanyGroup を使用します。これは、Character String 型の要素 CompanyName (テスト画像では会社名は1行で記載されています) と、Paragraph 型の要素 住所 をグループ化したものです。後者の要素は、会社住所を含むブロックを検索するために使用されます。 この補助要素を使用することで、Advanced pre-search relations セクションで要素の検索制約を記述するコードを簡潔にできます。 補助要素が検出されない場合 (つまり、その要素に対してヌル仮説が生成される場合) 、日付フィールドはinvoice fieldの右側にあることを意味します。この場合、field “会社名” は field “請求書番号” の下で検索されます。 補助要素が検出された場合、field “会社名” は field “請求書番号” の上で検索されます。この場合は
Nearest function を使用できます。これにより、会社名を含む field を明確かつ正確に特定できます (同じ検索制約に一致するオブジェクトはありません) 。Above: InvoiceGroup.InvoiceHeader; および Above: InvoiceGroup.InvoiceNum; は、会社名の文字列だけでなく、住所field内の各文字列によっても満たされます。

