1
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?

MayaAdvent Calendar 2024

Day 23

renderSetupで困った 続

Last updated at Posted at 2024-12-22

前回のお話

やっぱり不便なのでなんとかしたい。

referenceEditor から referenceEditの削除を試みるも、反映されない。

image.png

ではコマンドからではどうでしょうか?

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)

image.png

消えた!完!

ということは、アンロード状態であればUIからでもいけるのでは?

image.png

あ、いけましたね。

まぁ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"])    

これが
image.png

こうなりました
image.png

--

アニメーションもリファレンスしてると、アニメーションもリロードするかシーンを開き直す必要があります。

リファレンスしている数が多いと、処理に時間がかかってしまうのでmayaBatch.exeで処理させるのも良さそうですね。

1
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
1
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?