import math, sys
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
kPluginNodeTypeName = "MathNode"
mathNodeId = OpenMaya.MTypeId(0x87107)
# Node definition
class mathNode(OpenMayaMPx.MPxNode):
# class variables
input = OpenMaya.MObject()
oper = OpenMaya.MObject()
scale = OpenMaya.MObject()
output = OpenMaya.MObject()
radgrad=OpenMaya.MObject()
def __init__(self):
OpenMayaMPx.MPxNode.__init__(self)
def compute(self,plug,dataBlock):
if ( plug == mathNode.output ):
dataHandle = dataBlock.inputValue( mathNode.input )
dataOpHandle=dataBlock.inputValue(mathNode.oper)
dataRGHandle=dataBlock.inputValue(mathNode.radgrad)
dataSclHandle=dataBlock.inputValue(mathNode.scale)
operShort=dataOpHandle.asShort()
rgShort=dataRGHandle.asShort()
inputFloat = dataHandle.asFloat()
scaleFloat = dataSclHandle.asFloat()
result=0.0
outputHandle = dataBlock.outputValue( mathNode.output )
if (operShort==0):
result = math.sin( inputFloat ) * scaleFloat
outputHandle.setFloat( result )
elif(operShort==1):
result = math.cos( inputFloat ) * scaleFloat
outputHandle.setFloat( result )
elif(operShort==2):
result = math.tan( inputFloat ) * scaleFloat
outputHandle.setFloat( result )
elif(operShort==3):
if(inputFloat > 1):
inputFloat=1
if(inputFloat < -1):
inputFloat=-1
result = math.asin( inputFloat ) * scaleFloat
if(rgShort==0):
outputHandle.setFloat( result )
else:
outputHandle.setFloat( math.degrees(result))
elif(operShort==4):
if(inputFloat>1):
inputFloat=1
if(inputFloat<-1):
inputFloat=-1
result = math.acos( inputFloat ) * scaleFloat
if(rgShort==0):
outputHandle.setFloat( result )
else:
outputHandle.setFloat( math.degrees(result))
elif(operShort==5):
result = math.atan( inputFloat ) * scaleFloat
if(rgShort==0):
outputHandle.setFloat( result )
else:
outputHandle.setFloat( math.degrees(result))
dataBlock.setClean( plug )
return OpenMaya.kUnknownParameter
# creator
def nodeCreator():
return OpenMayaMPx.asMPxPtr( mathNode() )
# initializer
def nodeInitializer():
# input
nAttr = OpenMaya.MFnNumericAttribute()
mathNode.input = nAttr.create( "input", "in", OpenMaya.MFnNumericData.kFloat, 0.0 )
nAttr.setStorable(1)
nAttr.setKeyable(1)
nAttr.setWritable(1)
# enum attribute operator
enumAttr=OpenMaya.MFnEnumAttribute()
mathNode.oper=enumAttr.create("operator","op", 0)
attrF=enumAttr.addField("sin",0)
attrF=enumAttr.addField("cos",1)
attrF=enumAttr.addField("tan",2)
attrF=enumAttr.addField("arcsin",3)
attrF=enumAttr.addField("arccos",4)
attrF=enumAttr.addField("arctan",5)
enumAttr.setStorable(1)
enumAttr.setKeyable(0)
enumAttr.setWritable(1)
#radiant to deg and vice versa attribute
radgradAttr=OpenMaya.MFnEnumAttribute()
mathNode.radgrad=radgradAttr.create("angleType","at",0)
rgF=radgradAttr.addField("rad",0)
rgF=radgradAttr.addField("grad",1)
radgradAttr.setStorable(1)
radgradAttr.setKeyable(0)
radgradAttr.setWritable(1)
#scale attribute
sAttr=OpenMaya.MFnNumericAttribute()
mathNode.scale= sAttr.create( "scale", "scl", OpenMaya.MFnNumericData.kFloat, 1.0 )
sAttr.setStorable(1)
sAttr.setKeyable(1)
sAttr.setWritable(1)
# output
nAttr = OpenMaya.MFnNumericAttribute()
mathNode.output = nAttr.create( "output", "out", OpenMaya.MFnNumericData.kFloat, 0.0 )
nAttr.setStorable(0)
nAttr.setWritable(0)
# add attributes
mathNode.addAttribute( mathNode.input )
mathNode.addAttribute( mathNode.oper )
mathNode.addAttribute(mathNode.radgrad)
mathNode.addAttribute(mathNode.scale)
mathNode.addAttribute( mathNode.output )
# dependency graph
mathNode.attributeAffects( mathNode.input, mathNode.output )
mathNode.attributeAffects( mathNode.oper, mathNode.output )
mathNode.attributeAffects(mathNode.radgrad,mathNode.output)
mathNode.attributeAffects( mathNode.scale, mathNode.output )
# initialize the script plug-in
def initializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject,"Antonio Sacco","0.5")
try:
mplugin.registerNode( kPluginNodeTypeName, mathNodeId, nodeCreator, nodeInitializer )
except:
sys.stderr.write( "Failed to register node: %s" % kPluginNodeTypeName )
raise
# uninitialize the script plug-in
def uninitializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterNode( mathNodeId )
except:
sys.stderr.write( "Failed to deregister node: %s" % kPluginNodeTypeName )
raise