Я хочу получить разрешение рендеринга для каждого 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. Но почему? Что еще я мог попробовать?
ДА, Вы не представляете, насколько вы мне помогли. Я только пробовал 'utils.executeOnMainThreadWithResult' и никогда не рассматривал использование' evalDeferred'. – DodgerThud