Mayaで特定のreferenceEditを削除したい

アセットをリファレンスしてアニメーション付けてもらっていたら、
予期せぬアトリビュートにキーフレームが入ってしまい・・・
なんとかそれを除去したいのだけれども・・・・
いやーロック忘れちゃって・・・

※追記
通常命名規則がしっかりしてるDAGノードのアトリビュートであれば、決め打ちでdisconnectAttrとかで対応します。
が、今回の場合は　DAGノードのアトリビュートロックしわすれて、そのアトリビュートにconnectされていたchoiceノードに対してキーフレームが入ってしまったので、こんな対応をしてみました。

さてどうしよう

とりあえず reference editの確認
-
Reference Editor > file > List Reference Edits
でreferenceEditを表示させてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/a450c2ab-3320-77a4-ff02-23f9fb1a01de.png)
うーん　リファレンスノードのどこかに格納されているとは思うのですが、どこにあるのか

https://help.autodesk.com/cloudhelp/2022/JPN/Maya-Tech-Docs/Nodes/reference.html

>edits (ed)	
This attribute stores information about the modifications ("edits") that have been made to nodes in the reference. This attribute should not be accessed directly - please use the "List Reference Edits..." window, referenceEdit command, and referenceQuery command instead.

はい　referenceQuery 使えということですかね

referenceQueryを試す
-
https://help.autodesk.com/cloudhelp/2022/JPN/Maya-Tech-Docs/CommandsPython/referenceQuery.html

とりあえず　**editStrings**　ですかねぇ

```python
import maya.cmds as cmds
import pprint
strings = cmds.referenceQuery("hogeRN",editStrings =True)
pprint.pprint(strings)

#['setAttr |hoge:pSphere1.visibility 0',
# 'connectAttr "pSphere1_translateX.output" "|hoge:pSphere1.translateX"',
# 'connectAttr "pSphere1_translateY.output" "|hoge:pSphere1.translateY"',
# 'connectAttr "pSphere1_translateZ.output" "|hoge:pSphere1.translateZ"',
# 'connectAttr "|locator1.rotate" "|hoge:pSphere1.rotate"',
# 'connectAttr "pSphere1_scaleX.output" "|hoge:pSphere1.scaleX"',
# 'connectAttr "pSphere1_scaleY.output" "|hoge:pSphere1.scaleY"',
# 'connectAttr "pSphere1_scaleZ.output" "|hoge:pSphere1.scaleZ"']
```

**editCommand**を足すと表示数を絞れる感じですかね
```python
import maya.cmds as cmds
import pprint
strings = cmds.referenceQuery("hogeRN",editStrings =True,editCommand = "connectAttr")
pprint.pprint(strings)

#['connectAttr "pSphere1_translateX.output" "|hoge:pSphere1.translateX"',
# 'connectAttr "pSphere1_translateY.output" "|hoge:pSphere1.translateY"',
# 'connectAttr "pSphere1_translateZ.output" "|hoge:pSphere1.translateZ"',
# 'connectAttr "|locator1.rotate" "|hoge:pSphere1.rotate"',
# 'connectAttr "pSphere1_scaleX.output" "|hoge:pSphere1.scaleX"',
# 'connectAttr "pSphere1_scaleY.output" "|hoge:pSphere1.scaleY"',
# 'connectAttr "pSphere1_scaleZ.output" "|hoge:pSphere1.scaleZ"']
```
うんまぁこれでとりあえず取得できたことにして、編集結果を反映させるにはどうしたらいいんだろか？

referenceEditでしょうか
-
referenceEdit っていうくらいだし、なんかできるだろうという安易な考えの元・・・
https://help.autodesk.com/cloudhelp/2022/JPN/Maya-Tech-Docs/CommandsPython/referenceEdit.html

うーん　わっかりづらいのでscriptEditorに頼ってみることに。
UIから　**Remove Selected Edits**を実行してみます。

```
referenceEdit -failedEdits true -successfulEdits true -editCommand connectAttr -removeEdits "pSphere1_translateX.output" "hoge:pSphere1.translateX";
```
なるほど　こんな感じ

pythonで書くと
```python
import maya.cmds as cmds
cmds.referenceEdit(["pSphere1_translateX.output","hoge:pSphere1.translateX"],failedEdits = True,successfulEdits = True, editCommand ="connectAttr",removeEdits=True )
```
試しに実行してみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/a1b18d81-3bb3-da5a-65a2-c9aa3a314385.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/f943c201-9a49-a266-4f17-a145ee5a9afc.png)
はい、消えました。

sampleをもう一回みてみる
-
実行できたのでもう一回sampleを見てみる。

>Remove all the "connectAttr" edits which apply to mid:pSphere1.translateX.
cmds.referenceEdit( 'mid:pSphere1.translateX', editCommand='connectAttr', removeEdits=True )

>Remove the "connectAttr" edit having mid:pSphere1.translateX as a source and mid:pSphere2.translateX as a destination.
cmds.referenceEdit( ["|mid:pSphere1.translateX", "|mid:pSphere2.translateX"], failedEdits = True, successfulEdits = True, editCommand = 'connectAttr', removeEdits = True )

なるほど、特定のノード同士のコネクションのeditを削除するには引数2つ必要なんですかね

実装してみる
-
ひとまず今回は connectAttrを除去したいので

```python        
import maya.cmds as cmds

refNode = "hogeRN"
clearTarget = "\"|hoge:pSphere1.scaleY\""
targetCommand = "connectAttr"

#とりあえず referenceEditを取得
refEdits = cmds.referenceQuery(refNode, editStrings=True,editCommand = targetCommand)

#1行ずつ処理していく
for line in refEdits:
    if line.endswith(clearTarget):
        #connectAttrの source と destination を抽出
        strings = line.replace("\"","").split(" ")
        source = strings[1]
        destination = strings[2]        
        cmds.referenceEdit([source,destination],removeEdits = True,failedEdits =True, successfulEdits =True,editCommand = targetCommand)
```
実行してみるとー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/b82480b0-318b-650c-38c0-7839cd64c6ae.png)

はい、scaleYのとこだけ消せました。