MRampAttribute solved!
- October 23rd, 2010
- Posted in Maya Python
- Write comment
Thanks Ryan Trowbridge for the help!
###
###
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
import maya.mel as mel
kPluginNodeTypeName = "rpRampNode"
rampNodeId = OpenMaya.MTypeId(0x89010)
# Node definition
class rampNode(OpenMayaMPx.MPxNode):
# class variables
ramp01 = OpenMaya.MRampAttribute()
numSegs = OpenMaya.MObject()
outTwisty = OpenMaya.MObject()
##AEtemplate proc for the MRampAtributes
mel.eval('''
global proc AErpRampNodeTemplate( string $nodeName )
{
AEswatchDisplay $nodeName;
editorTemplate -beginScrollLayout;
editorTemplate -beginLayout "ramp Node Template" -collapse 0;
AEaddRampControl ($nodeName+".ramp01");
editorTemplate -endLayout;
AEdependNodeTemplate $nodeName;
editorTemplate -addExtraControls;
editorTemplate -endScrollLayout;
}
''')
def __init__(self):
OpenMayaMPx.MPxNode.__init__(self)
def compute(self, plug, dataBlock):
#Set the attribute ramp01 to the plug
thisNode = self.thisMObject()
rampPlug = OpenMaya.MPlug( thisNode, rampNode.ramp01 )
rampPlug.setAttribute(rampNode.ramp01)
RampPlug01 = OpenMaya.MPlug(rampPlug.node(), rampPlug.attribute())
#Get the atrributes as MRampAttribute
myRamp = OpenMaya.MRampAttribute(RampPlug01.node(), RampPlug01.attribute())
# Get the input handle
dataHandle = dataBlock.inputValue(rampNode.numSegs)
result = dataHandle.asInt()
#Get output handle and its array data builder
outputHandle = dataBlock.outputArrayValue(rampNode.outTwisty)
outputBuilder = outputHandle.builder()
numElements = outputHandle.elementCount()
# Some variables
myValAtPos = []
dels = []
#Get the float for get the average values
for i in range(result):
quo = 1.0/(result - 1.0)
myFloat = quo*i
#Def to get value at position
def getValAtPos():
valAt_util = OpenMaya.MScriptUtil()
#Get the value as pointer
valAt_util.createFromDouble(1.0)
valAtPtr = valAt_util.asFloatPtr()
#Get the value at position
myRamp.getValueAtPosition(myFloat, valAtPtr)
#Get the value at pointer as float
valAtPos = valAt_util.getFloat(valAtPtr)
return (valAtPos)
myValAtPos.append(getValAtPos())
#Set the myValAtPos in the output attributes array
try:
outputHandle.jumpToArrayElement(i)
outdatahandle = outputHandle.outputValue()
except:
pass
outdatahandle.setDouble(myValAtPos[i])
#Remove the unused elements in the attribute array.
for w in range(numElements):
try:
outputHandle.jumpToArrayElement(w)
myIndex = outputHandle.elementIndex()
except:
pass
if (myIndex >= result):
try:
outputBuilder.removeElement(myIndex)
except:
pass
return OpenMaya.kUnknownParameter
# creator
def nodeCreator():
return OpenMayaMPx.asMPxPtr( rampNode() )
# initializer
def nodeInitializer():
#ramp01
rampNode.ramp01= OpenMaya.MRampAttribute.createCurveRamp('ramp01', 'rmp01')
#NumSegs
nAttr = OpenMaya.MFnNumericAttribute()
rampNode.numSegs = nAttr.create ( "numSegs", "nseg", OpenMaya.MFnNumericData.kInt, 0 )
nAttr.setWritable(1)
nAttr.setStorable(1)
#outTwisty
nAttr = OpenMaya.MFnNumericAttribute()
rampNode.outTwisty = nAttr.create( "outTwisty", "ot", OpenMaya.MFnNumericData.kDouble, 0.0 )
nAttr.setArray(1)
nAttr.setStorable(1)
nAttr.setUsesArrayDataBuilder(1)
#Add Attributes
rampNode.addAttribute( rampNode.ramp01 )
rampNode.addAttribute ( rampNode.numSegs )
rampNode.addAttribute( rampNode.outTwisty )
#Attribute affects
rampNode.attributeAffects( rampNode.ramp01 , rampNode.outTwisty )
rampNode.attributeAffects( rampNode.numSegs , rampNode.outTwisty )
# initialize the script plug-in
def initializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject, "Rosenio Pinto", "1.0", "Any")
try:
mplugin.registerNode( kPluginNodeTypeName, rampNodeId, 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( rampNodeId )
except:
sys.stderr.write( "Failed to deregister node: %s" % kPluginNodeTypeName )
raise
###
###
