获取每个渲染层的分辨率
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()')
我想获得我的 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()')