Custom Compでイベントを使う方法。依存性を下げたCustom Compを実装するのに便利でです。
TouchDesignerでは、CallbackExt
というPython callback systemを使って実装します。詳細は、公式ドキュメントに記載されています。
TouchDesigner公式ドキュメント callbacksExt Extension
TouchDesigner公式ドキュメント CallbacksExt Examples
OP同士をネットワークでつないでいくよりも、よりコードベースでComp同士を連携でき、Base COMP
もしくはtox単位での開発がしやすくなります。
サンプルファイル
Custom Compへのライブラリの追加方法
Custom Compに、TouchDesignerが用意しているライブラリをcomponent's Extension Object
へ追加することで実現できます。
ここでは、イベント処理機能を持ったuserComp
というCustom Compの作り方を説明します。
userComp
というBase Comp
をつくります。
userComp
の中に入り、Select DAT
を追加。DATの名前をCallbacksExt
に変更します。この名前は、別なもにはしないでください。
追加したSelect DAT
のプロパティの、「Select」→DAT
をexpressionモードに変更し、以下のexpressionを入れます。
op.TDModules.op('TDCallbacksExt')
すると、Select DAT
に、TDCallbacksExt
というTouchDesignerが用意しているクラスが参照されます。
このコードをuserComp
に登録します。
1つ上の階層に戻り、userComp
のプロパティを表示し、「Extensions」>
Objectパラメータを
op('./CallbacksExt').module.CallbacksExt(me)
と設定します。
TDCallbacksExt
に、外部(userComp
ではないCompもしくはDATなど)からアクセスできるようにするには、PromoteパラメーターをOn
にします。
TDCallbacksExt
がデフォルトで参照するパラメーターを追加します。userComp
のComponent Editorを表示します。(userComp
を選択、右クリック > Custoimize Componentを選択)
「Custom Parameters」で、userComp
ページを作成します。
続いて、次の表のようなパラメーターをつくります。
parameter | style | |
---|---|---|
Callback DAT | DAT | |
Print Callbacks | Toggle | |
Toggle | Toggle | ※ |
String | Toggle | ※ |
Pulse | Pulse | ※ |
※「イベントハンドラーの設定」で使用するパラメーターなので、実際の実装では必須ではない。
設定するとuserComp
のプロパティは次のようになります。
CallBackの設定
ここでは、Custom Compで発火したイベントを受け取って処理するCallBack(イベントハンドラー)の設定の仕方を2種類説明します。引き続き、👆でつくったuserComp
に追加する形で説明してきます。
1. Callback DATを使う方法
userComp
の中に入り、Parameter Execute DAT
を追加します。
プロパティ→「Parameter Execute」のパラメーターを次のように設定します。
parameter | value |
---|---|
OPs | .. |
Parmeters | * |
Built-in | Off |
Parameter Execute DAT
を編集して、次のコードに書き換えます。
def valueChange(par, val, prev):
infoDict = {'parameter': par, 'value': val, 'previousValue': prev}
parent().DoCallback("onParChange", infoDict)
useComp
に設定したCustom Parameterが更新されると、valueChange
というメソッドが実行(call)されます。
infoDict
は、CallBack(イベント受信)側に、変更後・前のパラメーター値などを渡すためのペイロードです。
DoCallback()
が、イベント発火のためのメソッドになります。ここでは、イベント名をonParChange
としています。
最後に、CallBack関数をつくります。上の階層に戻り、Text DAT
を追加します。
このDATに、以下のコードを入力します。
def onParChange(info):
debug("PAR CHANGE:", info['parameter'].name, info['value'])
useComp
のCallback DAT
で、このDATを指定します。
useComp
のToggleパラメーターのON/OFFを切り替えると、Textportに次のようなログが出力されます
PAR CHANGE: Toggle on (Debug - DAT:/project1/example1 fn:onParChange line:2)
onParChange - callbackInfo:
{ 'parameter': type:Par name:Toggle owner:/project1/userComp value:True,
'value': 'on',
'previousValue': 'off',
'ownerComp': type:baseCOMP path:/project1/userComp,
'callbackName': 'onParChange',
'returnValue': None}
(Debug - DAT:/project1/userComp/CallbacksExt fn:DoCallback line:206)
1行目は、Text DAT
かれ出力され、2行目以降はPrintCallbacks
パラメーターがON
の場合に、TDCallbacksExt
から出力されるログです。
2.コードだけでCallBackを追加する方法
useComp
の中に入り、parexec1 DAT
で、以下のコードを書き換えます。
def onPulse(par):
infoDict = {'parameter': par}
parent().DoCallback("onPulse", infoDict)
ここでは、onPulse
イベントが発火されています。
1つ上の階層に戻り、Text DAT
を追加します。DAT
に以下のコードを追加します。
def printPulse(info):
print("PAR PULSE:", info['parameter'].name)
op('userComp').SetAssignedCallback('onPulse', printPulse)
printPulse()
は、イベントを受信後、実行されるメソッド(関数)です。最後の行のSetAssignedCallback()
で、onPulse
イベントに、printPulse()
をコールバックとして割り当てています。
onPulse
イベントがDoCallback()
で発火されると、printPulse()
が実行される流れです。
他の開発環境、コードに慣れ親しんでいる方には、わかりやすい方法ではありますが、CallbacksExt
が定義されているCompが初期化されると、コールバックのアサインが解除されるという問題点があります。そのため、何らかの方法で再アサインする必要があります。この点は、ぜひ改良して欲しい。