【MEL基本】6時限目 ボタンで複数行のコマンドを実行する

MEL基本最初の記事では、ボタンを押すと特定の機能が実行されるMELの書き方を説明しました。
しかしこの説明だけでは、複数行のコマンドを実行することが出来ません。
このブログでいうと
【MEL】新しいビューを別ウィンドウで開く
【MEL】同一頂点のマージを手軽に~マージの失敗を発見しやすく
など複数の行をスクリプトエディタに書き込んで実行するものです。
今回は複数行のコマンドや、複雑なコマンドの実行方法を説明します。
例ではわかりやすく、アウトライナ、ハイパーシェード、UVテクスチャエディタ、の3つのウィンドウをワンボタンで開くMELを書いてみます。
ただ最初に言っておきます。複数行でも単純なコマンドであれば改行を消して1行に詰め込めば実行できるには出来ます。今回はそうではなく、長く長く複雑なコマンドになったときにどうするかという意味も含めてです。
ボタンとウィンドウ
まず最低限のウィンドウとボタンだけのコードです。
実行するとボタンがひとつだけのウィンドウが開きます。

{
if ( (`window -ex AriToolWindow`) == true ) deleteUI AriToolWindow;
window -title "機能ボタン" AriToolWindow;
scrollLayout;//スクロールバーのあるフィールド
columnLayout;//縦に並べる
button -w 120 -l "複数実行" -c "";//ボタン
setParent..;//縦に並べる終了
setParent..;//スクロールバーのあるフィールド終了
showWindow;
}
buttonコマンドの -c ""の中に何もないので、まだボタンを押しても何も実行されない状態です。
詳細はMEL基本最初の記事でわかると思います。
アウトライナ等3つのウィンドウを開くコマンド
先ほどの{ }の外に、新たに{ }で囲って3つのウィンドウを開くコマンドを書きます。
まだ実行する必要はありませんが、実行するとそのまま全部実行されるので、ウィンドウ3つも開きます。

{
OutlinerWindow; //アウトライナ
HypershadeWindow; //ハイパーシェード
TextureViewWindow; //UVテクスチャエディタ
}
{
if ( (`window -ex AriToolWindow`) == true ) deleteUI AriToolWindow;
window -title "機能ボタン" AriToolWindow;
scrollLayout;//スクロールバーのあるフィールド
columnLayout;//縦に並べる
button -w 120 -l "複数実行" -c "";//ボタン
setParent..;//縦に並べる終了
setParent..;//スクロールバーのあるフィールド終了
showWindow;
}
コマンドをプロシージャ化
先ほど新たに書いた{ }の上にプロシージャ化するコマンドを追加します。
MELファイルの作り方にも書きましたが、global proc と書き、そのあとに後に好きな名前を書いて最後に()をつけます。
ここでつける名前は他のコマンドなどとかぶらないように気をつけてください。

プロシージャ化したので、自分でつけたプロシージャ名(ここではAriOpenMultiWindow)を実行するだけで、{ }中のコマンドが実行される状態になりました。
ボタンコマンドでプロシージャを実行する
あとはこのプロシージャを実行したいので、buttonコマンドの-cフラグの後に、先ほどつけたプロシージャ名を書けば完成です。

global proc AriOpenMultiWindow()
{
OutlinerWindow;
HypershadeWindow;
TextureViewWindow;
}
{
if ( (`window -ex AriToolWindow`) == true ) deleteUI AriToolWindow;
window -title "機能ボタン" AriToolWindow;
scrollLayout;//スクロールバーのあるフィールド
columnLayout;//縦に並べる
button -w 120 -l "複数実行" -c "AriOpenMultiWindow";//ボタン
setParent..;//縦に並べる終了
setParent..;//スクロールバーのあるフィールド終了
showWindow;
}
このようにglobal procによってプロシージャ化というものをして名前をつけておくと、後からその名前を実行するだけで、{ }の中が実行される仕組みになります。
global procを実行すると、その時点で{ }内の内容がMayaに登録される感覚で、コマンドをスクリプトエディタから消しても、Mayaを閉じるまでそのプロシージャは有効になります。
再びglobal proc の同じ名前を実行することで、内容を書き換えることは可能です。
ホントはglobalをつけず、procだけでプロシージャにはなるのですが、使う場所やタイミングが限定されるので、
今のところglobal procで、名前をかぶらないようにつけることだけ気をつけてください。あとMayaを閉じるまで有効になっているということも。
プロシージャは単にボタンで実行するためだけではなく、いろいろなところで使用されます。
同じ機能を何度も実行したい場合や、コードが複雑にならないようにするためでしょうか・・・。
(C言語等のプログラムでいうと関数というものにとても近いのですかね???)
おまけ
MEL化する場合
このボタンをMEL化したい場合、ボタンウィンドウの記述がある{ }のところにMEL化するプロシージャを書きます。

ここの名前とMELファイル名を同じにして全部テキストにコピペしてください。詳細【MEL基本】MELファイルの作り方
MELを実行したときになんていうプロシージャを実行させたいか考えるとここに書くことになりますよね。
1時限目 ボタンで機能を実行するMELを書く
2時限目 コマンドとフラグについて
3時限目 MELファイルの作り方
4時限目 UIを横に並べる&アイコンボタンの使用方法
5時限目 Windowコマンドについて
6時限目 ボタンで複数行のコマンドを実行する
MEL基本カテゴリ
スポンサーリンク