RenderSetupをPythonで操る方法 part2

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

あれこれ試したりし、解析したりした内容になりますが、今回は「コレクション」周りを書いていきたいと思います!

RenderSetupをPythonで操る方法 part1

2020.04.08

RenderSetupをPythonで操る方法 part3

2020.04.10

RenderSetupをPythonで操る方法 part4

2020.04.11

RenderSetupをPythonで操る方法 part5

2020.04.12

コレクションの取得

rs = renderSetup.instance()
layer = rs.getRenderLayer('renderSetupLayer1')

# レイヤーのコレクションを全て取得
collects = layer.getCollections()

# 名前を指定して、レイヤーのコレクションを取得
collect = layer.getCollectionByName('collection1')

コレクションの作成/削除

rs = renderSetup.instance()
layer = rs.getRenderLayer('renderSetupLayer1')

# コレクションの作成
collect = layer.createCollection('testCollection')

# コレクションの削除
collection.delete(collect)
コレクションの削除は、collectionモジュールのdeleteを使います。

コレクションの名前の操作

rs = renderSetup.instance()
layer = rs.getRenderLayer('renderSetupLayer1')
collect = layer.createCollection('collection1')

# 名前の取得
print collect.name()

# 名前の変更
collect.setName('geometryCollection')

コレクションの有効/無効

rs = renderSetup.instance()
layer = rs.getRenderLayer('renderSetupLayer1')
collect = layer.createCollection('collection1')

# 有効/無効の取得
print collect.isSelfEnabled()

# 有効/無効の設定
collect.setSelfEnabled(False)

Selectorの取得

コレクションのフィルター、追加するノードの設定は、Selectorを使って行います。

rs = renderSetup.instance()
layer = rs.getRenderLayer('renderSetupLayer1')
collect = layer.createCollection('collection1')

# Selectorの取得
selector_ = collect.getSelector()

コレクションのFillter設定

コレクションに追加できるノードの種類の設定は、SelectorのFillterを設定します。

rs = renderSetup.instance()
layer = rs.getRenderLayer('renderSetupLayer1')
collect = layer.createCollection('collection1')
selector_ = collect.getSelector()

# Filterを、Allに設定
selector_.setFilterType(selector.Filters.kAll)

# Customの場合のフィルター設定
selector_.setFilterType(selector.Filters.kCustom)
selector_.setCustomFilterValue('lambert')
キー内容
kAll0全て
kTransforms1トランスフォーム
kShapes2シェイプ
kShaders3いわゆるマテリアル
kLights4ライト
kSets5セット
kCustom8カスタム
kGenerators10ジオメトリージェネレータ
kShadingEngines11シェーディングエンジン

コレクションにノードの追加/削除

rs = renderSetup.instance()
layer = rs.getRenderLayer('renderSetupLayer1')
collect = layer.createCollection('collection1')
selector_ = collect.getSelector()

# ノードリストに追加
selector_.staticSelection.add(['persp'])

# ノードリストの差し替え
selector_.staticSelection.set(['top', 'front'])

# ノードリストから削除
selector_.staticSelection.remove(['top'])

コレクションのパターンの設定/取得

rs = renderSetup.instance()
layer = rs.getRenderLayer('renderSetupLayer1')
collect = layer.createCollection('collection1')
selector_ = collect.getSelector()

# ノード名のパターンを設定
selector_.setPattern('*')

# ノード名のパターンを取得
print selector_.getPattern()

コレクションのノードリストの取得

rs = renderSetup.instance()
layer = rs.getRenderLayer('renderSetupLayer1')
collect = layer.createCollection('collection1')
selector_ = collect.getSelector()
selector_.staticSelection.set(['top', 'front'])

# List型で取得
print selector_.staticSelection.asList()

# Set型で取得
print selector_.staticSelection.asSet()

コレクションのEncode / Decode

rs = renderSetup.instance()
layer = rs.getRenderLayer('renderSetupLayer1')
collect = layer.createCollection('collection1')

# コレクションの情報をdict型で取得
print collect.encode()

# コレクションのdict型データを、レイヤーに追加
layer = rs.createRenderLayer('renderSetupLayer2')
data = {'collections':[collect.encode()]}
layer.decode(data, renderSetup.DECODE_AND_MERGE, None)
コレクションをencodeしたデータは、そのままだと使えないので決まったキーのDictのリストに配置してからdecodeします。

decodeの引数

キー内容
DECODE_AND_OVERWRITE既存のレンダリング設定を削除し、名前空間なしで追加します
DECODE_AND_MERGE既存のレンダリング設定とマージし、予期しないオブジェクトの名前を変更します
DECODE_AND_RENAMEデコードされたすべてのレンダリング設定の名前を変更して、既存のレンダリング設定と競合しないようにする

子のコレクションの作成/取得

rs = renderSetup.instance()
layer = rs.getRenderLayer('renderSetupLayer1')
collect = layer.getCollection('collection1')

# 子のコレクションを全て取得
# ※階層化されたCollectionは、最初の一つだけしか返ってこない
childCollections = collect.getCollections()

# 子の特定のコレクションを取得
childCollection = collect.getCollectionByName('collection2')

テンプレートの読み込み

ユーザーが出力したコレクションのテンプレートを、指定のレンダーレイヤーに読み込む関数です。

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 importTemplateCollectionToLayer(layerName, 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
 
	collectionData = {'collections':jsonData}
	
	rs = renderSetup.instance()
	layer = rs.getRenderLayer(layerName)
	layer.decode(collectionData, option, None)
	return True