获取每个渲染层的分辨率

Get Resolution for each Render Layer

我想获得我的 Maya 项目中每个渲染层的渲染分辨率。我正在使用带有 SP 5 的 Maya 2016。

我知道您可以使用以下命令获取当前 selected 渲染层的分辨率:

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

现在,我想要 所有 渲染层的分辨率。您可能认为它就像编写循环、递归函数或处理事件 "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)

输出(取决于我已经通过 Maya select手动编辑了哪个渲染层 UI):

defaultRenderLayer
1920 x 1080
layer1
1920 x 1080

递归函数也是如此,所以我会跳过这部分。

现在,与 events/conditions 合作似乎更有希望。我假设 selecting 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" 层 selected。如您所见,尽管正确显示当前渲染层为 "defaultRenderLayer",但仍返回了错误的分辨率,并且 "layer1" 甚至根本没有得到 selected。

我也曾尝试在每次 select 渲染层时调用 cmds.refresh(),但无济于事。调用 mel 命令 layerEditorLayerButtonSelect 0 layer1(或实际上任何其他层)只会给我一个错误 layerEditor.mel line 5366: Invalid layer type: Render

无论我尝试什么,我似乎都无法获得每个渲染层的分辨率列表。但为什么?我还能尝试什么?

您可以尝试 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()')