Final result:

Step by step:

1. Creating and Manipulating Objects

2. Working with Selections and Constraints

3. Creating a Scripted Animation

4. Generating a User Interface

5. Custom Attributes and Expressions

The script:

randomCubes.py

import maya.cmds as cmds
import random

random.seed( 1234 )

”’
cubeList = cmds.ls( ‘myCube*’ )
if len( cubeList ) > 0:
cmds.delete( cubeList )
”’

result = cmds.polyCube( w=1, h=1, d=1, name=’myCube#’ )

print ‘result: ‘ + str( result )

transformName = result[0]

instanceGroupName = cmds.group( empty=True, name=transformName + ‘_instance_grp#’ )

for i in range( 0, 50 ):

instanceResult = cmds.instance( transformName, name=transformName + '_instance#' )

cmds.parent( instanceResult, instanceGroupName )

#print 'instanceResult: ' + str( instanceResult )

x = random.uniform( -10, 10 )
y = random.uniform( 0, 20 )
z = random.uniform( -10, 10 )

cmds.move( x, y, z, instanceResult )

xRot = random.uniform( 0, 360 )
yRot = random.uniform( 0, 360 )
zRot = random.uniform( 0, 360 )

cmds.rotate( xRot, yRot, zRot, instanceResult )

scalingFactor = random.uniform( 0.3, 1.5 )

cmds.scale( scalingFactor, scalingFactor, scalingFactor, instanceResult )

cmds.hide( transformName )

cmds.xform( instanceGroupName, centerPivots=True )


randomInstances.py

import maya.cmds as cmds
import random

random.seed( 1234 )

result = cmds.ls( orderedSelection=True )

print ‘result: %s’ % ( result )

transformName = result[0]

instanceGroupName = cmds.group( empty=True, name=transformName + ‘_instance_grp#’ )

for i in range( 0, 50 ):

instanceResult = cmds.instance( transformName, name=transformName + '_instance#' )

cmds.parent( instanceResult, instanceGroupName )

#print 'instanceResult: ' + str( instanceResult )

x = random.uniform( -10, 10 )
y = random.uniform( 0, 20 )
z = random.uniform( -10, 10 )

cmds.move( x, y, z, instanceResult )

xRot = random.uniform( 0, 360 )
yRot = random.uniform( 0, 360 )
zRot = random.uniform( 0, 360 )

cmds.rotate( xRot, yRot, zRot, instanceResult )

scalingFactor = random.uniform( 0.3, 1.5 )

cmds.scale( scalingFactor, scalingFactor, scalingFactor, instanceResult )

cmds.hide( transformName )

cmds.xform( instanceGroupName, centerPivots=True )


aimAtFirst.py

import maya.cmds as cmds

selectionList = cmds.ls( orderedSelection=True )

if len( selectionList ) >= 2:

print 'Selected items: %s' % ( selectionList )

targetName = selectionList[0]

selectionList.remove( targetName )

for objectName in selectionList:

    print 'Constraining %s towards %s' % ( objectName, targetName )

    cmds.aimConstraint( targetName, objectName, aimVector=[0,1,0] )

else:

print 'Please select two or more objects.'

keyRotation.py

import maya.cmds as cmds

def keyFullRotation( pObjectName, pStartTime, pEndTime, pTargetAttribute ):

cmds.cutKey( pObjectName, time=(pStartTime, pEndTime), attribute=pTargetAttribute )

cmds.setKeyframe( pObjectName, time=pStartTime, attribute=pTargetAttribute, value=0 )

cmds.setKeyframe( pObjectName, time=pEndTime, attribute=pTargetAttribute, value=360 )

cmds.selectKey( pObjectName, time=(pStartTime, pEndTime), attribute=pTargetAttribute, keyframe=True )

cmds.keyTangent( inTangentType='linear', outTangentType='linear' )

selectionList = cmds.ls( selection=True, type=’transform’ )

if len( selectionList ) >= 1:

# print 'Selected items: %s' % ( selectionList )

startTime = cmds.playbackOptions( query=True, minTime=True )
endTime = cmds.playbackOptions( query=True, maxTime=True )

for objectName in selectionList:

    # objectTypeResult = cmds.objectType( objectName )

    # print '%s type: %s' % ( objectName, objectTypeResult )

    keyFullRotation( objectName, startTime, endTime, 'rotateY' )

else:

print 'Please select at least one object'

keyRotationWithUI.py

import maya.cmds as cmds
import functools

def createUI( pWindowTitle, pApplyCallback ):

windowID = 'myWindowID'

if cmds.window( windowID, exists=True ):
    cmds.deleteUI( windowID )

cmds.window( windowID, title=pWindowTitle, sizeable=False, resizeToFitChildren=True )

cmds.rowColumnLayout( numberOfColumns=3, columnWidth=[ (1,75), (2,60), (3,60) ], columnOffset=[ (1,'right',3) ] )

cmds.text( label='Time Range:' )

startTimeField = cmds.intField( value=cmds.playbackOptions( q=True, minTime=True ) )

endTimeField = cmds.intField( value=cmds.playbackOptions( q=True, maxTime=True ) )

cmds.text( label='Attribute:' )

targetAttributeField = cmds.textField( text='rotateY' )

cmds.separator( h=10, style='none' )

cmds.separator( h=10, style='none' )
cmds.separator( h=10, style='none' )
cmds.separator( h=10, style='none' )

cmds.separator( h=10, style='none' )

cmds.button( label='Apply', command=functools.partial( pApplyCallback,
                                              startTimeField,
                                              endTimeField,
                                              targetAttributeField ) )

def cancelCallback( *pArgs ):
    if cmds.window( windowID, exists=True ):
        cmds.deleteUI( windowID )

cmds.button( label='Cancel', command=cancelCallback )

cmds.showWindow()

def keyFullRotation( pObjectName, pStartTime, pEndTime, pTargetAttribute ):

cmds.cutKey( pObjectName, time=(pStartTime, pEndTime), attribute=pTargetAttribute )

cmds.setKeyframe( pObjectName, time=pStartTime, attribute=pTargetAttribute, value=0 )

cmds.setKeyframe( pObjectName, time=pEndTime, attribute=pTargetAttribute, value=360 )

cmds.selectKey( pObjectName, time=(pStartTime, pEndTime), attribute=pTargetAttribute, keyframe=True )

cmds.keyTangent( inTangentType='linear', outTangentType='linear' )

def applyCallback( pStartTimeField, pEndTimeField, pTargetAttributeField, *pArgs ):

# print 'Apply button pressed.'

startTime = cmds.intField( pStartTimeField, query=True, value=True )

endTime = cmds.intField( pEndTimeField, query=True, value=True )

targetAttribute = cmds.textField( pTargetAttributeField, query=True, text=True )

print 'Start Time: %s' % ( startTime )
print 'End Time: %s' % ( endTime )
print 'Attribute: %s' % ( targetAttribute )

selectionList = cmds.ls( selection=True, type='transform' )

for objectName in selectionList:

    keyFullRotation( objectName, startTime, endTime, targetAttribute )

createUI( ‘My Title’, applyCallback )

------------------------------------------------------------------------------------

expandFromFirst.py

import maya.cmds as cmds

selectionList = cmds.ls( orderedSelection=True, type=’transform’ )

if len( selectionList ) >= 2:

targetName = selectionList[0]

selectionList.remove( targetName )

locatorGroupName = cmds.group( empty=True, name='expansion_locator_grp#' )

maxExpansion = 100

newAttributeName = 'expansion'

if not cmds.objExists( '%s.%s' % ( targetName, newAttributeName ) ):

    cmds.select( targetName )

    cmds.addAttr( longName=newAttributeName, shortName='exp',
                  attributeType='double', min=0, max=maxExpansion,
                  defaultValue=maxExpansion, keyable=True )

for objectName in selectionList:

    coords = cmds.getAttr( '%s.translate' % ( objectName ) )[0]

    locatorName = cmds.spaceLocator( position=coords, name='%s_loc#' % ( objectName ) )[0]

    cmds.xform( locatorName, centerPivots=True )

    cmds.parent( locatorName, locatorGroupName )

    pointConstraintName = cmds.pointConstraint( [ targetName, locatorName ], objectName, name='%s_pointConstraint#' % ( objectName ) )[0]

    cmds.expression( alwaysEvaluate=True, 
                     name='%s_attractWeight' % ( objectName ),
                     object=pointConstraintName,
                     string='%sW0=%s-%s.%s' % ( targetName, maxExpansion, targetName, newAttributeName ) )

    cmds.connectAttr( '%s.%s' % ( targetName, newAttributeName ), 
                      '%s.%sW1' % ( pointConstraintName, locatorName ) )


cmds.xform( locatorGroupName, centerPivots=True )

else:

print 'Please select two or more objects.'