renderSetupで困った　続

前回のお話

https://qiita.com/9boz/private/6251656e3c5f6d521691

やっぱり不便なのでなんとかしたい。

referenceEditor から　referenceEditの削除を試みるも、反映されない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/3f876245-ea17-f3fc-2fbf-931870c597c5.png)


ではコマンドからではどうでしょうか？

https://qiita.com/9boz/items/86426041005b28ce945d

```python
import maya.cmds as cmds
refNode = "sampleAsset_v01RN"
targetCommand = "connectAttr"
refEdits = cmds.referenceQuery(refNode, editStrings=True,editCommand = targetCommand)

for line in refEdits:
    strings = line.replace("\"","").split(" ")
    if strings[0] == targetCommand:
        cmds.referenceEdit([strings[1],strings[2]],removeEdits = True,failedEdits =True, successfulEdits =True,editCommand = targetCommand)
```

.....うんともすんとも言いませんね。

一旦リファレンスをよみなおしてみます。

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

>ターゲット リファレンスをロードまたはアンロードしたかによって、結果が異なる場合があります

なるほど、よろしいではアンロードだ。

```python
import maya.cmds as cmds

refNode = "sampleAsset_v01RN"
targetCommand = "connectAttr"
refEdits = cmds.referenceQuery(refNode, editStrings=True,editCommand = targetCommand)
cmds.file(unloadReference = refNode)

for line in refEdits:
    strings = line.replace("\"","").split(" ")
    if strings[0] == targetCommand:
        cmds.referenceEdit([strings[1],strings[2]],removeEdits = True,failedEdits =True, successfulEdits =True,editCommand = targetCommand)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/85053ce2-ae5e-196f-b12d-8fd57bac6878.png)


消えた！完！

ということは、アンロード状態であればUIからでもいけるのでは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/5e312074-0b82-02e3-3b36-bd9e19509cf3.png)

あ、いけましたね。

まぁUIでもいけますが、スクリプトで処理してしまおうと思います。
その為に、念のための処理を施そうと思います。

- デフォルトレイヤーに戻す。  
- 事前にマテリアルのアサイン情報をリセットしたいメッシュに対して initialShadingGroup をアサインする。  
- そのうえで、referenceEditを取得し　除去する。  

もっと念を入れるなら

- initialShadingGroupの代わりに一時的にユニークな名前のマテリアルを作成

ですかね


実装
--

```python
def getReferenceNode(namespace):
    allRefFiles = cmds.file(q =True ,reference =True)
    
    for refFile in allRefFiles:
        refNode = cmds.file(refFile,q =True ,referenceNode = True)
        
        if namespace == cmds.file(refFile,q =True ,namespace = True):
            return refNode

    return None

def resetReferenceMTAsign(namespace,resetTargets):
    refNode = getReferenceNode(namespace)

    if refNode == None:
        return
    
    cmds.editRenderLayerGlobals(currentRenderLayer = "defaultRenderLayer")
    ##tmp asignMT
    for target in resetTargets:    
        if cmds.objExists(namespace + ":" + target):
            cmds.sets(namespace + ":" + target,e =True,forceElement = "initialShadingGroup")

    refEdits = cmds.referenceQuery(refNode, es=True)

    ##unloadRefernce
    cmds.file(unloadReference = refNode)

    for line in refEdits:
        if line.startswith("connectAttr "):        
            strings = line.replace("\"","").split(" ")  
            
            if strings[1].endswith("instObjGroups") and strings[2].startswith("initialShadingGroup"):
                cmds.referenceEdit([strings[1],strings[2]],removeEdits = True,failedEdits =True, successfulEdits =True,editCommand = strings[0])

    ##loadRefernce
    cmds.file(loadReference = refNode)
```

テスト

```pyhton

resetReferenceMTAsign("sampleAsset_v01",["pSphere1","pCube1","pCone1"])    

```

これが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/77c56f1c-2ae1-a629-56b7-5d880034557b.png)

こうなりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/ca0db6eb-13f7-8d57-49f2-0f9f652b3639.png)


--

アニメーションもリファレンスしてると、アニメーションもリロードするかシーンを開き直す必要があります。

リファレンスしている数が多いと、処理に時間がかかってしまうのでmayaBatch.exeで処理させるのも良さそうですね。