如何在Maya的kBeforeOpen回调中获取待打开文件名称
如何在Maya打开文件前获取待打开的文件名
你遇到的问题很典型——kBeforeOpen 属于 MSceneMessage 回调,它的触发时机是当前场景即将被新内容替换,但它并不会把待打开的文件路径作为参数传递给回调函数。所以你用 cmds.file(q=True, sn=True) 查询到的只是还没被替换的当前场景名称(空场景自然就是空字符串)。
要解决这个问题,你需要换用 MFileMessage 下的 kBeforeOpenFile 回调,这个回调专门负责在文件打开前触发,并且会把待打开的文件路径直接作为参数传递给你的回调函数。
正确的代码示例
import maya.OpenMaya as om def before_open_file(file_path, *args): # file_path 就是即将打开的文件的完整路径 print('即将打开的文件:', file_path) # 注册回调 callback_id = om.MFileMessage.addCallback(om.MFileMessage.kBeforeOpenFile, before_open_file)
当你打开 C:/tmp/pen_01.mb 时,这个回调会直接输出:
即将打开的文件: C:/tmp/pen_01.mb
额外提示
如果你之后需要移除这个回调(避免内存泄漏),可以调用:
om.MFileMessage.removeCallback(callback_id)
为什么不推荐用命令历史解析?
有些开发者会尝试通过解析最近的 file 命令来获取路径,但这种方法非常不可靠——比如用户通过脚本调用打开文件、或者命令历史被清空时,这种方法就会失效。所以优先使用官方提供的 MFileMessage 回调是最稳妥的方案。
内容的提问来源于stack exchange,提问作者Massimo
相关产品推荐
相关产品推荐

