🗄️

【TouchDesigner】Storageの使い方

に公開

TouchDesignerのStorageの使い方について紹介します。

https://derivative.ca/UserGuide/Storage
https://derivative.ca/UserGuide/OP_Class#Storage

Storageはどの種類のオペレータでも利用できるPythonの辞書型オブジェクトで、任意の型の値をKey-Value形式で保持することができます。Storageに設定した値はtoeファイルに保存されるので、ファイルを開き直しても値が保持されます。

Storageの実態はOPクラスが持つstorage変数で、以下のように使用することができます。

# 値の設定
op('base1').storage['foo'] = 'bar'
# 値の取得
print(op('base1').storage['foo'])

直接storage変数にアクセスすることもできますが、Storageを扱いやすくするメソッドが用意されています。

storeはStorageに値を設定するメソッドで、storeにより値を更新するとエクスプレッションなどでこの値を参照しているオペレータは自動で再Cookされます。

# storeによる値の設定、依存しているオペレータが再Cookされる
op('base1').store('foo', 'bar')

fetchはStorageから値を取得するためのメソッドで、キーが存在しないときに上位階層のオペレータのStorageを再帰的に探索するほか、キーが存在しない場合に返されるデフォルト値を指定することができます。

# fetchによる値の取得
op('base1').fetch('foo')
# 第2引数でキーがない場合のデフォルト値を指定する
op('base1').fetch('foo', 'bar')
# storeDefault=Trueにするとキーがない場合にデフォルト値を保存する
op('base1').fetch('foo', 'bar', storeDefault=True)
# search=Falseで上位の階層に再帰的に探索しないようにする
op('base1').fetch('foo', search=False)

もしプロジェクトを開き直したときにStorageの値を初期化したい場合はstoreStartupValueで初期値を指定しておきます。解除するにはunstoreStartupValueを利用します。

# 初期値の指定
op('base1').storeStartupValue('foo', 'bar')
# 初期値の解除
op('base1').unstoreStartupValue('foo')

Storageの値はExamine DATで確認することができます。

https://derivative.ca/UserGuide/Examine_DAT


一見便利そうなStorageですが、プロジェクトファイルの再起動をまたいで値を保持したいことがほぼなく、個人的にはほとんど使うことはありません。

ずっと昔に書いた記事でStorageを使った状態管理について紹介しましたが、状態管理だけであればExtensionsを使うことが多いです。
https://qiita.com/aa_debdeb/items/562c4da5e8b8c1d1a424

プロジェクトファイルの再起動をまたいで値を維持するにはExtensionsで状態管理していてもStorageを使う必要がありますが、ExtensionsからStorageを使う場合にはStorageManagerというクラスを利用します。

https://derivative.ca/UserGuide/StorageManager_Class

Discussion