Mayaのreferenceにはいくつか盲点がありまして思い通りにならなく相談されることがしばしばありますが、他のはまた次回紹介することにしておき、今回はreference editの処理の仕様により発生するケースです。
Reference Editはreferenceされたobjectに対するmodifyの履歴であって
通常のデータとは違う形で保存されます。
addAttrの通常
createNode transform -n "pSphere1";
....
addAttr -ci true -sn "test" -ln "test" -dv 1 -at "double";
reference
createNode reference -n "refRN";
.....
1 |ref:pSphere1 "test" "test" " -ci 1 -dv 1 -at \"double\""
確認する方法はreference editorウィンドウからreferenceを選択し右クリックFile -> List Reference Edits… 確認できます

これらはシーンopenする時まずreferenceファイルを読みその後実行されるのは通常の操作と一緒ですが、処理される順番は種類別であることによって思ってない結果になる場合があります。普段あまり気になることはないと思いますが、たまーに引っかかります。
通常の操作はもちろん行われたhistory順で処理され結果が残ります
ex) set, add, set, add
reference editの場合はhistory順と関係なく種類ごとにまとめられその処理の優先度によって実行されます。
ex) add, add, set, set
では実際結果が変わってしまうケースを紹介します。
referenceデータを作成
spshereに”test”attributeを追加
from maya import cmds cmds.file(new=1, f=1) a = cmds.polySphere()[0] cmds.addAttr(a, ln="test", at="double") cmds.file(rename="reference.ma") cmds.file(s=1, f=1)
referenceデータを読み
“test”attributeを削除して追加しなおし
cmds.file(new=1, f=1)
cmds.file("reference.ma", r=1, ns="test")
a = "test:%s" % a
cmds.deleteAttr("%s.test" % a)
cmds.addAttr(a, ln="test", at="double")
cmds.file(rename="scene.ma")
cmds.file(s=1, f=1)
今は存在するけど
if cmds.ls("%s.test" % a):
print ">>>> yup"
else:
print "!! nope"

シーンを開きなおすと消える
cmds.file("scene.ma", o=1, f=1)
if cmds.ls("%s.test" % a):
print ">>>> yup"
else:
print "!! nope"

通常の場合はtestというattributeがすでに存在しdeleteを行われaddしたので結果test attributeは存在する
referenceの場合はaddが先に行われすでに存在するので失敗そのあとdeleteが行われattributeが消える
の差が生じてます。
コメントを残す