どうも!たっくんです!
ちょくちょく使う場面が増えてきた印象のRender Setupですが、まじスクリプトのドキュメントないっすよね。
なので、あれこれ試したりし、解析したりした内容になります!今回は「導入」と「レイヤー」周りを書きたいと思います!
必要なモジュール
Render SetupをPythonでいじるには下記のモジュールが必要になります。機能ごとに分かれていますが、あとから必要になることが増える印象なので、僕はとりあえず全部読み込んでいます(゚∀゚)
from maya.app.renderSetup.model import override from maya.app.renderSetup.model import selector from maya.app.renderSetup.model import collection from maya.app.renderSetup.model import renderLayer from maya.app.renderSetup.model import renderSetup from maya.app.renderSetup.model import typeIDs
Render Setupへのアクセス
レイヤーを取得したり、コレクションを作ったり、Render Setupにアクセスするには、インスタンスを取得し、ここからあれこれ操作してきます!
rs = renderSetup.instance()
レイヤーの作成/削除
rs = renderSetup.instance() # レイヤーの作成 layer = rs.createRenderLayer('test') # レイヤーの削除 renderLayer.delete(layer)
レイヤーの削除は、renderLayerモジュールのdeleteを使います。
レイヤーの取得
シーン内にあるレイヤーの取得は2種類方法があります。どちらの方法も、レイヤーを操作するためのオブジェクトになります。
# シーン内のレイヤーすべてを取得 rs = renderSetup.instance() layers = rs.getRenderLayers() # 決まった名前のレイヤーを取得 rs = renderSetup.instance() layer = rs.getRenderLayer('renderSetupLayer1')
レイヤーの名前の操作
rs = renderSetup.instance() layer = rs.getRenderLayer('renderSetupLayer1') # 名前の取得 print layer.name() # 名前の変更 layer.setName('CH_testA')
レイヤーをレンダリングをする/しないの操作
# レンダリングするするかしないか取得 print layer.isRenderable() # レンダリングするするかしないかの設定 layer.setRenderable(False)
レイヤーの表示状態の操作
# レイヤーの表示状態の取得 print layer.isVisible() # レイヤーの表示状態の設定 rs.switchToLayer(layer)
表示状態の設定は、レイヤーから設定するのではなく、RenderSetupのインスタンスから操作します。
レイヤーのEncode / Decode
レイヤーの情報(コレクションなどを含む)をDict型で取得し、レイヤーを作ったりすることができます。
# レイヤーの構成をDict型で取得 print layer.encode() # LayerのDict型データをRender Setupに追加 data = {'renderSetup':{'renderLayers':[layer.encode()]}} rs.decode(data, renderSetup.DECODE_AND_RENAME)
レイヤーをencodeしたデータは、そのままだと使えないので決まったキーのDictに配置してからdecodeします。そのまま入れても、エラーします。
TypeError: Unknown keys found in the dictionary: renderSetupLayer
TypeError: Unknown keys found in the dictionary: renderSetupLayer
レイヤーの複製
指定された名前のレイヤーを複製し、指定した名前にリネームする関数です。
from maya.app.renderSetup.model import override from maya.app.renderSetup.model import selector from maya.app.renderSetup.model import collection from maya.app.renderSetup.model import renderLayer from maya.app.renderSetup.model import renderSetup def duplicateRenderLayer(renderLayerName, newRenderLayerName=''): rs = renderSetup.instance() oldRenderLayers = set(rs.getRenderLayers()) renderLayer = rs.getRenderLayer(renderLayerName) data = {'renderSetup':{'renderLayers':[renderLayer.encode()]}} rs.decode(data, renderSetup.DECODE_AND_RENAME) newRenderLayer = list(set(rs.getRenderLayers()) - oldRenderLayers)[0] if newRenderLayerName != '': newRenderLayer.setName(newRenderLayerName) return newRenderLayer
テンプレートの読み込み
ユーザーが出力した、レンダーレイヤーのテンプレートを読み込む関数です。
import json import os from maya.app.renderSetup.model import override from maya.app.renderSetup.model import selector from maya.app.renderSetup.model import collection from maya.app.renderSetup.model import renderLayer from maya.app.renderSetup.model import renderSetup from maya import OpenMaya def importTemplateLayer(filename, option=renderSetup.DECODE_AND_MERGE): if not os.path.exists(filename): OpenMaya.MGlobal.displayError('Does not exists file. : '+filename) return False with open(filename, 'r') as file: fileData = file.read() jsonData = json.loads(fileData) if not jsonData: OpenMaya.MGlobal.displayError('Field load json. : '+filename) return False layerData = {'renderSetup':{'renderLayers':jsonData}} rs = renderSetup.instance() rs.decode(layerData, option, None) return True