条件付き実行
イントロダクション
条件付き実行は、プログラムの一部を実行するかどうかが条件に依存する場合があります。 Aurora Vision Studioでは、これを実現するために2つの方法があります:
- 条件付き接続 – より単純で、プログラムの構造が直線的で、特定の状況で一部のステップをスキップする必要がある場合に適しています。
- バリアントマクロフィルタ – より優雅で、2つ以上の代替の実行パスがある場合に適しています。
このセクションは前者、条件付き接続に焦点を当てています。
条件付きデータ
条件付き接続について話す前に、条件付きデータについて説明する必要があります。 いくつかのフィルタでは、特定の状況で出力データを計算することが不可能な場合があります。たとえば、SegmentSegmentIntersection フィルタは、2つの線分の交点を計算しますが、一部の入力セグメントでは交点が存在しない場合があります。このような場合、フィルタはデータがないことを示す特別な Nil 値を返します(通常は「検出されていない」と読まれます)。
条件付きデータを生成する他のフィルタの例には次のものがあります:
- ScanSingleEdge – 平らな画像上にエッジがない場合は何も検出しません。
- DecodeBarcode – チェックサムが正しくない場合、デコードされた文字列は返しません。
- GigEVision_GrabImage_WithTimeout – カメラとの通信がタイムアウトした場合は、画像は返しません。
- MakeConditional – 明示的に条件付きの出力を作成し、特定の条件が満たされた場合は Nil を返します。
条件付きデータを生成するフィルタの出力は、疑問符がサフィックスとなった型で認識できます。たとえば、SegmentSegmentIntersection の出力型は "Point2D?" です。
Nil 値は、NULL ポインタや -1 などの特別な値に対応しています。 ただし、条件付き型はより型の安全性を提供し、プログラムのどの部分で特別なケースが予測されているかを明確に定義します。
条件付き接続
条件付き接続()は、条件付き出力が非条件付き入力に接続されたときに表示されます。 この場合、2番目のフィルタは条件付きに実行され、その出力型も条件付きに変更されます。実際には、入力データが Nil でない場合にのみ、2番目のフィルタが実行されます。 それ以外の場合、つまり Nil が来た場合、2番目のフィルタはそのすべての出力で Nil を返し、プログラムエディタでは沈んで(暗くなって)表示されます。
条件付き実行されるフィルタの出力型が条件付きに変わるため、条件付き実行されるフィルタの連続を簡単に作成できます。このシーケンスは通常、条件付きデータを入力として受け入れるフィルタで終了します。
Nil 値の解決
一般的に、条件付き実行がある場合、Nil 値は予想され、ある時点で解決する必要があります。以下は最も一般的な解決策のリストです:
- まず最初に、Nil ケースを無視できます。プログラムの一部が実行されず、何のサインも表示されません。
例: カメラがフリーランモードで実行され、オブジェクトが検出された場合にのみ検査ルーチンを実行する場合にこのアプローチを使用します。 - Nil を解決する最も簡単な方法は、MergeDefault フィルタを使用して、プログラムで指定された他の値で Nil を置き換えることです。
例: 産業用品質検査システムでは、通常、Nil("オブジェクトが検出されていない")を "NOT OK"(False)検査結果で置き換えることができます。 - 条件付き値は、IsNil および IsNil.Not プロパティの出力を使用して、論理値に変換することもできます(バージョン4.8以前では、TestObjectNotNil および TestObjectNil フィルタで同じことができました)。
- 条件付き値が配列に現れる場合、つまり条件付き出力を持つフィルタが配列モードで実行される場合、RemoveNils フィルタを使用して、Nil を除いたこの配列のコピーを作成できます。
- [高度な] 時には、条件付き値がいくつかのイテレーションでのみ Nil が表示される タスク があります。 最新の非 Nil 値を返すことに興味がある場合、非条件付きのマクロフィルタ出力に接続すると、それが行われます(LastNotNil フィルタを使用する別のオプションもあります)。
- 別の可能性は、条件分岐入力を持つバリアントマクロフィルタを使用し、厳密に2つのバリアントがあるようにします。「Nil」は Nil の場合に実行され、「デフォルト」は他のすべての値の場合に実行されます。
例
条件付き実行は、「Capsules」例の簡略化されたバージョンで説明できます:
他の条件付き実行の代替手段
分類
条件付きで処理されるオブジェクトが配列に属する場合、バリアントマクロフィルタや条件付き接続を使用せず、Classify グループの分類フィルタを使用することがお勧めです。 これらのフィルタの各々は、入力として配列を受け取り、それを基準にして要素をいくつかの配列に分割します。
特に、ClassifyByRange フィルタは、数値的な特徴の抽出値に基づいてオブジェクトを分類する際に非常に便利です。
条件付きの選択
最も単純なケースでは、Choose グループのフィルタ(ChooseByPredicate、ChooseByRange、ChooseByCase)や、式ブロック内の三項 <if> ? <then> : <else> 演算子を使用して値を条件付きで計算することもできます。