【ArtistでもMELが書きたい】Maya MEL入門(5)【コマンドの調べ方】

# はじめに
この記事は、3DCG業界で働く**Artist向けのMEL入門記事**です。
普段の業務を効率化したいけど、MELの書き方が分からない、調べたけどイマイチ分からなかった、そんな方向けに書きました。
本記事は「使いたいコマンドを効率的に調べる」をゴールとします。

# 環境
Autodesk Maya 2022.2

# 前回のあらすじと今回へのつなぎ
[前回](https://qiita.com/Hum9183/private/1fce41d94092676f4003)はコマンドのフラグを使いました。
コマンドに関する知識も深まったところで、こんな思いが湧いてきたりしませんか？
>MELを書き進めていくためには、使いたいコマンドをコマンドリファレンスから探し出して、しかもどんなフラグがあるかも調べなきゃいけない...**めちゃめちゃ面倒くさい**

そうです。間違いなくめんどくさいです。というか大変です。時間もかかります。
効率化のためのMELなのですから、これに労力の大半をかけていては本末転倒です。

実はコマンドを調べる際は、**スクリプトエディタのヒストリ**を活用するともう少し楽になるんです。

# スクリプトエディタのヒストリとはなんぞや
スクリプトエディタの上半分はヒストリが表示されています。
![MEL_learning01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/ab94bad9-fbac-a019-1448-c1c6df392cd8.png)
Mayaでモデリング等を行うときにも馴染み深いヒストリですが、
今回の場合は、単純に**ログ**や**実行履歴**というニュアンスの言葉です(以下ログと呼称します)

ヒストリにはどんなログが表示されるのでしょうか。
立ち上げたばかりのスクリプトエディタのヒストリには大量のログが表示されていて、なにが起こったかが分かり辛いです。
ですので、一度ヒストリをクリアしましょう。
![MEL_learning02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/43efc445-35a0-f516-ebad-8484404993ff.png)
![MEL_learning03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/44a90b93-1bc3-f319-f015-0859f0009181.png)
ヒストリがまっさらになりました。これでログが流れても確認がしやすいです。

# ログを流してみる
Mayaのオペレーションであればほとんどの操作は実行後にログが流れます。
試しに、オペレーションでキューブを出してみましょう(**Shift + 右クリック**でマーキングメニューを表示し、立方体にマウスカーソルをあわせたら右クリックを離します)
![MEL_learning04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/48d119e0-f354-ef1b-3cea-3449a41b2dbf.png)
![MEL_learning05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/ae80ee41-7eb1-bfe9-8b75-20b7c6f5905d.png)
無事出せましたね。ログを確認しましょう。
![MEL_learning06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/bce78f5a-5f84-12de-077d-5ba2df95c5d7.png)
```
polyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;
// 結果: pCube1 polyCube1 // 
```
1行目は`polyCube`コマンドのようです。フラグもたくさん指定されています。

2行目は新要素ですね。**コメント**といいます。
MELは行の始めに`//`を入力すると、その後ろの文字はすべて無視されます。言わばメモのようなものです。これ自体はコマンドではなく、読み手が理解しやすくするために表示してくれているというわけです。
ちなみに、ログだけではなく、MELを記述する際にももちろん活用できます。
![MEL_learning07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/70b7c3c1-0909-7aab-6d43-33c8e3af787c.png)
こんな感じですね。
スクリプトエディタでは、コメントは赤くハイライトされます。

# ログから読み取れること
コメントはさておき、大切なのは1行目の`polyCube`コマンドの方です。
フラグと共に見ていきましょう。
```
polyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;
```
![MEL_learning08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/6ac7db10-0f32-3571-6e3c-e17fac378135.png)
![MEL_learning09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/caef2f9f-ad5d-9363-8a78-3d717b4997fe.png)
![MEL_learning10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/19090340-8627-fc08-2c4b-4d3e59f99394.png)
![MEL_learning11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/af304ee1-b4d9-6d65-e4d4-c20692773c5a.png)
![MEL_learning12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/f1c53166-6eb2-fa3f-2b53-4a4df6aa79df.png)
![MEL_learning13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/032ca116-c1eb-3606-73b8-c87d61c7ff19.png)
![MEL_learning14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/c2a557ab-bbb3-4cdb-b27b-1e32cbff3017.png)
なにやらたくさんのフラグがありますが、すべてを理解する必要はありません。
ここで大切なのは、Mayaのオペレーションは**内部的にMELが実行されているということを知る**ことです。

マーキングメニューからキューブを生成しただけではありますが、
内部では`polyCube`コマンドが呼ばれ、さらにフラグとしては、幅は1、高さは1、奥行きは1...等が指定されて、やっと、Mayaのビューポート上にキューブが生成されているのです。

ということは、ログに表示されたこのMELをそのまま実行すれば、オペレーションで行ったことを全く同じことがMELで行えるのではないでしょうか？
早速やってみましょう！

![MEL_learning15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/35626ebe-62c4-e6e9-a8ef-7ac14c161259.png)
![MEL_learning16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/dedf8969-c5b3-8092-bde6-63a78dcdd76d.png)
ビンゴです！
オペレーションのログで表示されたMELはそのままMELとして使用できるんですね。

# 一連の処理をMELで実行してみる
自動化ツールを作るには、自動化したいオペレーションを行い、そのログをMELとして実行するだけでOKということになります。
試しに、キューブを生成して、X軸方向に1だけ動かすMELを作ってみましょう。

作るといっても、実現したい内容をオペレーションするだけです。
![MEL_learning04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/96138d3c-8505-0c02-084f-f23295942328.png)
![MEL_learning05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/823bf7f4-7efd-d874-1736-12d38c1ec10b.png)
![MEL_learning17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/dcb65c61-1a41-a337-0931-cbdc619b7bd3.png)
![MEL_learning18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/8e0a6560-da2f-b3a2-927b-3ee0e8f8d4b3.png)
ログを確認しましょう。
![MEL_learning19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/2c15d82f-f0ab-c804-7f9d-fa3491e945fa.png)
```
polyCube -w 1 -h 1 -d 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1;
// 結果: pCube1 polyCube1 // 
setAttr "pCube1.translateX" 1;
```
`setAttr`...初めて見るコマンドです。これがオブジェクトを移動するコマンドなのでしょうか？
ともあれ、ログのMELをコピペして実行すると、本当に同じ処理が行えるかを確認しましょう。

まずは先程オペレーションで生成したキューブを削除して、
![MEL_learning20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/fc81cc38-9628-1f22-b788-d46442406d15.png)
![MEL_learning21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/a4ef6418-c8a3-9047-06f7-66ddb2d7ad27.png)
実行すると、
![MEL_learning22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3121056/07e80c8f-603d-52ee-3468-f27836001e5e.png)
できました！
先程のオペレーションと全く同じ処理です！

# おわりに
いかがでしたか？
本当は`setAttr`コマンドの解説もしたいところなのですが、話が込み入ってしまうので次回にできたらと思います。

スクリプトエディタのヒストリ(ログ)はMayaのオペレーション実行がMELで表示されるので大変便利です。
ぜひ日々のオペレーションをログで見てみて、どんなコマンドで構成されているか確認してみてください。

次回はこちら→[【ArtistでもMELが書きたい】Maya MEL入門(6)](https://qiita.com/Hum9183/items/71750017c0c1bf46c0ee)