componentTagをデフォーマーにセットする

2022から追加された　componentTag
アトリビュートエディタ以外からの編集方法がよくわからなかったので、
とりあえず自前で何とかしてみようかと

観察
-

アトリビュートエディタで足して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/216d38c0-f56f-26b9-010e-308dbbd302b9.png)

わかりやすくアトリビュートがおりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/abd4267c-3c7c-8257-9ce4-b0bb9e8e0477.png)

デフォーマーの方は
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/b96bd3b1-608e-a356-d2a9-d151ea01e4d5.png)

あー多分こいつだな
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/6655a502-3a27-226a-d14f-708afec087ff.png)

inputのindexと、outputGeometryのindexは一致してるのかしら？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/e0926151-8d5f-735c-7b91-7a8a4bd965ba.png)


とりあえずやってみる
-

デフォーマーの影響下にあるシェイプのcomponentTagを任意の物に指定したい。

ので

- オブジェクト名からデフォーマー内のinputのindexを特定
- input/componentTagExpression に　任意のcomponentTagをセットする

という感じで。

オブジェクト名からデフォーマー内のinputのindexを特定
-

安易に考えると、 
listConnections で outputGeometory の先を確認するか、　
input[n].inputGeometory でソースを取ってlistRelativesとか
なんですが


安易だった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/8b0e0c40-fd45-0fab-e5bd-cd8986f8779d.png)

このようなケースの場合
outputGeometory だと ffd1の場合は探せない
inputGeometory だと ffd2の場合は探せな

一旦リファレンス確認

https://help.autodesk.com/cloudhelp/2022/JPN/Maya-Tech-Docs/CommandsPython/deformer.html

ん～
```
cmds.deformer(deformer,q =True,g=True)
```
これで対象のshapeは取れそう

indexはこっちかな？
```
cmds.deformer(deformer,q =True,gi=True)
```


```python
def setComponentTagExp(target,deformer):
    index = cmds.deformer(deformer,q =True,gi=True)
    outputShapes = cmds.deformer(deformer,q =True,g=True)

    for i,outputShape in zip(index,outputShapes): 
        outputTransform = cmds.listRelatives(outputShape,p=True)[0]

        if outputTransform != target:
            continue
        print(target)
        print(str(i))
```

こんな状態でテスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/efb25cf5-e8c9-2580-3684-4157df1e753b.png)

```python
setComponentTagExp("pSphere3","ffd1")
##pSphere3
##6
```

多分大丈夫
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/9ac04a48-9ed2-7c46-9160-ae7145d610b5.png)

input/componentTagExpression に　任意のcomponentTagをセットする
-

componentTagExpression はシンプルにstringなようなので

```python
def setComponentTagExp(target,deformer,tagExp):
    index = cmds.deformer(deformer,q =True,gi=True)
    outputShapes = cmds.deformer(deformer,q =True,g=True)

    for i,outputShape in zip(index,outputShapes): 
        outputTransform = cmds.listRelatives(outputShape,p=True)[0]

        if outputTransform != target:
            continue
    
        cmds.setAttr(
                deformer+".input["+str(i)+"].componentTagExpression",
                tagExp,
                type = "string"
        )
```

実行してみる
```
setComponentTagExp("pSphere3","ffd1","hoge")
```

hogeったー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/4db86ef4-0388-4e74-f2c7-81821d5063ab.png)

tagによる影響範囲も機能してるっぽい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/5fd64de9-80e0-edef-91ce-17b3fac78c89.png)

まとめ
-

- 正規のやり方・コマンドないのかなぁ・・・きっとあるはず
- こんぽーねんとたぐぅ？？　とか思ってましたが、これはこれで便利な気がしてきた