Mayaスクリプトエディタを使いやすくしたい

INDEX

はじめに

こんにちは。モノリスソフト テクニカルアーティストの菅原です。

Mayaのスクリプト作成を行う際に基本的に外部エディタを使用している人でも、短いコードの確認をしたり、シーン内の情報を確認するスクリプトを作成したり等でスクリプトエディタを使用することがあるかと思います。

そういったスクリプトエディタでの作業を行っている時に個人的に気になった部分があったため、スクリプトエディタの動作を変更してみました。
今回はその処理を作成するにあたっての流れをまとめてみようと思います。

今回の内容はMayaの動作を変更するものになります。以下の内容を試す場合は自己責任でお願いします。

気になった部分と対応方法

まず、個人的に不便に感じた部分は以下の2点です。

  • Ctrl+sで保存先設定のダイアログが表示される
    • スクリプトをファイル保存することは無いので不要
  • Mayaを強制終了すると消えてしまう
    • スクリプトエディタ上に保持できるようにしたい

これを解決するため、今回はスクリプトエディタ上でCtrl+sを押したときはMaya終了時と同じようにスクリプトを保存するという動作にしていこうと思います。

Ctrl+sで実行されているコマンドを確認

まずはスクリプトエディタでCtrl+sを押したときに実行されるコマンドを確認しようと思います。

実際にCtrl+sを押してみるとcommandScrollFieldPromptForFileというコマンドが実行されるようです。

tech_18_02.png

wahtIsコマンドで上記コマンドを対象にすると以下のファイルに含まれていることがわかりました。

whatIs commandScrollFieldPromptForFile;
// Result: Mel procedure found in: C:/Program Files/Autodesk/Maya2019/scripts/others/commandScrollFieldPromptForFile.mel //

処理内容としては、保存先設定のダイアログを表示して入力されたパスを返す処理を行っていました。
このコマンドをMaya起動時に上書きして動作を変更していきます。

commandScrollFieldPromptForFileコマンドを上書き

次にMaya起動時にcommandScrollFieldPromptForFileコマンドを上書きするために、同じコマンド名・同じ型の引数・同じ型の戻り値で%USERPROFILE%\Documents\maya\2019\scripts\userSetup.melに追記してMayaを再起動します。

userSetup.melはMaya起動後に読み込まれるため、同名のコマンドを記述することによってその処理内容を上書きすることができます。
この時に同じ型の引数・同じ型の戻り値にしておかないと、他に内部で使用している場所があった場合にエラーが発生するので注意してください。

global proc string commandScrollFieldPromptForFile (string $caption, string $dir, int $save, string $lang)
{
    print("Ctrl+s!!\n");
    return "";
}

再起動後、スクリプトエディタ上でCtrl+sを押すと保存先設定のダイアログが表示されずに処理が上書きされていることが確認できます。

tech_18_03.png

savePrefsでスクリプトエディタの作業中スクリプトが保存されることを確認

Ctrl+s押下時のコマンドの上書きはできたので、次はスクリプトエディタの保存処理の作成です。

初期状態のPreferenceを使用して確認するため、一度%USERPROFILE%\Documents\maya\2019\prefsフォルダを削除してからMayaを起動します。
その後にスクリプトエディタのタブを適当な数に増やしsavePrefsを実行してから強制終了・再起動して内容が復元されていることを確認します。

tech_18_04.png tech_18_05.png

これでスクリプトが保存されると思ったのですが、%USERPROFILE%\Documents\maya\2019\prefs\scriptEditorTempフォルダにスクリプトのバックアップファイルが作成されていませんでした。
savePrefsだけではタブの情報のみ保存されて、内容の保存は別の処理のようです。

tech_18_06.png

通常操作でスクリプトのバックアップファイルが作成される状況を検証

savePrefsを実行しておけば大体保存できるだろうと思っていたので、改めてprefs\scriptEditorTempフォルダにスクリプトのバックアップファイルが作成されるタイミングを検証します。
結果、スクリプトエディタを閉じたタイミングで実行されるremoveScriptEditorPanelコマンドで保存されていることがわかりました。

removeScriptEditorPanelコマンドの処理を確認

Ctrl+s押下時のコマンド確認と同様にwhatIsでパスを調べて処理を確認します。

whatIs removeScriptEditorPanel;
// Result: Mel procedure found in: C:/Program Files/Autodesk/Maya2019/scripts/startup/scriptEditorPanel.mel //

ファイルを開いてremoveScriptEditorPanelコマンドを確認すると、ちょうどよくスクリプトのバックアップファイル作成処理がありましたのでこれを使用します。

// store contents of script editor tabs into backup files
syncExecuterBackupFiles();

ほぼ完成

今までの作業から以下のスクリプトを%USERPROFILE%\Documents\maya\2019\scripts\userSetup.melに追記することでスクリプトエディタ上でCtrl+sを押したときはMaya終了時と同じようにスクリプトを保存するという動作に変更することができました。

global proc string commandScrollFieldPromptForFile (string $caption, string $dir, int $save, string $lang)
{
    // スクリプト保存
    syncExecuterBackupFiles;
    // タブの状態保存
    savePrefs;
    
    return "";
}

ただし、この処理をそのまま使用するとスクリプトエディタのOpenScript・SourceScript処理でも同じコマンドが使用されているため実行できなくなります。
これを回避するためには第3引数のsaveの内容を見て保存しようとしているのか・開こうとしているのかを判別する必要があるので、対応する場合は元々のcommandScrollFieldPromptForFileコマンドを追記内容に含めて処理を分岐してください。

tech_18_07.png

元々のcommandScrollFieldPromptForFileコマンドを使用した場合のOpen時・Save時のログ

まとめ

今回はスクリプトエディタの動作を自分が使用しやすいものに変更してみました。
コマンドの上書きは影響範囲が大きく推奨されているものでもないと思いますので、用法・容量を守ってあくまで個人的な範囲で使用しましょう。

執筆者:菅原

インタラクティブコンテンツ制作会社を経てモノリスソフトへ入社。 以来、テクニカルアーティストとして主にMayaツール開発の業務を担当。 好きな食べものはごはん。

ABOUT

モノリスソフト開発スタッフが日々取り組んでいる技術研究やノウハウをご紹介

RECRUIT採用情報