Maya ascii文件中的Python函数

时间:2017-06-30 16:17:32

标签: python ascii maya mel

我想在打开.ma(maya ascii)文件时运行一些python代码(函数)。 所以我可以手动编辑ma文件并在其中编写一些python代码。所以我的问题是如何在.MA文件中“嵌入”python代码。 MEL也很好。一些梅尔码有效,但不是每一个。我不明白为什么会这样。

1 个答案:

答案 0 :(得分:1)

您不应该手动编辑文件来执行您正在尝试的操作 - MA文件看起来像Mel,但它们并不完全相同,并且您可以通过错误编辑轻松破坏您的场景。

在Maya文件中嵌入脚本功能的标准方法是使用script node。对于您正在查看的应用程序,您要创建一个脚本节点并将其设置为在Maya中打开文件时运行。

使用cmds.scriptNode()创建脚本节点。该节点有两个字符串属性.before.after;您将其中一个设置为要执行的脚本的文本。 .scriptType属性是一个枚举,告诉Maya何时执行脚本,.sourceType表示是使用Mel还是Python。要在Maya中打开文件时运行脚本,通常使用.scriptType为2,即“在GUI上打开/关闭”和.before属性(有点令人困惑,是“beforeScript”) “在命令标志中)

因此,例如,打开场景时打印“hello world”:

sn = cmds.scriptNode(beforeScript = "print('hello world')")
cmds.setAttr(sn + '.scriptType', 2) # gui open/close
cmds.setAttr(sn + '.sourceType', 1) # python

保存文件并重新打开,它会向监听器打印“hello world”。您无法控制可能打开文件的环境,因此您应该谨慎对可用导入进行假设等。该脚本将在全局范围内执行,就像在侦听器中键入一样。

更新 - 打包

评论表明OP希望将更复杂的脚本放入节点中。通常,maya将执行该字符串,就好像您在Python中的相同字符串上运行exec一样。 Exec适用于多行字符串,但如果使用制表符和空格,则必须使用换行符和制表符正确格式化它们。你还需要正确地逃避你的报价。对于简短的脚本,只需使用三重单引号来逃避整个事情:

script = '''
def example():
    for n in range (100):
        print ("hello world")
example()
'''
import maya.cmds as cmds
sn = cmds.scriptNode(beforeScript = script)
cmds.setAttr(sn + '.scriptType', 2) 
cmds.setAttr(sn + '.sourceType', 1) 

通常,从磁盘读取脚本并将其存储起来更容易:

def create_script_node_from_file(filename):
    with open('filename', 'rt') as handle:
        script_text = handle.read()
    sn = cmds.scriptNode(beforeScript = script_text)
    cmds.setAttr(sn + '.scriptType', 2) # gui open/close
    cmds.setAttr(sn + '.sourceType', 1) # python

您可能不希望在脚本节点中做任何非常干扰或精心制作的事情,因为将来打开文件的人可能只想检查它而不是深入到您呈现的任何UI中。您还可能使在文件上运行批处理变得更加困难。