在很多时候,我们需要在某个操作发生的时候处理一些自定义的任务,这个时候我们就需要用到MMessage类型来注册一些回调函数 callback.
对于使用过MMessage的开发者来说,这个是很容易理解的,但Maya同时也提供了一些内部的事件来给开发者调用,这个是通过MEventMessage类型来实现的。用户可以通过MEventMessage::addEventCallback()来注册一个Maya内部的事件,具体函数如下:
MCallbackId MEventMessage::addEventCallback ( const MString & eventName,
MMessage::MBasicFunction func,
void * clientData = NULL,
MStatus * ReturnStatus = NULL
)
其中第一个字符串参数就是Maya内部的事件名称,我们这里要说的PostSceneRead也就是其中的一个内部事件,开发者可以通过 getEventNames 函数或者Mel命令 scriptJob -listEvents 去获取所有的内部事件。
讲完了Maya的内部事件,让我们回到主题来看下PostSceneRead 内部事件和MSceneMessage::kAfterFileRead 事件到底是否完全一致呢?还是有啥区别?
参考官方文档如下:
PostSceneRead:
after a scene has been read. Specifically after a file open, import or all child references have been read.
kAfterFileRead
Called immediately after any file read operation (open, import or reference) and while reading state (MFileIO::isReadingFile) is true.
初步看起来,两者似乎一致,都是在文件打开,导入或者引用的时候被触发,但是通过实际测试,发现两者在引用的时候是不一样的,如文档所示,PostSceneRead 回调函数只会在所有的引用都被读入后才触发一次,但是kAfterFileRead会在每一个引用文件被读入时触发。举个例子:如果文件 main.ma 引用了 ref1.ma和ref2.ma, 那如果打开main.ma 时候,PostSceneRead回调只会在主文件和所有引用文件都读入的时候被触发一次;但是kAfterFileRead回调会在每个引用文件被读入时调用,也就先调用两次,并在最后文件全部读入时再调用一次,一共三次。
所以如果您要对每个引用文件在读入时单独进行处理的话,请使用kAfterFileRead 。