今天我们来学习一下API中的事件触发:MMessage
功能:用于处理Maya中多种事件消息,提供响应操作
特性:比scriptJob,事件更丰富
在Maya中,有许多的事件可以供我们来调用它的接口,也就是说Maya在处理任何以像工作的时候,她都会有相应事件,我们可以注册不同的事件,来响应他不同的操作,上图中是我截下来的关于MMessage的一部分,我们可以从帮助文档里看到他全部的Message,MMessage知识他的基础的一个父类,我们使用道德都是继承他的这些子类,比如说,我们要操作物体层级相关的,就用MDagMessage,我们要操作普通节点相关的,或者我们调用命令的时候,可以使用MCommandMessage,或者我们要绑定某一个节点上的事件,再比如说属性变化的时候,我们可以使用NodeMessage,我们也可以使用多边形的PolyMessage,或者当场景变化或者更新的时候。我们可以使用MSceneMessage
下面我们就以MTimerMessage,也就是说一个计时的事件,当我们注册玩这个TimerMessage之后,Maya就会根据我们所注册的事件的事件,一直调用我们所注册的函数,下面来看一下帮助文档:
他有一个addTimerCallback,也就是说,添加一个回调函数,那么第一个参数就是我们要传入的一个时间间隔,然后第二个我们可以看到是一个Function,也就是说要传入我们的回调函数,其他的内容为可选内容,我们不用填写,那么他返回的就是一个Callback的ID,如果我们要移除这个事件的话,我们就需要用CallbackID来进行移除
import maya.OpenMaya as OpenMaya
import pymel.core as pm
def func(*args):
"""
定义一个回调函数func,参数不限制他的输入的数量
"""
print 1, args
callback_id = OpenMaya.MTimerMessage.addTimerCallback(1, func) #添加这个时间的ID,第一个参数是秒数,第二个参数为传入的函数
OpenMaya.MTimerMessage.removeCallback(callback_id) #移除当前事件
这是一个普通的计时器的函数,那么除了一个计时的消息之外,我们还可以监控他的事件,那么我们可以使用MEventMessage
第一个参数就是一个String类型的Event,第二个同样是一个Function,那么如何传递StringEvent
我们可以使用getEventName()来获取他的事件
event_names = list()
OpenMaya.MEventMessage.getEventNames(event_names)
call_back_timer = OpenMaya.MEventMessage.addEventCallback('timeChanged', func)
OpenMaya.MMessage.removeCallback(callback_id)
先定义一个存放eventname的列表,来查看他有哪些事件可以供我们使用
event_names = list()
讲得到的eventname存放在上面创建的列表中
OpenMaya.MEventMessage.getEventNames(event_names)
创建一个timeChanged的事件
call_back_timer = OpenMaya.MEventMessage.addEventCallback('timeChanged', func)
移除id为callback_id的事件,因为事件的removeCallback是继承MMessage的,所有我们可以使用MMessage就可以移除任务
OpenMaya.MMessage.removeCallback(callback_id)
定义函数
addCallback
removeCallback
那么所有的Message里面基本上都是这三个主要步骤,定义函数,然后添加回调,删除回调,如果是常用的消息呢,我们就一般不会删除他的回调,因为当Maya关闭了,他就自然而然就没有了。