uploaded our presentation slides for now… will compile them into a board and e-mail it to you by the may 17th.
FINAL PRESENTATION – Juney + Jaeyual
juney jaeyual 20120510 Final Project
import rhinoscriptsyntax as rs
from random import choice
import random
from System.Drawing import Color
Xnumber = 3
Ynumber = 3
Znumber = 3
smallunitpercentage = 0.7
iterations = 1
# 1. CELL (Condition/Rules)
class Cell():
def __init__(self, x, y, z):
self.X = x
self.Y = y
self.Z = z
self.Pos = [x,y,z]
self.Visibility = False # Cell’s visibility(True means On/Alive, False means Off/Dead)
self.N = 0 # Number of Neighboring Cells
def getVisibility(self):
return self.Visibility
def setVisibility(self, v): # v will be True or False
self.Visibility = v
def getN(self):
return self.N
def setN(self, n): # n is the number of neighbors
self.N = n
def getX(self):
return self.X
def getY(self):
return self.Y
def getZ(self):
return self.Z
def getPos(self):
return self.Pos
def updateVisibility(self):
if (self.Visibility == True): # ALIVE cell = apply rule1_visibility
self.rule1_Visibility()
else: #(self.Visibility == False) # DEAD cell = apply rule2_visibility
self.rule2_Population()
def rule1_Visibility(self):
if (self.N < 10):
self.setVisibility(False)
elif (self.N < 18):
self.setVisibility(True)
else:
self.setVisibility(False)
def rule2_Population(self):
if (self.N == 0 or self.N == 5 or self.N == 10):
self.setVisibility(True)
elif (self.N < 10):
self.setVisibility(False)
elif (self.N < 18):
self.setVisibility(True)
else:
pass
# 2. SET OF CELLS
class SetOfCells():
def __init__(self):
self.ListCells = [] # list containing all cell classes
self.generateCells() # these two functions automatically run when the class is initiated.
self.setSeeds()
def generateCells(self):
xCellList = [] # this is the outer list of nested list(ListCells)
for x in range(Xnumber):
yCellList = [] # this is the inner list of a nested list(ListCells)
for y in range(Ynumber):
zCellList = []
for z in range(Znumber):
c = Cell(x,y,z)
zCellList.append(c)
yCellList.append(zCellList)
xCellList.append(yCellList)
self.ListCells = xCellList # returns the nested list into self.ListCells
def setSeeds(self): # this function defines initial states of cells
for x in range(Xnumber):
for y in range(Ynumber):
for z in range(Znumber):
cell = self.ListCells[x][y][z]
if (x > 0 and x < Xnumber and y > 0 and y < Ynumber and z > 0 and z < Znumber): # initial condition
cell.setVisibility(True)
else:
cell.setVisibility(False)
def getCells(self): # getter for self.ListCells
return self.ListCells
# 3. AUTOMATA CONTROLLER
class AutomataController():
def __init__(self):
self.ListCells = []
self.SC = SetOfCells() # generate cells and contain them in a list
self.M = AutomataModel() # initiates AutomataModel
def initiateModel(self):
self.ListCells = self.SC.getCells() # gets the generated cells
self.M.setListCells(self.ListCells) # passes the list of cells into AutomataModel
self.M.repeatProcesses() # calls repeating processes
# 4. AUTOMATA MODEL
class AutomataModel():
def __init__(self):
self.ListCells = [] # will be passed by AutomataConroller
self.V = AutomataView() # initiates View class
def setListCells(self, lc): # s etter
self.ListCells = lc
def repeatProcesses(self): # repeats the two processes and make geometries
iterationNumber = iterations
for i in range(iterationNumber):
self.checkNeighboringCells()
self.updateCellVisibility()
self.V.setListCells(self.ListCells) # passes self.ListCells into View
points = self.V.getCoordinates() # makes Geometries
center = self.V.getCenter()
self.V.makeUnits (points, center)
self.V.moveGeometries() # deletes geometries for the next iteration
def checkNeighboringCells(self): # the “1)” process
for i in range(1,Xnumber-1):
for j in range(1,Ynumber-1):
for k in range(1,Znumber-1):
cell = self.ListCells[i][j][k] # gets each cell information
x = cell.getX()
y = cell.getY()
z = cell.getZ()
n = self.calculateNumberOfNeighboringCells(x,y,z)
cell.setN(n)
def calculateNumberOfNeighboringCells(self, x, y, z):
cell0 = self.ListCells[x-1][y-1][z-1]
cell1 = self.ListCells[x][y-1][z-1]
cell2 = self.ListCells[x+1][y-1][z-1]
cell3 = self.ListCells[x-1][y][z-1]
cell4 = self.ListCells[x][y][z-1]
cell5 = self.ListCells[x+1][y][z-1]
cell6 = self.ListCells[x-1][y+1][z-1]
cell7 = self.ListCells[x][y+1][z-1]
cell8 = self.ListCells[x+1][y+1][z-1]
cell9 = self.ListCells[x-1][y-1][z]
cell10 = self.ListCells[x][y-1][z]
cell11 = self.ListCells[x+1][y-1][z]
cell12 = self.ListCells[x-1][y][z]
cell13 = self.ListCells[x+1][y][z]
cell14 = self.ListCells[x-1][y+1][z]
cell15 = self.ListCells[x][y+1][z]
cell16 = self.ListCells[x+1][y+1][z]
cell17 = self.ListCells[x-1][y-1][z+1]
cell18 = self.ListCells[x][y-1][z+1]
cell19 = self.ListCells[x+1][y-1][z+1]
cell20 = self.ListCells[x-1][y][z+1]
cell21 = self.ListCells[x][y][z+1]
cell22 = self.ListCells[x+1][y][z+1]
cell23 = self.ListCells[x-1][y+1][z+1]
cell24 = self.ListCells[x][y+1][z+1]
cell25 = self.ListCells[x+1][y+1][z+1]
v0 = cell0.getVisibility()
v1 = cell1.getVisibility()
v2 = cell2.getVisibility()
v3 = cell3.getVisibility()
v4 = cell4.getVisibility()
v5 = cell5.getVisibility()
v6 = cell6.getVisibility()
v7 = cell7.getVisibility()
v8 = cell8.getVisibility()
v9 = cell9.getVisibility()
v10 = cell10.getVisibility()
v11 = cell11.getVisibility()
v12 = cell12.getVisibility()
v13 = cell13.getVisibility()
v14 = cell14.getVisibility()
v15 = cell15.getVisibility()
v16 = cell16.getVisibility()
v17 = cell17.getVisibility()
v18 = cell18.getVisibility()
v19 = cell19.getVisibility()
v20 = cell20.getVisibility()
v21 = cell21.getVisibility()
v22 = cell22.getVisibility()
v23 = cell23.getVisibility()
v24 = cell24.getVisibility()
v25 = cell25.getVisibility()
sum = v0+v1+v2+v3+v4+v5+v6+v7+v8+v9+v10+v11+v12+v13+v14+v15+v16+v17+v18+v19+v20+v21+v22+v23+v24+v25
return sum
def updateCellVisibility(self): # the “2)” process
for x in range(1,Xnumber-1):
for y in range(1,Ynumber-1):
for z in range(1,Znumber-1):
cell = self.ListCells[x][y][z]
cell.updateVisibility()
# 5. AUTOMATA VIEW
class AutomataView():
def __init__(self):
self.ListCells = [] # will be passed by AutomataModel
self.S = smallunit ()
self.B = bigunit ()
def setListCells(self, lc):
self.ListCells = lc
def getCoordinates(self):
ptlist = []
for x in range(Xnumber):
for y in range(Ynumber):
for z in range(Znumber):
cell = self.ListCells[x][y][z]
visibility = cell.getVisibility()
if visibility == True:
pos = cell.getPos()
ptlist.append (pos)
length = len (ptlist)
return ptlist
def getCenter(self):
ptlist = []
for x in range(Xnumber):
for y in range(Ynumber):
for z in range(Znumber):
cell = self.ListCells[x][y][z]
visibility = cell.getVisibility()
if visibility == True:
pos = cell.getPos()
shift = 0.5
center = [pos[0]+shift, pos[1]+shift, pos[2]]
ptlist.append (center)
print ptlist
return ptlist
def makeUnits (self, points, center):
length = len (points)
print “point list =”, points
print “point list length =”, length #prints # of POINTS
percent = smallunitpercentage * length # set PERECNTAGE
minority = int(percent) # count of input percentage of all POINTS
print “minority # =”, minority
majority = length – minority # count of remaining percentage of all POINTS
minorityrandomlist = []
for i in range(minority):
randomvalues = random.randint (0, length-1)
minorityrandomlist.append (randomvalues)
minorityrandomlist = list (set(minorityrandomlist)) #removes duplicate numbders
minorityrandomlist.sort() #sorts the list in ascending order
print “minority random list =”, minorityrandomlist
majorityrandomlist = []
for i in range (length):
majorityrandomlist.append (i)
print “majority random list =”, majorityrandomlist
for x in minorityrandomlist:
majorityrandomlist.remove (x)
self.S.makeunit (minorityrandomlist, points, center)
self.B.makeunit (majorityrandomlist, points, center)
def moveGeometries(self):
#rs.Sleep(1000)
allObjIDs = rs.AllObjects()
trans = [0,0,Znumber-1]
rs.MoveObjects(allObjIDs, trans)
###
# CLASS FOR MAKING SMALL UNITS
class smallunit():
def __init__(self):
self.slab = slabmaker()
self.wall = wall()
self.glass = glass()
self.mullion = mullion_s()
self.railing = railing()
self.randomangle = randomangle()
self.slabthickness = 0.05
self.wallthickness = 0.02
self.glassoffset = 0.02
self.railingheight = 0.1
self.floorheight = 0.5
self.xdimension = 0.5
self.ydimension = 1
def makeunit (self, unitnumber, points, center):
for r in unitnumber :
rs.AddLayer(“Small Unit”, Color.Red)
rs.CurrentLayer(“Small Unit”)
x = points [r][0]
y = points [r][1]
z = points [r][2]
pt0 = [x, y, z]
pt1 = [x, y + self.ydimension , z]
pt2 = [x + self.xdimension, y + self.ydimension, z]
pt3 = [x + self.xdimension, y, z]
rectangle = rs.AddRectangle(points[r], self.xdimension, self.ydimension)
slabs = self.slab.slabmaker (rectangle, self.slabthickness, self.floorheight)
wall1 = self.wall.wall(pt0, self.wallthickness, self.ydimension, self.floorheight, self.slabthickness)
wall2 = self.wall.wall(pt2, -self.wallthickness, -self.ydimension, self.floorheight, self.slabthickness)
glass1 = self.glass.glass(pt2, pt1, pt0, self.glassoffset, self.floorheight, self.slabthickness)
glass2 = self.glass.glass(pt0, pt3, pt1, self.glassoffset, self.floorheight, self.slabthickness)
mullion1 = self.mullion.mullion(pt2, pt1, pt0, -self.glassoffset, self.floorheight, self.slabthickness)
mullion2 = self.mullion.mullion(pt0, pt3, pt1, self.glassoffset, self.floorheight, self.slabthickness)
railing = self.railing.railingmaker(rectangle, self.railingheight, self.floorheight)
angle = self.randomangle.generator()
verticalshift = [0, 0.5]
shift = choice(verticalshift)
path = [0, 0, shift]
rs.RotateObjects(slabs, center[r], angle)
rs.RotateObjects(wall1, center[r], angle)
rs.RotateObjects(wall2, center[r], angle)
rs.RotateObjects(glass1, center[r], angle)
rs.RotateObjects(glass2, center[r], angle)
rs.RotateObjects(mullion1, center[r], angle)
rs.RotateObjects(mullion2, center[r], angle)
rs.RotateObjects(railing, center[r], angle)
rs.MoveObjects(slabs, path)
rs.MoveObjects(wall1, path)
rs.MoveObjects(wall2, path)
rs.MoveObjects(glass1, path)
rs.MoveObjects(glass2, path)
rs.MoveObjects(mullion1, path)
rs.MoveObjects(mullion2, path)
rs.MoveObjects(railing, path)
#rs.DeleteObject(path)
rs.DeleteObject(rectangle)
# CLASS FOR MAKING BIG UNITS
class bigunit():
def __init__(self):
self.slab = slabmaker()
self.wall = wall()
self.glass = glass()
self.mullion = mullion_b()
self.railing = railing()
self.randomangle = randomangle()
self.slabthickness = 0.05
self.wallthickness = 0.02
self.glassoffset = 0.02
self.railingheight = 0.1
self.floorheight = 1
self.xdimension = 1
self.ydimension = 1
def makeunit (self, unitnumber, points, center):
for r in unitnumber :
rs.AddLayer(“Large Unit”, Color.Blue)
rs.CurrentLayer(“Large Unit”)
x = points [r][0]
y = points [r][1]
z = points [r][2]
pt0 = [x, y, z]
pt1 = [x, y + self.ydimension , z]
pt2 = [x + self.xdimension, y + self.ydimension, z]
pt3 = [x + self.xdimension, y, z]
rectangle = rs.AddRectangle(points[r], self.xdimension, self.ydimension)
slab = self.slab.slabmaker (rectangle, self.slabthickness, self.floorheight)
wall1 = self.wall.wall(pt0, self.wallthickness, self.ydimension, self.floorheight, self.slabthickness)
wall2 = self.wall.wall(pt2, -self.wallthickness, -self.ydimension, self.floorheight, self.slabthickness)
glass1 = self.glass.glass(pt2, pt1, pt0, self.glassoffset, self.floorheight, self.slabthickness)
glass2 = self.glass.glass(pt0, pt3, pt1, self.glassoffset, self.floorheight, self.slabthickness)
mullion1 = self.mullion.mullion(pt2, pt1, pt0, -self.glassoffset, self.floorheight, self.slabthickness)
mullion2 = self.mullion.mullion(pt0, pt3, pt1, self.glassoffset, self.floorheight, self.slabthickness)
railing = self.railing.railingmaker(rectangle, self.railingheight, self.floorheight)
angle = self.randomangle.generator()
slab = rs.RotateObjects(slab, center[r], angle)
wall1 = rs.RotateObjects(wall1, center[r], angle)
wall2 = rs.RotateObjects(wall2, center[r], angle)
glass1 = rs.RotateObjects(glass1, center[r], angle)
glass2 = rs.RotateObjects(glass2, center[r], angle)
mullion1 = rs.RotateObjects(mullion1, center[r], angle)
mullion2 = rs.RotateObjects(mullion2, center[r], angle)
railing = rs.RotateObjects(railing, center[r], angle)
rs.DeleteObject(rectangle)
# CLASS FOR MAKING SLABS
class slabmaker():
def __init__(self):
pass
def slabmaker(self, curve, slabthickness, floorheight):
path1 = rs.AddLine([0,0,0], [0,0,-slabthickness]) # Slab Thickness
extrusion = rs.ExtrudeCurve (curve, path1)
rs.CapPlanarHoles(extrusion)
copy = rs.CopyObject(extrusion, [0,0,floorheight])
return extrusion, copy
rs.DeleteObject(curve)
rs.DeleteObject(path1)
# CLASS FOR MAKING WALLS
class wall():
def __init__(self):
pass
def wall(self, point1, wallthickness, walllength, floorheight, slabthickness):
rs.AddLayer(“Wall”, Color.White)
rs.CurrentLayer(“Wall”)
rectangle = rs.AddRectangle(point1, wallthickness, walllength)
path = rs.AddLine([0,0,0], [0,0,floorheight-slabthickness])
extrusion = rs.ExtrudeCurve (rectangle, path)
rs.CapPlanarHoles(extrusion)
return extrusion
rs.DeleteObjects(rectangle)
rs.DeleteObject(path)
# CLASS FOR MAKING GLASS
class glass():
def __init__(self):
pass
def glass(self, point1, point2, directionpoint, offset, floorheight, slabthickness):
rs.AddLayer(“Glass”, Color.Gold)
rs.CurrentLayer(“Glass”)
line = rs.AddLine(point1, point2)
offset = rs.OffsetCurve(line, directionpoint, offset)
path = rs.AddLine([0,0,0], [0,0,floorheight-slabthickness])
extrusion = rs.ExtrudeCurve (offset, path)
return extrusion
rs.DeleteObjects(offset)
rs.DeleteObjects(line)
rs.DeleteObject(path)
# CLASS FOR MAKING MULLION
class mullion_s():
def __init__(self):
pass
def mullion(self, point1, point2, directionpoint, offset, floorheight, slabthickness):
rs.AddLayer(“Mullion”, Color.Aqua)
rs.CurrentLayer(“Mullion”)
line = rs.AddLine(point1, point2)
points = rs.DivideCurve(line, 2, False, True)
print points
pt1 = rs.AddPoint(points[1])
pt1_1 = rs.CopyObject(pt1, [0,0,floorheight-slabthickness])
mline_1 = rs.AddLine(pt1, pt1_1)
pt4 = rs.CopyObject(pt1, [0,offset,0])
height = rs.AddLine(pt1, pt4)
rec1 = rs.ExtrudeCurve(mline_1, height)
mullions = [rec1]
return mullions
rs.DeleteObjects(points)
rs.DeleteObject(line)
rs.DeleteObject(pt1)
rs.DeleteObject(pt1_1)
rs.DeleteObject(mline_1)
rs.DeleteObject(pt4)
rs.DeleteObject(height)
class mullion_b():
def __init__(self):
pass
def mullion(self, point1, point2, directionpoint, offset, floorheight, slabthickness):
rs.AddLayer(“Mullion”, Color.Aqua)
rs.CurrentLayer(“Mullion”)
line = rs.AddLine(point1, point2)
points = rs.DivideCurve(line, 4, False, True)
print points
pt1 = rs.AddPoint(points[1])
pt2 = rs.AddPoint(points[2])
pt3 = rs.AddPoint(points[3])
pt1_1 = rs.CopyObject(pt1, [0,0,floorheight-slabthickness])
pt2_1 = rs.CopyObject(pt2, [0,0,floorheight-slabthickness])
pt3_1 = rs.CopyObject(pt3, [0,0,floorheight-slabthickness])
mline_1 = rs.AddLine(pt1, pt1_1)
mline_2 = rs.AddLine(pt2, pt2_1)
mline_3 = rs.AddLine(pt3, pt3_1)
pt4 = rs.CopyObject(pt1, [0,offset,0])
height = rs.AddLine(pt1, pt4)
rec1 = rs.ExtrudeCurve(mline_1, height)
rec2 = rs.ExtrudeCurve(mline_2, height)
rec3 = rs.ExtrudeCurve(mline_3, height)
mullions = [rec1, rec2, rec3]
return mullions
rs.DeleteObjects(points)
rs.DeleteObject(line)
rs.DeleteObject(pt1)
rs.DeleteObject(pt2)
rs.DeleteObject(pt3)
rs.DeleteObject(pt1_1)
rs.DeleteObject(pt2_1)
rs.DeleteObject(pt3_1)
rs.DeleteObject(mline_1)
rs.DeleteObject(mline_2)
rs.DeleteObject(mline_3)
rs.DeleteObject(pt4)
rs.DeleteObject(height)
# CLASS FOR RAILING
class railing():
def __init__(self):
pass
def railingmaker(self, curve, railingheight, floorheight):
rs.AddLayer(“Railing”, Color.Gray)
rs.CurrentLayer(“Railing”)
path1 = rs.AddLine([0,0,0], [0,0,railingheight]) # Slab Thickness
railing = rs.ExtrudeCurve (curve, path1)
railing = rs.MoveObject(railing, [0,0,floorheight])
return railing
rs.DeleteObject(curve)
rs.DeleteObject(path1)
# CLASS FOR RANDOMLY ROTATING INPUT OBJECT
class randomangle():
def __init__(self):
pass
def generator(self):
rotation = [0, 90, 180, 270]
angle = choice(rotation)
print angle
return angle
# 6. RUN AUTOMATA CONTORLLER
ac = AutomataController()
ac.initiateModel()