My digital tutors tutorial!
Tag: maya
maya python api add plugin
Here we have a very simple plugin that adds two values together. I use it mainly as a plugin template.
import sys
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
##set vars
kAddUtilNodeTypeName = "Add"
kAddUtilNodeClassify = "utility/general"
kAddUtilNodeId = OpenMaya.MTypeId(0x87327)
# define a new matrixUtilNode class derived from the MPxNode class
class rtAddUtilNode(OpenMayaMPx.MPxNode):
# class variables
input = OpenMaya.MObject()
input1 = OpenMaya.MObject()
input2 = OpenMaya.MObject()
output = OpenMaya.MObject()
def __init__(self):
OpenMayaMPx.MPxNode.__init__(self)
# arguments ( self, MPlug, MDataBlock)
def compute(self, plug, dataBlock):
# if these attributes are requested, recompute their values
if plug == rtAddUtilNode.output:
# get MDataHandle's to attributes
#
try:
input_dataHandle1 = dataBlock.inputValue( rtAddUtilNode.input1 )
except:
sys.stderr.write( "Failed to get MDataHandle inputValue input1" )
raise
try:
input_dataHandle2 = dataBlock.inputValue( rtAddUtilNode.input2 )
except:
sys.stderr.write( "Failed to get MDataHandle inputValue input2" )
raise
try:
output_dataHandle = dataBlock.outputValue( rtAddUtilNode.output )
except:
sys.stderr.write( "Failed to get MDataHandle outputValue output" )
raise
# get values from dataHandle
#
input_value1 = input_dataHandle1.asFloat()
input_value2 = input_dataHandle2.asFloat()
result = input_value1 + input_value2
# set the output
output_dataHandle.setFloat(result)
# set the plug clean so maya knows it can update
dataBlock.setClean(plug)
else:
return OpenMaya.kUnknownParameter
return OpenMaya.MStatus.kSuccess
def nodeCreator():
return OpenMayaMPx.asMPxPtr( rtAddUtilNode() )
# create and initialize the attributes to the node
def nodeInitializer():
nAttr = OpenMaya.MFnNumericAttribute()
# create input attributes
#
rtAddUtilNode.input1 = nAttr.create("input1", "i1", OpenMaya.MFnNumericData.kFloat, 0.0)
nAttr.setWritable(True)
nAttr.setStorable(True)
nAttr.setReadable(True)
nAttr.setKeyable(True)
rtAddUtilNode.input2 = nAttr.create("input2", "i2", OpenMaya.MFnNumericData.kFloat, 0.0)
nAttr.setWritable(True)
nAttr.setStorable(True)
nAttr.setReadable(True)
nAttr.setKeyable(True)
rtAddUtilNode.output = nAttr.create("output", "o", OpenMaya.MFnNumericData.kFloat, 0.0)
nAttr.setWritable(True)
nAttr.setStorable(True)
nAttr.setReadable(True)
# add attribues
#
rtAddUtilNode.addAttribute( rtAddUtilNode.input1)
rtAddUtilNode.addAttribute( rtAddUtilNode.input2)
rtAddUtilNode.addAttribute( rtAddUtilNode.output)
# Setup which attributes affect each other
rtAddUtilNode.attributeAffects ( rtAddUtilNode.input1, rtAddUtilNode.output )
rtAddUtilNode.attributeAffects ( rtAddUtilNode.input2, rtAddUtilNode.output )
# initialize the script plug-in
def initializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject, "Tim Callaway", "1.0", "Any")
try:
mplugin.registerNode( kAddUtilNodeTypeName, kAddUtilNodeId, nodeCreator, nodeInitializer, OpenMayaMPx.MPxNode.kDependNode, kAddUtilNodeClassify)
except:
sys.stderr.write( "Failed to register node: %s" % kAddUtilNodeTypeName )
raise
# uninitialize the script plug-in
def uninitializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterNode( kAddUtilNodeId )
except:
sys.stderr.write( "Failed to deregister node: %s" % kAddUtilNodeTypeName )
raise