Python Maya ascii 文件中的函数

Python function in Maya ascii file

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

您不应该手动编辑文件来执行您正在尝试的操作 -- MA 文件看起来像 Mel,但它们并不完全相同,如果编辑不当,您很容易破坏场景。

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

脚本节点是用 cmds.scriptNode() 创建的。该节点有两个字符串属性,.before.after;您将其中之一设置为您要执行的脚本的文本。 .scriptType 属性是一个枚举,它告诉 Maya 何时执行脚本,.sourceType 指示是使用 Mel 还是 Python。要在 Maya 中打开文件时 运行 脚本,您通常使用 .scriptType of 2,即 "On GUI open/close" 和 .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 .您还可以使 运行 对文件进行批处理变得更加困难。