Maya 命令

所有本地 Maya 命令的 Python 绑定位于 maya.cmds 模块中。为了访问这些命令,在每个会话中,必须在“脚本编辑器”(Script editor)的 Python 选项卡中输入以下命令:

1
2
3
4
5
6
7
8
9
import maya.cmds

#参考
maya.cmds.ls()
maya.cmds.sphere( radius=4 )

maya.cmds.ls()
maya.cmds.sphere( radius=4 )

对应Mel

1
sphere -radius 4;

对于多个参数

1
2
3
4

maya.cmds.ambientLight( rgb=( 0.2, 0.3, 0.4 ) )

maya.cmds.ambientLight( rgb=[ 0.2, 0.3, 0.4 ] )

并非所有的 Maya 标志都需要一个值(例如,ls -sl)。实现需要为通常不使用任何参数的标志指定布尔参数。如果布尔值为 False,那么将忽略该标志;如果为 True,那么将使用该标志

1
2
3
4

maya.cmds.ls( selection=True )

maya.cmds.ls( selection=False )

多个命名参数

1
2
3
4
5
6
ls -type nurbsSurface -type transform;ls -type nurbsSurface -type transform;

maya.cmds.ls( type=['nurbsSurface','transform'] )

curveOnSurface -d 3 -uv 0 0 -uv 0.3 0.5 -uv 0.5 0.6 -uv 0.9 1.0 surface1;
maya.cmds.curveOnSurface( 'surface1', d=3, uv=[(0,0),(0.3,0.5),(0.5,0.6),(0.9,1.0)] )

范围

Maya 命令中有三种类型的范围:时间、索引和浮点。在 Python 中必须使用元组指定所有范围。任意元组都可能有一个或两个值。具有一个值的元组指定为放在括号中且后跟一个逗号的值;多个单值元组使用集表示法指定。

命令标志更改

  • polyAppendVertex :可用于取代 point、vertex 和 and hole 标志的新 append 标志。

  • polyAppend :可用于取代 point、edge 和 hole 标志的新 append 标志。

  • polySplit :可以用于取代 facepoint 和 edgepoint 标志的新 insertpoint 标志。

  • polyCreateFacet :经过修改后可用于指定洞的现有 point 标志。

  • roundConstantRadius :可替换使用应该混合使用的 sidea 和 sideb 的新 side 标志。

参数类型参考

对话框

1
2
3
4
5
6
7
8
#使用 raw_input
raw_input()
#使用 sys.stdin
import sys
inp = sys.stdin.readline()
#自定义命令提示
import maya.cmds as cmds
inp = cmds.promptDialog(message='hello')

MEL/Python 通信

MEL 命令 (Python) 会提取字符串并将其传递到 Python 中予以执行。Python 命令会尝试将结果转化为 MEL 类型

  • 只有带有单个 Python 语句的字符串才能返回结果。这是当前由 Python 施加的限制。

  • Python 的类型系统比 MEL 更复杂,因此无法将所有 Python 数据类型转化为本地 MEL 类型。Python 命令会转化自身知道如何进行处理的数据类型。对于其他数据类型,则会需要一个字符串来表示对象并进行返回。

从Python调用Mel

aya.mel.eval() 函数。由于 Python 的类型支持更灵活,此函数的转化效果会比 MEL 的 Python 命令更好。

1
import maya.mel as mm mm.eval("polySphere;")

创建Help

1
2
3
import maya.cmds
helpInfo = cmds.help('move')
print(helpInfo)

关于Python多线程

Python 语言附带有内置线程支持。该功能在 Maya 中可用,但是存在 Python 开发人员需要注意的一些重要限制事项。

Maya API 和 Maya 命令架构不是线程安全的架构。如果在主线程外调用 Maya 命令,它们会抛出一个异常,从主线程以外的线程中使用 OpenMaya API 时会产生无法预料的副效应

maya.utils.executeInMainThreadWithResult() 函数可以接受包含 Python 代码的字符串或 Python 可调用对象(例如函数)。如果是后者,executeInMainThreadWithResult() 也接受在其运行时传递给可调用对象的常规参数和关键字参数。

在下一个空闲事件期间,会在主线程中执行脚本或可调用对象。在主线程空闲并运行代码之前,调用 executeInMainThreadWithResult() 的线程会阻塞。主线程执行完代码后,executeInMainThreadWithResult() 会返回结果。如果 executeInMainThreadWithResult() 是从主线程调用的,则它会立即运行代码并返回结果。

1
2
3
4
import maya.utils import maya.cmds
def doSphere( radius ):
maya.cmds.sphere( radius=radius )
maya.utils.executeInMainThreadWithResult( doSphere, 5.0 )

Mel和Python差异

在 Python 中不支持 eval 和 evalDeferred Maya 命令。

  • Python 有一个用于对 Python 表达式求值的内置 eval 函数。
  • Python 具有用于对 MEL 表达式求值的 maya.mel.eval。
  • evalDeferred 已由 maya.utils.executeDeferred() 取代。

MEL 具有它自己的警告和错误消息报告机制,该机制已与 Maya 消息报告集成。这包括命令行上的颜色反馈

Python 附带系统模块,这些模块提供警告和错误报告功能;但是,这些模块未集成到 Maya 中,并且在命令行中不提供颜色反馈。