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.

MayaAdvent Calendar 2023

Day 17

maya renderSetupでコレクションの中身にnamespaceを足す

Posted at

renderSetup
renderLayerよりはシーンが壊れにくくなりましたね

カットシーン毎にテンプレートのrenderSetupを読み込んで・・・・

ここで問題になるのが
テンプレートのrenderSetupのコレクションにノード名を指定しておいても、シーンに合わせてネームスペースをコレクションの中身に追加してあげないとならんのですよね

ネームスペースを全て対象とする 書き方もありますが、

image.png

こんな感じで各レイヤー毎に別のネームスペースを指定したい
って場面に出会って、手動でやるの面倒だなぁと

collectionを集める

まずは各レイヤーに所属するcollectionを収集したい。

参考
https://kiwamiden.com/rendersetup-for-python-part2

まずはcollectionを・・・・

from maya.app.renderSetup.model import renderSetup

layerName = "renderSetupLayer1"
rs = renderSetup.instance()
layer = rs.getRenderLayer(layerName)
collections = layer.getCollections()

for collection in collections:
    print(collection.name())

#collection1

お 取れてますね。

更にcollectionを集める

ちょっと複雑な感じにしてみると
image.png

#collection1

うーん・・・1個しか取れませんね・・・

-getCollectionsなのでグループはリストされない
-レイヤーの直下のcollectionはリストされるが、それ以下はリストされない

あ、面倒な奴だ!(の予感

  • ノードの種類に関わらず子をリスト ( getChildren
  • 子ノードを個別に評価して、種類がcollecitonならリストに追加
  • 子ノードにさらに子ノードがある場合には↑に戻る

的なぐーるぐーる回るやつ

雑実装

こういう時pythonは便利

from maya.app.renderSetup.model import renderSetup

def getRSCollectionsHierarchy(taregtNode,collections):
    #対象のノードが collectionか否か
    if taregtNode.isCollection():
        #名前を取りたい場合は .name()
        collections.append(taregtNode)
    
    #対象のノードが hasChildren アトリビュートを持つか否か
    if "hasChildren" in dir(taregtNode):
        
        #対象のノードが子ノードを持つか否か
        if taregtNode.hasChildren():
            
            #対象のノードの子ノードをリスト
            chNodes = taregtNode.getChildren()

            #ぐーるぐーる
            for node in chNodes:
                collections = getRSCollectionsHierarchy(node,collections)

    return collections

def getRSCollections(layerName):
    rs = renderSetup.instance()
    layer = rs.getRenderLayer(layerName)
    chNodes  = layer.getChildren()
    collections = []
    
    #layer直下の子ノード
    for taregtNode in layer.getChildren():    
        getRSCollectionsHierarchy(taregtNode,collections)

    #layer直下のグループノード
    for taregtNode in layer.getGroups():    
        getRSCollectionsHierarchy(taregtNode,collections)
    
    print(collections)

getRSCollections("renderSetupLayer1")

#[<maya.app.renderSetup.model.collection.Collection object at 0x00000136A08F0EA8>, 
#<maya.app.renderSetup.model.collection.Collection object at 0x0000013665F37818>, 
#<maya.app.renderSetup.model.collection.Collection object at 0x00000136164564F8>]

取れてるのか判らんので、一旦名前収集で実行

from maya.app.renderSetup.model import renderSetup

def getRSCollectionsHierarchy(taregtNode,collections):
    #対象のノードが collectionか否か
    if taregtNode.isCollection():
        #名前を取りたいので .name()を一旦ついか
        collections.append(taregtNode.name())
    
    #対象のノードが hasChildren アトリビュートを持つか否か
    if "hasChildren" in dir(taregtNode):
        
        #対象のノードが子ノードを持つか否か
        if taregtNode.hasChildren():
            
            #対象のノードの子ノードをリスト
            chNodes = taregtNode.getChildren()

            #ぐーるぐーる
            for node in chNodes:
                collections = getRSCollectionsHierarchy(node,collections)

    return collections

def getRSCollections(layerName):
    rs = renderSetup.instance()
    layer = rs.getRenderLayer(layerName)
    chNodes  = layer.getChildren()
    collections = []
    
    #layer直下の子ノード
    for taregtNode in layer.getChildren():    
        getRSCollectionsHierarchy(taregtNode,collections)

    #layer直下のグループノード
    for taregtNode in layer.getGroups():    
        getRSCollectionsHierarchy(taregtNode,collections)
    
    print(collections)

getRSCollections("renderSetupLayer1")

#['collection1', 'collection3', 'collection4']

はい 取れました。
つづきます

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?