我想在打开.ma(maya ascii)文件时运行一些python代码(函数)。 所以我可以手动编辑ma文件并在其中编写一些python代码。所以我的问题是如何在.MA文件中“嵌入”python代码。 MEL也很好。一些梅尔码有效,但不是每一个。我不明白为什么会这样。
答案 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中。您还可能使在文件上运行批处理变得更加困难。