componentTagをメッシュにセットする

以前にデフォーマーに対して使用するcomponentTagをセットする方法はわかったんですが

https://qiita.com/9boz/items/9bfc55abec479c286e96

んじゃぁ、メッシュに対してcomponentTagをセットする方法はあるのだろうかと

再観察
-

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/5f68f50c-ccb3-e0b1-7ed5-40d12a3545c4.png)

上が名前で、下がコンポーネントなんでしょうね

とりあえずアトリビュートエディタから作ってみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/d7ff0744-925f-c3f7-b8bf-3def3c047dd9.png)


とりあえずgetAttr
-

```
cmds.getAttr("pSphereShape1.componentTags[0].componentTagName")
# Result: moge # 
```
こっちはstringっぽいですね

```
cmds.getAttr("pSphereShape1.componentTags[0].componentTagContents")
# Result: ['vtx[240:259]'] # 
```
こっちは・・・list?


```
cmds.getAttr("pSphereShape1.componentTags[0].componentTagName",type = True)
# Result: string # 
cmds.getAttr("pSphereShape1.componentTags[0].componentTagContents",type = True)
# Result: componentList # 
```
componentList　だそうです。


componentList
-
ちょっと初めての相手ですが、setAttrできるかしら？

まずは素直にsetAttrしてみる
```
cmds.setAttr("pSphereShape1.componentTags[0].componentTagContents",['vtx[240:259]'])
# Error: RuntimeError: file <maya console> line 1: setAttr: 'pSphereShape1.componentTags[0].componentTagContents' is not a simple numeric attribute.  Its values must be set with a -type flag. # 
```

え？じゃぁこう？
```
cmds.setAttr("pSphereShape1.componentTags[0].componentTagContents",['vtx[240:259]'],type = "componentList")
# Error: RuntimeError: file <maya console> line 1: setAttr: Error reading data element number 1: ['vtx[240:259]'] # 
```

チャンと確認する
-

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

>コンポーネントの可変長配列
>値の構文	int {string}
>値の意味	numberOfComponents {componentName}
>MEL の例	setAttr node.componentListAttr -type componentList 3 cv[1] cv[12] cv[3];
>Python の例	cmds.setAttr('node.componentListAttr',3,'cv[1]','cv[12]','cv[3]',type='componentList')

('A)なるほどなー　（わかりづれぇ・・・・）

3 っつーのが多分後に続く引数の数　かな？
そう仮定するとこんな感じか
```
cmds.setAttr("pSphereShape1.componentTags[0].componentTagContents",1,'vtx[240:259]',type = "componentList")
```
お　通った。

とーなるとーこんな感じで選択した物を登録でどうだろかー

```python
selects = cmds.ls(sl =True)
target = "pSphere"

components = []
for select in selects:
    components.append(select.split(".")[-1])

cmds.setAttr(target+".componentTags[0].componentTagContents",len(components),*components,type = "componentList")
# Error: RuntimeError: file <maya console> line 8: setAttr: No object matches name: pSphere.componentTags[0].componentTagContents # 

```

ん？なるほどではこうか

```
selects = cmds.ls(sl =True)
target = "pSphereShape1"

components = []
for select in selects:
    components.append(select.split(".")[-1])

cmds.setAttr(target+".componentTags[0].componentTagContents",len(components),*components,type = "componentList")
```

ok　登録できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/904246a3-eeb3-43b2-616f-a9582c5220c1.png)

もうすこしましにしたい
選択した物を追加できるように
tagNameはstringで指定できるように
tagNameが無い場合は新規追加できるように

```python
def setComponentTag(target,tagName,components):
    
    ##target がshapeかどうかチェック
    if "shape" not in cmds.nodeType(target,inherited=True):
        shapes = cmds.listRelatives(target,ad =False,type = "shape")
        
        if shapes == None:
            return
            
        target = shapes[0]

    ##現在のtagNameとindexを取得
    indexes = cmds.getAttr(target +".componentTags", mi = True)    
    tagNames = []
    for i in indexes:
        tagNames.append(cmds.getAttr(target+".componentTags[0].componentTagName"))
    
    ##目的のtagNameが存在しない場合は追加
    if tagName not in tagNames:
        cmds.setAttr(target+".componentTags["+str(indexes[-1]+1)+"].componentTagName",tagName,type = "string")
        tagNames.append(tagName)
        indexes.append(indexes[-1]+1)
    
    ##ほんでsetAttr
    componentsOpt = []
    for component in components:
        componentsOpt.append(component.split(".")[-1])

    index = indexes[tagNames.index(tagName)]
    cmds.setAttr(target+".componentTags["+str(index)+"].componentTagContents",len(components),*componentsOpt,type = "componentList")

tareget = "pSphere1"
tagName = "hoge"
components = cmds.ls(sl =True)
setComponentTag(target,tagName,components)
```

まぁこんなとこでしょうかね。
あとは
- componentTagContentsの内容を　replace or update とか？

まぁアトリビュートエディタのUI使えばいいんですがね。
一括で色々やるんであればスクリプトで処理したいなぁと