スクリプトジョブ

スクリプトジョブ

scriptJob という MEL コマンドを使用すると、 Maya の中でイベント・状態の変化・アトリビュートの変化があった時に、 特定のコマンド・プロシージャなどを実行させることができます。
これを応用すると、 モデリング・アニメーション作成時の操作手順を減らしたり、 GUI のカスタマイズなどができるようになります。
scriptJob コマンドでは、 何かが起きた場合に何のコマンド・プロシージャを実行するかを、 ジョブという形式で覚えておきます。 各ジョブには、ジョブ番号という番号が自動的に割振られてゆきます。 このジョブ番号によって、ジョブの取り消しが可能です。

scriptJob コマンドの主なフラグ

-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 で表されるジョブを消去します。

主な状態の説明

scriptJob -listConditions で返ってくる状態の中から、主なものを以下にあげておきます。
これらはフラグの -conditionTrue-conditionFalse-conditionChange などで使用できます。

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

主なイベントの説明

scriptJob -listEvents で返ってくるイベントの中から、主なものを以下にあげておきます。
これらはフラグの -event で使用できます。

DagObjectCreated
新しくトランスフォームノード・グループ・ジョイントなどが作られたとき。
deleteAll
File New を実行したとき。
displayLayerChange
ディスプレイレイヤが作られたか消されたとき。
idle
Mayaがアイドル状態にあり、優先順位が高いアイドルタスクがないとき
MenuModeChanged
シーンのモードを変更したとき。 ("アニメーション"、"ポリゴン"、"サーフェス"、"ダイナミクス"、"レンダリング" の切替え)
NewSceneOpened
新しいシーンが開かれたとき。
playbackRangeChanged
プレイバックされるキーフレームの範囲が変えられたとき。
playbackRangeSliderChanged
アニメーションの開始フレーム、または終了フレームが変えられたとき。
quitApplication
Maya を終了するとき。 (MELコマンドの quit、またはメニューの ファイル → 終了)
renderLayerChange
レンダリングレイヤが作られたか、消されたとき。
renderLayerManagerChange
レンダリングレイヤが他のレイヤに変えられたとき。
SceneOpened
シーンが開かれたとき。
SelectionChanged
新しく選択されたとき。

scriptJob の使用例1

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

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

scriptJobの使用例2

次に、 scriptJob コマンドを使用して、 オブジェクトの 移動X が 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. スクリプト エディタの ファイル → ソーススクリプト によって scriptJob1.mel を読み込みます。
    [sphere1が作られたシーン]
  3. 球体(sphere1)の 移動X の値を 10.0 以上にしても 10.0 に戻るようになります。
    [移動 X を150にする]
    [移動 X が10にもどる]

スクリプトの解説

global proc limitXValue1()
limitXValue1 という名前のプロシージャを宣言します。
float $x = `getAttr sphere1.tx`;
sphere1 という名前のオブジェクト(NURBS の球体)に属する tx ( 移動X )アトリビュートの値を変数 $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