Get rotation from tangent information…motionPath like

I’m meking a test for a custom node thats take the tangent, normal and binormal and transform in rotation information…This code is only for analysis…
Thanks for Fernando Soares and Richard Kazuo for the suport!

##
##
import maya.cmds as cmds
import maya.OpenMaya as om
import math as math

def tanCons(upVec, frontAxis, par):
    sel = cmds.ls(sl=True)
    curveObj = sel[0]
    obj = sel[1]

    #Ensure a valid up-vector. Use Y-up as default if input is bogus.
    if upVec.length() < 0.001:
        upVec = om.MVector(0.0, 1.0, 0.0)
        
    #Ensure up-vector is normalized.
    upVec.normalize()
    
    #Query the position and tangent
    p = cmds.pointOnCurve(curveObj, ch=False, top=True, pr=par, p=True)
    t = cmds.pointOnCurve(curveObj, ch=False, top=True, pr=par, nt=True)

    tan = om.MVector(t[0], t[1], t[2])
    tan.normalize()
    
    #Calculate a normal using the Y-up vector as the binormal.
    norm = tan^upVec
    
    #Calculate the orthogonal binormal.
    bi = tan^norm
    
    #If the binormal is pointing the wrong way,
    #negate it and the normal.
    if upVec*bi < 0.0:
        bi = -bi
        norm = -norm
    
    #Normalize our vector.
    norm.normalize()
    bi.normalize()
    
    #Create a matrix, using normal for the X axis and 
    #tangent for the Z axis.
    if frontAxis == (1,0,0):
        m = [(tan.x, tan.y, tan.z, 0.0), # X axis
            (bi.x, bi.y, bi.z, 0.0),# Y axis
            (norm.x, norm.y, norm.z, 0.0),# Z axis
            (p[0], p[1], p[2], 1.0)]
    elif frontAxis == (0,1,0):
        m = [(norm.x, norm.y, norm.z, 0.0), # X axis
            (tan.x, tan.y, tan.z, 0.0),# Y axis
            (bi.x, bi.y, bi.z, 0.0),# Z axis
            (p[0], p[1], p[2], 1.0)]
    else:
        m = [(norm.x, norm.y, norm.z, 0.0), # X axis
            (bi.x, bi.y, bi.z, 0.0),# Y axis
            (tan.x, tan.y, tan.z, 0.0),# Z axis
            (p[0], p[1], p[2], 1.0)]
        
    
    cmds.xform(obj, ws=True, m=((m[0][0], m[0][1], m[0][2], m[0][3], 
                            m[1][0], m[1][1], m[1][2], m[1][3], 
                            m[2][0], m[2][1], m[2][2], m[2][3],
                            m[3][0], m[3][1], m[3][2], m[3][3])),
                            p=True)
    cmds.scale(1,1,1,obj)
                       

frontAxis = (0,1,0)
upVec = om.MVector(0,1,0)
tanCons(upVec, frontAxis, .5)
##
##

MRampAttribute solved!

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

###
###

            

MRampAttribute trying…

###
###
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
import maya.mel as mel


kPluginNodeTypeName = "spRampNode"

rampNodeId = OpenMaya.MTypeId(0x87005)

# Node definition
class rampNode(OpenMayaMPx.MPxNode):
        # class variables
        ramp01 = OpenMaya.MRampAttribute()
        ramp02 = OpenMaya.MRampAttribute()
        output = OpenMaya.MObject()
        
        ##AEtemplate proc for the MRampAtributes
        mel.eval('''
                    global proc AEspRampNodeTemplate( string $nodeName )
{
	AEswatchDisplay  $nodeName;
	editorTemplate -beginScrollLayout;
		editorTemplate -beginLayout "ramp Node Template" -collapse 0;
			
			AEaddRampControl ($nodeName+".ramp01");
			AEaddRampControl ($nodeName+".ramp02");
		editorTemplate -endLayout;
		
	
		AEdependNodeTemplate $nodeName;

	editorTemplate -addExtraControls;
	editorTemplate -endScrollLayout;
}


                    ''')
        
        
        def __init__(self):
                OpenMayaMPx.MPxNode.__init__(self)

        def compute(self,plug,dataBlock):
                
                
                if ( plug == rampNode.output ):
                    

                    #Trouble in HERE

                          
            
                    
                        
                    dataBlock.setClean( plug )

			
                
                
                            
                



