4.编写Python脚本 的提示和技巧
4.1 内置Python库
Python具有许多有用的内置库和数据结构。大多数情况下,可以使用一个现有的库来完成常规的编程任务,这样不必与MEL脚本-样创建自定义工具。
4.2使用Python类的自定义UI
其中一个方便的Python函数是functools partial,该函数可用于将附加信息传递到回调函数。例如,下面的类创建的窗口具有多个在单击时会输出数字的按钮。
from functools import partial
import maya.cmds as cmds
class ButtonWin(object):
def_ .init (self);
self.win = cmds. window()
self.layout = cmds. columnL ayout(parent-=self.win)
for x in range( 10):
cmds. button(label= "Click Here %d"%x, parenta =self. layout, command=partial(self.report,x))
cmds. showWindow()
def report(self, buttonIndex, value):
print "button %d got %s %(buttonIndex, value)
f= ButtonWin()
4.3在Maya中调试Python脚本
使用Python脚本的一个优点是可以在开发过程中使用调试器。这在解决脚本问题时可以节省大量时间。
4.3.1使用PDB
Python在PDB模块中附带一个内置的调试器。PDB的文本界面适用于快速调试会话。如果在从Script Editor (脚本编辑器)调用的脚本中使用PDB,则每当PDB需要输入时都会出现输入对话框。使用PDB与导入PDB并按如下方式设定断点样简单:
import pdb
pdb.set trace()
执行达到第2行时,将显示输入对话框,您可以使用标准命令来继续、跳过、输出值等。
4.3.2使用外部调试器
对于复杂调试任务,可能更易于使用外部图形调试器。存在多个免费的和商业的IDE,例如:
●Wing IDE
●Winpdb
●Eclipse
可以先在Maya中导入一个工具模块来使用外部调试器,导入该模块会打开到IDE的通信套接字。IDE 连接到Maya后,即可打开脚本文件来设定断点、检查变量值等。每个IDE都将具有其自己所需的工作流。
4.4将Python函数注册为MEL程序
可以使用createMelWrapper函数将Python函数注册为MEL程序。然后,在调用MEL程序时,会调用Python函数,从而传递收到的任何参数并返回函数的结果。
路径为:
C:Program Files\AutodeskMaya2014\PythonNib\site- packageslmayalmel
或者,在脚本编辑器中执行以下命令:
import maya.mel
help(maya.mel.createMelWrapper)
使用该函数的优点如下。
通过将Python函数注册为MEL程序,您不需要获取MEL脚本的源代码(如果程序和脚本共享相同的名称)。相比之下,如果使用的是Python,则必须先显式导入脚本,然后才能访问其包含的函数或类。使用该包裹器函数可以使Maya即时获得源代码,且不必始终加载每个脚本。
Maya中的某些属性只接受MEL程序。例如,在“asset" ( 以前称为container )节点中,Context Properties (上下文特性)区域下的Rmb Command (鼠标右键命令)属性只接受MEL程序。
示例:
以下示例说明如何使用createMelWrapper函数将Python函数注册为MEL程序,以便使用"asset”(以前称为container )节点中的Rmb Command (鼠标右键命令)属性。
01将以下脚本另存为rmbScript.py,并保存到Maya2014/scripts目录中。
import maya.cmds as cmds
import maya.me/ as mel
def exCoNotes(node):
if(cmds.nodeType(node)== container':
objCont = node
else:
objCont = cmds. container(q= True, findContainer=node)
exec(cmds. getAttr(objCont+ '.notes'))
pyfunction = 'main("+node+ ", "+objCont+"'
exec(pyfunction)
cmds. select(node, r=True)
def setThisContainerCurrent(node):
if(cmds.nodeType(node)== container):
objCont = node
else:
objCont = cmds. container(q=True, findContainer=node)
cmds. container(objCont, e= True, c=True)
cmds. select(node, r=True)
def rmbMyContainerScript():
return ("Execute Container Notes"; "exCoNotes',
"Set This Container Current", "setThisContainerCurrent)
02在Script Editor (脚本编辑器)中,从Python选项卡执行以下脚本。该操作将创建所需的MEL包裹器脚本。
from rmbScript import
import maya. cmds as cmds
import maya.mel as mel
mel.createMelWrapper(rmbMyContainerScript,retType= string[')
mel. createMelWrapper(exCoNotes)
mel.createMe/Wrapper(setThisContainerCurrent)
03创建一个对象。
04选择Assets> Advanced Assets>Create (资源>高级资源>创建),然后将rmbMyContainerScript添加到资源的Rmb Command (鼠标右键命令)属性。
注意:还可以借助变换资源使用该步骤;但是,节点类型将为dagContainer。
05将类似如下的脚本添加到asset (资源)节点的Notes (注释)部分。
def main(node, container):
print node
print container
06在Script Editor (脚本编辑器)的MEL选项卡中,输入以下脚本。
rehash;
07在对象上单击鼠标右键(), 并从标记菜单中选择Custom (自定义)。您现在可以查看自定义鼠标右键菜单。
4.5 为已设置动画的曲线创建关键帧
可以使用以下Python示例脚本来创建已设置动画的曲线并设定其关键帧。
import maya. OpenMaya as om
import maya. OpenMayaAnim as oma
def addkeys(plugName, times, values, changeCache):
# Get the plug to be animated.
se/ = om.MSelectionList()
sel.add(plugName)
plug = om.MPlug()
sel.getPlug(0, plug)
# Create the animCurve.
animfn = oma. MFnAnimCurve()
animCurve = animfn. create(plug, oma.MFnAnimCurve.kAnimCurveTL)
# Copy the times into an MTimeArray and the values into an MDoubleArray.
timeArray = om.MTimeArray()
valueArray = om.MDoubleArray()
for iin rangellen(times)):
timeArray.append(om.MTime(times[i], om.MTime uiUnit())
valueArray append(valuesl[i)
# Add the keys to the animCurve.
animfn.addKeys(
timeArray,
valueArray,
oma.MFnAnimCurve.kTangentGlobal,
oma.MFnAnimCurve.kTangentGlobal,
False,
changeCache
以上示例代码会将关键帧动画添加到通道(即栓)。如果不需要具有撤消更改的能力,则可以按以下方式进行调用。
addkeys(pCube1.tx',[1.0, 3.0, 5.0], [0.6, 1.2, 2.4], None)
但是,如果需要具有撤消更改的能力,那么请按以下方式进行调用。
changeCache = oma.MAnimCurveChange()
addkeys(pCube1.x, [1.0, 3.0, 5.0], [0.6, 1.2, 2.4], changeCache)
然后执行以下脚本以撤消更改。
changeCache,undolt()
注意:为简便起见,该函数假定由plugName指定的栓当前未设置动画。
上一篇 maya中如何实现粒子替代?
热门课程
专业讲师指导 快速摆脱技能困惑相关文章
多种教程 总有一个适合自己专业问题咨询
你担心的问题,火星帮你解答《黑神话:悟空》作为一款现象级中国游戏,其成功离不开多种先进计算机技术的支持。本文将深入解析该游戏背后的关键技术,包括虚幻引擎......
在游戏开发领域,Unity和Unreal Engine(虚幻引擎)都是备受推崇的游戏引擎,但它们各自拥有不同的特点和优势。
春节之后大量抢人!这6个行业是转行首选,进去1年顶3年!火星毕业就能进
春节后求职,哪些行业进去能立马涨薪?打破信息差很关键!
还没毕业,就去帮电视台拍活动,作品被主任说“非常好”!猜猜是哪个专业呀?
回想过去,电子游戏里的草其实并不是真正的草。开发者们只是简单地把草的纹理直接贴在游戏关卡的地板上
在火星的就业指导老师那里,经常收到同学们这样、那样的提问。其中有一些共性问题,就业老师会根据自己丰富的经验,为同学们给出合适的回答。