
どうも!たっくんです!
あれこれ試したりし、解析したりした内容になりますが、今回は「コレクション」周りを書いていきたいと思います!
コレクションの取得
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')
キー | 値 | 内容 |
---|---|---|
kAll | 0 | 全て |
kTransforms | 1 | トランスフォーム |
kShapes | 2 | シェイプ |
kShaders | 3 | いわゆるマテリアル |
kLights | 4 | ライト |
kSets | 5 | セット |
kCustom | 8 | カスタム |
kGenerators | 10 | ジオメトリージェネレータ |
kShadingEngines | 11 | シェーディングエンジン |
コレクションにノードの追加/削除
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