Tuesday, August 11, 2009

columbarium_growth_by_grisha

this is my studio project "a multireligious columbarium"




and this is the script for it

import maya.cmds as cmds
import maya.cmds as cmds
import maya.mel as mm
import math
import sys
from random import*
from setColor import*

# increasing recursion limit to 8000 loops
sys.setrecursionlimit(8000)

#######################
### HELPING SCRIPTS ###
#######################

# getting center of the Face
def centerOfFace(facet):
#find the vertices that define that face.
vertex = cmds.polyListComponentConversion(facet, ff=1, tv=1)
cmds.select(vertex, r=1)
vertexFlat = cmds.ls(sl=1, fl=1)

#find out how many vertices define that face
vertCount = len(vertexFlat)
#print vertexFlat

#for each vertex go through and find it's world space position.
vertPositionSumX = 0.
vertPositionSumY = 0.
vertPositionSumZ = 0.
for a in range(0, vertCount, 1):
coordinate = cmds.pointPosition(vertexFlat[a], w=1)
vertPositionSumX += coordinate[0]
vertPositionSumY += coordinate[1]
vertPositionSumZ += coordinate[2]

centroidX = vertPositionSumX/float(vertCount)
centroidY = vertPositionSumY/float(vertCount)
centroidZ = vertPositionSumZ/float(vertCount)

return [centroidX, centroidY, centroidZ]

# distance between two points
def getDistance(start, end):
#start and end must be lists xyz
v = [start[0]-end[0], start[1]-end[1], start[2]-end[2]] #list format x,y,z
vector = "<<" + str(v[0]) + "," + str(v[1]) + "," + str(v[2]) + ">>"
mag = mm.eval("mag " + vector + ";")

return mag

