2016-07-13 8 views
0

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

私が試したことに関係なく、各レンダラーの解像度のリストを得ることはできません。しかし、なぜ?他に何を試すことができますか?

答えて

1

あなたはevalDeferred()コマンドを試すことができます。

def test(): 
    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) 
cmds.evalDeferred('test()') 
+0

はい、どれくらい助けてくれたかわかりません。私は 'utils.executeOnMainThreadWithResult'を試みただけで、' evalDeferred'を使うことは考えていませんでした。 – DodgerThud

関連する問題