MEL合宿 -15日目-

MEL合宿 -15日目-は、プログラミングの醍醐味!「制御構造」の「繰り返し処理」についてやっていきたいと思いまーっす!∠( ゚д゚)/

繰り返し処理って?

MELでツールを作っていると、複数のノードに同じ処理を適用したい場合がたっくさんあります!同じコマンド・似たような処理を、何度も繰り返し実行するのが「繰り返し処理(ループ)」です!

MELでの繰り返し処理は、「for文」「while文」の2種類があります!まずは、for文からやってみたいと思いまーす(*´ω`*)b

for文

MELでのfor文は、以下のように記述します。

for(変数 in 配列の変数){
	繰り返し行いたい処理
}

このfor文は、以下のように処理されていきます。

  1. 配列の変数」から、1つデータを取り出します。
  2. 取り出したデータを「変数」に代入します。
  3. for文のブロック内に書かれた「繰り返し行いたい処理」を行います。
  4. 配列の変数」から取り出すデータがなくなるまで、1~3を繰り返します。

for文を実際に試して見るために、新しいコマンドをいくつか使ってみましょう!

for文を使ってみる!

for文を使ってみるサンプルとして、選択されたノードを取得してScript Editorにノード名を表示してみたいと思います!

まずは、選択されたノードを取得取得します!これは、「MEL合宿 -10日目-」でやりましたね!覚えていますか?(゚∀゚)

{
	string $selection[] = `ls -sl`;
}

次に、for文の書き方を元に、for文を用意します!(`・ω・´)ゞ

{
	string $selection[] = `ls -sl`;
	for($node in $selection){
	}
}
こうすることで、配列の変数「$selection」から1つづつデータを取り出して、変数「$node」に代入されます。この変数を「for文」の中で使うことで、選択したノード全てに対して処理を行うことができちゃうワケです!

配列の変数「$selection」の全てのデータを取り出すと「for文」が終了します。

次に、ノード名をScript Editorに表示するために、変数「$node」と「print文」を使って見ましょう!!1つ1つ改行されるように「\n」も使っちゃいましょう(*´ω`*)b

{
	string $selection[] = `ls -sl`;
	for($node in $selection){
		print ($node+"\n");
	}
}

ノードを選択した状態でコードを実行してみると、選択されたノード名がキッチリScript Editorに表示されると思います!

もう少し具体的な例

もう少し具体的な例を試してみましょう!選択されたノードに、シェイプがあるモノだけをScript Editorに表示したいと思います。

listRelatives

listRelatives」は、指定されたノードの「親ノード」「子ノード」「シェイプノード」を取得することができます。

やってみよう!

先程のコードをベースにやっていきたいと思います!まずは、「for文」のブロックの中に、以下のコードを追加して、ノードにシェイプがあるか調べます!

ノードにシェイプがあるか調べるには、フラグ「-shapes(-s)」を指定します!最後に変数「$node」を使って、調べてほしいノードを教えてあげます(*´ω`*)b

戻り値は「string []」なので、配列の変数で受け取れるようにします!

{
	string $selection[] = `ls -sl`;
	for($node in $selection){
		string $shapes[] = `listRelatives -s $node`;
	}
}

次は、「シェイプがあるモノだけをScript Editorに表示」するようにします!

以前やったif文とコラボして、配列の変数「$shapes」の要素の数が1個以上の場合だけprintするようにすればOKですね!(`・ω・´)ゞ

{
	string $selection[] = `ls -sl`;
	for($node in $selection){
		string $shapes[] = `listRelatives -s $node`;
		if(`size $shapes` >= 1){
			print ($node+"\n");
		}
	}
}

シェイプのあるノード、ないノードを選択して実行すると、以下のようになります(*´ω`*)b

if文とコラボすることで、さらにいろいろな事ができそうですね!今回はシェイプの有無でしたが、シェイプの種類が「mesh」なら処理するなどとする、ポリゴンにだけ処理ができたりします!ぜひぜひチャレンジしてみてください!v(*´ω`*)v

まとめ!

  • 同じような処理を何度もやりたい場合は、「繰り返し処理(ループ)」を使う!
  • for文は「for(変数 in 配列 ){}」と書くことで、配列のデータを1つづつ処理できる!
  • for文の中に、if文を使ったりすると色々なことができる!

それでは、次回もお楽しみに!(`・ω・´)ゞ