# looking for closest locator through the list with locators to the LOCATOR
def closestLocator (locator, netOfLocs):
locatorPos = cmds.pointPosition(locator)
distance = 1000000000
closLocData = []
closestLocator = ""
for i in netOfLocs:
locPos = cmds.pointPosition(i)
currDist = getDistance(locatorPos, locPos)
if currDist < distance =" currDist" closlocator =" i" closlocpos =" locPos" closlocdist =" currDist" locatorpos =" Point" distance =" 1000000000" closlocdata =" []" closestlocator = "" locpos =" i[1]" currdist =" getDistance(locatorPos," distance =" currDist" closlocator =" i[0]" closlocpos =" locPos" closlocdist =" currDist" locatorpos =" Point" distance =" 1000000000" closlocdata =" []" closestlocator = "" locpos =" i" currdist =" getDistance(locatorPos," distance =" currDist" closlocator =" i[0]" closlocpos =" locPos" closlocdist =" currDist" locatorpos =" Point" distance =" 1000000000" closlocdata =" []" closestlocator = "" locpos =" i[2]" currdist =" getDistance(locatorPos," distance =" currDist" closlocator =" i[0]" grow =" i[1]" closlocpos =" locPos" closlocdist =" currDist" locatorpos =" Point" distance =" 1000000000" closlocdata =" []" closestlocator = "" locpos =" i[1]" currdist =" getDistance(locatorPos," distance =" currDist" closlocator =" i[0]" closlocpos =" locPos" closlocdist =" currDist" locatorpos =" center" distance =" 1000000000" closlocdata =" []" closestlocator = "" locpos =" i" currdist =" getDistance(locatorPos," distance =" currDist" closlocator =" i" closlocpos =" i" closlocdist =" currDist" x="0" y="0" z="0" n="0" ptpos =" cmds.pointPosition(i)" x="x+ptPos[0]" y="y+ptPos[1]" z="z+ptPos[2]" n="n+1" ptpos =" cmds.pointPosition(i)" x="x+ptPos[0]" y="y+ptPos[1]" z="z+ptPos[2]" n="n+1" midx =" x/n" midy =" y/n" midz =" z/n" midpt="[]" x="0" y="0" z="0" n="0" ptpos =" cmds.pointPosition(listLoc1[i])" x="x+ptPos[0]" y="y+ptPos[1]" z="z+ptPos[2]" n="n+1" ptpos =" listPt2" x="x+(ptPos[0]*len(listLoc1))" y="y+(ptPos[1]*len(listLoc1))" z="z+(ptPos[2]*len(listLoc1))" n="n+len(listLoc1)" midx =" x/n" midy =" y/n" midz =" z/n" midpt="[]" dire =" [" center =" center" loc2 =" loc2[0]" loc3 =" loc3[0]" loc4 =" loc4[0]" clpt1 =" closestPointToPoints" clpt2 =" closestPointToPoints" clpt1 =" clPt1[0]" clpt2 =" clPt2[0]" centerclosrelig =" centerClosRelig[0]" x =" (3*loc2[0]" y =" (3*loc2[1]" point =" [x,y,0]" x =" center[0]" y =" center[1]" new =" [x,y,0]" va =" (locPos[0]" vb =" (0,1,0)" angle =" cmds.angleBetween(v1=" v2="vb)" angle =" angle[3]" graves =" []" mitrary =" []" buddhism =" []" catholic=" []" orthodox =" []" hindu =" []" judaism =" []" protest =" []" islam =" []" allrelig =" []" otherr =" []" amitrary =" []" abuddhism =" []" acatholic=" []" aorthodox =" []" ahindu =" []" ajudaism =" []" aprotest =" []" aislam =" []" aallrelig =" []" ceremony =" []" entrance =" []" otherw =" []" otherm =" []" allrepuls =" []" trees =" []" treessrf=" []" cubes =" []" ff =" []" mitrary =" ff" ff =" []" buddhism =" ff" ff =" []" catholic =" ff" ff =" []" orthodox =" ff" ff =" []" hindu =" ff" ff =" []" judaism =" ff" ff =" []" protest =" ff" ff =" []" islam =" ff" ff =" []" amitrary =" ff" ff =" []" abuddhism =" ff" ff =" []" acatholic =" ff" ff =" []" aorthodox =" ff" ff =" []" ahindu =" ff" ff =" []" ajudaism =" ff" ff =" []" aprotest =" ff" ff =" []" aislam =" ff" otherrr =" []" otherr =" otherRR" allrelig =" self.mitrary" mmm="[]" mmmm="[]" ceremony =" mmm" entrance =" mmmm" otherw =" [centerOfFace('polySurface7766.f[0]'),centerOfFace('polySurface7770.f[0]'),centerOfFace('polySurface7767.f[0]'),centerOfFace('polySurface7769.f[0]'),centerOfFace('polySurface7771.f[0]')]" otherm =" [centerOfFace('polySurface7762.f[0]'),centerOfFace('polySurface7763.f[0]'),centerOfFace('polySurface7764.f[0]'),centerOfFace('polySurface7765.f[0]')]" allrepuls =" self.entrance" mm=" []" mmm =" []" m =" 'polySurface%d.f[0]'" n =" 'polySurface%d'" treessrf =" mmm" trees =" mm" r="True)" faces =" cmds.filterExpand(sm=" faces =" []" all="True)" cface =" centerOfFace(i)" loc =" cmds.spaceLocator(" p="(Cface[0],Cface[1],Cface[2])" graves =" FACES" all =" True)" locs =" cmds.filterExpand(sm=" pp =" []" loc =" i" lpos =" cmds.pointPosition(i)" oo =" []" graves =" PP" cubes =" []" position =" cmds.pointPosition(i)" cube =" cmds.polyCube" w ="size" h="size" d="size" repsize="10," pointsamount =" 4," n="0):" repulsivelocs =" self.allRepuls" locs =" self.graves" l="(repSize/5)*(i+1)" kpos =" k" closloc =" closestLocatorToPoint(Kpos," locpos =" closLoc[1]" clloc =" closLoc[0]" direc =" direction(LOCpos," newx =" ((direc[0]*6)/((i+1)*(i+1)))" newy =" ((direc[1]*6)/((i+1)*(i+1)))" newz =" ((direc[2]*6)/((i+1)*(i+1)))" cll =" [clLoc,LOCpos]" n="0," mn="0," bn="0," cn="0," on="0," hn="0," jn="0," pn="0," in="0," cubes =" []," max =" 150.0," cofcenmove="10" m =" [1]" b =" [2]" c =" [3]" o =" [4]" h =" [5]" j =" [6]" p =" [7]" i =" [8]" way ="=" way ="=" xxx =" randint" way ="=" xxx =" randint" n ="=" n ="=" n ="=" n="=" allrelig =" [M]+[B]+[C]+[O]+[H]+[J]+[P]+[I]" n="N+1" trees =" self.trees" closreligion =" closestPointToPoints1">= closReligion[1]:
M.append (midPtWater (self.otherW, self.otherM, M[2], self.ceremony, self.entrance, self.Amitrary, closReligion[2])) # midPt [3]
else:
closPT = closReligion[2]
g = M[2]
xx = g[0] - (closPT[0] - g[0])
yy = g[1] - (closPT[1] - g[1])
ptt = [xx, yy, 0]
M.append (midPtWater (self.otherW, self.otherM, M[2], self.ceremony, self.entrance, self.Amitrary, ptt)) # midPt [3]
#setting the center of growing
newCen = newCenter (M[2], M[3], cofCenMove)
M[2] = newCen
prevousPt = newCen

