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が初期化されると、コールバックのアサインが解除されるという問題点があります。そのため、何らかの方法で再アサインする必要があります。この点は、ぜひ改良して欲しい。



