[Maya]Python で Render Setup を取得する

Tech

はじめに

Python で Render Setup を扱う情報を調べると、新しくレンダーコレクションを作成して処理する方法に関するものは多く見つかります。
一方で、すでにシーン内にあるコレクションやレイヤーを「取得する」方法は、なかなかヒットしませんでした。

そこでこの記事では、選択中・アクティブなコレクションやレイヤーを Python で取得する方法をまとめます。

動作確認バージョン: Maya2024, Maya2026


選択中のコレクション・レイヤーを取得

選択しているのがレイヤー なのかコレクションなのか、区別しない場合は、maya.cmds.renderSetupSelect(q=True) で取得できます。
結果は選択しているレンダーレイヤー名やレンダー コレクション名のリストです。

import maya.cmds as cmds
selected = cmds.renderSetupSelect(q=True)
print(selected)  

# Result:['collection1', 'renderSetupLayer1']

maya.app.renderSetup.views.viewCmds.getSelection()でも取得可能です。
この場合も、選択しているレンダーレイヤー名やレンダーコレクション名のリストが返ります。

import maya.app.renderSetup.views.viewCmds as viewCmds
selected = viewCmds.getSelection()
print(selected)

# Result:['collection1', 'renderSetupLayer1']
Render Setup エディタで選択中のコレクションとレイヤーが水色にハイライトされた状態

レイヤーのみ、コレクションのみを取得したい場合はオプションを指定できます。

# render layerのみ取得
selected_layers = cmds.renderSetupSelect(q=True, renderLayers=True)
# render collectionのみ取得 
selected_collections = cmds.renderSetupSelect(q=True, collections=True) 

Render Setup の構成要素もノードなので、cmds.nodeType()で種類を確認できます。

cmds.nodeType('collection1')

# Result: collection

アクティブなレイヤーを取得

以下のようにすれば、アクティブな(=目のアイコンが付いている)Render Setup Layerを取得できます。

from maya.app.renderSetup.model import renderSetup

rs = renderSetup.instance()
layers = rs.getRenderLayers()
active_layers = [l for l in layers if l.isVisible()]

layers はシーン内のレンダーレイヤーのリストです。
ただし、レイヤー名ではなく RenderLayer オブジェクトが入っています。

RenderLayer オブジェクトは isVisible メソッドを持っており、これが True(=アクティブ)なレイヤーを active_layers に入れています。
これも、レイヤー名ではなく RenderLayer オブジェクトです。

master レイヤーがアクティブな場合、active_layers は空です。

アクティブなレンダーレイヤー名を確認したい場合は以下のようにすればOKです。

if len(active_layers):
    print(active_layers[0].name())
else:
    print('masterLayerがアクティブです。')

まとめ

Python で既存の Render Setup を取得する方法をまとめました。要点は次のとおりです。

  • 選択中の要素は cmds.renderSetupSelect(q=True) または viewCmds.getSelection() で名前のリストとして取得できる。
  • オプション renderLayers=True / collections=True でレイヤーだけ・コレクションだけに絞り込める。
  • 要素の種類は cmds.nodeType() で確認できる。
  • アクティブなレイヤーは renderSetup.instance().getRenderLayers()isVisible() の組み合わせで取得する(返るのは RenderLayer オブジェクト)。

コメント

タイトルとURLをコピーしました