I want to ask a help with voxelize script (by Peter Richardson and Justin 
Israel was help), what it 
do<http://zoomy.net/2010/02/25/voxelize-meshes-script-v2/>
.
Dimensions of cube is script setup proportional like L1xH1xW1. I need to 
have a control over a brick size (imitate a lego brick dimension 
9.6x16x16). Another tool like Legolize for sofimage  is unsuitable it works 
a different. My point is to make a documentation fo assambly a car out of 
lego brick, like 
ford<http://reviews.cnet.com/8301-13746_7-20111802-48/lego-ford-explorer-made-of-380000-bricks-but-you-cant-drive-it/>
.

-- 
You received this message because you are subscribed to the Google Groups 
"Python Programming for Autodesk Maya" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/python_inside_maya/caa7b3aa-da7b-4850-afe4-bba6dc56cbeb%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
### voxelize meshes v.3
### http://zoomy.net/2010/02/25/voxelize-meshes-script-v2/
### this script turns the selected meshes into cubes
### over the current timeline range.

import maya.OpenMaya as om
import maya.cmds as cmds
import maya.mel as mel

# shoot a ray from point in direction and return all hits with mesh
def rayIntersect(mesh, point, direction=(0.0, 0.0, -1.0)):
  # get dag path of mesh - so obnoxious
  om.MGlobal.clearSelectionList()
  om.MGlobal.selectByName(mesh)
  sList = om.MSelectionList()
  om.MGlobal.getActiveSelectionList(sList)
  item = om.MDagPath()
  sList.getDagPath(0, item)
  item.extendToShape()
  fnMesh = om.MFnMesh(item)

  raySource = om.MFloatPoint(point[0], point[1], point[2], 1.0)
  rayDir = om.MFloatVector(direction[0], direction[1], direction[2])
  faceIds            = None
  triIds             = None
  idsSorted          = False
  worldSpace         = om.MSpace.kWorld
  maxParam           = 99999999
  testBothDirections = False
  accelParams        = None
  sortHits           = True
  hitPoints          = om.MFloatPointArray()
  hitRayParams       = om.MFloatArray()
  hitFaces           = om.MIntArray()
  hitTris            = None
  hitBarys1          = None
  hitBarys2          = None
  tolerance          = 0.0001

  hit = fnMesh.allIntersections(raySource, rayDir, faceIds, triIds, idsSorted, worldSpace, maxParam, testBothDirections, accelParams, sortHits, hitPoints, hitRayParams, hitFaces, hitTris, hitBarys1, hitBarys2, tolerance)

  # clear selection as may cause problems if called repeatedly
  om.MGlobal.clearSelectionList()
  result = []
  for x in range(hitPoints.length()):
    result.append((hitPoints[x][0], hitPoints[x][1], hitPoints[x][2]))
  return result

# round to nearest fraction in decimal form: 1, .5, .25
def roundToFraction(input, fraction):
  factor = 1/fraction
  return round(input*factor)/factor

# progress bar, enabling "Esc"
def makeProgBar(length):
  global gMainProgressBar
  gMainProgressBar = mel.eval('$tmp = $gMainProgressBar');
  cmds.progressBar( gMainProgressBar,
        edit=True,
        beginProgress=True,
        isInterruptable=True,
        maxValue=length
        )

def promptNumber():
  result = cmds.promptDialog(
      title='Grow Shrub',
      message='Block size:',
      text="1",
      button=['OK', 'Cancel'],
      defaultButton='OK',
      cancelButton='Cancel',
      dismissString='Cancel')
  if result == 'OK':
    return float(cmds.promptDialog(query=True, text=True))
  else: return 0

