簡単なプラグイン
Python プラグイン
Maya はプラグインによって、機能を拡張することができます。
通常、プラグインは C++ 言語によって作成しますが、
8.5 より Python によってもプラグインを作成することができるようになりました。
コマンドプラグイン
MEL のコマンドを作成するプラグインです。
コマンドプラグインを作成するためには、以下のクラスと関数を用意します。
- maya.OpenMayaMPx.MPxCommand を継承したクラス
このクラス中に以下のメソッドを作成します。
- __init__(self)
maya.OpenMayaMPx.MPxCommand.__init__(self)
によって、親クラスの初期化メソッドを実行しておきます。
- doIt(self, args)
コマンドで計算・処理を行うメソッドです。
- 上のクラスのインスタンスを作成する関数
Maya はこの関数によってクラスのインスタンスを作成します。
関数名は自由につけることができます。
initializePlugin() 関数の中で、mPlugin.registerCommand() によって、この関数を登録します。
- initializePlugin()
プラグインをロードするときに一度だけ実行される関数です。
- uninitializePlugin()
プラグインをアンロードするときに一度だけ実行される関数です。
コマンドプラグインの作り方と実行例
まず、簡単な Python プラグインを作ってみましょう。
- Python フォルダーの中に helloWorld.py というファイルをエディターによって作ります。
ファイル(helloWorld.py)の内容は、以下のように書いておきます。
import sys
import maya.OpenMayaMPx
kPluginCmdName = 'helloWorld'
class Hello(maya.OpenMayaMPx.MPxCommand):
def __init__(self):
maya.OpenMayaMPx.MPxCommand.__init__(self)
def doIt(self, args):
print 'Hello World!'
def creator():
return maya.OpenMayaMPx.asMPxPtr(Hello())
def initializePlugin(mObject):
mPlugin = maya.OpenMayaMPx.MFnPlugin(mObject)
try:
mPlugin.registerCommand(kPluginCmdName, creator)
except:
sys.stderr.write('Failed load plugin : %s' % kPluginCmdName)
raise
def uninitializePlugin(mObject):
mPlugin = maya.OpenMayaMPx.MFnPlugin(mObject)
try:
mPlugin.deregisterCommand(kPluginCmdName)
except:
sys.stderr.write('Failed unload plugin : %s' % kPluginCmdName)
raise
- helloWorld.py をロードします。
以下のどちらかの方法でロードします。
- ウインドウ → 設定/プリファレンス → プラグイン マネージャ
から プラグイン マネージャ を表示して、
参照ボタンをクリックします。
- MEL コマンド loadPlugin によって読み込みます。
helloWorld.py が /home/abe/school/python ディレクトリにある場合は、
以下のように実行します。
loadPlugin("/home/abe/school/python/helloWorld.py");
- スクリプト エディタ の MEL タブから以下のように実行します。
helloWorld;
スクリプトの解説
import sys
- sys モジュールをインポートします。
ここでは、エラーの表示をするために必要です。
import maya.OpenMayaMPx
- maya.OpenMayaMPx モジュールをインポートします。
コマンド用のクラスで、このモジュールの MPxCommand を継承します。
kPluginCmdName = 'helloWorld'
- このコマンドの名前を helloWorld とします。
このプラグインをロードした後に、
スクリプトエディタで helloWorld というコマンド名で実行できるようになります。
class Hello(maya.OpenMayaMPx.MPxCommand):
- MPxCommand クラスを継承して、Hello というクラスを定義します。
コマンドプラグインを作成する場合は、
このクラスに doIt() メソッドが必要です。
def __init__(self):
- クラスのインスタンスを作成するときに実行されるメソッドです。
maya.OpenMayaMPx.MPxCommand.__init__(self)
- 親クラスである MPxCommand の初期化メソッド __init__ を実行します。
def doIt(self, args):
- helloWorld コマンドが実行されたときに、
実行されるメソッドです。
args にはコマンドの引数が入っています。
print 'Hello World!'
- 文字列 'Hello World!' を表示します。
def creator():
- クラス Hello のインスタンスを作成するための関数です。
Maya がコマンドのインスタンスを作成するために、この関数が必要です。
return maya.OpenMayaMPx.asMPxPtr( Hello() )
- Hello クラスのインスタンスを作成して、返します。
asMPxPtr()メソッドによって、作成されたインスタンスの所有者をMayaに変更します。
これを行わないと、Pythonがインスタンスを廃棄して、インスタンスが無くなってしまうことがあります。
def initializePlugin(mObject):
- プラグインがロードされるときに実行される関数です。
この関数がないとプラグインがロードされません。
mPlugin = maya.OpenMayaMPx.MFnPlugin(mObject)
- MFnPlugin クラスのインスタンスを作成します。
try:
mPlugin.registerCommand( kPluginCmdName, creator )
- プラグインを Maya に登録します。
コマンド名が変数 kPluginCmdName に代入された 'helloWorld'、
コマンドのインスタンスを作成する関数が creator() になります。
try によって、ロードに失敗した場合は例外を送出します。
except:
sys.stderr.write( u'コマンド登録失敗 : %s\n' % kPluginCmdName )
raise
- プラグインの登録に失敗した場合に、メッセージを表示します。
受け取った例外は、raise によって送出しなおされます。
def uninitializePlugin(mObject):
- プラグインをアンロードするときに実行される関数です。
mPlugin = maya.OpenMayaMPx.MFnPlugin(mObject)
- MFnPlugin クラスのインスタンスを作成します。
try:
mPlugin.deregisterCommand( kPluginCmdName )
- プラグインをアンロードします。
try によって、アンロードに失敗した場合は例外を送出します。
except:
sys.stderr.write( u'コマンド登録失敗 : %s\n' % kPluginCmdName )
raise
- プラグインのアンロードに失敗した場合に、メッセージを表示します。
受け取った例外は、raise によって送出しなおされます。
% 演算子
% 演算子を使うと、
C 言語の printf() 関数のように文字列中に数値・文字列を挿入することができます。
val2 = 3
s1 = 'test'
s2 = 'this is %s, %d times' % (s1, val2) # s2 == 'this is test, 3 times'
Tips (デバッグ方法)
プラグインのロード時にエラーが起きた場合、または、機能を追加・改良した場合は、
プラグインをアンロードして、ロードしなおします。
練習
- 上の helloWorld.py を参考にして、フラグを追加してみましょう。
コマンド名を helloWorld2 とし、ファイル名も helloWorld2.py とします。
(実行方法)
helloWorld2 -r 繰り返し回数;
helloWorld2 -repeat 繰り返し回数;
-r または、 -repeat フラグをつけないで実行すると、
1 回だけ helloWorld を表示します。
-r または、 -repeat フラグをつけて実行すると、
繰り返し回数 だけ helloWorld を表示します。
(実行例)
helloWorld2;
helloWorld
helloWorld2 -repeat 2;
helloWorld
helloWorld
helloWorld2 -r 3;
helloWorld
helloWorld
helloWorld
(ヒント)
次の順序で、フラグをプラグインに追加します。
- フラグをあらわす文字列を、外部変数に代入しておきます。
kRepeatFlag = '-r'
kRepeatLongFlag = '-repeat'
- フラグを追加するための関数を追加します。
def syntaxCreator():
syntax = maya.OpenMaya.MSyntax()
syntax.addFlag(kRepeatFlag, kRepeatLongFlag, maya.OpenMaya.MSyntax.kLong)
return syntax
maya.OpenMaya.MSyntax.kLong
は、フラグにつく引数の数字が整数であることを表します。
数字が実数の場合は、代わりに
maya.OpenMaya.MSyntax.kDouble
を使用します。
もし、フラグにつく引数の数字が 2 つ以上ある場合は、
必要な個数だけ
maya.OpenMaya.MSyntax.kLong
または
maya.OpenMaya.MSyntax.kDouble
を並べます。
- 関数 initializePlugin() の中の
registerCommand()
メソッドで syntaxCreator() 関数を登録します。
mPlugin.registerCommand(kPluginCmdName, creator, syntaxCreator)
以上で、フラグを使う準備が整いました。
- プラグインのクラスの中のメソッド
doIt()
で実行時に kRepeatFlag フラグが使用されているかどうか調べるには、
以下のメソッドを使います。
argData = maya.OpenMaya.MArgDatabase(self.syntax(), args)
if argData.isFlagSet(kRepeatFlag):
フラグが存在したときの処理
- kRepeatFlag フラグにつけられた数値(整数)を取り出して、
変数に代入するのには以下のように実行します。
変数 = argData.flagArgumentInt(kRepeatFlag, 0)
取り出す数値が実数の場合は、以下のように実行します。
変数 = argData.flagArgumentDouble(kRepeatFlag, 0)
flagArgumentInt() メソッドの引数にある 0 は、
kRepeatFlag フラグにつけられた数値のインデックスです。
この場合は、数値を 1 つしか持たないのでインデックスは 0 になります。
数値を 2 つ持つ場合には、2 つめの数字はインデックス 1 で表します。
まとめ
- コマンドプラグインは、
最低限 1 つのクラスと 3 つの関数で作られます。
参考
Prev
Home | Contents
Mail