获取每个渲染层的分辨率

时间:2016-07-13 08:35:33

标签: python maya

我想获取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的分辨率列表。但为什么?我还能尝试什么?

1 个答案:

答案 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()')