Search code examples
pythonrowmaya

how to create a row of cubes with a random width in python


I want to create a row of tiles with a random width. i can do it for 2 cubes, but i don't know how to do it for 100 cubes.

import maya.cmds as cmds
import random

cubeList = cmds.ls( 'Tiles*' )
if len(cubeList) > 0:
    cmds.delete( cubeList )

#create row and col list
cols = 2
arr = []
for col in xrange (cols):
    width_rand_Size = random.uniform(0.8,3)

    arr.append(cmds.polyCube (ax = (0,0,1), w = width_rand_Size, h = 1, d =1 , n='Tiles#'))
    if col != 0:
        cmds.setAttr( "Tiles2.tx",(cmds.polyCube('Tiles1', q = 1, w = 1))/2 + (cmds.polyCube('Tiles2', q = 1, w = 1))/2)

Solution

  • You have to make the script automatically find the name of your object and previous object each time you're iterating. Then you compute the space between the current tile and all the previous created tiles.

    Here is the code:

    import maya.cmds as cmds
    import random
    
    cubeList = cmds.ls( 'Tiles*' )
    if len(cubeList) > 0:
        cmds.delete( cubeList )
    
    #create row and col list
    cols = 10 # number of tiles to create
    x = 1 # increment variable
    arr = []
    allTilesSpace = [] # cumalated space between tiles
    for col in xrange (cols):
        # if there is no tile to create, do nothing
        if not cols:
            break
        # get the names of the objects
        currentTile = 'Tiles%d' % x
        previousTile = "Tiles%d" % (x - 1)
        # set random width
        width_rand_Size = random.uniform(0.8,3)
        arr.append(cmds.polyCube (ax = (0,0,1), w = width_rand_Size, h = 1, d =1 , n=currentTile))
    
        # Move the tiles
        currentTileWidth = cmds.polyCube(currentTile, q = 1, w = 1)
        if cmds.objExists(previousTile):
            previousTileWidth = cmds.polyCube(previousTile, q = 1, w = 1)
            allTilesSpace.append(previousTileWidth)
            tilesSpace = sum(allTilesSpace) + (currentTileWidth / 2)
            cmds.setAttr(currentTile + ".tx",tilesSpace)
        else:
            cmds.setAttr(currentTile + ".tx", currentTileWidth / 2)
    
        x += 1 # increment