[ #TouchDesigner ] Replicator COMP を自在に使えるようになりたい記事

# Replicator COMP

オペレータを複製するために使うオペレータ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/46d67cba-797b-22f2-445a-e11e648e611e.png)


UI構築やデータからのオペレータ自動生成を簡易にするために用いられます

## How to Use

1. 複製したいオペレータ(Master Operater) を設定
1. 複製方法を選択（TableDAT or 数値入力）
1. Operator Prefixで複製されるオペレータの名前を指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/3fc29d60-9631-5dae-764f-1e4d57c639b5.png)


### 複製方法 (Replication Method)

複製方法は

- DAT（Table）から指定
- 数値で指定

の２種類があります

#### DATから複製する

- Template DAT Table
    - 複製数などを決めるDATの指定
- Name from Table
    - 複製されたオペレータの接尾語の付け方の設定
    - デフォルトだとDATの行番号
- Ignore First Row
    - 最初の行を無視するかどうか、ヘッダーに情報を持っている場合などには無視しないほうが良（'name'とか'path'とか持っているとき）

#### 数値で指定
- Number of Replicants
    - 複製数を整数で指定
    - 特定のCHOPの長さなどを参照すると良
- Replicant Suffix Start
    - 接尾後の数値の開始番号

### Maximun Operators

複製されるオペレータ数の上限値

APIや外部データを元にオペレータを複製する際に、想定以上の大量のデータが来ることは多々ありまう。
そのようなとき時に（例えば、10万行のデータのDAT）全てを複製してしまうとパフォーマンスに甚大な影響が出てしまします。
入力のDATや数値を事前に処理して必要な物だけを抜け出す処理は必要ですが、複製数の上限を設定してあげることで予期せぬ処理落ちやクラッシュなどを防ぐことができます。

### Layout

複製したオペレータのレイアウトの設定

- Off 一箇所に複製される
- Horizontal　横並び
- Vertical　縦並び
- Grid　グリッド
+ Layout Origin 
    + レイアウトの基準点、最初に複製されるオペレータの位置、この位置からレイアウトがされる


### Destination

複製するオペレータのできる階層の指定
特定のCompの中に生成するなどができる
参照切れなどに注意！

### Incremental Update

１Frameに複製する数
複製時の処理落ちを回避できる

### 

### Callbacks DAT

``` default_callback.py
def onRemoveReplicant(comp, replicant):
	replicant.destroy()
	return

def onReplicate(comp, allOps, newOps, template, master):
	for c in newOps:
		#c.display = True
		#c.render = True
		#c.par.display = 1
		#c.par.clone = comp.par.master
		pass
	return
```

オペレータが複製される時などに呼び出される関数

#### onReplicate

オペレータの複製時に呼び出される

| arg | 中身 |
|:-:|:-:|
|comp|複製をするreplicatorCOMP|
|allOps|  複製されたすべてのオペレータ |
|newOps|新規に複製されたオペレータ|
|template|テンプレートDAT|
|master|複製元のオペレータ|

新規に作り出されたオペレータにだけ処理をかけたりできる

```onReplicate.py
def onReplicate(comp, allOps, newOps, template, master):
	for c in newOps:
		c.par.display = 1 # 複製時にDisplayをオン、マスターオペレータは表示させない時とかに
		pass
	return
```

#### onRemoveReplicant

templateDATの行数などが変化して複製数が減った際にその分減るオペレータに対しての処理
デフォルトだと行数が減る時は対応する数だけオペレータが削除される
`replicant.destroy()` を削除することにより、自動的には削除されないようになる


### Clone

マスターオペレータを編集するたびにReplicatorCOMPのRecreateAllボタンなどを押すが手間な時などに使用

```clone.py
def onReplicate(comp, allOps, newOps, template, master):
	for c in newOps:
		c.par.clone = comp.par.master
		pass
```
Callback関数をでマスターオペレータをクローンオペレータに設定してあげることによって、マスターオペレータの変更がそのまま複製先でも同じく反映されます
CloneについてはWikiをお読みください
https://docs.derivative.ca/Clone

## Replicatorをもっと自在に使う

### parent().digits

複製されたオペレータで名前の末尾につく数値を取得することができる
例えばButtonCOMPを複製し、背景となるTextTOPのTextに`parent().digits`と入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/f9a5cfce-71ed-e04f-c9d6-f14a89724946.png)
そうすると背景には複製名の末尾の数字が表示されどのボタンなのかが一目瞭然となります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/471cb2e7-3d38-d442-45b0-e8e66f870cf4.png)

### select DAT

複製先でテンプレートDATの自分のインデックスの行を取得し、そこのデータを使う際にSelectDATが役に立ちます。
上記の`parent().digits`と併用し、行の選択をしてあげることで元となるDATから自分に必要な情報のみを取得できます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/9bef25bc-c596-8e6a-77d5-78d8c04a8bed.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/1a8690db-32cf-54f8-2ed7-b06b6b935860.png)


### select CHOP

ButtonCOMPなどを複製した時に全てのオペレータの出力を取得する際にCompのアウトからMergeなどに繋ぐことが多いと思います
↓ こんな感じ
![Screen Shot 2021-12-14 at 13.43.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/f370a464-0f54-33e0-5ac1-43fca8f8f4c7.png)

しかし複製ごとに繋ぎ直さなくてはならなかったり、Callback関数でConnectorsをごにょごにょして自動で繋いであげる処理を書いてあげるなど結構手間が掛かってるかと思います。
そんな時に便利なのがSelectChopです
パラメータのCHOPに `item*/out1` と記述してあげるだけでitemと名のつくオペレータが持つout1というCHOPを取得することができます

![Screen Shot 2021-12-14 at 13.47.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175399/b6e39b12-78bb-bbbe-c683-ab4a58c01be2.png)

この記述方法などは PatternMatching などを調べてみてください

https://docs.derivative.ca/Pattern_Matching


### execute DAT とか

executeDATの`onCreate()`を記述することにより、複製された際にScriptを走らせることができます。
またそれと同様にExtensionで拡張したCOMPを複製することにより生成時などにより柔軟に複製されたオペレータを扱うことができます

https://qiita.com/joe0hara/items/de0f91e8886c116504b3


## 最後に

replicator 使ってこんなツールが作りたいですね、、

https://derivative.ca/community-post/kazoe-nobuakis-sensational-and-highly-adaptive-devision-vj-system

結局は細部の作りこみとかなのでそれ以外の部分でいかにreplicatorとかで自動的に生成ししたりして楽ができるかが大事なんじゃないですかね