プログラマ向け MEL

言語として、MEL は UNIX のシェル スクリプトの流れを受け継いでいます。すなわち、MEL は他の言語のようにデータ構造の操作や関数のコールを行ったり、オブジェクト指向の手法を利用するのではなく、実行コマンドに基づいて目的を達成します(UNIX シェルの実行コマンドと同様です)。

多くのコマンドは、UNIX のコマンド ライン ユーティリティのように Maya を制御することができます。動作変更が可能なオプションを複数備えたちょっとしたスタンドアローン プログラムのようなものです。

MEL がシェル スクリプトに由来していることを覚えておくと、MEL の独特な特徴を理解するのに役立ちます。

簡単な概要

代入と値

MEL の代入演算子は等号(=)です。また、MEL には C や Java のような簡略代入演算子もあります(+=-=/=*=++-- など)。

MEL は強く型付けされた言語ですが、たいていの場合暗示的な宣言や型定義を行うことが可能です。変数を宣言するときに、その変数の型を宣言し、任意に初期値を設定することもできます。

変数の名称は $ で始まり、その後に 1 文字続きます。さらに文字、数字、アンダースコアを任意に組み合わせた文字列が続きます。PERL とは異なり、変数(スカラーおよび複合)の型はすべて $ で始まります。

MEL には、通常の整数型(int)、浮動小数点型(float)、文字列型(string)のデータ型があります。また、3 つの浮動小数点の組み合わせであるベクトル(vector)データ型(3 次元データを操作する場合に便利)、配列型(すべての要素が同じ型の可変長のリスト)、行列型(matrix、浮動小数点数を要素に持つ固定サイズの 2 次元の表)もあります。配列の項目はすべて同じ型にしてください。

int $a = 5;
float $b = 3.456;
vector $v = <<1.2, 3.4, 6.5>>;
float $ar[] = {1.2, 3.4, 4.5}; // An array of floats
matrix $mtx[3][2]; // A 3x2 matrix of floats

MEL では、配列の配列を作ることはできません。

可能な場合はいつでも MEL は自動的に型の変換を行います。

制御およびループに関するステートメントと演算子

MEL の制御文は C や Java によく似ています。

//Compare $a and $b, and perform different actions depending on the result
if ( $a == $b) {
	...
} else if ($a > $b) {
	...
} else {
	...
}

//Compare $a with the result of whether $b is greater than 10. 
//If true, then $c is used. 
//If false, then $c is subtracted by 10.
$a = ($b > 10) ? $c : ($c - 10);

//Switch statement is evaluated to select the block of code that should be executed
switch ($color) {
 case "blue":
 ...
 break;
 case $c1:
 ...
 break;
 default:
 ...
 break;
}

//While a condition is true, do as follows
while ($a < size($arry)) {
	...
}

//Do the following while a condition is true
do {
	 ...
} while ($a > 0);

//Basic for loop
int $i;
for ($i = 10; $i > 0; $i--) {
	print($i+"...\n");
}
print("Blastoff!!!");
string $arry[3] = {"red","green","blue"};

//Iterate through each k variable in arry
for ($k in $arry) {
	...
}

プロシージャを定義しコールする

次の文を使用してユーザ定義のプロシージャを作成します。

global proc <return type> <name>(<arg list>) {
	...
	return <exp>;
}
global proc float squareAndAdd(float $x, float $y) {
	return $x * $x + $y;
}
square(5.0, 2.0);
27

global キーワードが無いと、このプロシージャは定義されたスクリプト ファイル内でしか利用できなくなります。

このプロシージャが値を返さない場合には、return type キーワードを削除し、return 文を除外してください。

global proc msg() {
	print("Hello world\n");
}

コメント

MEL では、C++ 形式の // で始まる単一行のコメントおよび /**/ で囲んだフリーフォームのコメントを使用します。

MEL イズム

MEL のプログラミングには、初心者だけではなく経験豊富なプログラマでもつまずくような点がいくつかあります。

MEL の文はすべてセミコロン(;)で終わります。

if ($a > $b) {print("Hello");};
// Both semicolons are required!

一部のスクリプト言語やスクリプト環境とは異なり(ただし、Logo 言語とは似ている)、MEL では値を返す式を書いても自動的に値が出力される訳ではなく、エラーになります。

3 + 5;
// Error: 3 + 5; //
// Error: Syntax error //
print(3+5);
8

MEL では、同じコマンドを使用してオブジェクトの作成、編集、情報検索を行うことがよくあります。次のいずれの場合も、フラグを使用してコマンドの機能(作成、編集、または検索)を制御しています。

// Create a sphere named "mySphere" with radius 5
sphere -radius 5 -name "mySphere";
// Edit the radius of mySphere
sphere -edit -radius 3 "mySphere";
// Print the radius of mySphere
sphere -query -radius

MEL では、各コマンドをコマンド文(UNIX シェル コマンドと同じ)と関数ステートメントに分類することができます。コマンド文では、1 つの文字列を囲むクォーテーション マークを省略し、カンマの代わりに空白を使用して引数を分けることができます。

setAttr("mySphere1.translateX",10); // Function syntax
setAttr mySphere1.translateX 10; // Command syntax

関数文は自動的に値を返します。コマンド ステートメントを使用して戻り値を取得するには、コマンドをバッククォーテーションで囲む必要があります。

$a = getAttr("mySphere.translateX"); // Function syntax
$b = `getAttr mySphere.translateY`; // Command syntax