前言

  去年我还在动画制作公司的时候,绑定那边就提到了一个神奇的 callback 问题。

1
2
3
4
5
// Error: line 1: Cannot find procedure "CgAbBlastPanelOptChangeCallback". //
// Error: line 1: Cannot find procedure "CgAbBlastPanelOptChangeCallback". //
// Error: line 1: Cannot find procedure "CgAbBlastPanelOptChangeCallback". //
// Error: line 1: Cannot find procedure "CgAbBlastPanelOptChangeCallback". //
// Error: line 1: Cannot find procedure "CgAbBlastPanelOptChangeCallback". //

  只要在视窗切换模型的显示操作就会弹出这么一大堆的报错(按4 、 5 键切换)
  虽然报错没有什么影响,但是下面的显示总是报 红色 ,制作起来就很烦。
  最神奇的是,新打开的 Maya 不会有这个问题,但是打开一些 Maya 文件就会这样,而且一旦出错就无法消除,打开其他文件也一直报错。

  一开始最简单的解决方案就是 global proc CgAbBlastPanelOptChangeCallback 定义一个这样的 mel 程序。
  但是为什么会出现这个错误,要从根源解决问题。
  于是我花了好长一段时间自己找到了问题的根源所在,并且弄了一段代码解决这个问题。

1
2
3
for modelPanel in cmds.getPanel(type="modelPanel"):
if cmds.modelEditor(modelPanel, q=1, ec=1) == "CgAbBlastPanelOptChangeCallback":
cmds.modelEditor(modelPanel, e=1, ec="")

  只要执行上面这段代码,就可以从根源上解决问题。


  最近想着写文章,又简单探索了一下这个问题,没想到去年在我研究出解决方案之后也有人发布到 github 上了。链接

1
2
3
4
5
6
7
8
9
10
11
12
from maya import cmds

for model_panel in cmds.getPanel(typ="modelPanel"):

# Get callback of the model editor
callback = cmds.modelEditor(model_panel, query=True, editorChanged=True)

# If the callback is the erroneous `CgAbBlastPanelOptChangeCallback`
if callback == "CgAbBlastPanelOptChangeCallback":

# Remove the callbacks from the editor
cmds.modelEditor(model_panel, edit=True, editorChanged="")

  可以说和我上面的操作代码 一毛一样, 哈哈~

问题查找

  最开始我以为 CgAbBlastPanelOptChangeCallback 是 Maya 的内置 callback。
  于是我在 Maya 的安装目录里面搜索 CgAbBlastPanelOptChangeCallback ,毫无收获。


  于是我猜想是 scriptJob 引入进去的,但是罗列了所有的 scriptJob 也一无所获。


  唯一确定的就是 切换视窗会报错 ,并且Maya文件会像病毒一样污染整个 Maya。
  于是保存了一个空的 Maya 文件出来,查看到底是什么导致的。
  然后就发现这个问题和 modleEditor 有关。

  于是我进一步研究 modleEditor 命令,然后发现是 editorChanged 添加了这个回调,并且通过 scriptNode 添加。
  一旦打开文件就会添加,并且文件关闭没有消除这个命令,因此导致其他文件就会报错。


  但是我到最后还是没有研究出这个 callback 是什么插件引入的。

总结

  我去年3、4月份的时候在网上貌似找不到答案,但是现在查的时候就查到了两篇日本人的博客有很详细的描述,而且和我解决问题思路有 90% 是一样的。


  当然最后他们也没有查出到底是什么插件引入的,只是可以通过上面的脚本来解决这种问题。
  因此上面的博客也提到,不要再 scriptNode 里面写这些花里胡哨的东西,很容易导致全局污染,用到这种 callback 的操作都要谨慎小心。