RenderSetupをPythonで操る方法 part1

takkun
どうも!たっくんです!

ちょくちょく使う場面が増えてきた印象のRender Setupですが、まじスクリプトのドキュメントないっすよね。

なので、あれこれ試したりし、解析したりした内容になります!今回は「導入」と「レイヤー」周りを書きたいと思います!

RenderSetupをPythonで操る方法 part2

2020.04.09

RenderSetupをPythonで操る方法 part3

2020.04.10

RenderSetupをPythonで操る方法 part4

2020.04.11

RenderSetupをPythonで操る方法 part5

2020.04.12

必要なモジュール

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

レイヤーの複製

指定された名前のレイヤーを複製し、指定した名前にリネームする関数です。

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