Python で初めてスクリプトを記述する場合のヒントとコツ
 
 
 

Python ビルトイン ライブラリ

Python には、多数の便利なビルトイン ライブラリやデータ構造があります。一般的なプログラミング タスクに使用できる既存のライブラリが用意されているため、ほとんどの場合、MEL スクリプトと同様にカスタム ユーティリティを作成する必要はありません。Python のビルトイン ライブラリに関する文書は、http://docs.python.org を参照してください。このサイトには、一般的な Python プログラミングの入門ガイドとして適したチュートリアルも提供されています。

Python クラスを使用したカスタム UI

使いやすい 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()

Maya で Python スクリプトをデバッグする

Python スクリプトの利点の 1 つに、開発段階でデバッガとして利用にできることが挙げられます。これによって、スクリプティングのトラブルシューティング時間を大幅に削減できます。

pdb で使用する

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 ごとに独自に必要なワークフローがあります。詳細については、それぞれのマニュアルを参照してください。

Wing IDE を Maya で使用する

Windows で Wing IDE 3.1 を使用して Maya Python スクリプトのデバッグ セッションを開始するには、以下の操作を実行します。

  1. wingdbstub.py を Wing IDE インストール ディレクトリから Maya Python スクリプト パスにコピーします。たとえば、C:\Program Files (x86)\Wing IDE 3.1\wingdbstub.pyC:\Users\<ユーザ名>\Documents\maya\scripts にコピーします。
  2. Wing IDE の [Edit] > [Preferences] > [Debugger] で、[Enable Passive Listen] をチェックして、外部プロセスからの接続を許可します。ダイアログボックスが表示され、通信ポートを開く権限を要求されます。以下のようにしてこれを許可します。
  3. Maya を起動して、Python スクリプトを確実にインポートして実行します。
  4. Wing IDE でこのスクリプトを開きます。F9 を使用するか左端のマージンをクリックして、ブレークポイントを設定します。
  5. Maya で Python ステートメントを実行します。
    import wingdbstub

    権限を要求する別の認証ダイアログボックスが表示されることがあります。以下のようにしてこれを許可します。

  6. Wing IDE に戻り、Wing IDE のメイン ウィンドウの左下にあるステータス インジケータが緑色であることを確認します。これは、リモート デバッグ接続が確立され、 Maya が実行中であることを示します。
  7. Maya で、ブレークポイントを含む Python 関数をコールします。ブレークポイントに到達すると、ステータス インジケータが、Maya が一時停止していることを示す黄色に変わります。実行する次のコード行が赤いラインで強調表示されます。
  8. これで、Wing IDE のすべてのデバッグ機能を使用して、プログラムの状態を検査できるようになりました。F5 または緑色の再生ボタンを押すと、制御が Maya に戻ります。
注:Wing IDE の使用方法の詳細については、ヘルプ文書を参照してください。

Python 関数を MEL プロシージャとして登録する

createMelWrapper 関数を使用して、Python 関数を MEL プロシージャとして登録することができます。次に、MEL プロシージャをコールすると、Python 関数をコールし、これが受け取る引数を渡して関数の結果を返します。

この関数の詳細については、次の場所にある melutils.py ファイルを参照してください。

C:\Program Files\Autodesk\Maya2010\Python\lib\site-packages\maya\mel

または、スクリプト エディタ(Script Editor)で以下を実行します。

import maya.mel
help(maya.mel.createMelWrapper)

この関数の利点:

次の例は、createMelWrapper 関数を使用して Python 関数を MEL プロシージャとして登録し、Rmb コマンド(Rmb Command)アトリビュートを container ノードで使用する方法を示しています。

  1. 以下を Maya2010/scripts ディレクトリの rmbScript.py に保存します。
    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")
  2. スクリプト エディタ(Script Editor)の Python タブから以下を実行します。これによって、必要な MEL ラッパ(wrapper)スクリプトが作成されます。
    from rmbScript import *
    import maya.cmds as cmds
    import maya.mel as mel
    mel.createMelWrapper(rmbMyContainerScript,retType='string[]')
    mel.createMelWrapper(exCoNotes)
    mel.createMelWrapper(setThisContainerCurrent)
  3. オブジェクトを作成します。
  4. アセット > コンテナの作成(Assets > Create Container)を選択して、rmbMyContainerScript をコンテナの Rmb コマンド(Rmb Command)アトリビュートに追加します。
  5. 以下のコードと同様のものを、container ノードの注(Notes)セクションに追加します。
    def main(node, container):
        print node
        print container
  6. スクリプト エディタ(Script Editor)で MEL タブに以下を入力します。
    rehash;
  7. オブジェクトをして、マーキング メニューからカスタム(Custom)を選択します。これで、カスタムの右マウス ボタン メニューが表示されるようになります。詳細については、「 カスタム コマンドまたはメニューのコンテナへの割り当て」を参照してください。