# creator
def nodeCreator():
        return OpenMayaMPx.asMPxPtr( rampNode() )
        
       
        
        

# initializer
def nodeInitializer():
       
        #ramp01
        rampNode.ramp01 = OpenMaya.MRampAttribute.createCurveRamp('ramp01', 'rmp01')
        rampNode.addAttribute( rampNode.ramp01 )

        #ramp02
        rampNode.ramp02 = OpenMaya.MRampAttribute.createCurveRamp('ramp02', 'rmp02')
        rampNode.addAttribute( rampNode.ramp02 )
        
        #output
        nAttr = OpenMaya.MFnNumericAttribute()
        rampNode.output = nAttr.create( "output", "out", OpenMaya.MFnNumericData.kDouble, 0.0 )
        rampNode.addAttribute( rampNode.output )
        nAttr.setStorable(1)
        nAttr.setWritable(0)
        rampNode.attributeAffects( rampNode.ramp01, rampNode.output )
        rampNode.attributeAffects( rampNode.ramp02, rampNode.output )
        


# initialize the script plug-in
def initializePlugin(mobject):
        mplugin = OpenMayaMPx.MFnPlugin(mobject)
        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

###
###

            

Arm rig notes

##
##

import maya.cmds as cmds

##Create the locators for the distance mesure node for the arm and parent then appropriately.

cmds.spaceLocator(n='arm_dist_start')
cmds.spaceLocator(n='arm_dist_end')
cmds.spaceLocator(n='hand_loc')

point=cmds.pointConstraint('up_arm','arm_dist_start')
cmds.delete(point)

cmds.parent('arm_Handle','hand_loc')
cmds.parent('up_arm','arm_dist_start')
cmds.parent('arm_dist_end','hand_loc')



##Create arm_dist node

cmds.createNode('distanceDimShape')

myArmDist=cmds.rename('distanceDimension1',
                      'arm_dist')

cmds.connectAttr('arm_dist_startShape.worldPosition',
                  myArmDist+'.startPoint')

cmds.connectAttr('arm_dist_endShape.worldPosition',
                  myArmDist+'.endPoint')

##Create up_arm_to_elbow_dist node

cmds.createNode('distanceDimShape')
myDistUpToElbow=cmds.rename('distanceDimension1', 'up_arm_to_elbow_dist')

cmds.connectAttr('arm_dist_startShape.worldPosition',
                  myDistUpToElbow+'.startPoint')

cmds.connectAttr('elbowShape.worldPosition',
                  myDistUpToElbow+'.endPoint')

##Create elbow_to_hand_dist node

cmds.createNode('distanceDimShape')
myDistElbowToHand=cmds.rename('distanceDimension1',
                              'elbow_to_hand_dist')

cmds.connectAttr('elbowShape.worldPosition',
                  myDistElbowToHand+'.startPoint')

cmds.connectAttr('hand_locShape.worldPosition',
                  myDistElbowToHand+'.endPoint')

##Create variables

upArmLength  =    0.0
lowArmLength =    0.0
fullLength   =    0.0
driver       =    'arm_distShape.distance'

##Set variables

upArmLength  = cmds.getAttr('low_arm.tx')
lowArmLength = cmds.getAttr('hand.tx')
fullLength   = (upArmLength + lowArmLength)

##Create setDrivenKey commands (normal state)

cmds.setDrivenKeyframe('low_arm.tx',
                        cd=driver,
                        dv=fullLength,
                        v=upArmLength)

cmds.setDrivenKeyframe('hand.tx',
                        cd=driver,
                        dv=fullLength,
                        v=lowArmLength)

##2 times of length

cmds.setDrivenKeyframe('low_arm.tx',
                        cd=driver,
                        dv=(fullLength*2),
                        v=(upArmLength*2))

cmds.setDrivenKeyframe('hand.tx',
                        cd=driver,
                        dv=(fullLength*2),
                        v=(lowArmLength*2))

##When length is 0(Default)

cmds.setDrivenKeyframe('low_arm.tx',
                        cd=driver,
                        dv=0,
                        v=upArmLength)

