スクリプトジョブ

スクリプトジョブ

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) で返ってくる状態の中から主なものを以下にあげておきます。
これらはフラグの conditionTrueconditionFalseconditionChange などで使用できます。

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、またはメニューの ファイル → Exit)
renderLayerChange
レンダリングレイヤが作られたか消されたとき。
renderLayerManagerChange
レンダリングレイヤが他のレイヤに変えられたとき。
SceneOpened
シーンが開かれたとき。
SelectionChanged
新しく選択されたとき。

scriptJob の使用例1

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

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

scriptJob の使用例2

次に scriptJob() を使用してオブジェクトの 移動X が 10 以上にならないようにしてみましょう。

  1. 以下の 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()'))
    
  2. スクリプト エディタ の ファイル → スクリプトのロード によって scriptJob1.py を読み込んで、テンキーの Enter キーなどで実行します。
    [sphere1が作られたシーン]
  3. 球(sphere1)の 移動X の値を 10.0 以上にしても 10.0 に戻るようになります。
    [移動 X を150にする]
    [移動 X が10にもどる]

スクリプトの解説

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() を実行します。

練習

まとめ

参考


Prev | Next
Home | Contents
Mail