Maya はプラグインによって、機能を拡張することができます。 通常、プラグインは C++ 言語によって作成しますが、 8.5 より Python によってもプラグインを作成することができるようになりました。
MEL のコマンドを作成するプラグインです。
コマンドプラグインを作成するためには、以下のクラスと関数を用意します。
まず、簡単な Python プラグインを作ってみましょう。
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
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( u'コマンド登録失敗 : %s\n' % kPluginCmdName )
raise
def uninitializePlugin(mObject):
mPlugin = maya.OpenMayaMPx.MFnPlugin(mObject)
try:
mPlugin.deregisterCommand( kPluginCmdName )
except:
sys.stderr.write( u'コマンド登録失敗 : %s\n' % kPluginCmdName )
raise
% 演算子を使うと、 C 言語の printf() 関数のように文字列中に数値・文字列を挿入することができます。
プラグインのロード時にエラーが起きた場合、または、機能を追加・改良した場合は、 プラグインをアンロードして、ロードしなおします。
kRepeatFlag = '-r' kRepeatLongFlag = '-repeat'
def syntaxCreator(): syntax = maya.OpenMaya.MSyntax() syntax.addFlag(kRepeatFlag, kRepeatLongFlag, maya.OpenMaya.MSyntax.kLong) return syntaxmaya.OpenMaya.MSyntax.kLong は、フラグにつく引数の数字が整数であることを表します。
mPlugin.registerCommand(kPluginCmdName, creator, syntaxCreator)以上で、フラグを使う準備が整いました。
argData = maya.OpenMaya.MArgDatabase(self.syntax(), args) if argData.isFlagSet(kRepeatFlag): フラグが存在したときの処理
変数 = argData.flagArgumentInt(kRepeatFlag, 0)取り出す数値が実数の場合は、以下のように実行します。
変数 = argData.flagArgumentDouble(kRepeatFlag, 0)flagArgumentInt() メソッドの引数にある 0 は、 kRepeatFlag フラグにつけられた数値のインデックスです。 この場合は、数値を 1 つしか持たないのでインデックスは 0 になります。
import sys import maya.OpenMaya import maya.OpenMayaMPx kPluginCmdName = 'helloWorld2' kRepeatFlag = '-r' kRepeatLongFlag = '-repeat' class hello2(maya.OpenMayaMPx.MPxCommand): def __init__(self): maya.OpenMayaMPx.MPxCommand.__init__(self) def doIt(self, args): rep = 1 argData = maya.OpenMaya.MArgDatabase(self.syntax(), args) if argData.isFlagSet(kRepeatFlag): rep = argData.flagArgumentInt(kRepeatFlag, 0) for i in range(rep): print 'Hello World!' def creator(): return maya.OpenMayaMPx.asMPxPtr(hello2()) def syntaxCreator(): syntax = maya.OpenMaya.MSyntax() syntax.addFlag(kRepeatFlag, kRepeatLongFlag, maya.OpenMaya.MSyntax.kLong) return syntax def initializePlugin(mObject): mPlugin = maya.OpenMayaMPx.MFnPlugin(mObject) try: mPlugin.registerCommand(kPluginCmdName, creator, syntaxCreator) 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