クリーク・アンド・リバー社 COYOTE CG STUDIO テクニカルチームの長生きの武将と言えば伊達政宗、戦国大好き人間の中林です。
今回はMelでのあるあるネタで有名なこちらのエラーの回避方法です。
// Error: line 1: More than one object matches name: objectName //
// エラー: line 1: 複数のオブジェクトが名前と一致します: オブジェクト名 //string $list[] = ls -sl
;
これは日本語のエラーを読めば一目瞭然です。
が、英語版を使っているとエラーの内容を見なくなります。
そして、自作ツールを使っていて、このエラーが発生すると高確率でツールが止まったと報告が来ます。
そもそものキッカケは?
テクニカルアーティスト(以下、TA)「ツールをリリースしました」
アーティスト(以下、ア)「ツールでエラーが発生しました」
TA「すみません、対応するのでエラーログを送ってください」
ア「Error: line 1: More than one object matches name: objectName」
TA「エラーを読んでください。同じ名前のオブジェクトが複数あります」
よくあるTAのいる会社の風景です。しかし、これがツールをリリースする度に同じことが発生すると……
※苦さ100%のいつもの会社風景がチーム内検閲に引っかかったのでオブラートに包んでみました。
TA「新ツールをリリースしました」
ア「ん~もう、またあなたの作ったツールがエラーで止まったわよ」
TA「エラーって『Error: line 1: More than one object matches name: objectName』だから、いつもの同名オブジェクトが複数あるじゃない。ぷんすこ」
ア「ごっめ~ん。わたしのデータのミスだったは、てへぺろ」
TA「うふふ」
ア「あはは」
オブラートを取り払った会話は適当に想像してください。たぶん間違ってないです。
Maya自体が同じオブジェクト名を許さない仕様
元からMaya自体が同名のオブジェクト名を許さない仕様です。例えばメッシュモデルとマテリアルの名前を付けようとすると、後から付けた方を末尾に対して+1した名前にリーネムされます。
本来ならこれで回避されるのだけど、アウトライナーなどで階層のあるオブジェクトを複製すると親階層だけはリーネムされるけど子階層はそのままです。階層が違うオブジェクトは自動リネームから対象外になります。
階層が違えば親子で同名にできてしまうのが今回の原因です。
主な発生原因【コマンド “オブジェクト名”】
上図の通り複数の「pSphere1」がある状態で
select "pSphere1";
などを実行するとエラーが発生します。どうしても選択するならフルパス名で取得する方法もありますが
select "group5|pSphere1|pSphere1";
と毎回長いオブジェクト名を用意するのも大変だし名前の変更についても弱いです。
回避方法【ls “オブジェクト名”】
過去のブログ「MELのlsコマンドの可能性」
こちらの可能性の結果の1つとも言えます。
select `ls "pSphere1"`
を使うと上図を見ると一目瞭然ですがエラーが発生しないで全ての「pSphere1」を同時選択してくれます。lsコマンドとselectコマンドをMELの初期から知っていたのに、組み合わせるだけでエラーも起こさずに同名オブジェクトの複数選択ができるようになるとは僕も長年、気付きませんでした。
MELの「More than one object matches name」の回避方法
答えはもうこちらですね。
【コマンド `ls "オブジェクト名"`
】
このエラー回避は裏技としては使えます。
僕自身、今ではwarningで優しく複数オブジェクトを指摘できるようになったのでアーティストとの摩擦が減りました。