ノード・プラグインによって、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.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.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