Python と MEL は大きくことなる言語であるため、Maya コマンドを Python で起動する方法と MEL で使用する方法では多くの違いがあります。
次に Maya で Python を使用する場合の基本について説明します。
Maya で Python を入力する方法にはいくつかあります。
Maya で MEL スクリプティングと Python スクリプティングの両方を円滑に実行するため、スクリプト エディタ(Script Editor)が修正され、各言語に個別のタブができました。MEL タブのウィンドウに入力したステートメントは MEL に送信、処理されます。同様に、Python タブのウィンドウに入力すると、Python により処理されます。
Python が返す結果には、先頭に Python のコメント キャラクタ(#)が付きます。
スクリプト エディタでオートコンプリート機能を使用すると、コマンド名をよりすばやく検索できます。詳細については、MEL コマンドに関するヘルプを参照するを参照してください。
詳細については、スクリプト エディタ(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 用に初期化するを参照してください。
from maya.cmds import *
こうすると、その後は次のように Maya コマンドをすばやく参照できるようになります。
ls() sphere( radius=4 )
警告: トップ レベルのネームスペースに読み込むと、Python ビルトインや他のモジュールの定義がオーバーライドされます。
たとえば、Python には自身のヘルプ システムがあり、Python バージョンの help をコールすると、Python に固有の内容が表示されます。maya.cmds.help をコールすると、Maya コマンドのヘルプが表示されます。しかし、maya.cmds をトップ レベルのネームスペースに読み込むと、Python のヘルプにはアクセスできなくなります。
Python でのフラグの処理は MEL と異なります。MEL はシェル コマンド スタイルの構文で作られています。
Python での Maya コマンドについては、コマンド引数構文は Python で自然になるような方法で適用されています。その結果、フラグは、ロング形式とショート形式のいずれでも名前付き引数としてコマンドに渡されます。引数の名前はフラグ名で、フラグの引数は名前付き引数に渡されます。
MEL sphere コマンドは次のようになります。
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;
Python では次のようになります。
maya.cmds.curveOnSurface( 'surface1', d=3, uv=[(0,0),(0.3,0.5),(0.5,0.6),(0.9,1.0)] )
複数の引数フラグを使用すると Python はエラーを返します(‘重複したキーワード引数です’)。
Maya コマンドには、time、index、float の 3 種類の範囲があります。すべて Python ではタプルを使用して指定する必要があります。タプルには 1 つまたは 2 つの値があります。値が 1 つのタプルは、1 つのカンマで区切ってカッコに値を入れて指定します。値が 1 つの複数のタプルは、セット表記法を使用して指定します(詳細については、複数の名前付き引数を参照)。
また、time 範囲は単位をサポートします。単位を指定するには、文字列を使用する必要があります。各値は個別に解析されるため、単位を混合してもかまいません。
以下は有効な time 範囲の例です。
(1,)(1,10)('1sec','10sec')('1min:2min')
次の表では、time と index の範囲を指定する例として cutKey コマンドを使用しています。
MEL 範囲 | 意味 | Python 範囲 |
---|---|---|
-time 10pal |
フレーム 10 でキーをカットします(PAL フォーマット)。 |
time=('10pal',) |
-time 1.0sec -time 15ntsc -time 20 |
time 1.0 秒、フレーム 15 (NTSC フォーマット)、time 20 (現在定義されているグローバル時間単位)でキーをカットします。 |
time=[('1.0sec',),('15ntsc',),(20,)] |
-time "10:20" |
10 ~ 20 の範囲(10 と 20 を含む)にあるすべてのキーを現在のタイム単位でカットします。 |
time=(10,20) |
-time "10:" |
現在のタイム単位で time 10 とそれ以降のすべてのキーをカットします。 |
time=('10:',) |
-time ":10" |
time 10 と time 10 までのすべてのキーを現在のタイム単位でカットします。 |
time=(':10',) |
-time ":" |
すべてのキーをカットします。 |
time=(':',) |
-index 0 |
各アニメーション カーブの 1 番目のキーをカットします (インデックスは 0 から開始します。) |
index=(0,) |
-index 2 -index 5 -index 7 |
3 番目、6 番目、8 番目のキーをカットします。 |
index=[(2,),(5,),(7,)] |
-index "1:5" |
各アニメーション カーブの 2 番目、3 番目、4 番目、5 番目、6 番目のキーをカットします。 |
index=[("1:5",)] |
Python の複数使用のフラグの引数はリストとしてフラグに渡す必要があるので、Maya コマンドに対する特定のフラグ変更が必要です。このため、異なる複数使用のフラグを混合して一致させる必要があるコマンドでは問題が発生します。各複数使用のフラグの引数は Python の個別のリストで提供されるため、これらの引数を混合することはありません。複数使用のフラグに依存していたいくつかのコマンドは拡張されて、単一の複数使用のフラグが個々の複数使用のフラグの仕事を処理することができます。
これらのコマンドには次のものが含まれます。
これらすべてのフラグの使用法については、CommandsPython リファレンス マニュアルに記載されています。
すべてのケースで、フラグには後方互換性があり、古いフラグはすべて同じ位置で使用できます。
前述の curveOnSurface の例も、Python 構文の別の要件を示しています。Maya コマンドは、フラグの他に、引数とオブジェクトを取ることもできます。引数は、コマンドで必要になる固定型の値です。たとえば、move コマンドは移動のための x、y、z の値を示す 3 つの引数を取ります。オブジェクトはコマンドが動作する構成要素です(たとえば、シーンや UI 要素内のオブジェクトです)。1 つのコマンドに変化する数のオブジェクトが存在することもあり、現在のセレクション リストに基づいてインプリシットになる場合もあります。
オブジェクトと引数は MEL の場合と同じようにコマンドに渡されますが、次の順序で渡す必要があります。
command arguments object flags/named arguments
これは MEL とは異なります。MEL では、オブジェクトが引数リストの末尾に来なければなりません。しかし、Python では名前付き引数を、すべての他の引数の後に配置する必要があります。
次の表に、Maya Python モジュールで使用できるフラグ(名前付き引数)のタイプの概要を示します。
フラグ タイプ | 例 | コメント |
---|---|---|
単純フラグ |
MEL: ls -selection Python: maya.cmds.ls ( selection=True ) |
引数のないフラグで、戻り値はブーリアン True/False スイッチになります。 |
単一引数を取るフラグ |
MEL: sphere -radius 10 Python: maya.cmds.sphere( radius=10 ) |
|
複数の引数を取るフラグ |
MEL: ambientLight -rgb 0.2 0.3 0.4 Python: maya.cmds.ambientLight( rgb=( 0.2, 0.3, 0.4 )) |
タプルを使用して複数の引数を指定します。 |
複数使用のフラグ |
MEL: ls -type nurbsSurface -type transform Python: maya.cmds.ls( type=['nurbsSphere','transform'] ) |
リストを使用して複数のフラグ値を保持します。 |
複数の引数を取る複数使用のフラグ |
MEL: curveOnSurface -d 3 -uv 0 0 -uv 0.3 0.5 -uv 0.5 0.6 surface1 Python: maya.cmds.curveOnSurface( 'surface1', degree=3, uv=[(0,0),(0.3,0.5),(0.5,0.6)] ) |
タプルのリストを使用します。 (タプルのタプル、リストのリスト、リストのタプルを使用することもできます)。 |
コマンド引数 |
MEL: move 2.0 1.0 1.0 Python: maya.cmds.move( 2.0, 1.0, 1.0 ) |
MEL と同じですが、引数が最初に来る必要があります。 |
フラグ付きのコマンド引数 |
MEL: move -objectSpace 2.0 1.0 1.0 Python: maya.cmds.move( 2.0, 1.0, 1.0, objectSpace=True ) |
|
コマンド オブジェクト |
MEL: select nurbsSphere1 Python: maya.cmds.select( 'nurbsSphere1' ) |
MEL と同じ。 |
引数とフラグを取るコマンド オブジェクト |
MEL: move -objectSpace 2.0 1.0 1.0 nurbsSphere1 Python: maya.cmds.move( 2.0, 1.0, 1.0, 'nurbsSphere1', objectSpace=True ) |
オブジェクトはフラグの前に来なければなりません。 |
フラグ/引数が値を取る照会 |
MEL: skinCluster -q -inf; Python maya.cmds.skinCluster (q=True, inf=True) |
ブーリアン True が必要な照会フラグ。 |
フラグ/引数が値を取らない照会 |
MEL: skinCluster -inf joint1 -q -dr; Python: skinCluster (q=True, inf='joint1', dr=True) |
Python は STDIN (標準入力)の読み取りをサポートしています。Python スクリプトでは、これは sys.stdin を読み取るか raw_input をコールすることにより実行します。Maya を(バッチ モードではなく) GUI モードで実行している場合、Python からのこれらのコールに割り込んでダイアログ ボックスが表示されるため、そこで入力することができます。
Maya は、自身の実行によって sys.stdin をオーバーライドします。Python の一般的な標準オブジェクトを使用する場合は、sys.__stdin__ を参照して行います。
スクリプト エディタ(Script Editor)に以下のいずれかを入力し、Python STDIN ダイアログボックスを表示します。
raw_input()
import sys inp = sys.stdin.readline()
import maya.cmds as cmds inp = cmds.promptDialog(message='hello')
新しい MEL コマンド python は、文字列を受け取って Python に渡して実行させます。python コマンドは、結果を MEL データ型に変換しようとします。
python( "import maya.cmds" ) python( "maya.cmds.ls" )
単一の Python ステートメントのある文字列だけが結果を返します。これは現在のところ Python の制限事項です。
Python のデータ型体系は MEL より高度なため、すべての Python データ型を一般的な MEL データ型に変換することはできません。python コマンドは、処理方法がわかっている型を変換します。わからないものについては、オブジェクトの文字列表現を要求して、それを返します。
次の表に、現在サポートされているマッピングを示します。
Python の戻り値 | 変換された MEL での値 |
---|---|
string |
string |
unicode |
string |
int |
int |
float |
float |
最低 1 つの float を含む数値を含むリスト表示 |
float[] |
integers または longs を含むリスト表示 |
int[] |
数値以外を含むリスト |
string[] |
その他すべて |
string |
空の Python リスト |
空の文字配列(string $array[]) |
Python から MEL をコールするには、maya.mel.eval() 関数を使用します。Python のほうがデータ型をより柔軟にサポートしているので、この関数を使用したほうが MEL python コマンドよりもうまく変換することができます。
このコマンドを使用するには、maya.mel モジュールを読み込む必要があります。
import maya.mel as mm mm.eval("polySphere;")
次に、サポートされる変換の表を示します。
MEL の戻り値 | 変換された Python での値 |
---|---|
string |
string |
int |
int |
float |
float |
vector |
値の 3 タプル |
matrix |
各サブリストに行列の 1 行が含まれるリストのリスト |
string[] |
文字列のリスト |
int[] |
int のリスト |
float[] |
float のリスト |
vector[] |
3 タプルのリスト |
位置引数とは、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 )