Python と MEL は大きくことなる言語であるため、Maya コマンドを Python で起動する方法と MEL で使用する方法では多くの違いがあります。
次に Maya で Python を使用する場合の基本について説明します。
Maya で Python を入力する方法にはいくつかあります。
Maya で MEL スクリプティングと Python スクリプティングの両方を円滑に実行するため、スクリプト エディタ(Script Editor)が修正され、各言語に個別のタブができました。MEL タブのウィンドウに入力したステートメントは MEL に送信、処理されます。同様に、Python タブのウィンドウに入力すると、Python により処理されます。
Python が返す結果には、先頭に Python のコメント キャラクタ(#)が付きます。
詳細については、『Maya の基本』マニュアルの「 スクリプト エディタ(Script Editor)」を参照してください。
短い Python コマンドはコマンド ラインに入力することもできます。MEL と Python コマンドの入力を切り替えることができます。
MEL スクリプトと同じように、 を押したまま Python スクリプトをシェルフ(Shelf)にドラッグすることができます。この場合、ダイアログ ボックスが表示され、スクリプトが Python か MEL のどちらであるかを尋ねられます。
すべての一般的な Maya コマンドの Python バインディングは、maya.cmds モジュールにあります。これらのコマンドにアクセスするには、セッションごとにスクリプト エディタ(Script Editor)の Python タブに以下を入力する必要があります。
import maya.cmds
これにより Maya コマンドが使用できるようになります。例:
maya.cmds.ls()
maya.cmds.sphere( radius=4 )
Maya コマンドを異なる、短いネームスペースにインポートすることができます。
import maya.cmds as cmd
cmd.sphere()
import maya.cmds as mc mc.sphere()
詳細については、 Maya 環境を Python 内および Python 用で初期化するを参照してください。
こうすると、その後は次のように Maya コマンドをすばやく参照できるようになります。
警告: トップ レベルのネームスペースにインポートすると、Python ビルトインや他のモジュールの定義がオーバーライドされます。
たとえば、Python には自身のヘルプ システムがあり、Python バージョンのヘルプを呼び出すと、Python に固有の内容が表示されます。maya.cmds.help を呼び出すと、Maya コマンドのヘルプが表示されます。しかし、maya.cmds をトップ レベルのネームスペースにインポートすると、Python のヘルプにはアクセスできなくなります。
Python でのフラグの処理は MEL と異なります。MEL はシェル コマンド スタイルの構文で作られています。
Python での Maya コマンドについては、コマンド引数構文は Python で自然になるような方法で適用されています。その結果、フラグは、ロング形式とショート形式のいずれでも名前付き引数としてコマンドに渡されます。引数の名前はフラグ名で、フラグの引数は名前付き引数に渡されます。
sphere -radius 4;
Python バージョンではフラグ radius は名前付き引数として参照され、単一の引数だけがあるため、値は次のように渡されます。
maya.cmds.sphere( radius=4 )
フラグに複数の引数がある場合は、引数をリストまたはタプルにパックする必要があります。次の例は 3 つの引数を持つフラグが 1 つのあるコマンドです。
# With a tuple maya.cmds.ambientLight( rgb=( 0.2, 0.3, 0.4 ) )
# With a list maya.cmds.ambientLight( rgb=[ 0.2, 0.3, 0.4 ] )
名前付き引数には関連付けられた値が必要です。ただし、すべての Maya フラグに値が必要なわけではありません(たとえば、ls -sl)。一貫した構文を維持するため、Autodesk Maya で Python を実装する場合、通常は引数を取らないフラグにブーリアン引数を割り当てる必要があります。ブーリアン値が False の場合、フラグは無視されます。True の場合、フラグは使用されます。例:
# Pass selection flag maya.cmds.ls( selection=True )
# Selection flag is ignored here maya.cmds.ls( selection=False )
フラグによっては、1 回のコマンド呼び出しで複数回使用することができます。たとえば、MEL では次のようになります。
ls -type nurbsSurface -type transform;
Python では、名前付き引数 type を使用して値をリストまたはタプルに渡します。
maya.cmds.ls( type=['nurbsSurface','transform'] )
1 つのフラグが複数回使用され、複数の引数を持つ場合、値はリストのリストになります。タプルをリストの代わりに使用して、リストのタプル、タプルのリスト、またはタプルのタプルを使用することができます。たとえば、MEL 上の curveOnSurface コマンドは次のようになります。
curveOnSurface -d 3 -uv 0 0 -uv 0.3 0.5 -uv 0.5 0.6 -uv 0.9 1.0 surface1;
maya.cmds.curveOnSurface( 'surface1', d=3, uv=[(0,0),(0.3,0.5),(0.5,0.6),(0.9,1.0)] )
Maya コマンドには、time、index、float の 3 種類の範囲があります。すべて Python ではタプルを使用して指定する必要があります。タプルには 1 つまたは 2 つの値があります。値が 1 つのタプルは、1 つのカンマで区切ってカッコに値を入れて指定します。値が 1 つの複数のタプルは、セット表記法を使用して指定します(詳細については、 複数の名前付き引数を参照)。
また、time 範囲は単位をサポートします。単位を指定するには、文字列を使用する必要があります。各値は個別に解析されるため、単位を混合してもかまいません。
(1,) (1,10) ('1sec','10sec') ('1min:2min')
次の表では、time と index の範囲を指定する例として cutKey コマンドを使用しています。
Python の複数使用のフラグの引数はリストとしてフラグに渡す必要があるので、Maya コマンドに対する特定のフラグ変更が必要です。このため、異なる複数使用のフラグを混合して一致させる必要があるコマンドでは問題が発生します。各複数使用のフラグの引数は Python の個別のリストで提供されるため、これらの引数を混合することはありません。複数使用のフラグに依存していたいくつかのコマンドは拡張されて、単一の複数使用のフラグが個々の複数使用のフラグの仕事を処理できるようになりました。
前述の curveOnSurface の例も、Python 構文の別の要件を示しています。Maya コマンドは、フラグの他に、引数とオブジェクトを取ることもできます。引数は、コマンドで必要になる固定型の値です。たとえば、move コマンドは移動のための x、y、z の値を示す 3 つの引数を取ります。オブジェクトはコマンドが動作する構成要素です(たとえば、シーンや UI 要素内のオブジェクトです)。1 つのコマンドに変化する数のオブジェクトが存在することもあり、カレント セレクション リストに基づいてインプリシットになる場合もあります。
オブジェクトと引数は MEL の場合と同じようにコマンドに渡されますが、次の順序で渡す必要があります。
command arguments object flags/named arguments
これは MEL とは異なります。MEL では、オブジェクトが引数リストの末尾に来なければなりません。しかし、Python では名前付き引数を、すべての他の引数の後に配置する必要があります。
次の表に、Maya Python モジュールで使用できるフラグ(名前付き引数)のタイプの概要を示します。
Python は STDIN(標準入力)の読み取りをサポートしています。Python スクリプトでは、これは sys.stdin を読み取るか raw_input を呼び出すことにより実行します。Maya を(バッチ モードではなく)GUI モードで実行している場合、Python からのこれらの呼び出しに割り込んでダイアログ ボックスが表示されるため、そこで入力することができます。
Maya は、自身の実行によって sys.stdin をオーバーライドします。Python の一般的な標準オブジェクトを使用する場合は、sys.__stdin__ を参照して行います。
新しい MEL コマンド python は、文字列を受け取って Python に渡して実行させます。python コマンドは、結果を MEL データ型に変換しようとします。
python( "import maya.cmds" )
python( "maya.cmds.ls" )
Python のデータ型体系は MEL より高度なため、すべての Python データ型を一般的な MEL データ型に変換することはできません。python コマンドは、処理方法がわかっている型を変換します。わからないものについては、オブジェクトの文字列表現を要求して、それを返します。
Python から MEL をコールするには、maya.mel.eval() 関数を使用します。Python のほうがデータ型をより柔軟にサポートしているので、この関数を使用したほうが MEL python コマンドよりもうまく変換することができます。
このコマンドを使用するには、maya.mel モジュールをインポートする必要があります。
import maya.mel as mm mm.eval("polySphere;")
位置引数とは、UI 要素がそのコールバック スクリプトに渡す引数のことです。たとえば、float スライダ コントロールに関するコールバック MEL スクリプトには #1 を含めることができます。コールバックが実行されると、float スライダの値にはこの位置引数が代入されます。
Python の場合、コールバックでコントロールからの値に代入する方法には 2 つあります。評価されるコールバックが文字列の場合には、Maya は MEL と同じように文字列代入を実行します。ただし、この代入の実行には Python のフォーマット演算子が使用されます。このフォーマット演算子は代入のための項目の辞書を渡され、この辞書では値の名前は 1、2 のようになります。例:
maya.cmds.floatSlider( cc="print '%(1)s'" )
(この辞書は文字列に後で、ただし実行前に適用されます。floatSlider コマンドは、スクリプトを実行する前にこの文字列を現在選択されているスライダ値でフォーマットします。ユーザはフォーマット文字列を指定し、UI 要素はフォーマット操作のための辞書を提供します。)
2 番目の方法では、Python コールバックは複雑な関数を使用し、Maya はこの関数に値を引数として渡します。
def doPrint( arg ):
print arg
cmds.floatSlider( cc=doPrint )
コールバック関数では、コールバックが正しい数の引数を取らない場合にエラー メッセージが表示されます。
def badStuff():
print "bad"
cmds.floatSlider( cc=badStuff )
# TypeError: badStuff() takes no arguments (1 given)
任意の数の引数で動作するコールバックを作成する場合は、可変引数リストを使用します。
def genericCallback( *args ):
print( "args: " + str ( args ) )
cmds.button( command=genericCallback )
エラーや警告が発生した時に、Maya のステータス ラインを赤や紫色に表示させるには、スクリプトに次のコードを追加して、これらの関数を使用します。
def pyError( errorString ):
""" print an error message """
import maya.mel as mel
try:
mel.eval(_NOL10N('error "%s"') % errorString)
except:
pass
def pyWarning( warningString ):
""" print a warning message """
import maya.mel as mel
try:
mel.eval(_NOL10N('warning "%s"') % warningString)
except:
pass