スクリプトジョブ
スクリプトジョブ
maya.cmds.scriptJob() という Python 関数を使用すると MAYA の中でイベント・状態の変化・アトリビュートの変化があった時に特定の関数などを実行させることができます。
これを応用すると、乗物の車輪などのように、
あるオブジェクトを移動すると他のオブジェクトもいっしょに移動したりすることができます。
scriptJob<()/KBD> 関数では何かが起きた場合に何の関数を実行するかをジョブという形で覚えておきます。
各ジョブにはジョブ番号という番号が自動的に割振られてゆきます。
このジョブ番号によってジョブの取り消しが可能です。
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=True
- 使用できるイベントの名前を返します。
- listCondisions=True
- 使用できる状態の名前を返します。
- listJobs=True
- 現在、存在するジョブを表示します。
- kill=number
- number で表されるジョブを消去します。
主な状態の説明
scriptJob(listConditions=True) で返ってくる状態の中から主なものを以下にあげておきます。
これらはフラグの
conditionTrue、
conditionFalse、
conditionChange
などで使用できます。
- playingBack
- アニメーションキーフレームをプレイバックしていると true になります。
- SomethingSelected
- 何かをセレクトすると true になります。
- busy
- MAYA が何かを実行している時に true になります。
- writingFile
- ファイルを書き込んでいると true になります。
- readingFile
- ファイルを読み込んでいると true になります。
主なイベントの説明
scriptJob(listEvents=True) で返ってくるイベントの中から主なものを以下にあげておきます。
これらはフラグの
event
で使用できます。
- DagObjectCreated
- 新しくトランスフォームノード・グループ・ジョイントなどが作られたとき。
- deleteAll
- File New を実行したとき。
- displayLayerChange
- ディスプレイレイヤが作られたか消されたとき。
- idle
- Mayaがアイドル状態にあり、優先順位が高いアイドルタスクがないとき
- MenuModeChanged
- シーンのモードを変更したとき。
("Modeling"、 "Animation"、"Dynamics"、"Rendering" の切替え)
- NewSceneOpened
- 新しいシーンが開かれたとき。
- playbackRangeChanged
- プレイバックされるキーフレームの範囲が変えられたとき。
- playbackRangeSliderChanged
- アニメーションの開始フレームまたは終了フレームが変えられたとき。
- quitApplication
- Maya を終了するとき。
(MELコマンドの quit、またはメニューの )
- renderLayerChange
- レンダリングレイヤが作られたか消されたとき。
- renderLayerManagerChange
- レンダリングレイヤが他のレイヤに変えられたとき。
- SceneOpened
- シーンが開かれたとき。
- SelectionChanged
- 新しく選択されたとき。
scriptJob の使用例1
scriptJob() を使用して、
セレクトされたオブジェクトを、
セレクトされると同時に消去するように設定してみましょう。
- 適当に球などのオブジェクトを数個作っておきます。
作ったら、すべてのオブジェクトがセレクトされていない状態にしておきます。
そうしないと、この例では scriptJob 関数がうまく働きません。
- に以下のような関数を打ち込んで実行します。
maya.cmds.scriptJob(conditionTrue=('SomethingSelected', 'maya.cmds.delete()'))
scriptJob 関数を実行した結果。
(# 結果: 30 # という番号に注意してください)
- この関数を実行した後にオブジェクトをセレクトすると、
セレクトされたオブジェクトが delete 関数が実行されることによって、消去されます。
- このままでは、セレクトするたびにオブジェクトが消えてしまうので、
このジョブを取り消します。
ジョブを取り消したい時は、まずジョブの番号を調べます。
そのためには上の 2 で関数を実行した際に表示されたジョブ番号を覚えておくか、または
maya.cmds.scriptJob(listJobs=True)
を実行することによって番号を調べます。
以下の例では 30 が 2. で登録したジョブの番号だということがわかります。
- 番号がわかったら、以下の関数を実行することによってセレクトしてもオブジェクトが消えなくなります。
例えば番号が 30 ならば以下のように実行します。
maya.cmds.scriptJob(kill=30)
scriptJob の使用例2
次に scriptJob() を使用してオブジェクトの 移動X が 10 以上にならないようにしてみましょう。
- 以下の Python スクリプトを scriptJob1.py という名前で作ります。
import maya.cmds
def limitXValue1():
x = maya.cmds.getAttr('sphere1.tx')
if x > 10.0:
maya.cmds.setAttr('sphere1.tx', 10.0)
maya.cmds.sphere(n='sphere1')
maya.cmds.scriptJob(attributeChange=('sphere1.tx', 'limitXValue1()'))
- スクリプト エディタ の によって scriptJob1.py を読み込んで、テンキーの Enter キーなどで実行します。
- 球(sphere1)の 移動X の値を 10.0 以上にしても 10.0 に戻るようになります。
スクリプトの解説
import maya.cmds
- maya.cmds モジュールをインポートします。
-
def limitXValue1():
- limitXValue1 という名前のプロシージャを宣言します。
-
x = maya.cmds.getAttr('sphere1.tx')
- sphere1 という名前のオブジェクト(NURBS の球)に属する tx ( 移動X )アトリビュートの値を変数 x に代入します。
-
if x > 10.0:
- x の値が 10.0 以上の場合は以下の関数を実行します。
-
maya.cmds.setAttr('sphere1.tx', 10.0)
- sphere1 の tx アトリビュートに 10.0 を設定します。
-
maya.cmds.sphere(n='sphere1')
- sphere1 という名前で NURBS の球を作ります。
-
maya.cmds.scriptJob(attributeChange=('sphere1.tx', 'limitXValue1()')
- sphere1 の tx アトリビュートが変化したら、関数 limitXValue1() を実行します。
練習
- scriptJob1.py を参考にして scriptJob2.py を作り、移動X だけでなく 移動Y, 移動Z も 10.0 以上の値にならないように書き換えてみましょう。
(注意)
実行する前にシーンの中のオブジェクトを全部消去しておくようにしてください。
まとめ
- scriptJob() 関数によって MAYA のイベント・状態・アトリビュートの変化をとらえて関数・プロシージャを実行することができます。
参考
Prev | Next
Home | Contents
Mail