Mayaプロジェクトの各レンダリングレイヤーのレンダリング解像度を取得したいとします。各レンダリングレイヤーの解像度を取得
width = maya.cmds.getAttr("defaultResolution.width")
height = maya.cmds.getAttr("defaultResolution.height")
は今、私はすべて Renderlayersのための決議をしたい:私は私はあなたが次のコマンドを使用して、現在選択されたレンダーの解像度を得ることができることを知っているSP 5.
でのMaya 2016を使用しています。ループや再帰関数を記述するか、イベント "renderLayerManagerChange"や "isCurrentRenderLayerChanging"を使って作業するのは簡単ですが、そうではないと思います。あるいは、私は方法を見つけることができません。
私はレンダーレイヤーが2つあると仮定します。 "defaultRenderLayer"のデフォルト解像度は960x540、レイヤー "layer1"は解像度設定のオーバーライドがあるため解像度は1920x1080です。
これは私がforループで得るものです:
renderlayers = cmds.ls(type="renderLayer")
for layer in renderlayers:
print layer
#select the render layer
cmds.editRenderLayerGlobals(crl=layer)
#get resolution values
w = cmds.getAttr("defaultResolution.width")
h = cmds.getAttr("defaultResolution.height")
print str(w),"x",str(h)
出力(私はすでにマヤUIを使用して手動で選択しているレンダーに依存します):
defaultRenderLayer
1920 x 1080
layer1
1920 x 1080
それは同じ取り引きです再帰的な関数なので、私はこの部分をスキップします。
今、イベント/条件の作業はもっと有望です。私は、RenderLayerの選択に時間がかかることを前提としています。つまり、for-loop/recursive関数が単純すぎるか何かに過ぎないということです。ここで
は、ドキュメントからの提案の条件との例です。
def updateClicked(self):
print "update"
self.layerchanged_event = cmds.scriptJob(ct=["isCurrentRenderLayerChanging", self.onLayerChange])
self.renderlayers = cmds.ls(type="renderLayer")
self.index = 0
self.updating = True
cmds.editRenderLayerGlobals(crl=self.renderlayers[0])
def onLayerChange(self):
if self.updating == True:
currentlayer = cmds.editRenderLayerGlobals(q=True,crl=True)
print currentlayer
w = cmds.getAttr("defaultResolution.width")
h = cmds.getAttr("defaultResolution.height")
print str(w),"x",str(h)
next = self.index+1
if next == len(self.renderlayers):
print "done"
self.updating = False
else:
cmds.editRenderLayerGlobals(crl=self.renderlayers[next])
私はこのことから得る出力:
update
defaultRenderLayer
1920 x 1080
この例では、私が選択した「レイヤ1」レイヤーを持っていました。ご覧のように、現在のRender Layerが "defaultRenderLayer"であり、 "layer1"がまったく選択されていないことを正しく示したにもかかわらず、間違った解像度が返されます。
レンダーレイヤーを選択するたびにcmds.refresh()
を呼び出そうとしましたが、役に立たなくなりました。メルコマンドlayerEditorLayerButtonSelect 0 layer1
(または実際に他のレイヤー)を呼び出すと、私にエラーが表示されますlayerEditor.mel line 5366: Invalid layer type: Render
私が試したことに関係なく、各レンダラーの解像度のリストを得ることはできません。しかし、なぜ?他に何を試すことができますか?
はい、どれくらい助けてくれたかわかりません。私は 'utils.executeOnMainThreadWithResult'を試みただけで、' evalDeferred'を使うことは考えていませんでした。 – DodgerThud