My digital tutors tutorial!
Author: timcallaway
Start of the new site!
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
maya python, finding the distance between two vectors
Great little funciton for finding the distance between two points in maya.
import maya.cmds as Mc from math import pow,sqrt def GetDistance(objA, objB): gObjA = Mc.xform(objA, q=True, t=True, ws=True) gObjB = Mc.xform(objB, q=True, t=True, ws=True) return sqrt(pow(gObjA[0]-gObjB[0],2)+pow(gObjA[1]-gObjB[1],2)+pow(gObjA[2]-gObjB[2],2))