アセットをリファレンスしてアニメーション付けてもらっていたら、
予期せぬアトリビュートにキーフレームが入ってしまい・・・
なんとかそれを除去したいのだけれども・・・・
いやーロック忘れちゃって・・・
※追記
通常命名規則がしっかりしてるDAGノードのアトリビュートであれば、決め打ちでdisconnectAttrとかで対応します。
が、今回の場合は DAGノードのアトリビュートロックしわすれて、そのアトリビュートにconnectされていたchoiceノードに対してキーフレームが入ってしまったので、こんな対応をしてみました。
さてどうしよう
とりあえず reference editの確認
Reference Editor > file > List Reference Edits
でreferenceEditを表示させてみる
うーん リファレンスノードのどこかに格納されているとは思うのですが、どこにあるのか
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を試す
とりあえず editStrings ですかねぇ
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を足すと表示数を絞れる感じですかね
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で書くと
import maya.cmds as cmds
cmds.referenceEdit(["pSphere1_translateX.output","hoge:pSphere1.translateX"],failedEdits = True,successfulEdits = True, editCommand ="connectAttr",removeEdits=True )
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を除去したいので
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)
はい、scaleYのとこだけ消せました。