if M[1]/10 == 0:
GG = randint (0,1)
else:
GG = M[1]/10
#trees growth
for i in range (GG):
#looking for closest tree
closTree = closestTreeToPoint (M[2], Trees)
closTree = closTree[0]
#making a circle in new tree position
cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)
cmds.planarSrf (d=1)
#1 tree == 2 graves... so... looking for closest two graves to the tree and removing the from the list
for i in range (2):
closGrave = closestPointToPoints2 (closTree, allGraves)
closGraveName = [closGrave[0],closGrave[1]]
allGraves.remove (closGraveName)
# stop recursion because allGraves list is empty
if len(allGraves)==1:
return "Done."
# stop the loop if Trees list is empty
if len(Trees) < closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]">= MAX:
MN = 0
M2 = closGrave[1]
allGraves.remove (closGraveName)
break
else:
M2 = M[2]
#looking for angle rotate the box according it to face the center
angle = angleBetweenVectors (M[2], closGravePos)
#making the cube with size which is changing depends on counter
cube = cmds.polyCube (w =size*(MN/MAX) ,h=size*(MN/MAX) ,d=size*(MN/MAX))
CUBES.append (cube[0])
#move the cube to the locator position
cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)
#rotate the cube to face the center of the religion
cmds.rotate ( angle[0], angle[1], angle[2], cube, pivot=closGravePos )
#remove the locator from the list with locators according to not to loop through it next time
allGraves.remove (closGraveName)
# draw a curve between center of the religion and the locator
cmds.curve( p=[(M2[0],M2[1], M2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )
prevousPt = closGravePos
# stop recursion because allGraves list is empty
if len(allGraves)==1:
return "Done."


#return "Done."
cmds.refresh()

####### ALL THE RELIGIONS HAVE SIMILAR LOGIC BUT DIFFERENT NUMBERS

######BUDDISM######
closReligion = closestPointToPoints1 (B[2], ALLRELIG) #dist - [3]
if B[1] >= closReligion[1]:
B.append (midPtWater (self.otherW, self.otherM, B[2], self.ceremony, self.entrance, self.Abuddhism, closReligion[2])) # midPt [3]
else:
closPT = closReligion[2]
g = B[2]
xx = g[0] - (closPT[0] - g[0])
yy = g[1] - (closPT[1] - g[1])
ptt = [xx, yy, 0]
B.append (midPtWater (self.otherW, self.otherM, B[2], self.ceremony, self.entrance, self.Abuddhism, ptt)) # midPt [3]
newCen = newCenter (B[2], B[3], cofCenMove)
B[2] = newCen
prevousPt = newCen

if B[1]/10 == 0:
GG = randint (0,1)
else:
GG = B[1]/10
for i in range (GG):
closTree = closestTreeToPoint (B[2], Trees)
closTree = closTree[0]
cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)
cmds.planarSrf (d=1)
#print "closTree"
#print closTree
for i in range (2):
closGrave = closestPointToPoints2 (closTree, allGraves)
closGraveName = [closGrave[0],closGrave[1]]
allGraves.remove (closGraveName)
if len(allGraves)==1:
return "Done."
if len(Trees) < closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]">= MAX:
BN = 0
B2 = closGrave[1]
allGraves.remove (closGraveName)
break
else:
B2 = B[2]
cube = cmds.polyCube (w =size*(BN/MAX) ,h=size*(BN/MAX) ,d=size*(BN/MAX))
CUBES.append (cube[0])
cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)
allGraves.remove (closGraveName)
cmds.curve( p=[(B2[0],B2[1], B2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )
prevousPt = closGravePos
if len(allGraves)==1:
return "Done."

cmds.refresh()

######Catholics######
closReligion = closestPointToPoints1 (C[2], ALLRELIG) #dist - [3]
if C[1] >= closReligion[1]:
C.append (midPtWater (self.otherW, self.otherM, C[2], self.ceremony, self.entrance, self.Acatholic, closReligion[2])) # midPt [3]
else:
closPT = closReligion[2]
g = C[2]
xx = g[0] - (closPT[0] - g[0])
yy = g[1] - (closPT[1] - g[1])
ptt = [xx, yy, 0]
C.append (midPtWater (self.otherW, self.otherM, C[2], self.ceremony, self.entrance, self.Acatholic, ptt)) # midPt [3]
newCen = newCenter (C[2], C[3], cofCenMove)
C[2] = newCen
prevousPt = newCen

if C[1]/10 == 0:
GG = randint (0,1)
else:
GG = C[1]/10
for i in range (GG):
closTree = closestTreeToPoint (C[2], Trees)
closTree = closTree[0]
cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)
cmds.planarSrf (d=1)
#print "closTree"
#print closTree
for i in range (2):
closGrave = closestPointToPoints2 (closTree, allGraves)
closGraveName = [closGrave[0],closGrave[1]]
allGraves.remove (closGraveName)
if len(allGraves)==1:
return "Done."
if len(Trees) < closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]">= MAX:
CN = 0
C2 = closGrave[1]
allGraves.remove (closGraveName)
break
else:
C2 = C[2]
cube = cmds.polyCube (w =size*(CN/MAX) ,h=size*(CN/MAX) ,d=size*(CN/MAX))
CUBES.append (cube[0])
cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)
allGraves.remove (closGraveName)
cmds.curve( p=[(C2[0],C2[1], C2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )
prevousPt = closGravePos
if len(allGraves)==1:
return "Done."

cmds.refresh()

######Orthodox######
closReligion = closestPointToPoints1 (O[2], ALLRELIG) #dist - [3]
if O[1] >= closReligion[1]:
O.append (midPtWater (self.otherW, self.otherM, O[2], self.ceremony, self.entrance, self.Aorthodox, closReligion[2])) # midPt [3]
else:
closPT = closReligion[2]
g = O[2]
xx = g[0] - (closPT[0] - g[0])
yy = g[1] - (closPT[1] - g[1])
ptt = [xx, yy, 0]
O.append (midPtWater (self.otherW, self.otherM, O[2], self.ceremony, self.entrance, self.Aorthodox, ptt)) # midPt [3]
newCen = newCenter (O[2], O[3], cofCenMove)
O[2] = newCen
prevousPt = newCen

if O[1]/10 == 0:
GG = randint (0,1)
else:
GG = O[1]/10
for i in range (GG):
closTree = closestTreeToPoint (O[2], Trees)
closTree = closTree[0]
cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)
cmds.planarSrf (d=1)
#print "closTree"
#print closTree
for i in range (2):
closGrave = closestPointToPoints2 (closTree, allGraves)
closGraveName = [closGrave[0],closGrave[1]]
allGraves.remove (closGraveName)
if len(allGraves)==1:
return "Done."
if len(Trees) < closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]">= MAX:
ON = 0
O2 = closGrave[1]
allGraves.remove (closGraveName)
break
else:
O2 = O[2]
cube = cmds.polyCube (w =size*(ON/MAX) ,h=size*(ON/MAX) ,d=size*(ON/MAX))
CUBES.append (cube[0])
cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)
allGraves.remove (closGraveName)
cmds.curve( p=[(O2[0],O2[1], O2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )
prevousPt = closGravePos
if len(allGraves)==1:
return "Done."

cmds.refresh()

######HINDU######
closReligion = closestPointToPoints1 (H[2], ALLRELIG) #dist - [3]
if H[1] >= closReligion[1]:
H.append (midPtWater (self.otherW, self.otherM, H[2], self.ceremony, self.entrance, self.Aprotest, closReligion[2])) # midPt [3]
else:
closPT = closReligion[2]
g = H[2]
xx = g[0] - (closPT[0] - g[0])
yy = g[1] - (closPT[1] - g[1])
ptt = [xx, yy, 0]
H.append (midPtWater (self.otherW, self.otherM, H[2], self.ceremony, self.entrance, self.Aprotest, ptt)) # midPt [3]
newCen = newCenter (H[2], H[3], cofCenMove)
H[2] = newCen
prevousPt = newCen

if H[1]/10 == 0:
GG = randint (0,1)
else:
GG = H[1]/10
for i in range (GG):
closTree = closestTreeToPoint (H[2], Trees)
closTree = closTree[0]
cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)
cmds.planarSrf (d=1)
#print "closTree"
#print closTree
for i in range (2):
closGrave = closestPointToPoints2 (closTree, allGraves)
closGraveName = [closGrave[0],closGrave[1]]
allGraves.remove (closGraveName)
if len(allGraves)==1:
return "Done."
if len(Trees) < closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]">= MAX:
HN = 0
H2 = closGrave[1]
allGraves.remove (closGraveName)
break
else:
H2 = H[2]
cube = cmds.polyCube (w =size*(HN/MAX) ,h=size*(HN/MAX) ,d=size*(HN/MAX))
CUBES.append (cube[0])
cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)
allGraves.remove (closGraveName)
cmds.curve( p=[(H2[0],H2[1], H2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )
prevousPt = closGravePos
if len(allGraves)==1:
return "Done."

cmds.refresh()

######JUDAISM######
closReligion = closestPointToPoints1 (J[2], ALLRELIG) #dist - [3]
if J[1] >= closReligion[1]:
J.append (midPtWater (self.otherW, self.otherM, J[2], self.ceremony, self.entrance, self.Ajudaism, closReligion[2])) # midPt [3]
else:
closPT = closReligion[2]
g = J[2]
xx = g[0] - (closPT[0] - g[0])
yy = g[1] - (closPT[1] - g[1])
ptt = [xx, yy, 0]
J.append (midPtWater (self.otherW, self.otherM, J[2], self.ceremony, self.entrance, self.Ajudaism, ptt)) # midPt [3]
newCen = newCenter (J[2], J[3], cofCenMove)
J[2] = newCen
prevousPt = newCen

if J[1]/10 == 0:
GG = randint (0,1)
else:
GG = J[1]/10
for i in range (GG):
closTree = closestTreeToPoint (J[2], Trees)
closTree = closTree[0]
cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)
cmds.planarSrf (d=1)
#print "closTree"
#print closTree
for i in range (2):
closGrave = closestPointToPoints2 (closTree, allGraves)
closGraveName = [closGrave[0],closGrave[1]]
allGraves.remove (closGraveName)
if len(allGraves)==1:
return "Done."
if len(Trees) < closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]">= MAX:
JN = 0
J2 = closGrave[1]
allGraves.remove (closGraveName)
break
else:
J2 = J[2]
cube = cmds.polyCube (w =size*(JN/MAX) ,h=size*(JN/MAX) ,d=size*(JN/MAX))
CUBES.append (cube[0])
cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)
allGraves.remove (closGraveName)
cmds.curve( p=[(J2[0],J2[1], J2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )
prevousPt = closGravePos
if len(allGraves)==1:
return "Done."

cmds.refresh()

######PROTESTANTISM######
closReligion = closestPointToPoints1 (P[2], ALLRELIG) #dist - [3]
if P[1] >= closReligion[1]:
P.append (midPtWater (self.otherW, self.otherM, P[2], self.ceremony, self.entrance, self.Ahindu, closReligion[2])) # midPt [3]
else:
closPT = closReligion[2]
g = P[2]
xx = g[0] - (closPT[0] - g[0])
yy = g[1] - (closPT[1] - g[1])
ptt = [xx, yy, 0]
P.append (midPtWater (self.otherW, self.otherM, P[2], self.ceremony, self.entrance, self.Ahindu, ptt)) # midPt [3]
newCen = newCenter (P[2], P[3], cofCenMove)
P[2] = newCen
prevousPt = newCen

if P[1]/10 == 0:
GG = randint (0,1)
else:
GG = P[1]/10
for i in range (GG):
closTree = closestTreeToPoint (P[2], Trees)
closTree = closTree[0]
cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)
cmds.planarSrf (d=1)
#print "closTree"
#print closTree
for i in range (2):
closGrave = closestPointToPoints2 (closTree, allGraves)
closGraveName = [closGrave[0],closGrave[1]]
allGraves.remove (closGraveName)
if len(allGraves)==1:
return "Done."
if len(Trees) < closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]">= MAX:
PN = 0
P2 = closGrave[1]
allGraves.remove (closGraveName)
break
else:
P2 = P[2]
cube = cmds.polyCube (w =size*(PN/MAX) ,h=size*(PN/MAX) ,d=size*(PN/MAX))
CUBES.append (cube[0])
cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)
allGraves.remove (closGraveName)
cmds.curve( p=[(P2[0],P2[1], P2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )
prevousPt = closGravePos
if len(allGraves)==1:
return "Done."

cmds.refresh()

######ISLAM######
closReligion = closestPointToPoints1 (I[2], ALLRELIG) #dist - [3]
if I[1] >= closReligion[1]:
I.append (midPtWater (self.otherW, self.otherM, I[2], self.ceremony, self.entrance, self.Aislam, closReligion[2])) # midPt [3]
else:
closPT = closReligion[2]
g = I[2]
xx = g[0] - (closPT[0] - g[0])
yy = g[1] - (closPT[1] - g[1])
ptt = [xx, yy, 0]
I.append (midPtWater (self.otherW, self.otherM, I[2], self.ceremony, self.entrance, self.Aislam, ptt)) # midPt [3]
newCen = newCenter (I[2], I[3], cofCenMove)
I[2] = newCen
prevousPt = newCen

if I[1]/10 == 0:
GG = randint (0,1)
else:
GG = I[1]/10
for i in range (GG):
closTree = closestTreeToPoint (I[2], Trees)
closTree = closTree[0]
cmds.circle (c=(closTree[0], closTree[1], closTree[2]), r=1.5)
cmds.planarSrf (d=1)
#print "closTree"
#print closTree
for i in range (2):
closGrave = closestPointToPoints2 (closTree, allGraves)
closGraveName = [closGrave[0],closGrave[1]]
allGraves.remove (closGraveName)
if len(allGraves)==1:
return "Done."
if len(Trees) < closgrave =" closestPointToPoints2" closgravepos =" closGrave[1]" closgravename =" [closGrave[0],closGrave[1]]">= MAX:
IN = 0
I2 = closGrave[1]
allGraves.remove (closGraveName)
break
else:
I2 = I[2]
cube = cmds.polyCube (w =size*(IN/MAX) ,h=size*(IN/MAX) ,d=size*(IN/MAX))
CUBES.append (cube[0])
cmds.move (closGravePos[0], closGravePos[1], closGravePos[2], cube)
allGraves.remove (closGraveName)
cmds.curve( p=[(I2[0],I2[1], I2[2]), (closGravePos[0], closGravePos[1], closGravePos[2])] )
prevousPt = closGravePos
if len(allGraves)==1:
return "Done."

cmds.refresh()

#duplicate and move all the cubes to see the growth progress after running the script
sss = cmds.duplicate( CUBES )
gr = cmds.group( sss )
cmds.select (gr, r=True)
cmds.move( 0, 300*N, 0 )

#run the recursion again if there are more elements in the locators list then 0
if len(allGraves)>0:
self.GROWTH (Way, minGrow, maxGrow, size, allGraves, M2, B2, C2, O2, H2, J2, P2, I2, N, MN, BN, CN, ON, HN, JN, PN, IN, CUBES, MAX = 150.0, cofCenMove=10)
else:
return "Done."

to run the script


g= graves()
allGraves=g.allLocs()
g.getAll()
g.changeNetBecauseRepulsive()
allGraves = g.allLocs1()
g.deleteTrees ()
#'Random'-1 'Normal'-2 'War'-3
g.GROWTH (1,3,80,1.5,allGraves,0,0,0,0,0,0,0,0)
maya file

Friday, August 7, 2009

Crowd system - first attempt

It doesn't always consider the obstacles as it should. Sometimes the objects are rejected (although they should be deleted) and sometimes they just ignore the obstacles.


#######################################################################################################
##
## Crowd System
## student Andreea Nica
##
## Active agents: predacious & small fishes
## Passive agents: edge & fishing line
##
## Rules:
## - fishes meet the edge - delete fishes
## - fishes meet the fishing line - delete fishes
## - small fish meets predacious - delete small fish
## - small fish meets small fish - scale 0.5
## - predacious meets predacious - duplicate predacious
##
#######################################################################################################


import maya.cmds as cmds
from random import *



def hit(hit, agent):
### define what to do when it some collision is detected
#all transformations are made only on the agent, as the hit object will perform the same queries on this agent
#if it hit the cube, ignore
if hit == "wall_rigid":
return
agentRole = cmds.getAttr(agent + ".role")
hitRole = cmds.getAttr(hit + ".role")
if hitRole == agentRole:
#check if both are bad
if hitRole == "bad":
#then delete - edge rule
cmds.delete('agent')
else:
#if good, increase size
cmds.delete( 'agent')
elif hitRole != agentRole:
if hitRole == "bad":
#means agent role is good (small fish)
cmds.scale(.5,.5,.5, agent, r=1)
elif hitRole == "good":
#means agent was bad (predacious - duplicate)
cmds.duplicate( 'agent')


class Agent:
def __init__(self, solver, role, position=(0,0,0), size=(3,3,3), color=(0,0,0), objType="cube", rigidType="active", bounciness=.6, collide=1):
#set agent atributes
self.bounciness = bounciness
self.collide = collide
self.rigidType = rigidType
self.solver=solver
self.role = role
self.initialScale = size
#create the agent and scale it
self.object = cmds.polyCube(ax=(0,0,1))
cmds.scale(size[0], size[1], size[2])
#apply a color to the agent
#set the object color
#sh = createShader(color, transparency=0, type="lambert")
#applyShaderOnObject(self.object[0], sh)

#create the rigid body
self.rigid = cmds.rigidBody(self.object,
name=self.object[0] + "_rigid",
p=position,
b=self.bounciness,
impulse=(0,0,0),
sio=objType, #stand in object
cc = 1, #contact count
cp = 1, #contact position
cn = 1, #contact name
solver=self.solver)

#add attribute to the rigid body to store the type of agent
cmds.select(self.rigid, r=1)
cmds.addAttr(ln="role", dt="string", keyable=1)
cmds.setAttr(self.rigid + ".role", "good", type="string")

if self.rigidType == "active":
cmds.setAttr(self.rigid + ".active", 1)
else:
cmds.setAttr(self.rigid + ".active", 0)

#apply the expression
self.applyExpression()

def applyExpression(self):
"Function to apply the expression to the agent"
#first disconnect the rotation attributes because we want to controll it via expressions
cmds.disconnectAttr (self.rigid + "ry.output", self.object[0] + ".rotateY")
cmds.disconnectAttr (self.rigid + "rx.output", self.object[0] + ".rotateX")
cmds.disconnectAttr (self.rigid + "rz.output", self.object[0] + ".rotateZ")
# Create expression for VehicleF with a random multiplier added to the expression.
randX = random.uniform(-3,3)
randY = random.uniform(3,-3)
####COMPOSE THE EXPRESSION STRING

#now put the text above in a python string
#the first lines define how the agent will wander
expString = "// Set wander motion of vehicle and add random multipliers.\n"
expString += "%s.impulseX" % self.rigid
expString += " = sin(time * %f);\n" % randX
expString += "%s.impulseY" % self.rigid
expString += " = (noise(time) * %f);\n\n" % randY
#the second part, how it rotates according to the direction it is going (velocity vector)
expString += "// Set orientation of Vehicle according to the velocity direction.\n"
expString += "float $fVel[];\n"
expString += "$fVel = `getAttr %s.velocity`;\n\n" % (self.rigid)
expString += "%s.rotateX = 0;\n" % self.object[0]
expString += "%s.rotateZ = atan2d( $fVel[0], $fVel[1] );\n" % (self.object[0])
expString += "%s.rotateY = 0;\n\n" % self.object[0]
#the third part, checking bumps on other agents
expString += "//checking bumps on other agents\n"
expString += "string $lastHit;\n"
expString += "if (%s.contactCount > 0){\n" % self.rigid
expString += " int $contactCount = `getAttr %s.contactCount`;\n" % self.rigid
expString += " $lastHit = `getAttr %s.contactName[0]`;\n" %self.rigid
expString += ' string $rigid = "%s";\n' % self.rigid
expString += ' python("hit(\'"+$lastHit+"\', \'"+ $rigid +"\')");\n'
expString += "};//endif\n"

self.expString = expString
cmds.expression(s=expString)



class Crowd:
def __init__(self):
"Initialize attributes"
#objects for obstacles
self.collectObjects = []
#number of vehicles
self.vNumber = 0
#boolean for obstacles
self.obst = 0
#boolean for global forces
self.gforces = 0
#dictionary for UI elements
self.UIelements = {}
#set timeline
cmds.playbackOptions(min= 1, max=1000)
#get selected objects
self.collectObjects = cmds.ls(sl=1)
#start UI
self.crowdSystemUI()

def crowdSystemUI(self):
"Assembles and displays the UI for the Crowd System"
self.UIelements["window"] = cmds.window(title="Crowd System",
widthHeight=(300, 200)
)

self.UIelements["form"] = cmds.formLayout()
txt = cmds.text(label="Number of Vehicles")
collection = cmds.radioCollection()
radiob1 = cmds.radioButton(label="10", data=1, changeCommand=self.changeVnumber)
radiob2 = cmds.radioButton(label="20", onCommand="vNumber = 20")
cmds.setParent(upLevel=1)
cmds.setParent(upLevel=1)

txtOB = cmds.text(label="Obstacles")
collection2 = cmds.radioCollection()
radiob3 = cmds.radioButton(label="On", changeCommand=self.changeObst)
radiob4 = cmds.radioButton(label="Off")
cmds.setParent(upLevel=1)
cmds.setParent(upLevel=1)

txtGF = cmds.text( label = "Global Forces")
collection3 = cmds.radioCollection()
radiob5 = cmds.radioButton(label= "On" ,changeCommand =self.changeGforces)
radiob6 = cmds.radioButton(label="Off")
cmds.setParent(upLevel=1)
cmds.setParent(upLevel=1)

cmds.radioCollection(collection, edit=1, select=radiob1)
cmds.radioCollection(collection2, edit=1, select=radiob4)
cmds.radioCollection(collection3, edit=1, select=radiob6)

# Place Vehicle options
form = self.UIelements["form"]
cmds.formLayout(form,
edit=1,
attachForm= [
( txt, "top", 20),
(txt ,"left", 70),
(radiob1,"top", 10),
(radiob1,"left", 20),
(radiob2,"top", 30),
(radiob2,"left", 20)
]
)
# Place environment options
cmds.formLayout(form,
edit=1,
attachForm= [
(txtOB, "top", 80),
(txtOB, "left", 80),
(radiob3, "top", 80),
(radiob3, "left", 150),
(radiob4 ,"top", 80),
(radiob4, "left", 190),
(txtGF, "top", 110),
(txtGF, "left", 63),
(radiob5, "top", 110),
(radiob5, "left", 150),
(radiob6, "top", 110),
(radiob6, "left", 190)
]
)
# Create buttons
button1 = cmds.button(label = "Create")
button2 = cmds.button(label = "Cancel")

# Place buttons in the window
cmds.formLayout(form,
edit=1,
attachForm =[
(button1, "bottom", 10),
(button1, "left", 185),
(button2, "bottom", 10),
(button2, "right", 10)
]
)
# Add the commands to the buttons.
cmds.button(button1, edit=1, command=self.createCrowd )
cmds.button(button2, edit=1, command=self.deleteUI )

cmds.showWindow(self.UIelements["window"])
## UI help functions
def changeVnumber(self, *args):
if args[0] == "true":
self.vNumber = 10
else:
self.vNumber = 20
print "vNumber:",self.vNumber
def changeObst(self, *args):
if args[0] == "true":
self.obst = 1
else:
self.obst = 0
print "Obst:", self.obst
def changeGforces(self, *args):
if args[0] == "true":
self.gforces = 1
else:
self.gforces = 0
print "gforces:", self.gforces
def deleteUI(self, *args):
cmds.deleteUI(self.UIelements["window"])
self.UIelements["window"] = ""

## MAIN METHODS
def createCrowdSolver(self):
"Creates the main rigidSolver for the elements in the Crowd System"
self.crowdSolver = cmds.rigidSolver( create=1,
current=1,
name="crowdSolver",
velocityVectorScale=0.5,
displayVelocity=1
)
cmds.setAttr(self.crowdSolver + ".allowDisconnection", 1)

def createVehicle(self, vType, N):
"Creates one vehicle and add fields and expressions to it."
#first verify if the vehicle is of type follower (F) or leader (L)
#and set the size of the cube according to the type (leaders are bigger! :)
if vType == "F":
w = 1 #width
h = .5 #height
d = 1 #depth
else:
w = 5
h = 3
d = 5

#creates the basic cube
vehicle = cmds.polyCube(w=w,d=d,h=h)

#create a vehicle force to the agent
field = cmds.radial(position = [0,0,0],
magnitude = 50, #positive magnitude means repoulsion, negative magnitude means atraction
attenuation = 0.3,
maxDistance = 8.0
)

cmds.parent(field[0],vehicle[0])
cmds.hide(field)

if vType == "L":
Lfield = cmds.radial(position = [0,0,0],
magnitude =-1,
attenuation = .2,
maxDistance = 50
)
cmds.parent(Lfield[0],vehicle[0])
cmds.hide(Lfield)


#convert it to a rigid body with random placement
rigid = cmds.rigidBody(
vehicle[0],
n="rigidVeh1%s%d" % (vType, N),
active=1,
mass=1,
bounciness=0,
damping=1.5,
position=(uniform(-70,70),uniform(-70,70),0),
impulse=(0,0,0),
standInObject="cube",
solver=self.crowdSolver
)

#disconnect the rotation attributes of the vehicle
cmds.disconnectAttr(rigid + "rx.output", vehicle[0]+".rx")
cmds.disconnectAttr(rigid + "ry.output", vehicle[0]+".ry")
cmds.disconnectAttr(rigid + "rz.output", vehicle[0]+".rz")

#add expression for movement
randX = uniform(-3,3)
randY = uniform(-3,3)

expString = "%s.impulseX = sin(time * %f);" % (rigid, randX)
expString += "%s.impulseY = (noise(time)*%f);" % (rigid, randY)
expString += "float $Vel[] = `getAttr %s.velocity`;" % rigid
expString += "%s.rotateX = 0;" % vehicle[0]
expString += "%s.rotateY = 0;" % vehicle[0]
expString += "%s.rotateZ = atan2d( $Vel[0], $Vel[2] );" % vehicle[0]

cmds.expression(s=expString)

if vType== "F":
return [rigid,field]
else:
return [rigid, field, Lfield]



def createCrowd(self, *args):
"Method to assemble the whole system"
#creates a rigidSolver to add the vehicle to
self.createCrowdSolver()
#turn on the velocity arrow
cmds.setAttr(self.crowdSolver + ".displayVelocity", 1)
cmds.setAttr(self.crowdSolver + ".scaleVelocity", .5)

#allow disconnections on the rigidSolver
cmds.setAttr(self.crowdSolver + ".allowDisconnection", 1)



##create amount of agents
if self.vNumber == 10: #vNumber = number of vehicles
FNumber = 8 #followers
LNumber = 2 #leaders
elif self.vNumber ==20:
FNumber =18
LNumber =2

#create empty lists to store followers and leaders
followers = []
leaders = []


#creating the followrs
for i in range(FNumber):
v = self.createVehicle("F",i)
followers.append(v)
#creating the leaders
for i in range(LNumber):
v = self.createVehicle("L",i)
leaders.append(v)

#CONNECT THE FIELDS TO THE RIGID BODIES (AGENTS)
#1) connect the leaders (predacious fishes) to the followers (small fishes)
for i in range (LNumber):
Lfield = leaders[i][2]
lfield = leaders[i][1]
for j in range(FNumber):
Frigid = followers[j][0]
#connect the fields
cmds.connectDynamic(Frigid, fields=Lfield)
cmds.connectDynamic(Frigid, fields=lfield)

#2) connect followers (small fishes) to leaders (predacious fishes)
for i in range(FNumber):
Ffield = followers[i][1]
for j in range(LNumber):
Lrigid = leaders[j][0]
cmds.connectDynamic(Lrigid, fields=Ffield)

#3) connect leaders (predacious fishes) to leaders ((predacious fishes))
for i in range(LNumber):
Lfield = leaders[i][1]
for j in range(LNumber):
if i==j: continue
L1rigid = leaders[j][0]
cmds.connectDynamic(L1rigid, fields=Lfield)

#4) connect followers (small fishes) to followes (small fishes)
for i in range(FNumber):
Ffield = followers[i][1]
for j in range(FNumber):
if i==j: continue
F1rigid = followers[j][0]

cmds.connectDynamic(F1rigid, fields=Ffield)





#create obstacles if I want
if self.obst: self.collectObstacles()

#disable solver warnings
cmds.cycleCheck(e=0)

def collectObstacles(self):
"Collects all obstacles"
if len(self.collectObjects) == 0:
#there is nothing selected
return "There is nothing selected!"

for o in self.collectObjects:
cmds.rigidBody( o,
passive=1,
name=o+"_rb",
bounciness=2.0 )






### create an instance of this class
c = Crowd()

Thursday, August 6, 2009

Assignment01B

I managed to make the part with the rotation and the scale of the square but when i tried to make it recursive i could not manage to select all the time the last square created. I tried to make a list where to store all of them and always refer to it from the list but it doesn't work as well.


###########################
###assignment01B
###student Andreea Nica


import maya.cmds as cmds


def squares (it,i):

##select the needed sides of the square
t=i-1
cmds.select('nurbsSquare%d'%t)
isSides = cmds.filterExpand(sm=9)

line1 = isSides[0]
line2 = isSides[1]

##get the point on the side of the square at the specific proportion
poc1 = cmds.pointOnCurve( line1, pr=perc1, top=True, p=True ) #rightnurbsSquare
poc2 = cmds.pointOnCurve( line2, pr=perc2, top=True, p=True )

##find the corner of the square in order to find the exact position where the second square will be moved
perc3 =1
corner = cmds.pointOnCurve( line2, pr=perc3, top=True, p=True )

##create the second square

cmds.duplicate('nurbsSquare%d'%t)
if t <> 1:
SquaresList.append('nurbsSquare%d'%t)

##find the position where the last square will be placed
x = corner[0]-poc1[0]
xx=float(x/3)
y= corner[0]
yy=float(y/3)

##move the square
cmds.move (xx,yy,0, 'nurbsSquare%d'%i)
cmds.select('nurbsSquare%d'%i)

##find the pivot for scale and rotation
x1=float(poc2[0])
y1=float(poc2[1])

##scale and rotate
cmds.scale( .8, .8, .8, 'nurbsSquare%d'%i, pivot=(x1, y1, 0), absolute=True )
cmds.rotate(0,0,'20deg',pivot=(x1, y1, 0),absolute=True)

##select only the last square created
cmds.select( clear=True )
cmds.select('nurbsSquare%d'%i)

cmds.hide('nurbsSquare%d'%t)

##check if the last iteration was reached or not
if it == 0 :
#stop
cmds.showHidden( all=True )
print 'gataaaaaaaaaaaaaaaa'
return "Done."
else:
#did not finish yet
#remove one unit (count down)
it -= 1
i += 1

squares(it,i)

##create the initial square
initialSquare = cmds.nurbsSquare( sl1=10, sl2=10 )
isSides = cmds.filterExpand(sm=9)
print isSides
perc1 = 1./3
perc2 = 2./3

SquaresList = []
SquaresList.append('nurbsSquare1')
print SquaresList
##call the recursive function

squares(4,2)

print 'Final List'
print SquaresList