2.Python的应用
2.1 MEL/Python之间的互通
新的MEL命令一一"python" ,它产生字符串并能使之传递到Python中。Python命令可以把命令转换成MEL所能识别的类型。
python( "import maya. cmds )
python( 'maya.cmds.Is )
Python只会返回一种字符串的结果,这是Python目 前的限制情况。
Python具有比MEL更复杂的类系统(CLASS),因此不可能完全转化为MEL能识别的类型。Python命令会自动转换到能处理的方式。对于其他不能处理的,要求以字符串的类型作为返回对象来返回。
下表为二者相互转换的类型结果。
2.2 在Python中调用MEL
在Python编译器中调用MEL,比如使用maya.mel.eval()功能,能更好地转换MEL Python之间命令,因为Python有更多的类支持。必须导入Maya.mel模块来使用这个命令。那就是:
import maya.mel as mm
mm.eval("polySphere;")
下表为二者相互转换的结果类型。
2.3 位置参数
位置参数指的是UI元素向其回调脚本传递的参数。例如,浮点滑块控件的回调MEL脚本可以包含#1。在运行此回调时,浮点滑块的值将替换为此位置参数。
Python支持两种在回调中替换来自控件的值的方法。如果回调是一个要对其 求值的字符串,Maya就以MEL中的方式进行字符串替换。但是,会使用Python的格式运算符进行替换。格式操作将会获得一个传递来的用于替换的项目字典,其中值的名称为1、2等。例如:
maya.cmds.floatSlider( cc='print '%(1)s" )
在执行此字典之前,会先将其应用于字符串。在执行脚本之前,floatSlider 命令使用当前滑块值对此字符串进行格式设置。对于格式操作,用户为其提供格式字符串,UI元素为其提供字典。
Python回调的第2个样式使用编译的函数,其中Maya将值作为参数传递给该函数:
def doPrint( arg ):
print arg
cmds.floatSlider( cc=doPrint )
使用回调函数时,如果回调没有使用正确数量的参数,则会收到错误消息。
def badStuff):
print "bad"
cmds.floatSlider( cc=badStuff)
在移动滑块时会看到以下错误:
# TypeError: badStuff() takes no arguments (1 given)
如果要创建可使用任意数量的参数的回调,请使用变量参数列表:
def genericCallback( *args ):
print( 'args:"+ str (args )
cmds. button( command=genericCallback )
3.MEL与Python之间的重要差异
3.1更改
在Python中可以访问使用MEL runTimeCommand命令创建的MEL命令。例如:
在MEL选项卡中:
runTimeCommand -command "sphere -name myName' mySphere;
在Python选项卡中:
import maya.cmds as cmds
cmds.mySphere()
同样,可以使用以下语法创建Python运行时命令,并从Python中调用这些命令:
import maya.cmds as cmds
def mySphere():
cmds. sphere(name= 'myName')
cmds.runTimeCommand( MyBall, command= 'mySphere())
cmds.MyBal()
3.2其他差异
01 在Python中不支持eval和evalDeferred Maya命令。但是,请注意下列事项。
●Python有 一个用于对Python表达式求值的内置eval函数。
●Python具有 用于对MEL表达式求值的maya.mel.eval。
●在Python中,evalDeferred已由mayautils executeDeferred()取代。
02 MEL具有它自己的警告和错误消息报告机制,该机制已与Maya消息报告集成。这包括命令行上的颜色反馈。Python附带系统模块,这些模块提供警告和错误报告功能;但是,这些模块未集成到Maya中,并且在命令行中不提供颜色反馈。
必须将Python中的单位指定为带引号的字符串;例如:
maya. cmds. scale(3, 3, 3, r=True, p=('0cm', 0.5cm;, '0cm'))
03 Python脚本中的命令标志参数采用一个包含Python脚本的字符串(就像MEL等效项一样)或一个Python可调用对象(如函数)。
例如:
import maya.cmds as cmds
def defaultButtonPush(*args):
print 'Default was pushed.'
cmds. window( width=150)
cmds. columnl ayout( adjustableColumn=True )
cmds button( label= 'Default, command=defaultButtonPush)
cmds. button( label= Left, align=left' )
cmds. button( label= 'Center', align= 'center')
cmds. button( label= Right', align='right')
cmds. showWindow()
04 MEL使用不同于Python的语法来指定值的范围。在MEL中,使用“来来指定值的范围,而不使用*,例如:
select - surface1.cvi**J][O];
在Python中,使用不带引号的*指定值的范围。对于上面的示例,在Python中 则为:
cmds. select( 'surface1.cv[ *I[O]' , r=True)
3.3返回和回显结果
存在两种方式,MEL和Python在返回和回显结果方面会有差异。一一个是与正确的脚本执行相关的,而另一个是表面问题。本节将讨论回显结果和返回结果,有时会混淆它们。
本教程主要对熟悉MEL但不熟悉Python的人员有帮助。
3.3.1返回结果
MEL在执行脚本时会返回最后执行的语句的结果(如果有)。将值指定给变量和返回结果的过程调用的语句属于返回结果的语句类型。例如,以下代码块将有一个结果,MEL会将该结果回显到脚本编辑器和命令行消息区域:
if($foo== 1 ) $bar = 42; else $bar = 7;
相比之下,在Python中指定值的语句不返回结果,尽管Python执行该指定。
使用Python的语法,只需引用一个变量即可返回其值。MEL的语法不允许只是编写变量的名称作为一条完整的语句。
在Python中可以将上述MEL代码片段编写为以下内容。最后一行(bar)会返回结果。
iffoo== 1: bar= 42 else bar= 7 bar
如果需要在一种语言的上下文中使用在另一种语言中计算的值,那么了解该差异是很重要的。例如,如果希望在MEL中使用Python值,只需执行以下命令.
$myMELvariable = python ('myPythonVariable);
反之,如果希望在Python中使用MEL变量,则需要执行类似以下的命令.
import maya.mel myPythonVariable = maya. mel. eval ('global $myMELvariable;$temp=$myMELvariable;' )
可以这样做是因为赋值语句会返回一个结果,该语句是脚本中传递到eval命令的最后一条语句。
在Python中只能访问全局范围的MEL变量。
3.3.2回显结果
MEL会回显由脚本的最后-条语句返回的结果 ( 如果有),而不管脚本中有多少行。Python仅回显单条语句的结果。
热门课程
专业讲师指导 快速摆脱技能困惑相关文章
多种教程 总有一个适合自己专业问题咨询
你担心的问题,火星帮你解答Blender确实不是那么容易上手的软件,尤其是如果你之前用的是像Maya或Max这样的传统软件。但当你终于掌握了它,那种成就......
《哪吒之魔童闹海》幕后纪录片《不破不立》上线,揭秘制作艰辛与匠心。哪吒冲破穿心咒场景灵感源自防盗玻璃,导演饺子分享角色塑造心得......
你还在苦苦寻觅今年的挣钱新风口吗?这里为大家盘点了一些今年乃至明年会有增长点的新风口。大家可以结合自己的优势和特长做一下拼接,......
从学舞蹈到做开发再到做动画,这位《哪吒2》动画师都经历了什么
吴同学从舞蹈转软件开发,再转行学动画,在火星时代教育学习后入职制作公司,参与《哪吒2》动画制作获成就感,强调打好基础对工作和职......
大学生跨专业求职,应找兴趣方向,分析职业能力并提升,利用人脉资源公开求职意愿,尝试私信招聘方,保持开放心态降低要求,耐心投简历......
伴随着《哪吒2》火爆全网,它所带来的不仅仅是电影票房的一路飙升,更是让动画公司和动画创作者群体,再一次走进大众视野。