バージョン 2.3.0 で追加.
Blocks¶
Blocksとは、ユーザの用意したコードを、入れる器です。Blocksを使うことで、複雑なノードの実行様態をカスタマイズすることが可能です。さらには一歩踏み込み、自前のblockを組み込み動作するあたらしいプリセットを作成することもできます。
Blocks を伝統的なプログラミング言語でのループと同様な操作に使用することができます。とはいえBlocksにはより強力な点があります。Blocksでは条件判定に使用したり、複数のblockを状態に応じて異なる振舞をさせることができます。
参考として Fabric.Compounds.Blocks.Geometry.PolygonMesh.Deform
プリセット(タブメニューから PolygonMesh.Deform
としてアクセス)では、 mesh
ポートと deform
block の2つをとります。 deform
ブロックは deformation そのものです:
ノードをシフト+ダブルクリックし、blockの定義に入ります。より詳しくは以下を参照 block instance:
中を見ると blockインスタンスには、既定の定義があることがわかります。この場合、単に newPosition
のポート値を originalPosition
ポートへと設定しています。実際には何もデフォーム行いません。しかしここから定義に変更を加えていき、望みのデフォーム効果を形作っていくことができます。
blockインスタンスの定義とは、それぞれのデフォームノードに固有のものになります。つまり各デフォームノードに異なる変型を指定することができます。
「固定」Blockポート¶
blockインスタンスの中のポートで鍵アイコン付きのものを fixed block ports と呼びます。これらのポートはプリセットにより定義され(例の場合では Deforme
プリセット)ています。インスタンスで定義するものではありません。つまり名前の変更や追加、削除をインスタンスで行うことはできません。インスタンスが実行される時、プリセットから 固定inputポート, 固定IOポートが提供されそれらのポート値を受け取り、インスタンスの仕事を続行します。 Deform
プリセットの例では、 originalPosition
と originalNormal
の値がblockインスタンスに提供され、インスタンスは実行結果である newPosition
を Deform
プリセットに提供します。
公開Blockポート¶
Blockインスタン中において、グラフを機能させるため blockの外部へとポートを外部公開することができます。たとえば、デフォメーションを amount
ポート一個で単純な押出変型を定義します:
固定ポートで「ない」 amount
ポートに注目してください。これが公開blockポートです。公開Blockポートは通常のblockポート同様動作します。つまり同じ多態性についての規則 (see Polymorphic (多態性)ノード)に従います。ただしblockでは inputポートのみを外部公開とすることができます。 IOポートやoutputポートではできません。
“Back” ボタンを押し直前のグラフへと戻ると先ほど公開したポートを確認できます。
amount
が接続可能になっていることに着目ください。あたらしいblockインスタンスのヘッダーメニューからそのポートを作ることもできます。通常のノードのポートと一緒ですね。
Blockのあるノードの見方¶
素の状態では、blockインスタンスを一つ以上もつプリセットであれば、シフトを押しながらダブルクリックすることで blockインスタンスを編集できます。複数ある場合はマウス直下のインスタンスの編集になり、ノードの上方であれば、はじめのインスタンスを編集します。この挙動は、通常blockを用いたプリセットを使用している場合blockを編集したいであろうからです。ただし、ノード自身を見る(編集)ことも可能で、右クリックからコンテキストメニューを開き “Edit Node” を選びます。
Blocksのサンプル¶
Fabric は blocksの使用法に主眼おいた多数の用例を揃えています。 $FABRIC_DIR/Samples/Canvas/Blocks
を御覧ください。blockがどのようなものであるかの理解するにはこれらのサンプルシーンがどのようにして機能するかを調べることをお薦めします。
Blockプリセット¶
Fabric に同梱したプリセットには blockの利用に特化したものが多数あります。多くは Fabric.Compounds.Blocks
以下にあります。さらに、例に使用した PolygonMesh.Deform
プリセットなど、幾つかは以下の場所にあります:
Fabric.Core.Control.ForLoop
- 単純な直列(serial)ループです。各ループの繰り返し処理に
exec
ポートを引いてきます。 Fabric.Compounds.Blocks.Array.Filter
- ある配列の要素を条件に応じて除去します。条件は block として公開されます。
Fabric.Compounds.Blocks.Array.Modify
- 既存の配列から1対1対応したあたらしい配列を作成します。他のプログラミングシステムではこの種の操作を “Map” と呼ぶことがあります。
Fabric.Compounds.Blocks.Math.Accumulate
- 与えた繰り返し番号に基づき、値を新しい値に置き換えます。これは配列の作成や値の集計によく用いる操作です。他のプログラミングシステムではこの種の操作を “Fold” と呼ぶことがあります。
Fabric.Compounds.Blocks.Math.AccumulateWhile
Fabric.Compounds.Blocks.Math.Accumulate
とほぼ同じす。特定の条件(blockに公開)が真の間でのみ動作する点が違います。Fabric.Compounds.Blocks.Array.AnyElementMatches
- 配列要素の中に、blockのテストにマッチするものがあるかどうかをテストします。
Blockのカスタムグラフ・関数での使用¶
Blockはインラインもしくは公開プリセットであろうと、ユーザ独自のカスタムグラフ・関数において使用できます。詳しくは Canvasプログラミングガイドの Block についての章 を参照してください。