接続

前に読む:データフロープログラミングへの導入

イントロダクション

一般的に、プログラム内の接続は、互換性のあるタイプの入力および出力間で作成できます。ただし、これはタイプが完全に等しい必要はないことを意味します。 転送されるデータ値を自動変換、配列分解、ループ、または条件によって適応できる場合、異なるタイプのポートを接続できます。 このドラッグアンドドロップのプログラミングモデルの強力さは、ユーザーが接続をドラッグし、すべてのロジックが暗黙のうちにdo what I meanの基礎で追加されるという点にあります。

接続ロジック

これはおそらくAurora Visionプログラミングモデルの最も複雑な部分であり、その計算の柔軟性の大部分を集中させています。アプリケーションが自動的に行うため、接続ロジックを明示的に定義することはありませんが、それについて考える必要があります。

接続ロジックには5つの基本的なタイプがあります:

  1. 基本的な接続
    T T
    この種の接続は、同じタイプのポート間で表示されます。
  2. 自動変換
    A B
    ユーザーが異なるタイプの2つのポートを接続し、IntegerReal のような適切なフィルタがConversionsカテゴリに存在する場合、例:IntegerToReal、値を変換するために自動変換が使用されます。
  3. 配列接続
    TArray T
    このロジックは、配列からスカラータイプへの接続に対して暗黙のうちにループを作成し、例えば RegionArray から Region への接続です。その結果はすべて配列に統合され、したがって2番目のフィルタの出力も配列に変わります(詳細は Arraysを参照)。

    配列接続の例(各ブロブの面積を計算)。

  4. シングルトン接続
    T TArray
    逆に、スカラータイプの出力が配列入力に接続される場合、例:Point2D から Point2DArray への接続、シングルトン接続は値を単一要素の配列に変換します。これは一部のフィルタのみで機能します。
  5. 条件付き接続
    T? T
    最後の接続タイプである条件付き接続は、条件付きデータ(T?)が非条件付き入力(T)に転送されると発生します。これにより、値が実際に存在するかどうか(存在しない場合は NIL)に応じて2番目のフィルタが条件付きで実行されます。その結果、フィルタの出力は対応する条件付き出力に変更され、連続するフィルタも条件付きで実行されることが保証されます。このトピックの詳細については、 条件付き実行セクションを参照してください。

    条件付き接続の例(2つのセグメントの交点が存在しない場合があります)。

異なる接続タイプの組み合わせ

最大の柔軟性のために、上記のロジックの多くの組み合わせが現れることがあります。再度、これは常に自動的に推論されます。

  1. 変換付き条件付き接続
    A? B
    オブジェクトが存在する場合、変換されて入力ポートに渡されます。存在しない場合、フィルタは呼び出されません。
  2. 変換付き配列接続
    AArray B
    入力配列のすべての要素が個別に変換されます。
  3. 条件付き配列接続
    TArray? T
    条件に応じてすべての配列要素が処理されるか、なし – 条件に応じて出力は条件付き配列タイプになります。
  4. 変換付き条件付き配列接続
    AArray? B
    すべての配列要素が条件に応じて個別に処理および変換されるか、なし – 条件に応じて出力は条件付き配列タイプになります。
  5. 条件付き要素の配列接続
    T?Array T
    2番目のフィルタは各配列要素に対して条件付きで呼び出され、出力タイプは条件付き要素の配列になります。
  6. 変換付き条件付き要素の配列接続
    A?Array B
    上記に加えて変換も行われます。
  7. 変換付きシングルトン接続
    A BArray
    変換された入力値から単一要素の配列が作成されます。
  8. 条件付きシングルトン接続
    T? TArray
    オブジェクトが存在する場合、単一要素の配列に変換されます。存在しない場合、2番目のフィルタは呼び出されません。
  9. 変換付き条件付きシングルトン接続
    A? BArray
    オブジェクトが存在する場合、変換されて単一要素の配列に変換されます。存在しない場合、2番目のフィルタは呼び出されません。

各個別の接続ロジックは、C/C++の制御フローパターンの1つの具現です。たとえば、条件付き要素の配列接続は次の基本的なコード構造に対応します:


for (int i = 0; i < arr.Size(); ++i)
{
    if (arr[i] != atl::NIL)
    {
        ...
    }
}

型との作業

上記のように、型定義はプログラムロジックに強い影響を与えることがあります。このため、既存のプログラムでそれらを変更する場合は、特にすべての配列と条件を正しく定義するように注意を払う必要があります。 この問題は、次の場所で発生します:

  • マクロフィルタの入力および出力
  • 数式ブロックの入力および出力
  • ジェネリックフィルタをインスタンス化するとき

ミスの場合、プログラム内で不正確な接続が発生する可能性があります(赤でマークされます)、ただし、一部の厄介なミスは自動的に検出されない場合があります。