我想获取Maya Project中每个Renderlayer的渲染分辨率。我正在使用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。
这是我用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)
输出(取决于我已经通过Maya UI手动选择的Renderlayer):
defaultRenderLayer
1920 x 1080
layer1
1920 x 1080
这与递归函数的处理相同,所以我将跳过这一部分。
现在,处理事件/条件似乎更有希望。我假设选择RenderLayer需要花费一些时间,这意味着for循环/递归函数太快或者其他东西。
以下是文档中建议条件的示例:
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”层。正如您所看到的,尽管正确显示当前的渲染层是“defaultRenderLayer”,并且“layer1”甚至根本没有被选中,但会返回错误的分辨率。
我每次选择渲染图层时都试图调用cmds.refresh()
,但无济于事。调用mel命令layerEditorLayerButtonSelect 0 layer1
(或实际上任何其他层)只会给我一个错误layerEditor.mel line 5366: Invalid layer type: Render
无论我尝试什么,我似乎无法获得每个Renderlayer的分辨率列表。但为什么?我还能尝试什么?
答案 0 :(得分:0)
您可以尝试使用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()')