プロシージャーの作り方

プロシージャーとは

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

プロシージャーの形式

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

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

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

global
この宣言があるとプロシージャーをどこからでも呼んで実行できます。
逆にこの宣言が無いと、そのプロシージャーはプロシージャが記述してあるファイルの内部からしか実行できません。
proc
プロシージャーであることの宣言です。
プロシージャーを定義するときに必ず必要です。
返り値の型
プロシージャーが返り値を返す場合は、返り値の型を記述します。
返り値を返すには return 文を使用します。
プロシージャー名
プロシージャーの名前は英数字と _ (アンダースコア)の組合せで作られます。
ただし、名前の先頭文字は英字または _ でなければなりません。
引数
プロシージャーに渡す引数(パラメータ)がある場合は、引数の型と変数名を並べて記述します。
2 つ以上の引数がある場合は , (カンマ)で区切って並べます。
MEL 文
MEL コマンドや制御構造などを記述します。

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

Tips

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

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

whatIs sphere
// Result: Command //
whatIs makeSphere1
// Result: Mel procedure found in: /home/ad030000/mel/makeSphere1.mel //
whatIs makeSphere1000
// Result: Unknown //

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

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

最初に引数の無い簡単なプロシージャーを作ってみましょう。

  1. まず、mel ディレクトリへ移動しておきます。 % cd mel
    % pwd
    /amt/home0/ad030000/mel
  2. makeSphere1.mel という名前のファイルをエディターを使って作ります。
    % vi makeSphere1.mel
    ファイルの内容は、以下のように記述します。
    global proc makeSphere1()
    {
    	sphere;
    	scale 1 3 1;
    }
    
    ここでプロシージャーの名前とファイル名の前半が同じ(makeSphere1)であることに注意しておいてください。
  3. ファイルを書き込んでエディタを終了してください。
    vi ならば :wq によってファイルに書き込んで終了します。
  4. Script Editor から File → Source Script によってmakeSphere1.melを読み込みます。
    ここで、読み込んだだけでは実行できないことに注意してください。
  5. Script Editor のインプットウインドウに makeSphere1() と打ち込んで実行します。
  6. スケールされた球が作成されました。
  7. もしエラーがでた時は makeSphere1.mel をエディタを使って修正して再実行してください。
    この場合は、もう一度 Script Editor の File → Source Script によって読み込み直さないと書き直したものが実行されません。

上の例でFile → Source Script の代わりに File → Open Script によって Script Editor のインプットウインドウに表示してから Enter で実行しても良いでしょう。

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

上の実行例でわかったように MEL のプロシージャーは Script Editor で読み込んだだけでは実行されません。
それがなぜかを実行例を参考に説明してみましょう。

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

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

Tips

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

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

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

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

internalVar -usd
// Result: /home/ad000000/maya/scripts //

//Result: の後ろに表示されたフォルダー(ディレクトリ)に MEL スクリプトをコピーして Maya を立ち上げ直せば、 その MEL スクリプトに記述してあるプロシージャが Script Editor から読み込まないでも実行できるはずです。

練習

まとめ

課題

参考


Prev | Next
Home | Contents
Mail