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 syntax
maya.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