MEL合宿 -21日目-

ご無沙汰していたMEL合宿21日目は、プロシージャの「引数」についてやっていきたいと思います!∠( ゚д゚)/

引数って?

今までやってきたMayaコマンドって色々オプションがありましたが、アレと同じ様に自分のプロシージャにオプション的なものを用意することが出来ます!

引数を設定することで、処理の系統を変えたり、処理の対象物を変えたりして処理の幅を広げることができるようになります!(*´ω`*)

書式

プロシージャに引数を設定したい場合は、以下のように「()」の中に変数の宣言を書いていきます!

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

複数の引数を設定したい場合は、「,(カンマ)」で区切っていきます。

global proc プロシージャ名(型 $変数名, 型 $変数名, 型 $変数名){
    プロシージャの中身
}

やってみよう!

指定されたノードの、Translate、Rotate、Scaleをロックして、ChannelBoxから表示を消してみるプロシージャを作ってみたいと思います!

まずは、プロシージャの宣言から。

global proc lockTransform(){
 }

続いて、書式に沿ってノード名を指定できるように引数を設定していきます!ノード名は文字列型なので「string型」、変数名はわかりやすいように「$node」にします!∠( ゚д゚)/

global proc lockTransform(string $node){
}
引数の変数「$node」は、プロシージャの中身だけで使うことが出来ます!

アトリビュートをロックするには、Mayaコマンド「setAttr」を使い、フラグ「l」を「true」にすることでロックされた状態になり、フラグ「k」を「false」にすることでChannel Boxから表示を消すことができます!

global proc lockTransform(string $node){
	setAttr -l true -k false ($node+".tx");
	setAttr -l true -k false ($node+".ty");
	setAttr -l true -k false ($node+".tz");
	
	setAttr -l true -k false ($node+".rx");
	setAttr -l true -k false ($node+".ry");
	setAttr -l true -k false ($node+".rz");
	
	setAttr -l true -k false ($node+".sx");
	setAttr -l true -k false ($node+".sy");
	setAttr -l true -k false ($node+".sz");
}
このコードを「lockTransform.mel」で保存します!

実験!part1

ポリゴンのSphereを作成し、ノード名を指定して実行してみましょう!ここでは、Sphereの名前は「pSphere1」でした!

lockTransform("pSphere1");

引数を設定したプロシージャを使う時に、引数を指定しないと以下のようにエラーしてしまうことを頭の片隅に入れておいてください!(`・ω・´)ゞ

lockTransform();
// Error: lockTransform(); // 
// Error: Line 1.15: Wrong number of arguments on call to lockTransform. //

もう一つプロシージャを用意!

毎回1つづつ名前を指定して実行するのは大変なので、選択したノードを処理できるようにします!先程のコードに追記していただければOKです(*´ω`*)

プロシージャ名は、選択したノードを処理できるようにということで「lockTransformSelection」とします!

global proc lockTransform(string $node){
	setAttr -l true -k false ($node+".tx");
	setAttr -l true -k false ($node+".ty");
	setAttr -l true -k false ($node+".tz");
	
	setAttr -l true -k false ($node+".rx");
	setAttr -l true -k false ($node+".ry");
	setAttr -l true -k false ($node+".rz");
	
	setAttr -l true -k false ($node+".sx");
	setAttr -l true -k false ($node+".sy");
	setAttr -l true -k false ($node+".sz");
}

global proc lockTransformSelection(){
}

選択されたノードを取得し、繰り返し処理するようにします!

global proc lockTransform(string $node){
	setAttr -l true -k false ($node+".tx");
	setAttr -l true -k false ($node+".ty");
	setAttr -l true -k false ($node+".tz");
	
	setAttr -l true -k false ($node+".rx");
	setAttr -l true -k false ($node+".ry");
	setAttr -l true -k false ($node+".rz");
	
	setAttr -l true -k false ($node+".sx");
	setAttr -l true -k false ($node+".sy");
	setAttr -l true -k false ($node+".sz");
}

global proc lockTransformSelection(){
	string $selection[] = `ls -sl -type "transform"`;
	for($node in $selection){
	}
}

繰り返し処理の中身は、先程作成したプロシージャルを呼び出すようにします!こうしていきながら、過去に作ったプロシージャルを有効活用したりしていきます(゚∀゚)

global proc lockTransform(string $node){
	setAttr -l true -k false ($node+".tx");
	setAttr -l true -k false ($node+".ty");
	setAttr -l true -k false ($node+".tz");
	
	setAttr -l true -k false ($node+".rx");
	setAttr -l true -k false ($node+".ry");
	setAttr -l true -k false ($node+".rz");
	
	setAttr -l true -k false ($node+".sx");
	setAttr -l true -k false ($node+".sy");
	setAttr -l true -k false ($node+".sz");
}

global proc lockTransformSelection(){
	string $selection[] = `ls -sl -type "transform"`;
	for($node in $selection){
		lockTransform($node);
	}
}
主に使うプロシージャ名が「lockTransformSelection」に変わったので、MELファイルの名前も「lockTransformSelection.mel」としてください!

実験!part2

Mayaで適当なTransformを複数選択して、以下のコードで実験してみます!

lockTransformSelection();

すると、「lockTransformSelection」で選択されたノードを繰り返し処理しながら、「lockTransform」を使ってTransformをロックするっというロジックが出来上がりです!

最低限のコードで、選択したノードをロックしたい場合は「lockTransformSelection」、名指しで処理したい場合は「lockTransform」と使い分けることができます!

まとめ!

  • プロシージャに引数を設定することで、処理の系統を変えたり、処理の対象物を変えたりできる!
  • 引数の書き方は、プロシージャの「()」の中に書く!
  • 引数があるプロシージャルを使う時は、必ず指定しないとエラーになる!

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