【TouchDesigner】本当に教えたい！！かゆいところに手が届くメモ

# 挨拶
[WOW inc.](https://www.w0w.co.jp/)でプログラマーをしています。
[落合陽一×日本フィルハーモニー交響楽団プロジェクト VOL.7《帰納する音楽会》](https://japanphil.or.jp/concert/20230823)のシステムの開発などで小ワザ的な知見が貯まったので共有します！

https://twitter.com/wow_tokyo/status/1693899077648568648


# 1. Performモード時のウィンドウの名前を変更
:::note info
複数のTDプロジェクトを立ち上げてPerformモードで運用している時に役立ちます。
:::
[刻みTD](https://qiita.com/shks/items/656186c5127869bfbe84)までいかないにしても、複数のプロジェクトファイルを立ち上げてタイトルバーが全部`/perform`だとわかりにくい時があると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/3d76f78c-2089-237b-0023-4a922bf8750e.png)

### 追記 2023/11/1
![Screenshot 2023-11-01 002124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/d36fa82b-88f2-8e16-78ba-9e203204fffe.png)
以下のことをしなくても、`Window COMP`の`Title`というパラメータにつけたい名前を入力するとタイトルバーの名前を変更できました。

追記終わり

---

TDファイルの一番上の階層にある`Window COMP`の名前を`perfom`から変更します。この状態で`F1`を押してPerformモードにしようとするとエラーが出るので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/0e4a01a5-bde3-2437-42d3-008f1d449c45.png)
左上の`Dialog -> Window Placement`を開いて、`Path`が変更後の名前になっていれば`F1`を押してもエラーが出なくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/ef79c6ff-c509-2cdb-8ddc-a01d38f23b82.png)
また、プロジェクト内に他の`Window COMP`があれば、Performモードで開く`Window COMP`を選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/ef60604d-0a19-c964-affa-c22869d8b00c.png)

# 2. パラメータのexperession小ワザ集

## 2-1. File Suffix
:::note info
連番png書き出しなどで、自動でナンバリングしながらファイル保存したい時に役立ちます。
:::
`Movie File Out TOP`のデフォルトの`me.fileSuffix`より自由が効くようになります。
詳しくは[【TouchDesignerドキュメント：moviefileoutTOP Class】](https://docs.derivative.ca/MoviefileoutTOP_Class)へ。

`File`パラメータの`expression`に
```python
'Path/name_take' + str(me.writeCount) + '_frame' + str(me.curSeqIndex).zfill(5) + '.' + str(me.par.imagefiletype)
```
と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/b496823a-a557-e606-6915-e9c031fac704.png)

`Path/name_take0_frame00000.png`, `Path/name_take0_frame00001.png`, …と書き出されていきます。`me.writeCount`のとこには、書き出しのテイク数が入ります。

`Path`で指定しているフォルダがないと保存されないので気をつけてください。


## 2-2. digits系
:::note info
Replicatorとかで番号に合わせてパラメータを変化させたい時に役立ちます。
:::
`me.digits`, `parent().digits`はよく使うと思います。
例えば`cam1_xx_yy`の`1`を取り出す場合は、`me.name.split('_')[0:][0][3]`とすると良いでしょう。
詳しくは[【Pythonドキュメント：str.split】](https://docs.python.org/ja/3/library/stdtypes.html?highlight=split#str.split)へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/3ba6f0ba-1a58-77eb-5672-422ae7e6af9c.png)

# 3. OP Find DATでオペレーターの位置を参照してソートする
:::note
SceneChangerで切り替えたい`COMP`を集めるとか、並び順が大事な時に役立ちます。
:::

`Palette -> UI -> Basic Widgets`の`buttonRadio`の`Layout/Align Order`に潜んでいたりするのですが、TouchDesignerのオペレーターはネットワークエディタ上の位置情報を持っています。
詳しくは[【TouchDesignerドキュメント：OP Class / Appearance】](https://docs.derivative.ca/OP_Class#Appearance)へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/cbbca24e-d60d-a3c4-9007-d77863d0d209.png)
この`nodeX`, `nodeY`を使います。
`OP Find DAT`にソートしたいパラメータの追加方法は、コールバック内に簡単に説明が書いてあります。
詳しくは[【TouchDesignerドキュメント：opfindDAT Class】](https://docs.derivative.ca/OpfindDAT_Class#Callbacks)へ。

Y座標でソートしたい場合、コールバックに以下のように記入し、
```python
def onInitGetColumnNames(dat):
	return ['nodeY']

def onFindOPGetValues(dat, curOp, row):
	return [curOp.nodeY]
```
`Select DAT`を繋ぎ`nodeY`でソートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/ad0115f3-226b-8660-5fde-e7645bad10ec.png)


# 4. Select DATで文字入ってるセルだけ取得
:::note
`Select DAT`で文字入ってるセルだけ取得したい時に役立ちます。
:::
`Select DAT`の`Select Rows/Cols`で`by Values`を選択し、`*?`とします。
詳しくは[【TouchDesignerドキュメント：Pattern Matching】](https://docs.derivative.ca/Pattern_Matching)へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/325d049c-f060-0d3c-a812-85b7b418e16d.png)


# 5. 超便利なSearch機能
:::note
「これどこで参照してるっけ…？」てなった時に役立ちます。
:::
限られた時間で組み上げたシステムの階層が深く複雑になればなるほど、依存関係がコントロールできなくなることがあると思います。
パラメータのexpressionでも、DATに書いたコードでも、オペレータの名前でも検索結果に表示してくれます。
ショートカットは`F3`。
詳しくは[【TouchDesignerドキュメント：SearchReplace Dialog】](https://docs.derivative.ca/SearchReplace_Dialog)へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144702/18d58c3d-c8e0-997b-bcb4-45f60869180a.png)


# 結び

以上です！