スクリプトジョブ

スクリプトジョブ

scriptJob という MEL コマンドを使用すると MAYA の中でイベント・状態の変化・アトリビュートの変化があった時に特定のコマンド・プロシージャなどを実行させることができます。
これを応用すると、乗物の車輪などのように、 あるオブジェクトを移動すると他のオブジェクトもいっしょに移動したりすることができます。
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
シーンのモードを変更したとき。 ("Modeling"、 "Animation"、"Dynamics"、"Rendering" の切替え)
NewSceneOpened
新しいシーンが開かれたとき。
playbackRangeChanged
プレイバックされるキーフレームの範囲が変えられたとき。
playbackRangeSliderChanged
アニメーションの開始フレームまたは終了フレームが変えられたとき。
quitApplication
Maya を終了するとき。 (MELコマンドの quit、またはメニューの File → Exit)
renderLayerChange
レンダリングレイヤが作られたか消されたとき。
renderLayerManagerChange
レンダリングレイヤが他のレイヤに変えられたとき。
SceneOpened
シーンが開かれたとき。
SelectionChanged
新しく選択されたとき。

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