プロシージャの作り方

プロシージャとは

複数のコマンドを何度も実行するような場合に、それらのコマンドに名前をつけておいて その名前で実行できるようにしておくと便利です。
そのために MEL では、ひとまとまりのコマンドをプロシージャとして定義・実行できます。
プロシージャにしておくことによって、 プロシージャに変更点がなければ、 MEL スクリプトを読み直さなくても、 何回でも同じスクリプトをプロシージャ名で実行できます。
プロシージャは、他のプロシージャから呼んで使うこともできます。
プロシージャは、MEL コマンドと同様に実行することができます。 プロシージャを作るということは、自分用の MEL コマンドを作るということだと覚えておいてください。

プロシージャの形式

プロシージャの書式は、以下のようになっています。
[ ] で囲まれた部分は省略可能です。

[global] proc [返り値の型] プロシージャ名([引数...])
{
	[MEL文;]
	[return 値;]
}

プロシージャの書式における、各要素の説明は以下のとおりです。
わからない用語はとりあえず無視して、後から必要なときに見直してください。

global
この宣言があると、プロシージャをどこからでも呼んで実行できます。
global は省略することもできます。
global がないプロシージャのことを、ローカル プロシージャ と呼びます。
ローカル プロシージャは記述してあるファイルの内部からしか実行できません。 また、ローカル プロシージャは、スクリプト エディタ のインプットウインドウで実行することはできません。
proc
プロシージャであることの宣言です。
プロシージャを定義するときに必ず必要です。
返り値の型
プロシージャが返り値を返す場合は、返り値の型を記述します。
返り値を返すには return 文を使用します。
プロシージャ名
プロシージャの名前は英数字と _ (アンダースコア)の組合せで作られます。
ただし、名前の先頭文字は英字または _ でなければなりません。
引数
プロシージャに渡す引数(パラメータ)がある場合は、引数の型と変数名を並べて記述します。
2 つ以上の引数がある場合は , (カンマ)で区切って並べます。
ブロック
{ から } までをブロックと呼びます。
ここでブロックは、プロシージャに含まれる MEL コマンドが、 どこからどこまでなのかを決めるために使われています。
MEL 文
MEL コマンドや計算式・制御構造などを記述します。
return 値;
return によって、プロシージャで処理した結果を返すことができます。
(値を返すプロシージャ 参照)

C 言語の経験がある人のために、以下に MEL のプロシージャが C 言語の関数と異なる点を中心に解説しておきます。

Tips

プロシージャの名前は、他のコマンド・プロシージャ名と同じものでなければ好きな名前でかまいません。 しかし、プロシージャの内容をわかりやすく表現するためにも、 少し長めの名前をつけることを推奨します。

プロシージャの名前が、 すでに存在しているコマンド・プロシージャの名前と同じかどうかは whatIs コマンドで調べることができます。

whatIs sphere;
// 結果: Command //
whatIs makeSphere1;
// 結果: Mel procedure found in: Z:\mel\makeSphere1.mel //
whatIs makeSphere1000;
// 結果: Unknown //

上の例のように //結果: の後ろに Command または Mel procedure の表示があれば、その名前はすでに使われているので違う名前を考える必要があります。 それ以外の表示や Unknown という表示があれば、その名前でだいじょうぶです。

プロシージャの作り方と実行例

最初に、引数の無い簡単なプロシージャを作ってみましょう。
以下の例のように、プロシージャは通常ファイルに記述しておきます。 ここでは、1 ファイルに 1 プロシージャを記述してゆきますが、 1 つのファイル中に複数のプロシージャを記述してもかまいません。

  1. テキストエディタ(gvim) を起動して、以下のようにファイルに記述します。
    global proc makeSphere1()
    {
    	sphere;
    	scale 1 3 1;
    }
    
  2. makeSphere1.mel という名前で mel フォルダに保存します。
    ここで、プロシージャの名前とファイル名の前半が同じ(makeSphere1)であることに注意しておいてください。
  3. ファイルを保存してください。
  4. スクリプト エディタ から ファイル → ソーススクリプト によって makeSphere1.mel を読み込みます。
    ここで、読み込んだだけでは実行できないことに注意してください。
  5. スクリプト エディタ のインプットウインドウに makeSphere1() と打ち込んで実行します。
  6. スケールされた球体が作成されました。
  7. もし、エラーがでたときは makeSphere1.mel をテキストエディタによって修正してから保存し、 再実行してください。
    この場合は、もう一度 スクリプト エディタ の ファイル → ソーススクリプト によって読み込み直さないと、書き直したものが実行されません。

上の例で、 ファイル → ソーススクリプト の代わりに ファイル → スクリプトのロード によって、 スクリプト エディタ のインプットウインドウに表示してから Enter キーで実行しても良いでしょう。

Maya におけるプロシージャの実行方法

上の実行例でわかるように、 MEL のプロシージャは スクリプト エディタ で読み込んだだけでは実行されません。
それがなぜかを、実行例を参考に説明してみましょう。

  1. makeSphere1.mel が スクリプト エディタ などから Maya に読み込まれます。
  2. Maya は makeSphere1 という名前の手続き(プロシージャ)を覚えておきます。
    この時点では Maya は makeSphere1 というプロシージャ名と中身のコマンドを覚えただけで、 コマンド自体は実行されません。
  3. スクリプト エディタ などに makeSphere1() と打ち込んで実行します。
  4. すると、始めてプロシージャ makeSphere1 中のコマンドである spherescale 1 3 1 が実際に実行されます。

MEL スクリプトを実行する場合は、それがプロシージャであるかどうかで、 実行方法が少し違うことを覚えておいてださい。

Tips

プロシージャを実行する時は makeSphere1() で実行できますが、引数が無い場合は makeSphere1 のように () を省略しても実行できます。
逆に今まで () 無しで実行してきた sphere コマンドを sphere() として実行することもできます。

MEL スクリプト(プロシージャ)の自動読み込み

もし、普段よく使用するプロシージャがある場合、 Maya を起動するたびにいちいち MEL スクリプトを読み込んでいたのでは面倒です。
そのような場合には、 MELスクリプトをスクリプトパスと呼ばれる特定のフォルダ(ディレクトリ)にコピーなどしておけば ファイル → ソーススクリプト などで読み込む必要が無くなります。
ただし、ファイル名の .mel 以前の名前とプロシージャ名が一致していることが必要です。
また、Maya の使用中にスクリプトパス内の MEL スクリプトの内容を書き換えた場合は、 スクリプトエディタで、もう一度読み込み直す必要があります。

スクリプトパスを調べるには internalVar コマンドを使用します。

internalVar -usd
// 結果: //galaxy4/user/ad090000/myDocument/maya/2009/scripts/ //

//結果: の後ろに表示されたフォルダ(ディレクトリ)に MEL スクリプトをコピーして、 Maya を再起動すれば、 その MEL スクリプトに記述してあるプロシージャが スクリプト エディタ から読み込まないでも実行できるはずです。

練習

まとめ

課題

参考


Prev | Next
Home | Contents
Mail