def setLocs(mesh):
  global xmin, xmax, ymin, ymax, zmin, zmax, xLocs, yLocs, zLocs
  bb = cmds.exactWorldBoundingBox(mesh)
  xmin = bb[0]
  ymin = bb[1]
  zmin = bb[2]
  xmax = bb[3]
  ymax = bb[4]
  zmax = bb[5]
  
  # make 3 arrays of ray start points, one for each axis
  # this is necessary because rays aren't likely to catch surfaces
  # which are edge-on... so to make sure to catch all faces,
  # we shoot rays along each axis
  xLocs = []
  yLocs = []
  zLocs = []

  fac = 1/cubeSize
  for y in range(int(ymin*fac), int(ymax*fac+1)):
    for z in range(int(zmin*fac), int(zmax*fac+1)):
      loc = (xmax, y*cubeSize, z*cubeSize)
      xLocs.append(loc)
  for z in range(int(zmin*fac), int(zmax*fac+1)):
    for x in range(int(xmin*fac), int(xmax*fac+1)):
      loc = (x*cubeSize, ymax, z*cubeSize)
      yLocs.append(loc)
  for x in range(int(xmin*fac), int(xmax*fac+1)):
    for y in range(int(ymin*fac), int(ymax*fac+1)):
      loc = (x*cubeSize, y*cubeSize, zmax)
      zLocs.append(loc)
  
# start the action
if len(cmds.ls(sl=1)) == 0:
  result = cmds.confirmDialog( title='Mesh selection', message= 'Please select a mesh.', button=['OK'])
else:
  startTime= cmds.timerX()
  cubeSize = promptNumber()
  global cubeDict, xmin, xmax, ymin, ymax, zmin, zmax, xLocs, yLocs, zLocs
  cubeDict = {}

  # set selected objects to be the shape targets, aka controls
  ctrl = cmds.ls(sl=1)

  firstFrame = int(cmds.playbackOptions(query=1, min=1))
  lastFrame = int(cmds.playbackOptions(query=1, max=1))
  duration = int(lastFrame-firstFrame)

  makeProgBar(duration*len(ctrl))
  cmds.progressBar(gMainProgressBar, edit=1, beginProgress=1)

  print "Animating visibility over", duration, "frames..."
  print "Press ESC to cancel"

  # animate cube visibility
  resetList = []
  for f in range(firstFrame,lastFrame+1): # for each frame
    cmds.currentTime(f, edit=1, update=1)
    # if the cube was visible last frame, hide it
    for x in resetList:
      cmds.setKeyframe(x, at="scale", v=0, t=f)
    resetList = []
    directions = [(-1.0, 0.0, 0,0), (0.0, -1.0, 0,0), (0.0, 0.0, -1.0)]
    # for every target control object:
    for c in ctrl:
      if cmds.progressBar(gMainProgressBar, query=1, isCancelled=1 ):
        break
      cmds.progressBar(gMainProgressBar, edit=1, step=1)
      
      setLocs(c)
      locArrays = [xLocs, yLocs, zLocs]
     
      # for each axis:
      for i in range(3):
        cmds.flushUndo()
        # for every gridpoint:
        for loc in locArrays[i]:
          hits = []
          # zap a ray thrugh the object
          hits = rayIntersect(c, loc, directions[i])
          for x in hits:
            # snap hit locations to cubegrid
            x = (roundToFraction(x[0], cubeSize), roundToFraction(x[1], cubeSize), roundToFraction(x[2], cubeSize) )
            # if location isn't in cubeDict, add it and a new cube
            if x not in cubeDict:
              cubeDict[x] = cmds.polyCube(sz=1, sy=1, sx=1, cuv=4, d=cubeSize, h=cubeSize, w=cubeSize, ch=1)[0]
              # move cube to quantized location
              cmds.xform(cubeDict[x], t=x)
            # set a scale key
            cmds.setKeyframe(cubeDict[x], at="scale", v=1, t=f)
            # if previous frame didn't have a scale key, set it to 0
            tempCurTime = cmds.currentTime(q=1)-1
            lastKey = cmds.keyframe(cubeDict[x], at="scale", q=1, t=(tempCurTime,tempCurTime), valueChange=1)
            if lastKey == None or lastKey[0] != 1.0:
              cmds.setKeyframe(cubeDict[x], at="scale", v=0, t=(f-1))
            # add cube to resetList
            resetList.append(cubeDict[x])
    cmds.currentTime(f, edit=1, update=1)

  cmds.progressBar(gMainProgressBar, edit=1, endProgress=1)
  totalTime = cmds.timerX(startTime=startTime)
  print("Total Time: "+str(totalTime))

### end voxelize meshes v.3

Reply via email to