首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取每个呈现层的分辨率

获取每个呈现层的分辨率
EN

Stack Overflow用户
提问于 2016-07-13 08:35:32
回答 1查看 2.1K关注 0票数 1

我想为我的玛雅项目中的每个渲染层获得渲染分辨率。我使用玛雅2016与SP 5。

我知道,您可以使用以下命令获得当前选定的渲染层的分辨率:

代码语言:javascript
复制
width = maya.cmds.getAttr("defaultResolution.width")
height = maya.cmds.getAttr("defaultResolution.height")

现在,我要所有渲染者的决议。您可能会认为,编写循环、递归函数或处理事件"renderLayerManagerChange“或条件"isCurrentRenderLayerChanging”都很简单,但它不起作用,或者,我也找不到它是如何工作的。

假设我有两个渲染者。"defaultRenderLayer“具有默认决议960x540,层"layer1”覆盖其分辨率设置,因此具有第1920x1080号决议。

这就是我使用for循环得到的结果:

代码语言:javascript
复制
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手动选择的Renderlayer ):

代码语言:javascript
复制
defaultRenderLayer
1920 x 1080
layer1
1920 x 1080

对于递归函数也是如此,所以我将跳过这一部分。

现在,处理事件/条件似乎更有希望了。我假设选择RenderLayer需要花费一些时间,这意味着for循环/递归函数太快了。

下面是一个来自docs的建议条件的示例:

代码语言:javascript
复制
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])

我从这里得到的输出:

代码语言:javascript
复制
update
defaultRenderLayer
1920 x 1080

对于这个例子,我选择了"layer1“层。正如您所看到的,尽管正确地显示当前呈现层是"defaultRenderLayer",而"layer1“甚至根本没有被选中,但还是返回了错误的分辨率。

每次选择渲染层时,我也尝试调用cmds.refresh(),但都没有效果。调用mel命令layerEditorLayerButtonSelect 0 layer1 (实际上是任何其他层)只会给出一个错误layerEditor.mel line 5366: Invalid layer type: Render

无论我如何尝试,我似乎无法得到每个渲染层的决议列表。但是为什么呢?我还能做什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-13 11:48:21

您可以尝试使用evalDeferred()命令。

代码语言:javascript
复制
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()')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38346542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档