Python」タグアーカイブ

TDで、OPの名前を処理する方法

概要

Pythonで、OPの名前”base1″の数字やベース名を抽出したり、OPの名前を生成する方法。
OPの名前から数字(連番)をスクリプトから取得することで、繰り返し処理などが効率化できます。

サンプルファイル

https://github.com/arkwknsk/touchdesigner/tree/master/tips/op-name

OPの名前から連番を取得する方法

d = op('base1').digits
print(d) # 1

ここでは、digitsを使って、base1の連番を抽出しています。

OPの名前を生成する方法

TDF = op.TDModules.mod.TDFunctions
name = TDF.incrementStringDigits('foo',2)
print(name) #foo2

TDの標準ライブラリのincrementStringDigitsを使います。2個目の引数に、くっ付けたい数字を指定します。

OPの名前から連番前の文字列を取得する方法

b = op('base1').base
print(b) #base

baseを使って、連番前の文字列を抽出します。正規表現を書くより楽です。

Please follow and like us:

TDで、スクリプトからConstant CHOPを書き換える方法

概要

Constant CHOPを参照するのと同じ形で値を変えようとするとエラーになるが、書き換えられる方法。

サンプルファイル

https://github.com/arkwknsk/touchdesigner/tree/master/tips/rewrite-upconstant-chop

Pythonコード

import random
op('constant1').par.value0 = random.uniform(0,100)

ここでは、1constant12text1のスクリプトから書き換えています。

chop_op.par.value0の形でアクセスすることで、値を書き換えられます。chop_op[0] = 1234 の形でアクセスするとエラーになります(Read Only)。

実行タイミング

最後に、このやり方で実行のタイミングはどうなるかを検証。結論は、同フレーム内で処理されるので安心です。

3text2のスクリプトから1constant1を書き換え、その変更で4chopexec1が実行されるサンプルを実行します。各実行タイミングでFrame数を出力しています。

import random
print( absTime.frame)
print( op('constant1')[0])
op('constant1').par.value0 = random.uniform(0,100)
print( op('constant1')[0])

4chopexec1で最後のFrame数を出力します。

def onValueChange(channel, sampleIndex, val, prev):
	print( absTime.frame)
	return

3text2のスクリプトから1constant1を書き換え、その変更で4chopexec1が実行されるサンプルを実行します。各実行タイミングでFrame数を出力しています。

実行結果は以下です。

python >>> 
29169
9.247329711914062
54.78358840942383
29169
python >>> 

2行目で、最初のFrame数を出力。3行目で、古い値が表示されています。4行目で書き換わった値を1constant1から参照して出力しています。ということは、同スクリプト内で書き換えた値を再び参照できるようです。最後に、4chopexec1の実行タイミングのFrame数を出力しています。最初のFrame数と同じなので、同フレーム内で実行されていることを検証できました。

余談

スクリプトの計算結果から、CHOPのノードで処理するときに便利です。また、スクリプトの計算結果を環境変数にして、各ノードの設定を決めるのにも便利です。

スクリプトから、Table DATを更新して、CHOPに流し込む方法もありますが、ノードの数が増えてしまいます。

Please follow and like us:

TouchDesignerでPythonからOPを作成する

例えば、Table DATをPython スクリプトから生成する場合

parent().create(tableDAT,'foo')

COMP.create

create(OPtype, name, initialize=True) 

OPType に、作成したい OPのclassを入れると OPの種類を指定できます。

Replicator COMPからではなく、OPを作成したいときに便利です。

Please follow and like us: