我有在 Maya 中对文件运行批处理操作的代码。实际的实现并不重要,只要知道它得到一个文件路径列表,maya 打开文件,然后依次对每个文件执行操作。
如果由于某种原因引用无效(例如路径无效),我想中止加载整个场景并跳到批处理列表中的下一个。
查看此站点和其他地方的其他问题,我只能看到用户询问如何查询参考。我已经有一个合理的函数来执行此操作,这是在该函数返回一个让我难过的无效引用路径之后要做的事情。
过去一直通过弹出窗口手动解决无效的参考路径,但是大批量不断地照看 Maya 实例是不可行的。也不会抑制弹出窗口本身,因为我相信它仍然会打开文件,并在它处于无效状态时在现场运行批处理操作。
我已经通过maya cmds
python模块尝试不加载引用,但是当使用loadReferenceDepth
标志时cmds.file
我仍然得到一个弹出窗口:
cmds.file(r'c:\path\to\file.ma', o=1, f=1, lrd='none') #invalid ref popup during file cmd
第二种方法是查看maya open api并在 before open 事件上注册一个回调。下面的代码在功能上与批处理的设置方式相同:
import maya.OpenMaya as OpenM
batchFileList = [r"c:\path\to\file.ma", r"c:\path\to\file2.ma"]
def _test_raise_exception(arg0, arg1, arg2):
#pretending that a file ref failed below. Ref path validation code would go here.
print '\n'*5+'Test Logging'+'\n'*5
return False
cId = OpenM.MSceneMessage.addCheckFileCallback(OpenM.MSceneMessage.kBeforeOpenCheck, _test_raise_exception)
for file_ in batchFileList:
try:
rv = cmds.file(file_, o=1)
#do stuff to the maya scene here
except:
#something didn't validate on load, except and skip, logging the occurrence.
print 'load cancelled'
OpenM.MSceneMessage.removeCallback(cId)
但是,即使addCheckFileCallback
表明如果回调函数返回False
操作是 aborted,文件还是会被加载。
同样,替换return False
for araise RuntimeError
不会让我捕捉到异常。相反,cmds.file
完成并且只在日志中打印出一条小消息,说“python回调失败”。python open api 文档说绑定更喜欢异常而不是 MStatus 返回代码,所以我希望它可以工作。
我们删除了 MStatus 类。必须使用 Python 异常而不是 MStatus。
我在这里错过了什么吗?必须有办法做到这一点。构建一个非常粗糙的 .ma 解析器是另一种选择,但这意味着放弃对 .mb 文件的支持,我不想这样做。
谢谢你的时间!