0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[TouchDesigner] Custom Compでイベントを使う!:CallbacksExtの導入ガイド

Last updated at Posted at 2024-10-06

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の中に入り、1Select DATを追加。DATの名前をCallbacksExtに変更します。この名前は、別なもにはしないでください。

callbacks-ext_00.jpg

追加したSelect DATのプロパティの、「Select」→2DATをexpressionモードに変更し、以下のexpressionを入れます。

op.TDModules.op('TDCallbacksExt')

すると、Select DATに、TDCallbacksExtというTouchDesignerが用意しているクラスが参照されます。

このコードをuserCompに登録します。

callbacks-ext_01.jpg

1つ上の階層に戻り、userCompのプロパティを表示し、「Extensions」> 3
Objectパラメータを

op('./CallbacksExt').module.CallbacksExt(me)

と設定します。

TDCallbacksExtに、外部(userCompではないCompもしくはDATなど)からアクセスできるようにするには、4Promoteパラメーターを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の中に入り、5Parameter Execute DATを追加します。

callbacks-ext_06.jpg

プロパティ→「Parameter Execute」の6パラメーターを次のように設定します。

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関数をつくります。上の階層に戻り、7Text DATを追加します。

callbacks-ext_07.jpg

このDATに、以下のコードを入力します。

def onParChange(info):
	debug("PAR CHANGE:", info['parameter'].name, info['value'])

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?