Python の使用法
 
 
 

Python と MEL は大きくことなる言語であるため、Maya コマンドを Python で起動する方法と MEL で使用する方法では多くの違いがあります。

次に Maya で Python を使用する場合の基本について説明します。

Maya で Python コマンドを入力する

Maya で Python を入力する方法にはいくつかあります。

スクリプト エディタ(Script Editor)

Maya で MEL スクリプティングと Python スクリプティングの両方を円滑に実行するため、スクリプト エディタ(Script Editor)が修正され、各言語に個別のタブができました。MEL タブのウィンドウに入力したステートメントは MEL に送信、処理されます。同様に、Python タブのウィンドウに入力すると、Python により処理されます。

Python が返す結果には、先頭に Python のコメント キャラクタ(#)が付きます。

詳細については、『Maya の基本』マニュアルの「 スクリプト エディタ(Script Editor)」を参照してください。

コマンド ラインとシェルフ(Shelf)

短い Python コマンドはコマンド ラインに入力することもできます。MEL と Python コマンドの入力を切り替えることができます。

MEL スクリプトと同じように、 を押したまま Python スクリプトをシェルフ(Shelf)にドラッグすることができます。この場合、ダイアログ ボックスが表示され、スクリプトが Python か MEL のどちらであるかを尋ねられます。

Maya Python モジュール

すべての一般的な 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()
ヒント:maya.cmds は自動的に userSetup.py ファイルにインポートできます。これを変更して好きなプリフィックスを付けることができます。たとえば次のようになります。

import maya.cmds as mc mc.sphere()

詳細については、 Maya 環境を Python 内および Python 用で初期化するを参照してください。

注:または、以下を使用して Maya コマンドをトップ レベルのネームスペースにインポートすることができます。

from maya.cmds import *

こうすると、その後は次のように Maya コマンドをすばやく参照できるようになります。

ls() sphere( radius=4 )

警告: トップ レベルのネームスペースにインポートすると、Python ビルトインや他のモジュールの定義がオーバーライドされます。

たとえば、Python には自身のヘルプ システムがあり、Python バージョンのヘルプを呼び出すと、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 ] )

必須の引数(True/False)

名前付き引数には関連付けられた値が必要です。ただし、すべての 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)

 

標準入力(stdin)の実行

Python は STDIN(標準入力)の読み取りをサポートしています。Python スクリプトでは、これは sys.stdin を読み取るか raw_input を呼び出すことにより実行します。Maya を(バッチ モードではなく)GUI モードで実行している場合、Python からのこれらの呼び出しに割り込んでダイアログ ボックスが表示されるため、そこで入力することができます。

Maya は、自身の実行によって sys.stdin をオーバーライドします。Python の一般的な標準オブジェクトを使用する場合は、sys.__stdin__ を参照して行います。

MEL と Python の通信

新しい 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 リスト

empty string array (string $array[])

Python から MEL を呼び出す

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 タプル

行列

各サブリストに行列の 1 行が含まれるリストのリスト

string[]

文字列のリスト

int[]

int のリスト

float[]

float のリスト

vector[]

3 タプルのリスト

位置引数

位置引数とは、UI 要素がそのコールバック スクリプトに渡す引数のことです。たとえば、float スライダ コントロールに関するコールバック MEL スクリプトには #1 を含めることができます。コールバックが実行されると、float スライダの値にはこの位置引数が代入されます。

Python の場合、コールバックでコントロールからの値に代入する方法には 2 つあります。評価されるコールバックが文字列の場合には、Maya は MEL と同じように文字列代入を実行します。ただし、この代入の実行には Python のフォーマット演算子が使用されます。このフォーマット演算子は代入のための項目の辞書を渡され、この辞書では値の名前は 12 のようになります。例:

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 )

Python のエラーと警告

エラーや警告が発生した時に、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