• PostSceneRead 事件和MSceneMessage::kAfterFileRead 的关系和区别


    在很多时候,我们需要在某个操作发生的时候处理一些自定义的任务,这个时候我们就需要用到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 。

  • 相关阅读:
    Google 推出开源博客迁移工具
    Google 的盲人科学家 T. V. RAMAN
    Sun收购Qlayer以积极推动云计算业务
    比尔盖茨:云计算再造软件边界
    一些CodeGuru的COM教程 (英文)
    机器人:人工智能与心理学的较量
    100个最古老互联网域名 最久只有23年(附名单)
    spring2 hibernate3 中包冲突问题解决
    spring2.5+struts2+hibernate+mysql
    [转].NET破解体验 ildasm.exe的使用
  • 原文地址:https://www.cnblogs.com/johnonsoftware/p/3536139.html
Copyright © 2020-2023  润新知