クリーク・アンド・リバー社 COYOTE CG STUDIO テクニカルチームのストイックな大名と言えば上杉謙信、戦国大好き人間の中林です。
Maya2018から発生していて2020でも解決してない問題、ファイル>プロジェクト設定(File>Set Prject)で日本語フォルダを選択するとworkspace.melが作られない問題の解決方法です。
今回は解決方法の一例は紹介しますが、実行するかは読んだ人の自己責任に委ねます。
正確にはマルチバイト文字や2バイト文字と書くべきなのか迷いますが、今回のブログでは分かりやすく日本語と統一しておきます。
そもそものキッカケは?
クライアントの要望でMaya2016.5からMaya2018にバージョンアップしたアーティストさんからの相談でプロジェクト設定が上手くいかないとのことでした。
最近は色々なクライアントがMayaのバージョンを上げ始めていたけど、先行してMaya2018に移行した別チームのアーティストさんからは特に問題の報告がありませんでした。
そこで、問題の起きるチームと起きないチームを比較して、原因が日本語フォルダを使っていることだと分かりました。
これが社内プロジェクトならMayaの作業フォルダ名に日本語を使うなで解決しますが、今回は長年続くクライアントからの指定の日本語フォルダで一存では変えられません。
仮に変えたとしても全ての日本語フォルダをクライアントも合わせて英語にするのは現実的ではないです。
いつから日本語フォルダに作れなくなった
最近の若者は分かりませんが、僕みたいな古参のおじさんになるとMayaで日本語フォルダを使っちゃだめは懐かしいネタです。なにせ昔のMayaはプロジェクト設定どころか、ファイルのセーブ、ロードも日本語のフォルダは禁止でしたから。
あの頃から比べると使いやすくなりました。
現時点で遡れるMaya2015~2020で試しましたがMaya2017までは日本語フォルダでも普通にプロジェクト設定ができました。
Maya2018からエラーっぽいダイアログメッセージを表示(表示されない場合もあり)して失敗します。ちなみに何人かの席で試してもらって失敗をしたのだけど、なぜかダイアログの内容が一定ではありませんでした。
原因はsetProject……ではありません
コマンドがそのままの名前でMelのコマンドリファレンスに載っている
setProject "D:/日本語/";
一見、こいつが犯人だと思ったのですがコマンドリファレンスに載っているのにコマンドではなく、setProject.melというMelスクリプトでした。
なので、setProjectの中に隠れた真犯人がいました。
途中の長い解析なんかは地道なだけで読んでも面白くないのですっ飛ばして、結論だけ言うと犯人は
workspace -openWorkspace $projectLocation;
(Maya2018なら113行目付近)です。$projectLocationは選択フォルダまでのフルパスだけど、その中に日本語が混じるとエラーになります。
そして、僕が知る限りでも最も困った状況に陥ったバグです。主な原因は2つあります。
1・エラーが表示されないエラー
前提条件1:Maya2018~20スクリプトエディタ
前提条件2:DドライブのルートにEnglishと日本語というフォルダを用意。
●問題の無い挙動
workspace -openWorkspace "D:/English/";
workspace -q -openWorkspace;
// 結果: D:/English //
●問題のある挙動
workspace -openWorkspace "D:/日本語/";
workspace -q -openWorkspace;
// 結果: D:/English //
スクリプトエディタ上でエラーが表示されないので分かりづらいけど問題がある方が1行目でエラーで失敗して、そのためopenWorkspaceの中を覗いても変化はありません。普通のコマンドならここでエラーが表示されるけど、この失敗は表示されないことがキモです。
そして、setProjectの内部処理はエラーが発生した時にgetLastError;
コマンドで直前のエラーを取得してダイアログに表示する優しさ機能が付いてます。
でも、今回がそれが裏目に出てworkspaceのエラーが発生してるのに取得できないため、その前のエラーを取得して表示をするため混乱を起こしてます。
理解をしていればわざと直前にエラーを発生させて、プロジェクト設定のエラーダイアログの内容がそれと一致してることが確認できます。
これが人によってダイアログの内容が違うことの正体です。
2・最後の"/"が原因の予想外のエラー
世の中には悪魔の証明というものがあり、無いものは証明をすることは困難というものです。では、エラー表示がないものは本当にエラーなのか?実は僕が嘘を書いていてworkspace -openWorkspace "D:/日本語/";
はエラーが起きてないのでは!?
まあ、ないものを証明するのは困難ですがcatch
コマンドでエラーを0か1で証明できます。Pythonに慣れてる人はMel版のTry文というと分かりやすいかもしれません。
catch( workspace -openWorkspace "D:/日本語/"
);
// 結果: 1 //
catch( workspace -openWorkspace "D:/English/"
);
// 結果: 0 //
これによって日本語フォルダーは1でエラーが(高確率で……ボソ)で発生していることが分かります。ちなみにMaya2017以前は両方ともエラーが発生しないので0を返します。
さてエラーが証明できたので恐ろしい事実を伝えます。
catch( workspace -openWorkspace "D:/日本語"
);
// 結果: 0 //
フォルダパスの最後の"/"を消すだけでエラーが発生しなくなります。なんか凡ミスみたいなバグですね。
Maya2018以降で発生しているプロジェクト設定の不具合は、この$projectLocationの中身の最後が"/"だったら消すだけで回避が可能です。
まあ、根本的にworkspaceコマンドのバグが治ってくれれば、2017以前のように使えるのですが。
スクリプトコピーで日本語フォルダ対応
こちらのスクリプトコピー方法は自己責任でお願いします。
やり方はMaya2018で説明をしていきます。
➀setProject.melの複製
<>C:/Program Files/Autodesk/Maya2018/scripts/others/setProject.mel
このスクリプトファイルを以下のフォルダにコピーして複製をする
英語版
ドキュメント/maya/2018/scripts
日本語版
ドキュメント/maya/2018/ja_JP/scripts
➁最後の"/"を消す処理を追加
コピー先のsetProject.melを開いてworkspace -oで検索をかけて、処理の直前に一文字削るソースを挿入する。
検索ワードが-oまでなのはショートネームでもロングネームでも検索できるからです。
ソース例:
if(gmatch (endString($projectLocation, 1)) "/"
){
$projectLocation = startString($projectLocation, size($projectLocation) - 1);
}
➂Mayaの再起動
Mayaを再起動するとその後は日本語フォルダでもプロジェクト設定ができるようになります。
スクリプトコピーが自己責任の理由
大切なことなので改めて書きます。このスクリプトコピーは自己責任でお願いします。
自己責任の理由はMayaをバージョンアップをした時に「以前のプリファレンスのコピー」を選択するとscriptフォルダの中身もコピーされてしまうからです。
僕自身の経験ですがまだMayaやMelに慣れてない頃に、人に頼まれてネットを頼りにMaya2012でスクリプトコピーをやりました。そして、数年後にMaya2015にバージョンアップした彼のMayaのscriptフォルダを覗いた時に2012から複製され続けたスクリプトが鎮座してました。
依頼者にMelに理解があればスクリプトコピーの問題がわかったかもしれませんが、結局最後まで彼には何が悪いのかは伝わりませんでした。多分、彼のMaya2018にはMaya2015のスクリプトが鎮座してると思います。
僕自身はこの時の反省から例え便利でも、スクリプトコピーの改良は知識がない不特定多数に行わないようにしました。今回の改良も相談を受けたアーティストに方法を教えるだけで、ファイルのコピーからソースのコピペもアーティスト本人の手でやってもらっています。