スクリプトジョブ

スクリプトジョブ

scriptJob という MEL コマンドを使用すると MAYA の中でイベントや状態の変化があった時に特定のコマンド・プロシージャなどを実行させることができる。
これを応用すると、あるオブジェクトを移動すると他のオブジェクトもいっしょに移動したりすることができる。 (乗物の車輪など)

主なフラグ

下記の説明でコマンドの部分はプロシージャでもよい。

-conditionTrue "string" "script"
"string"で表される状態がtrueになった時、実行されるコマンド"script"を設定する。
-conditionFalse "string" "script"
"string"で表される状態がfalseになった時、実行されるコマンド"script"を設定する。
-conditionChange "string" "script"
"string"で表される状態が変化した時、実行されるコマンド"script"を設定する。
状態がtrueからfalseに、またはfalseからtrueになった時に"script"を実行する。
-event "string" "script"
"string"で表されるイベントが起きた時、実行されるコマンド"script"を設定する。
-attributeChange "string" "script"
"string"で表されるアトリビュートに変化が起きた時、実行されるコマンド"script"を設定する。
-parent "string"
"string"で指定されたユーザーインターフェースが存在する間だけジョブが存在する。
そのユーザーインターフェースが消されるとジョブも消去される。
-listEvents
使用できるイベントの名前を返す。
-listCondisions
使用できる状態の名前を返す。
-listJobs
現在、存在するジョブを表示する。
-kill number
numberで表されるジョブを消去する。

主な状態の説明

-listConditionsで返ってくる状態の中から主なものを以下にあげてみる。
これらはオプションの -conditionTrue-conditionFalse-conditionChange などで使用できる。

playingBack
アニメーションキーフレームをプレイバックしているとtrueになる。
SomethingSelected
何かをセレクトするとtrueになる。
busy
MAYAが何かを実行している時にtrueになる。
writingFile
ファイルを書き込んでいるとtrueになる。
readingFile
ファイルを読み込んでいるとtrueになる。

scriptJobの使用例1

scriptJob を使用してセレクトされたオブジェクトを、セレクトされると同時に消去するように設定してみよう。

  1. 適当に球などのオブジェクトを数個作っておく。
    [シーン]
    作ったら、すべてのオブジェクトがセレクトされていない状態にしておく。 そうしないと、この例では scriptJob コマンドがうまく働かない。
  2. Script Editor に以下のようなコマンドを打ち込んで実行する。
    scriptJob -conditionTrue "SomethingSelected" "delete";
    [scriptJob を実行]
    scriptJob コマンドを実行した結果。 (Result: 135 という番号に注意) [scriptJob  の実行結果]
  3. このコマンドを実行した後にオブジェクトをセレクトすると、 セレクトされたオブジェクトが消去(delete コマンドが実行)される。
  4. この後、このジョブを取り消したい時は、まずジョブの番号を調べる。
    そのためには上の2でコマンドを実行した際に表示されたジョブ番号を覚えておくか、または
    scriptJob -listJobs;
    を実行することによって番号を調べる。
    [scriptJob -listJobs; を実行]
    以下の例では 135 が 2 で登録したジョブの番号だということがわかる。
    [scriptJob -listJobs; の実行結果]
  5. 番号がわかったら以下のコマンドを実行することによってセレクトしてもオブジェクトが消えなくなる。
    例えば番号が135ならば
    scriptJob -kill 135;
    [scriptJob -kill 135; を実行]

scriptJobの使用例2

次に scriptJob を使用してオブジェクトの TranslateX が 10 以上にならないようにしてみよう。

  1. 以下のMELスクリプトをscriptJob1.melという名前で作る。
    global proc limitXValue1()
    {
    	float $x = `getAttr sphere1.tx`;
    	if($x > 10.0)
    	{
    		setAttr sphere1.tx 10.0;
    	}
    }
    sphere -n sphere1;
    scriptJob -attributeChange sphere1.tx limitXValue1;
    
  2. Script Editorの File → Source Script によって scriptJob1.mel を読み込む。
    [sphere1が作られたシーン]
  3. 球(sphere1)の translateX の値を 10.0 以上にしても 10.0 に戻るようになる。
    [Translate X を150にする]
    [Translate X が10にもどる]

スクリプトの解説

global proc limitXValue1()
limitXValue1 という名前のプロシージャを宣言する。
float $x = `getAttr sphere1.tx`;
sphere1 という名前のオブジェクト(NURBS の球)に属する tx ( translateX )アトリビュートの値を変数 $x に代入する。
if($x > 10.0)
$x の値が 10.0 以上の場合は以下のコマンドを実行する。
setAttr sphere1.tx 10.0;
sphere1 の tx アトリビュートに 10.0 をセットする。
sphere -n sphere1;
sphere1 という名前で NURBS の球を作る。
scriptJob -attributeChange sphere1.tx limitXValue1;
sphere1 の tx アトリビュートが変化したら、プロシージャ limitXValue1 を実行する。

練習

まとめ

練習課題

参考


Prev | Next
Home | Contents
Mail