【问题标题】:getting list of camera or render globals from maya scene file without opening scene in maya从 Maya 场景文件中获取相机列表或渲染全局变量,而无需在 Maya 中打开场景
【发布时间】:2012-11-25 07:53:34
【问题描述】:

是否可以使用 python 读取 Maya 场景文件而无需打开并获取相机列表或渲染全局设置或对其执行一些操作。 我需要这个,以便如果它们是多个场景文件,我不必打开每个 Maya 场景,只需从 python 脚本调整它,如果有人可以展示如何开始休息,我将不胜感激,我会自己做......

【问题讨论】:

    标签: python maya autodesk


    【解决方案1】:

    有可能,只是不实用。 Maya ASCII 文件的解析非常简单。 Maya 二进制文件没有那么多。现在讨论这些问题可能有点为时过早。

    首先要做的事情。 Maya 确实提供了批处理模式,批处理模式不会用完完整的许可证。它仍然会打开一个完整的 Maya 环境,但没有 GUI。这是注入脚本的完美平台。它并没有真正满足您不打开 Maya 的要求,但它满足了所有其他要求。有几种方法可以使用这种批处理模式。但主要归结为两种通用方法。

    方法 1,使用 mayabatch:mayaXX/bin/ 目录包含一个名为 mayabatch 的命令。您可以简单地从 cmd/shell 批处理文件/shellscript 调用它。这是调用现有脚本的一种极其简单的方法。假设 mayabatch 在您的环境路径中,并且您的脚本在 Maya 脚本路径中。为简单起见,我们假设您的脚本如下所示(demo.py):

    import maya.cmds as cmd
    
    def func():
        print cmd.ls()
    
    # we want this to execute on import
    func()
    

    现在在 windows 下为一个文件调用它会如下所示:

    mayabatch -command "python(""import demo"") " -file filename.ma
    

    对当前文件夹文件中的所有 Maya 调用此方法很简单:

    for %i in (*.ma) do mayabatch -command "python(""import demo"") " -file %i
    

    mac 和 Linux 上的引用规则有点不同,但应该很容易找到。冷藏到你的外壳手册。

    方法 2,使用 mayapy 和独立:

    现在你也可以直接用mayapy调用python脚本了。它与 mayabtach 位于同一目录中。如果您在系统路径中包含 Maya 模块,也可以从其他 python 解释器调用 Tough 独立的。现在必须对脚本稍作改动,使其执行相同的操作(demo_direct.py):

    #init maya
    import maya.standalone
    maya.standalone.initialize( name='python' )
    import maya.cmds as cmd
    import glob
    
    def func():
        print cmd.ls(shapes=True)
    
    for file in glob.glob('*.m[ab]'):
        cmd.file( file, o=True )
        func()
    

    使用以下命令调用此表单命令行:

    mayapy demo_driect.py
    

    这些方法都不会加载 Mayas 图形用户界面。所以你不能调用 playblast 之类的东西。因为它们依赖于 GUI,因此是完整的 Maya 许可证。没有什么说你不能像上面那样在 GUI 中执行类似的加载循环。

    然后是没有实际加载 Maya 的方法。这有点棘手。这样做并不一定值得,因为批处理节点非常快,因为它们不会最终加载所有内容。为帧范围解析 Maya ASCII 文件的示例脚本。你可能会发现它很有用。请参阅以下post。对于 Maya 二进制文件,cgKit 中有一个 python 模块,可以帮助您读取 Maya 二进制块。不幸的是,它对理解数据没有任何帮助。

    【讨论】:

    • 我不能使用第一种方法,因为我想读取相机是场景文件,以及渲染全局变量的 startFrame 和 endFrame,但就第二种方法而言,假设我通过cmds.ls(shapes=True) 我应该如何将我得到的形状列表附加到 QComboBox ?
    • @san,你可以使用第一种方法。我只是在说明您如何启动许多脚本,因为您对您想要做什么并不是非常具体,因此我假设您知道如何编写 Maya 脚本。显然,如果您想列出所有相机,您可以将 print cmd.ls() 更改为 print cmd.ls(type='camera')。至于 QComboBox 那不是你问的。当您提出要求时,请尽量将其保持在您想要的范围内,并且不要用很多您不知道可能在解决方案中的东西来装饰它。
    • import subprocess subprocess.call() import os import maya.standalone import maya.cmds as cmds fileToOpen="I:/scenes/san_telus_pan_v009.ma" def getCams(phileToOpen): maya.standalone.initialize (name='python') cmds.file(phileToOpen, force=True,open=True) cams=cmds.ls(type="camera") return cams getCams(fileToOpen) 我想在readMayaFile.py中执行上面的函数从 [RenderUI.py][1] 获取 QComboBox [1] 中的凸轮返回列表:pastebin.com/9gfYaWRV
    • 好的,我可以得到这个。只是您已经很好地破坏了stackoverflow的目的。你不应该在这里讨论事情。您应该提出简洁的问题,以便该问题作为参考有意义。 Stackoverflow 正在尝试构建一个常见问题解答。因此,如果您想更改问题的解决方案,那么您需要更改您的问题以反映您需要的答案。如果你想一般地讨论一些事情去一些论坛。众所周知,如果您想扩展内容,我会挂在 creativecrash.com 上,否则请修改您的问题以更好地适应 stackoverflow。
    • 至于你的问题。省略子流程行省略最后一行。然后在主文件中输入 import yourPythonFilename,然后在主文件中调用:cameras = yourPythonFilename.getCams('I:/scenes/san_telus_pan_v009.ma')。但是评论字段不适合这种讨论,因为它们不应该在这里发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多