2016-07-13 1 views
0

Я хочу получить разрешение рендеринга для каждого Renderlayer в моем проекте Maya. Я использую Maya 2016 с SP 5.Получить разрешение для каждого слоя рендера

Я знаю, что вы можете получить разрешение текущего выбранного RenderLayer со следующими командами:

width = maya.cmds.getAttr("defaultResolution.width") 
height = maya.cmds.getAttr("defaultResolution.height") 

Теперь я хочу разрешение для всех Renderlayers. Вы считаете, что это так же просто, как писать цикл, рекурсивную функцию или работать с событием «renderLayerManagerChange» или условие «isCurrentRenderLayerChanging» будет работать, но это не так. Или, альтернативно, я не могу понять, как это сделать.

Предположим, у меня есть 2 Renderlayers. «defaultRenderLayer» имеет разрешение по умолчанию 960x540, слой «layer1» имеет переопределения для его настроек разрешения и, следовательно, имеет разрешение 1920x1080.

Это то, что я получаю с цикл:

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) 

Выход (зависит от того, RenderLayer я уже выбран вручную через Maya 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 

Для этого примера я имел «layer1» слой выбран. Как вы можете видеть, неправильное разрешение возвращается, несмотря на то, что правильно показано, что текущий слой Render является «defaultRenderLayer», а «layer1» даже не выбирается вообще.

Я также пытался позвонить cmds.refresh() каждый раз, когда я выбираю Render Layer, но безрезультатно. Вызов команды mel layerEditorLayerButtonSelect 0 layer1 (или любой другой уровень) просто дает мне ошибку layerEditor.mel line 5366: Invalid layer type: Render

Независимо от того, что я пытаюсь, я не могу получить список разрешений для каждого Renderlayer. Но почему? Что еще я мог попробовать?

ответ

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