cmds.setDrivenKeyframe('hand.tx',
                        cd=driver,
                        dv=0,
                        v=lowArmLength)

##Set postInfinit curves to linear

cmds.selectKey('low_arm',add=True,k=True, at='translateX')
cmds.selectKey('hand',   add=True,k=True, at='translateX')

cmds.setInfinity('low_arm', poi='linear')
cmds.setInfinity('hand',    poi='linear')

##Create the blend nodes and make the proper connection to pin the elbow

cmds.blendTwoAttr('low_arm.tx',
                   at0='low_arm_translateX.output',
                   at1='up_arm_to_elbow_dist.distance',
                   n='up_arm_choice')

cmds.blendTwoAttr('hand.tx',
                   at0='hand_translateX.output',
                   at1='elbow_to_hand_dist.distance',
                   n='low_arm_choice')

cmds.select('elbow')

cmds.addAttr( longName='Pin', attributeType='float', max=1.0, min=0.0, dv=0.0, k=True)

cmds.connectAttr('elbow.Pin','up_arm_choice.attributesBlender',f=True)
cmds.connectAttr('elbow.Pin','low_arm_choice.attributesBlender',f=True)

##
##

Create Joints in center of mesh with PaintSelectTool

#Módulo que chama os comandos do maya. 
import maya.cmds as cmds

#Contador.
count=0

#Função que gera toda a ação principal.
def myLoop():
    #Variável que conta cada ciclo da função.
    global count
    #Seleciona o loop apartir do edge selecionado.
    cmds.SelectEdgeLoopSp()
    #Converte o loop de edges para vertices.
    cmds.ConvertSelectionToVertices()
    #Cria um clustes aparir da seleção de vertices.
    clu=cmds.cluster()
    #Variavel que guarda a posição do cluster no mundo.
    cluOrig=cmds.getAttr(clu[1]+".origin")
    #Limpa a seleção.
    cmds.select(clear=True)
    #Variavel que guarda o nome e cria o joint.
    jnt=cmds.joint(position=cluOrig[0]) 
    #Deleta o cluster.
    cmds.delete(clu)
    #Incrementa "1" na variavel count.
    count=count+1
    #Checa quantas vezes a função foi rodada. Se é a primeira vez que a função é 
    #rodada ele não linca o joint, pois ainda não existe nenhum para ser lincado.
    if count > 1:      
        cmds.parent(jnt, myCurrJNT)
    else:
        print"Nenhum pai"
    
    

#Cria a ferramenta PaintSelectTool com as seguintes configurações.
cmds.artSelectCtx(n='artCreateJoint', pm="tangent",r=0.2, sop='select', ads=False, ch=False, bsc='python "myCurrJNT=cmds.ls(selection=True)"' ,asc='python "myLoop()"')
#Chama a ferramenta criada anteriormente.
cmds.setToolTo('artCreateJoint')

List selection

#
#
import maya.cmds as mc 
selVs = mc.ls(selection=True) 
#
#

Window

#
# Se a janela existir ele a deleta.
if mc.window(myWin, exists=True):  
       mc.deleteUI("Rosenio")

myWin = mc.window("Rosenio", wh=(250,250) )  
#
#

Select shapes

#
#
shapeSel=cmds.listRelatives(shapes=True)  
#
#

Exemplo para fazer botões usando “for loop statement”

Referência tirada de um estudo do blog JustinAnimator’s thoughts.

#
#
import maya.cmds as mc  
   
#Função dos botões. Mostra o nome do botão.  
def mySoftIs (name):  
     print "Meu soft é %s" % name  
       
   
#Cria a nossa janela.  
if mc.window(myWin, exists=True):  
mc.deleteUI("Softwares")  
       
myWin = mc.window("Softwares", wh=(100,100) )  
mc.rowColumnLayout()  
   
#Variavel(array) que guarda os nomes.  
mySofts =('Maya', '3D', 'Zbrush', 'Photoshop')  
   
#Executa o loop de criação dos botões.  
for obj in mySofts:  
     mc.button(l=obj, c=lambda x, i=obj:mySoftIs(i))  
   
   
mc.showWindow(myWin) 
#
#

Hello world!

#
#
import maya.cmds as cmds

def helloGuys():
    print ('Hello World!!!')

helloGuys()
#
#
Return top