[Maya]恐怖！Cannot find procedure の怪

```
// Error: line 1: Cannot find procedure "CgAbBlastPanelOptChangeCallback". // 
// Error: line 1: Cannot find procedure "onModelChange3dc". //
```

が出てきた場合の対処。
UI乗っ取り系プラグイン滅すべし！！！

##とりあえずググる
https://qiita.com/mono-g/items/457b1c80147daa059eb2 

https://forums.autodesk.com/t5/maya-animation-and-rigging/onmodelchange3dc-error/td-p/8124149 
の６番め

以下のスクリプトを実行するといいらしい

```py:
import pymel.core as pm
 
# Get all model editors in Maya and reset the editorChanged event
for item in pm.lsUI(editors=True):
   if isinstance(item, pm.ui.ModelEditor):
       pm.modelEditor(item, edit=True, editorChanged="")
```

##が、消えない
↑の対処が直らない・・・というか↑のスクリプト使わないほうが良さそう。
https://forums.autodesk.com/t5/maya-animation-and-rigging/onmodelchange3dc-error/m-p/8124149 
の８番め

**DO NOT USE THAT SCRIPT! The above solution is very dangerous.**

まあ、今あるmodelEditorで出来てるUI全部editしちゃうからそりゃそうか・・・

```py:
needs_fixing = False
try:
    expression_str = cmds.getAttr('uiConfigurationScriptNode.before')
    fixed_expression_lines = []
    for line in expression_str.split('\n'):
        if '-editorChanged "onModelChange3dc"' in line:
            needs_fixing = True
            continue
        fixed_expression_lines.append(line)
    fixed_expression = '\n'.join(fixed_expression_lines)
     
    if needs_fixing:
         
        cmds.setAttr('uiConfigurationScriptNode.before', fixed_expression, type='string')
except:
    pass
```
内容的には`uiConfigurationScriptNode`の.beforeアトリビュートを取得して、一行ずつ読んでエラーのプロシージャを見つけたら消すというもの。

>Here is a script that will safely remove the onModelChange3dc callback without damaging the default maya UI expression.

と自信満々に書いているけどコレ走らせた後でも出る。
MayaAsciiで保存して該当箇所を検索して削除すると消えるらしい。

##原因
`uiConfigurationScriptNode` というノードが原因。

Preferences > Interface > UI Elements > Panel Configurations > When saving >Save panel layouts with file のチェックがオンになっていると作成されるファイル

https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2015/JPN/Maya/files/GUID-B67AE9E4-83EA-444F-AC8A-13DB57BC65BB-htm.html 

https://dcc-scripts.blogspot.com/2015/11/uiconfigurationscriptnode.html 

恐らくプラグイン・ツールによってMayaに現存するmodelEditorで出来たUIをeditされる
↓
uiConfigurationScriptNodeに保存される
↓
このノードが保存されたシーンが外注とかから回ってくる
↓
このノードが保存されているシーンを開いてmodelEditorがeditされる
↓
汚染されたシーン以外のシーンを開いても同様のエラーが発生
↓
そちらのuiConfigurationScriptNodeがさらに上書きされて被害が広がっていく

という状態のようだ。

##二次被害

上記のSave panel layouts with fileのチェックを外して変更を保存したところ、uiConfigurationScriptNodeを消せばエラーは出なくなりました。

が、今度はOutlinerで選択を変更するごとに

```
Error: line 1: Cannot find procedure "look".
```
が発生。最高にうざい。最初に問題にしたエラーが可愛く見える。

これは Mayaデータ保存フォルダの、prefs > workspaces > Maya_Classic.json に
`outlinerEditor -e`　で　-`selectCommand \"look\"`　が書き込まれてたのが原因だと発覚した・・・。
どのタイミングでその変更がかかったのか不明…意味が分からない。
環境によるものかもしれんが、取り合えず自環境ではSave panel layouts with fileのチェックを外すのはダメそうだ。
（同じことを試してくれた人も同じ症状が出た）

##対策
uiConfigurationScriptNodeを消してもすでにmodelEditorがeditされてるので、Save時にonModelChange3dcとか勝手に書き加えられたuiConfigurationScriptNodeが生成されて出続ける。

ので、**必要なものをExportSelectionして即座にMayaを落とし再起動のちにExportしたシーンを開く**と消えてました。

ma編集するよりこっちの方が楽だと思う。今のチームmb運用だし…。

##ツールを作るときには

UIのフラグ書き換えるなら、警告出すとか使ってるときだけ書き換えるようにするとか、後濁さないで欲しいわ・・・。

ホットキー勝手に設定してカレントにするプラグインもあったけど、それもホットキーにプラグインのプロシージャ読みに行かせてたから、パスが切れたら全く同様のことが起こった。

自分もツール作る側だからいい勉強になったけど、規定のUIいじるのはアブない。

##追記　対策おまけ

そういえばmayabatchを使えばUI出さないから、uiConfigurationScriptNodeをいじるスクリプト走らせてもSave時上書きされないんじゃね！？と思い試したところ、

スクリプト走らせなくても**mayabatchでSaveだけすればuiConfigurationScriptNodeの中身が（ほぼ）クリアされる**という事が発覚した…。

（ほぼ）っていうのは、uiConfigurationScriptNode.beforeに書いてある冒頭の「このスクリプトは自動生成されたもんで、いじってバグっても知らないからね」的な事がコメントアウトで書いてある部分以外は消えたという事。
つまりは、UI出さないモードでUIの状態を保存したもんだから消えたのかな…。なんか、こう…モヤっとするわ。

mayabatchについての説明
https://knowledge.autodesk.com/ja/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2016/JPN/Maya/files/GUID-2E5D1D43-DC3D-4CB2-9A35-757598220F22-htm.html

あと、D&DでSaveだけするバッチも置いときます。複数ファイル可です。利用は自己責任でお願いします。

```bat:
for %%F in (%*) do call :sub %%F

:sub
   Call お使いのMayaバージョンがあるディレクトリ\bin\mayabatch.exe -file %* -command "file -save"
```