MEL合宿 -20日目-




MEL合宿 -20日目-は、以前すこーーーしだけ触れました「プロシージャ」についてです!ツール制作では避けては通れない内容ですので、じっくり読んでいただければっと思います!(`・ω・´)ゞ

MEL合宿 -4日目-

2017.09.22

プロシージャって?

複数のコマンドを実行してアレコレ処理したものに、名前をつけて1つのまとまりにしたものを「プロシージャ」と言います。関数という場合もあります。プロシージャにすることで、簡単な名前を入力するだけで実行できるようになったり、何度もMELスクリプトを読み直さなくても良くなります!

プロシージャから他のプロシージャを実行することも可能なので、MELコマンドのように複数のプロシージャを使ってツールを組み立てることも可能です!うまくプロシージャが作れるようになると、1~100まですべてプログラミングせず、過去の資産を有効活用して時間短縮も見込めます!

簡単にまとめると、「自分用のコマンドを作る」ということです∠( ゚д゚)/

プロシージャの書式

基本的なプロシージャは、以下のように書きます。

global proc プロシージャ名(){
	プロシージャの中身
}

プロシージャ名

プロシージャ名は、「英数字」と「_ (アンダースコア)」で名前をつける事ができます。ただし、数字から始まるのはNGです!(´・ω・`)

MELファイル名とプロシージャ名を合わせることで、自動でMELファイルが読み込まれ実行することができます。

非常に厄介な問題なのが「名前の重複」です。Mayaを使っている人の多くは、すくながらず配布されているツールを使っていると思います。それらのツールと名前が重複していると、、、

  • 他者のツールが動かなくなる
  • 自分のツールが思うように動かない

といった問題が出てきてしまいます(´;ω;`)

回避策として、プロシージャ名の先頭に「自分のイニシャル」や「ブランド名」を入れていることが多いです。例えば、僕が配布しているツール「Amaterasu」なら、、、

global proc amaterasu_polyCleaner(){
	プロシージャの中身
}

と言った具合です!これなら、重複する可能性は低いでしょう!(*´ω`*)b

プロシージャの中身

プロシージャの中身に「プロシージャを作る」以外のことなら何でも書けます!

global proc amaterasu_polyCleaner(){
	global proc amaterasu_freezeVertex(){
	}
}

また、ちょっとしたツールでも、1つのMELファイルに複数のプロシージャを作るようになります!そんな時のために、プロシージャの中身には「インデント」をいれてコードを読みやすくしましょう!

うまく動かなかったり、中々理解できなくてイライラしている時に、コードまでグチャグチャになっていると投げ捨てたくなっちゃうと思います(;´∀`)

global proc amaterasu_polyCleaner(){
	MELの中身
	MELの中身
	MELの中身
	MELの中身
	MELの中身
	MELの中身
	MELの中身
}

global proc amaterasu_freezeVertex(){
	MELの中身
	MELの中身
	MELの中身
	MELの中身
	MELの中身
	MELの中身
	MELの中身
}

global proc amaterasu_unLockTransform(){
	MELの中身
	MELの中身
	MELの中身
	MELの中身
	MELの中身
	MELの中身
	MELの中身
}
global proc amaterasu_polyCleaner(){
MELの中身
MELの中身
MELの中身
MELの中身
MELの中身
MELの中身
MELの中身
}

global proc amaterasu_freezeVertex(){
MELの中身
MELの中身
MELの中身
MELの中身
MELの中身
MELの中身
MELの中身
}

global proc amaterasu_unLockTransform(){
MELの中身
MELの中身
MELの中身
MELの中身
MELの中身
MELの中身
MELの中身
}

プロシージャは書いただけでは実行されない!

プロシージャは、MELファイルを読み込んだり、Script Editorで実行しても、プロシージャの中身は実行されません

例えば、上記のコードを実行した場合、Mayaは「amaterasu_polyCleaner」「amaterasu_freezeVertex」「amaterasu_unLockTransform」という名前のプロシージャがあるっということを覚えます。これを「定義」と言ったりします。

Mayaがプロシージャがあること覚えた上で、「プロシージャ名」に「()」を付けて「amaterasu_polyCleaner();」と書いて、初めてプロシージャの中身が実行されます。これを「呼び出し」と言ったりします。

実際には、「()」を付けずに「amaterasu_polyCleaner;」と書いても呼び出すことができます。

MEL スクリプトの自動読み込み

4日目でも触れましたが、プロシージャ名とMELファイル名を同じにしておくと、Mayaが自動でMELスクリプトを読み込むようになります。

逆に、プロシージャ名とMELファイル名が異なる場合は、「source」コマンドや、Script EditorからMELファイルを読み込んでから呼び出さないとエラーしてしまいます(;´∀`)メンドクセー

Maya使用中にMELスクリプトを書き換えた場合は、自分で読み込み直す必要があります。

久々にやってみよう!

以下のコードは、選択されたノードを取得して、Script Editorにノード名を表示するスクリプトです。

// 選択されたノードの取得
string $selection[] = `ls -sl`;

// 選択されたノードがなかった場合は、エラーさせる
if(`size $selection` == 0){
	error "Please select node(s)";
}

// 選択されたノードを1つづつ処理する
for($node in $selection){
	// ノード名をScript Editorに表示する
	print ($node+"\n");
}

// 終了したことを伝える
print "Done!\n";

このコードに、「getSelection」という名前でプロシージャ化してみましょう!

答え

ドキュメント\maya\scripts」に「getSelection.mel」という名前で保存します。

global proc getSelection(){
	// 選択されたノードの取得
	string $selection[] = `ls -sl`;

	// 選択されたノードがなかった場合は、エラーさせる
	if(`size $selection` == 0){
		error "Please select node(s).";
	}

	// 選択されたノードを1つづつ処理する
	for($node in $selection){
		// ノード名をScript Editorに表示する
		print ($node+"\n");
	}

	// 終了したことを伝える
	print "Done!\n";
}

Script Editorで「getSelection();」と記述し実行すると、「選択されたノード名」か「Please select node(s).」というエラーメッセージが表示されれば成功です!

まとめ!

  • プロシージャを使うと、複数のコマンドに名前をつけてオリジナルのコマンドが作れる!
  • プロシージャの書き方は、「global proc プロシージャ名(){プロシージャの中身}」
  • プロシージャの名前は、ファイル名と一緒にする。(自動読み込みしたい場合)
  • プロシージャの中身は「{」から「}」の中に書かれた部分。
  • インデントを入れて、コードを見やすくしよう!
  • 一度ロードされたMELファイルは更新されないので、再読込したい場合は「source」を使う!
  • プロシージャ名が、他のMELスクリプトと重複しないようにする!
  • プロシージャを作っただけでは、「定義」なので実行されない!
  • プロシージャ名に「()」を付けると実行される。これを「呼び出す」という!

それでは次回もお楽しみに!∠( ゚д゚)/







Maya x Pythonの技術書
たっきゅんのガチンコツール開発部 Maya Python 101
(CG Pro Insights)

もっとMayaを便利に使いませんか!?実用性のあるツールを例にPythonが学べるように、がんばって執筆させていただきました!是非、この機会によろしくお願いいたします!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です