Python には、多数の便利なビルトイン ライブラリやデータ構造があります。一般的なプログラミング タスクに使用できる既存のライブラリが用意されているため、ほとんどの場合、MEL スクリプトと同様にカスタム ユーティリティを作成する必要はありません。Python のビルトイン ライブラリに関する文書は、http://docs.python.org を参照してください。このサイトには、一般的な Python プログラミングの入門ガイドとして適したチュートリアルも提供されています。
使いやすい Python 関数の 1 つに functools.partial があり、これを使用するとコールバック関数に追加情報を渡すことができます。たとえば、次のクラスでは、クリックすると番号が出力されるボタンをいくつか含むウィンドウが作成されます。
from functools import partial import maya.cmds as cmds class ButtonWin(object): def __init__(self): self.win = cmds.window() self.layout = cmds.columnLayout(parent=self.win) for x in range(10): cmds.button(label="Click Here %d"%x, parent=self.layout, command=partial(self.report,x)) cmds.showWindow() def report(self,buttonIndex,value): print "button %d got %s"%(buttonIndex,value) f = ButtonWin()
Python スクリプトの利点の 1 つに、開発段階でデバッガとして利用にできることが挙げられます。これによって、スクリプティングのトラブルシューティング時間を大幅に削減できます。
Python では、pdb モジュール内にビルトイン デバッガが装備されています。pdb には、クィック デバッグ セッションに適したテキスト インタフェースがあります。スクリプト エディタ(Script Editor)からコールされたスクリプトで pdb を使用すると、pdb で入力が必要な場合には必ず入力ダイアログボックスが表示されます。pdb の使用方法はシンプルであり、次のように読み込んでブレークポイントを設定します。
import pdb pdb.set_trace()
2 行目まで実行すると入力ダイアログが表示されるので、標準コマンドを使用して作業を続行し、ステップイン、値の出力などを行います。
pdb に関する詳細文書は、 http://docs.python.org/library/pdb.html を参照してください。
複雑なデバッグ タスクの場合は、外部のグラフィカル デバッガを使用するほうが簡単でしょう。無償または市販の IDE には、以下のようなものがあります。
外部デバッガを使用して Maya に初めてユーティリティ モジュールを読み込むと、IDE への通信ソケットが開きます。IDE が Maya に接続されたら、スクリプト ファイルを開いてブレークポイントの設定や変数値の検査などができます。IDE ごとに独自に必要なワークフローがあります。詳細については、それぞれのマニュアルを参照してください。
Windows で Wing IDE 3.1 を使用して Maya Python スクリプトのデバッグ セッションを開始するには、以下の操作を実行します。
import wingdbstub
権限を要求する別の認証ダイアログボックスが表示されることがあります。以下のようにしてこれを許可します。
Wing IDE の使用方法の詳細については、ヘルプを参照してください。
createMelWrapper 関数を使用して、Python 関数を MEL プロシージャとして登録することができます。次に、MEL プロシージャをコールすると、Python 関数をコールし、これが受け取る引数を渡して関数の結果を返します。
この関数の詳細については、Maya のインストール ディレクトリの ..¥Python¥lib¥site-packages¥maya¥mel フォルダ内にある melutils.py ファイルを参照してください。
または、スクリプト エディタ(Script Editor)で以下を実行します。
import maya.mel help(maya.mel.createMelWrapper)
この関数の利点:
次の例は、createMelWrapper 関数を使用して Python 関数を MEL プロシージャとして登録し、Rmb コマンド(Rmb Command)アトリビュートを asset ノード(以前の container ノード)で使用する方法を示しています。
import maya.cmds as cmds import maya.mel as mel def exCoNotes(node): if(cmds.nodeType(node)=='container'): objCont = node else: objCont = cmds.container(q=True, findContainer=node) exec(cmds.getAttr(objCont+'.notes')) pyfunction = 'main("'+node+'","'+objCont+'")' exec(pyfunction) cmds.select(node, r=True) def setThisContainerCurrent(node): if(cmds.nodeType(node)=='container'): objCont = node else: objCont = cmds.container(q=True, findContainer=node) cmds.container(objCont, e=True, c=True) cmds.select(node, r=True) def rmbMyContainerScript(): return ("Execute Container Notes", "exCoNotes", "Set This Container Current", "setThisContainerCurrent")
from rmbScript import * import maya.cmds as cmds import maya.mel as mel mel.createMelWrapper(rmbMyContainerScript,retType='string[]') mel.createMelWrapper(exCoNotes) mel.createMelWrapper(setThisContainerCurrent)
このて銃手順は、トランスフォームを含むアセットにも使用できます。ただし、ノード タイプは dagContainer になります。
def main(node, container): print node print container
rehash;
Python のサンプル スクリプトを使用して、アニメートしたカーブを作成してキーフレームを設定することができます。
import maya.OpenMaya as om import maya.OpenMayaAnim as oma def addkeys(plugName, times, values, changeCache): # Get the plug to be animated. sel = om.MSelectionList() sel.add(plugName) plug = om.MPlug() sel.getPlug(0, plug) # Create the animCurve. animfn = oma.MFnAnimCurve() animCurve = animfn.create(plug, oma.MFnAnimCurve.kAnimCurveTL) # Copy the times into an MTimeArray and the values into an MDoubleArray. timeArray = om.MTimeArray() valueArray = om.MDoubleArray() for i in range(len(times)): timeArray.append(om.MTime(times[i], om.MTime.uiUnit())) valueArray.append(values[i]) # Add the keys to the animCurve. animfn.addKeys( timeArray, valueArray, oma.MFnAnimCurve.kTangentGlobal, oma.MFnAnimCurve.kTangentGlobal, False, changeCache )
上記のサンプル コードでチャネルにキーフレーム アニメーション(つまりプラグ)が追加されます。変更内容を元に戻す必要がまったくない場合は、以下のようにコールします。
addkeys('pCube1.tx', [1.0, 3.0, 5.0], [0.6, 1.2, 2.4], None)
ただし、変更内容を元に戻せるようにしておく場合は、以下のようにコールします。
changeCache = oma.MAnimCurveChange() addkeys('pCube1.tx', [1.0, 3.0, 5.0], [0.6, 1.2, 2.4], changeCache)
変更内容を元す場合は、以下の手順を実行します。
changeCache.undoIt()
ここではわかりやすくするために、plugName で指定したプラグは現在アニメートされていないものとします。これは練習問題用で、この条件を不要にするために必要なチェックを追加することもできます。
dgInfo コマンドを使用して DG に関する情報を入手する場合、DIRTY BLOCK、DIRTY PROP といった情報メッセージが表示されることがあります。
これは、Python スクリプトで、API コールを使用して行うことができます。以下の例は、myEvent という新しいユーザ イベント タイプを登録する方法を示します。
import maya.OpenMaya as om om.MUserEventMessage.registerUserEvent('myEvent')
イベントが発生するたびに myFunc という関数が実行されるようにするには、次を実行します。
def myFunc(data): print('Got a myEvent event!') callbackId = om.MUserEventMessage.addUserEventCallback('myEvent', myFunc)
myEvent イベントを送信するには、次を実行します。
om.MUserEventMessage.postUserEvent('myEvent')
終了後にコールバック関数を除去するには、次を実行します。
om.MUserEventMessage.removeCallback(callbackId)