From DreamsteepWiki
import math, sys
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
kPluginNodeTypeName = "mynode"
kPluginNodeId = OpenMaya.MTypeId(0x87005)
kkPluginNodeTypeName = "mynoded"
kkPluginNodeId = OpenMaya.MTypeId(0x87007)
# Node definition
class circle(OpenMayaMPx.MPxNode):
# class variables
aInput = OpenMaya.MObject()
aScale = OpenMaya.MObject()
aFrames = OpenMaya.MObject()
aSOutput = OpenMaya.MObject()
aCOutput = OpenMaya.MObject()
aSNAP = OpenMaya.MObject()
aCRPOutput = OpenMaya.MObject()
def __init__(self):
OpenMayaMPx.MPxNode.__init__(self)
def compute(self, plug, data):
# Check that the requested recompute is one of the output values
if (plug == circle.aSOutput or plug == circle.aCOutput):
# Read the input values
inputData = data.inputValue(circle.aInput)
scaleData = data.inputValue(circle.aScale)
framesData = data.inputValue(circle.aFrames)
# Compute the output values
currentFrame = inputData.asFloat()
scaleFactor = scaleData.asFloat()
framesPerCircle = framesData.asFloat()
angle = 6.2831853 * (currentFrame/framesPerCircle)
sinResult = math.sin(angle) * scaleFactor
cosResult = math.cos(angle) * scaleFactor
# Store them on the output plugs
sinHandle = data.outputValue(circle.aSOutput)
cosHandle = data.outputValue(circle.aCOutput)
sinHandle.setFloat(sinResult)
cosHandle.setFloat(cosResult)
data.setClean(plug)
else:
return OpenMaya.MStatus.kUnknownParameter
return OpenMaya.MStatus.kSuccess
# Node definition
class circled(OpenMayaMPx.MPxNode):
# class variables
aInputd = OpenMaya.MObject()
aScaled = OpenMaya.MObject()
aFramesd = OpenMaya.MObject()
aSOutputd = OpenMaya.MObject()
aCOutputd = OpenMaya.MObject()
aSNAPd = OpenMaya.MObject()
aCRPOutputd = OpenMaya.MObject()
def __init__(self):
OpenMayaMPx.MPxNode.__init__(self)
def compute(self, plug, data):
return OpenMaya.MStatus.kSuccess
# creator
def nodeCreator():
return OpenMayaMPx.asMPxPtr( circle() )
def nodedCreator():
return OpenMayaMPx.asMPxPtr( circled() )
def nodedInitializer():
nAttrd = OpenMaya.MFnNumericAttribute()
# Setup the input attributes
circled.aInputd = nAttrd.create("input", "in", OpenMaya.MFnNumericData.kFloat, 0.0)
nAttrd.setStorable(True)
circled.aScaled = nAttrd.create("scale", "sc", OpenMaya.MFnNumericData.kFloat, 10.0)
nAttrd.setStorable(True)
circled.aFramesd = nAttrd.create("frames", "fr", OpenMaya.MFnNumericData.kFloat, 48.0)
nAttrd.setStorable(True)
circled.aSNAPd = nAttrd.create("snapper", "snp", OpenMaya.MFnNumericData.kFloat, 333.0)
nAttrd.setStorable(True)
# Setup the output attributes
circled.aSOutputd = nAttrd.create("sineOutput", "so", OpenMaya.MFnNumericData.kFloat, 0.0)
nAttrd.setWritable(True)
nAttrd.setStorable(True)
circled.aCOutputd = nAttrd.create("cosineOutput", "co", OpenMaya.MFnNumericData.kFloat, 0.0,)
nAttrd.setWritable(True)
nAttrd.setStorable(True)
circled.aCRPOutputd = nAttrd.create("crapper", "crp", OpenMaya.MFnNumericData.kFloat, 0.0,)
nAttrd.setWritable(True)
nAttrd.setStorable(True)
# Add the attributes to the node
circled.addAttribute(circled.aInputd)
circled.addAttribute(circled.aScaled)
circled.addAttribute(circled.aFramesd)
circled.addAttribute(circled.aSOutputd)
circled.addAttribute(circled.aCOutputd)
circled.addAttribute(circled.aCRPOutputd)
circled.addAttribute(circled.aSNAPd)
# Set the attribute dependencies
circled.attributeAffects(circled.aInputd, circled.aSOutputd)
circled.attributeAffects(circled.aInputd, circled.aCOutputd)
circled.attributeAffects(circled.aScaled, circled.aSOutputd)
circled.attributeAffects(circled.aScaled, circled.aCOutputd)
circled.attributeAffects(circled.aFramesd, circled.aSOutputd)
circled.attributeAffects(circled.aFramesd, circled.aCOutputd)
##
circled.attributeAffects(circled.aSNAPd, circled.aCRPOutputd)
circled.attributeAffects(circled.aSNAPd, circled.aCRPOutputd)
# initializer
def nodeInitializer():
nAttr = OpenMaya.MFnNumericAttribute()
# Setup the input attributes
circle.aInput = nAttr.create("input", "in", OpenMaya.MFnNumericData.kFloat, 0.0)
nAttr.setStorable(True)
circle.aScale = nAttr.create("scale", "sc", OpenMaya.MFnNumericData.kFloat, 10.0)
nAttr.setStorable(True)
circle.aFrames = nAttr.create("frames", "fr", OpenMaya.MFnNumericData.kFloat, 48.0)
nAttr.setStorable(True)
circle.aSNAP = nAttr.create("snapper", "snp", OpenMaya.MFnNumericData.kFloat, 333.0)
nAttr.setStorable(True)
# Setup the output attributes
circle.aSOutput = nAttr.create("sineOutput", "so", OpenMaya.MFnNumericData.kFloat, 0.0)
nAttr.setWritable(True)
nAttr.setStorable(True)
circle.aCOutput = nAttr.create("cosineOutput", "co", OpenMaya.MFnNumericData.kFloat, 0.0,)
nAttr.setWritable(True)
nAttr.setStorable(True)
circle.aCRPOutput = nAttr.create("crapper", "crp", OpenMaya.MFnNumericData.kFloat, 0.0,)
nAttr.setWritable(True)
nAttr.setStorable(True)
# Add the attributes to the node
circle.addAttribute(circle.aInput)
circle.addAttribute(circle.aScale)
circle.addAttribute(circle.aFrames)
circle.addAttribute(circle.aSOutput)
circle.addAttribute(circle.aCOutput)
##
circle.addAttribute(circle.aCRPOutput)
circle.addAttribute(circle.aSNAP)
# Set the attribute dependencies
circle.attributeAffects(circle.aInput, circle.aSOutput)
circle.attributeAffects(circle.aInput, circle.aCOutput)
circle.attributeAffects(circle.aScale, circle.aSOutput)
circle.attributeAffects(circle.aScale, circle.aCOutput)
circle.attributeAffects(circle.aFrames, circle.aSOutput)
circle.attributeAffects(circle.aFrames, circle.aCOutput)
##
circle.attributeAffects(circle.aSNAP, circle.aCRPOutput)
circle.attributeAffects(circle.aSNAP, circle.aCRPOutput)
# initialize the script plug-in
def initializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject, "perihelion_vfx", "1.0", "Any")
try:
mplugin.registerNode( kPluginNodeTypeName, kPluginNodeId, nodeCreator, nodeInitializer )
mplugin.registerNode( kkPluginNodeTypeName, kkPluginNodeId, nodedCreator, nodedInitializer )
except:
sys.stderr.write( "Failed to register node: %s" % kPluginNodeTypeName )
sys.stderr.write( "Failed to register node: %s" % kkPluginNodeTypeName )
raise
# uninitialize the script plug-in
def uninitializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterNode( kPluginNodeId )
mplugin.deregisterNode( kkPluginNodeId )
except:
sys.stderr.write( "Failed to deregister node: %s" % kPluginNodeTypeName )
sys.stderr.write( "Failed to deregister node: %s" % kkPluginNodeTypeName )
raise