Maya渲染设置问题

时间:2014-12-17 07:55:41

标签: python maya renderer

我有两个问题,我不确定这是否可以通过使用python在场景中完成。

我的Maya版本没有安装任何Mental Ray。有些时候,当我打开文件(使用Mental Ray安装)时,我不断收到错误,例如:

// Warning: file: /apps/Linux64/aw/maya2014/scripts/others/supportRenderers.mel line 77: The renderer "mentalRay" used by this scene, is not currently available. The Maya Software renderer will be used instead. //
// Error: file: /apps/Linux64/aw/maya2014/scripts/others/supportRenderers.mel line 82: setAttr: The attribute 'defaultRenderGlobals.currentRenderer' is locked or connected and cannot be modified. //
// Error: file: /apps/Linux64/aw/maya2014/scripts/others/unifiedRenderGlobalsWindow.mel line 415: The renderer mentalRay is not registered yet. //
// Error: line 1: The renderer mentalRay is not registered yet. // 

我尝试使用以下代码来纠正'问题:

list = cmds.listAttr("defaultRenderGlobals", l=True)

for item in list:
    cmds.setAttr("defaultRenderGlobals." + item, l=False)

mel.eval('updateCurrentRendererSel("unifiedRenderGlobalsRendererSelOptionMenu");')
mel.eval('loadPreferredRenderGlobalsPreset("mayaHardware");')

但如果我尝试打开渲染设置

,我会收到另一堆错误
//Error: Object ‘tabForm’ not found.

所以,有没有什么方法可以在现场补救

附件是截图: enter image description here

2 个答案:

答案 0 :(得分:2)

注意:请参阅"更新"在这个答案的下面部分找到完整的解决方案。

为什么不尝试使用currentRenderer本身解锁并设置setAttr值。

cmds.setAttr("defaultRenderGlobals.currentRenderer", l=False)    
cmds.setAttr("defaultRenderGlobals.currentRenderer", "mayaHardware", type="string")

您收到错误//Error: Object ‘tabForm’ not found.,因为渲染设置窗口无法加载,可能是因为未注册的mentalRay。因此,在当前渲染器更改之前,AVOID会调用以下内容:

mel.eval('updateCurrentRendererSel("unifiedRenderGlobalsRendererSelOptionMenu");')
mel.eval('loadPreferredRenderGlobalsPreset("mayaHardware");')

<强> 更新

根据问题中的更新和下面的评论,我们了解到这里的问题是Maya在遇到丢失的渲染器或渲染设置错误时无法正确构建渲染设置窗口的UI。这导致父UI组件,如不构建选项卡和框架。因此,当切换渲染器时,渲染设置UI会尝试将相应的设置加载到这些选项卡中,但无法找到它们并停止。

要解决此问题,我们可以设置我们想要的渲染设置,完全删除渲染设置窗口的UI并重新加载它。我为此写了一个快速功能。这将解决它。

import maya.cmds as cmds
import maya.mel as mel


def remake_render_settings_ui(renderer="mayaSoftware"):
    """ Remakes the render settings window """
    # Unlock the render globals' current renderer attribute
    cmds.setAttr("defaultRenderGlobals.currentRenderer", l=False)    

    # Sets the current renderer to given renderer
    cmds.setAttr("defaultRenderGlobals.currentRenderer", renderer, type="string")

    # Deletes the render settings window UI completely
    if cmds.window("unifiedRenderGlobalsWindow", exists=True):
        cmds.deleteUI("unifiedRenderGlobalsWindow")

    # Remake the render settings UI
    mel.eval('unifiedRenderGlobalsWindow;')


if __name__ == "__main__":
    remake_render_settings_ui(renderer="mayaHardware")

警告:如果以某种方式再次选择错误的渲染器,这不会阻止UI再次丢失。为了防止这种情况,最好是unload渲染器的插件。在任何情况下,如果再次调用上述方法,则应修复窗口。

希望这很有用。

答案 1 :(得分:0)

在安装了 no Mental Ray插件 的机器中打开包含Mental Ray痕迹的场景文件时,渲染设置中出现一些问题

出于某些原因,尽管解锁并在场景中的defaultRenderGlobals中设置渲染器,渲染设置仍会出现问题,如帖子帖子中提到的或kartikg3答案中的评论。

我找到了一个解决方法 -

  • 解锁defaultRenderGlobals
  • 保存所述文件删除任何现有的unifiedRenderGlobalsWindow UI +更多mel命令
  • 重新加载/重新打开场景

在我看来,在场景中的前两个步骤中,它不会解决“渲染设置”窗口中的问题,除非我通过打开新文件会话关闭当前场景文件或重新打开文件本身...... < / p>

import maya.cmds as cmds
import maya.mel as mel

def unlockRenderer(renderer="mayaHardware2"):
    print "Unlocking and resetting current renderer"

    # Unlock the render globals' current renderer attribute
    cmds.setAttr("defaultRenderGlobals.currentRenderer", l=False)    

    # Sets the current renderer to given renderer
    cmds.setAttr("defaultRenderGlobals.currentRenderer", renderer, type="string")

def saveFile():
    # Prompts User to resave the file, removing traces of Mental Ray
    mel.eval('SaveSceneAs;')

def reloadScene():
    recentFiles = []
    try:
        recentFiles = cmds.optionVar( query = 'RecentFilesList' )

    except:
        cmds.error("No recent files found!")

    curFile = cmds.file(query =True, loc = True)

    if curFile == "unknown":
        cmds.confirmDialog(title = 'Reload Scene', message = ('Reload Last Opened Scene?\n\n' + recentFiles[len(recentFiles)-1]), button = ['Cancel','OK'], defaultButton = 'OK', cancelButton = 'Cancel', dismissString = 'Cancel' )
        cmds.file( str(recentFiles[len(recentFiles)-1]), force = True, open = True)
        print "Opening Last Recent File - ", recentFiles[len(recentFiles)-1]
    else:
        cmds.confirmDialog(title = 'Reload Scene', message = ('Reload Current Scene?\n'), button = ['Cancel','OK'], defaultButton = 'OK', cancelButton = 'Cancel', dismissString = 'Cancel' )
        curFileLoc = cmds.file(query = True, location = True)
        cmds.file( curFileLoc , force = True, open = True)
        print "Re-Opening current file - ", curFileLoc

def main():
    unlockRenderer(renderer="mayaHardware2")
    saveFile()
    if cmds.window("unifiedRenderGlobalsWindow", exists=True):
        cmds.deleteUI("unifiedRenderGlobalsWindow")
    mel.eval('resetAE()')
    mel.eval('buildNewSceneUI;')
    reloadScene()

main()

需要注意的事项 - 有时,即使重新打开文件,仍会遇到#// Error: file: /apps/Linux64/aw/maya2014/scripts/others/unifiedRenderGlobalsWindow.mel line 1074: setParent: Object 'unifiedRenderGlobalsWindow' not found. //等错误。它可能与场景文件

有所不同