0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-09-20

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

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

さてどうしよう

とりあえず reference editの確認

Reference Editor > file > List Reference Edits
でreferenceEditを表示させてみる
image.png
うーん リファレンスノードのどこかに格納されているとは思うのですが、どこにあるのか

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 )

試しに実行してみると
image.png
image.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を除去したいので

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?