ノード・プラグインによって、Maya のノードを作成することができます。
入力データを sin() 関数によって計算し、出力するノードを作ってみましょう。
import sys
import math
import maya.OpenMaya
import maya.OpenMayaMPx
kPluginNodeName = 'sineNode1'
sineNodeId = maya.OpenMaya.MTypeId(0x87001)
class sineNode1(maya.OpenMayaMPx.MPxNode):
input = maya.OpenMaya.MObject()
output = maya.OpenMaya.MObject()
def __init__(self):
maya.OpenMayaMPx.MPxNode.__init__(self)
def compute(self, plug, dataBlock):
if(plug == sineNode1.output):
dataHandle = dataBlock.inputValue(sineNode1.input)
inputFloat = dataHandle.asFloat()
result = math.sin(inputFloat)
outputHandle = dataBlock.outputValue(sineNode1.output)
outputHandle.setFloat(result)
dataBlock.setClean(plug)
return maya.OpenMaya.MStatus.kSuccess
else:
return maya.OpenMaya.MStatus.kUnknownParameter
def nodeCreator():
return maya.OpenMayaMPx.asMPxPtr(sineNode1())
def nodeInitializer():
nAttr = maya.OpenMaya.MFnNumericAttribute()
sineNode1.input = nAttr.create('input', 'i', maya.OpenMaya.MFnNumericData.kFloat, 0.0)
nAttr.setStorable(1)
nAttr = maya.OpenMaya.MFnNumericAttribute()
sineNode1.output = nAttr.create('output', 'o', maya.OpenMaya.MFnNumericData.kFloat, 0.0)
nAttr.setStorable(1)
nAttr.setWritable(1)
sineNode1.addAttribute(sineNode1.input)
sineNode1.addAttribute(sineNode1.output)
sineNode1.attributeAffects(sineNode1.input, sineNode1.output)
def initializePlugin(mobject):
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.registerNode(kPluginNodeName, sineNodeId, nodeCreator, nodeInitializer)
except:
sys.stderr.write('Failed to register node: %s' % kPluginNodeName)
raise
def uninitializePlugin(mobject):
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterNode(sineNodeId)
except:
sys.stderr.write('Failed to deregister node: %s' % kPluginNodeName)
raise
import sys
import math
import maya.OpenMaya
import maya.OpenMayaMPx
kPluginNodeName = 'sineNode1'
sineNodeId = maya.OpenMaya.MTypeId(0x87001)
class sineNode1(maya.OpenMayaMPx.MPxNode):
input = maya.OpenMaya.MObject()
output = maya.OpenMaya.MObject()
def __init__(self):
maya.OpenMayaMPx.MPxNode.__init__(self)
def compute(self, plug, dataBlock):
if(plug == sineNode1.output):
dataHandle = dataBlock.inputValue(sineNode1.input)
inputFloat = dataHandle.asFloat()
result = math.sin(inputFloat)
outputHandle = dataBlock.outputValue(sineNode1.output)
outputHandle.setFloat(result)
dataBlock.setClean(plug)
return maya.OpenMaya.MStatus.kSuccess
return maya.OpenMaya.MStatus.kUnknownParameter
def nodeCreator():
return maya.OpenMayaMPx.asMPxPtr(sineNode1())
def nodeInitializer():
nAttr = maya.OpenMaya.MFnNumericAttribute()
sineNode1.input = nAttr.create('input', 'i', maya.OpenMaya.MFnNumericData.kFloat, 0.0)
nAttr.setStorable(1)
nAttr = maya.OpenMaya.MFnNumericAttribute()
sineNode1.output = nAttr.create('output', 'o', maya.OpenMaya.MFnNumericData.kFloat, 0.0)
nAttr.setStorable(1)
nAttr.setWritable(1)
sineNode1.addAttribute(sineNode1.input)
sineNode1.addAttribute(sineNode1.output)
sineNode1.attributeAffects(sineNode1.input, sineNode1.output)
def initializePlugin(mobject):
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.registerNode(kPluginNodeName, sineNodeId, nodeCreator, nodeInitializer)
except:
sys.stderr.write('Failed to register node: %s' % kPluginNodeName)
raise
def uninitializePlugin(mobject):
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterNode(sineNodeId)
except:
sys.stderr.write('Failed to deregister node: %s' % kPluginNodeName)
raise