前回のお話
やっぱり不便なのでなんとかしたい。
referenceEditor から referenceEditの削除を試みるも、反映されない。
ではコマンドからではどうでしょうか?
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)
.....うんともすんとも言いませんね。
一旦リファレンスをよみなおしてみます。
ターゲット リファレンスをロードまたはアンロードしたかによって、結果が異なる場合があります
なるほど、よろしいではアンロードだ。
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)
消えた!完!
ということは、アンロード状態であればUIからでもいけるのでは?
あ、いけましたね。
まぁUIでもいけますが、スクリプトで処理してしまおうと思います。
その為に、念のための処理を施そうと思います。
- デフォルトレイヤーに戻す。
- 事前にマテリアルのアサイン情報をリセットしたいメッシュに対して initialShadingGroup をアサインする。
- そのうえで、referenceEditを取得し 除去する。
もっと念を入れるなら
- initialShadingGroupの代わりに一時的にユニークな名前のマテリアルを作成
ですかね
実装
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)
テスト
resetReferenceMTAsign("sampleAsset_v01",["pSphere1","pCube1","pCone1"])
--
アニメーションもリファレンスしてると、アニメーションもリロードするかシーンを開き直す必要があります。
リファレンスしている数が多いと、処理に時間がかかってしまうのでmayaBatch.exeで処理させるのも良さそうですね。