#Johanna Kremser

import rhinoscriptsyntax as rs
import random as ran

#delete and start again
allobjs = rs.AllObjects()
rs.DeleteObjects(allobjs)

#variables
A = 5                       #A = Module size (distance between columns)
B = A/3                     #B = Distance of columns to end of plate
thick = 0.2                 #thickness of all slabs
hgt = 2.7                   #height of room
xcol = 2                    #columns in x directions
ycol = 3                    #cloumns in y directions
levels = 5                  #number of floor plates
f_height = 0.5              #f_height = foundation height
f_size = 0.8                #f_size = foundations edge size

grho = thick+f_height       #foundation + plate height
hb = (levels-1)*(thick+hgt) #height building
gh = thick+hgt              #height geschoss

#derived values:
center_pt = [A*(xcol-1)/2,A*(ycol-1)/2,f_height]       #insertion point of floor plate
p_width = A*(xcol-1)+2*B                               #width of floor plate (x)
p_lenght = A*(ycol-1) + f_size                         #lenght of floor plate (y)

#function to create box at centerpoint
def make_box(insertion=[0,0,0],xsize=10,ysize=10,zsize=10):
    #create a box
    corners = [[0,0,0], [xsize,0,0], [xsize,ysize,0], [0,ysize,0],
            [0,0,zsize], [xsize,0,zsize], [xsize,ysize,zsize], [0,ysize,zsize]]
    box=rs.AddBox(corners)
    rs.MoveObject(box, (-xsize/2,-ysize/2,0))
    rs.MoveObject(box, insertion)
    return(box)

#function to create box at cornerpoint
def make_podest(insertion=[0,0,0],xsize=10,ysize=10,zsize=10):
    #create a box
    corners = [[0,0,0], [xsize,0,0], [xsize,ysize,0], [0,ysize,0],
            [0,0,zsize], [xsize,0,zsize], [xsize,ysize,zsize], [0,ysize,zsize]]
    box=rs.AddBox(corners)
    rs.MoveObject(box, insertion)
    return(box)

#function to create a field of foundations
def make_foundations(A=5.0, f_size=0.8, f_height=0.5, xcol=2, ycol=3):
    fns = []        #foundations list
    for i in range(xcol):
        for j in range(ycol):
            fns.append(make_box([i*A,j*A,0], f_size, f_size, f_height))
    return(fns)

#function to create a field of columns
def make_columns(A=5.0, level=0.7, thick=0.2, hgt=3.0, xcol=2, ycol=3):
    cls = []        #columns list
    for i in range(xcol):
        for j in range(ycol):
            cls.append(make_box([i*A,j*A,level], thick, thick, hgt))
    return(cls)

#function to create stairs
def make_stair(start,th,tt,steps,thick,s_width):
    pointlist=[start]
    for i in range(steps):
        pointlist.append([pointlist[-1][0],pointlist[-1][1],pointlist[-1][2]+th])
        pointlist.append([pointlist[-1][0]+tt,pointlist[-1][1],pointlist[-1][2]])
    pointlist.append([pointlist[-1][0],pointlist[-1][1],pointlist[-1][2]-thick])
    pointlist.append([pointlist[0][0],pointlist[0][1],pointlist[0][2]-thick])
    pointlist.append([pointlist[0][0],pointlist[0][1],pointlist[0][2]])
    s_outline=rs.AddPolyline(pointlist)
    path=rs.AddLine(start,[start[0],start[1]+s_width,start[2]])
    hull = rs.ExtrudeCurve(s_outline,path)
    rs.CapPlanarHoles(hull)
    return(hull)

#steps=12
#th=0.18
#tt=0.3
#thick=0.2
#s_width=1.2
#make_stair([0,0,0],th,tt,steps,thick,s_width)
#make_stair([steps*tt,s_width,steps*th],th,-tt,steps,thick,s_width)

rs.EnableRedraw(False)

#building dom-ino

def build_my_domino (A=A,B=B, level= thick+f_height, thick=thick, hgt=hgt, xcol=xcol, ycol=ycol):
    f_list = []         #list of foundations
    c_list = []         #list of columns
    p_list = []         #list of plates
    for i in range(levels):
        center_pt[2] = f_height + i*(thick+hgt)
        level = f_height + thick + (i-1)*(hgt+thick)
        if i==0:
            f_list = make_foundations(A, f_size, f_height, xcol, ycol)
        else:
            c_list.extend(make_columns(A, level, thick, hgt, xcol, ycol))
        p_list.append(make_box(center_pt, p_width, p_lenght, thick))
        
    #calculate stair values
    steps=int((hgt+thick)/0.17)
    if steps%2:
        steps=steps-1
    th=(hgt+thick)/steps
    if (th>0.19):
        steps=steps+2
        th=(hgt+thick)/steps
    #stair parameters
    tt=0.3                                        #step size
    s_width=1.2                                   #stair width
    pod_w=B                                       #depth of landing
    start=[pod_w,-(s_width*2+f_size/2),grho]          #startpoint of stair
    
    #loop to create staircase
    stair_1=[]
    for i in range(levels):
        start[2]=grho+i*gh                        #z-wert bei jeder Iteration neu gesetzt
        if i==levels-1:                           #last podest
            stair_1.append(make_podest([start[0]-pod_w,start[1]+s_width,start[2]-thick],pod_w,s_width,thick))      #soderpodest
        else:
            stair_1.append(make_podest([start[0]-pod_w,start[1],start[2]-thick],pod_w,s_width*2,thick))
            stair_1.append(make_stair(start,th,tt,int(steps/2),thick,s_width))
            stair_1.append(make_podest([start[0]+(steps/2)*tt,start[1],start[2]+(steps/2)*th-thick],pod_w,s_width*2,thick))
            stair_1.append(make_stair([start[0]+(steps/2)*tt,start[1]+s_width,start[2]+(steps/2)*th],th,-tt,int(steps/2),thick,s_width))
            
    return(f_list, c_list, p_list,stair_1)

(f_list, c_list, p_list,stair_1) = build_my_domino()

def domino_street(number,min_hgt,max_hgt):
    p_width=A*(xcol-1)+2*B
    for i in range(number):
        result=build_my_domino(A=A,B=A/3,hgt=hgt,level=ran.randint (min_hgt,max_hgt),xcol=xcol,ycol=ycol+ran.randint(0,6))
        (f_list,c_list,p_list,stair_1)=result
        for j in range(len(result)):
            rs.MoveObjects(result[j],[i*(p_width*2),0,0])

def domino_curved_street(number,min_hgt,max_hgt):
    crv=rs.AddCurve([[0,0,0],[150,-100,0],[250,200,0],[370,150,0]],3)
    rs.RebuildCurve(crv,1,number)
    pts=rs.CurvePoints(crv)
    for p in pts:
        result=build_my_domino(A=A,B=A/3,hgt=hgt,level=ran.randint (min_hgt,max_hgt),xcol=xcol,ycol=ycol+ran.randint(0,6))
        for j in range(len(result)):
            rs.MoveObjects(result[j],p)

if 0:
    (f_list,c_list,p_list,stair_1)=build_my_domino()

if 1:
    domino_street(5,4,10)
if 1:
    domino_curved_street(15,4,8)

#    rs.AddLayer("foundation")
#    rs.LayerColor("foundation", (220,60,60))
#    rs.ObjectLayer(f_list, "foundation")
#    rs.AddLayer("columns", (60,220,60))
#    rs.ObjectLayer(c_list, "columns")
#    rs.AddLayer("plates")
#    rs.LayerColor("plates", (60,60,220))
#    rs.ObjectLayer(p_list, "plates")
#    return(f_list,c_list,p_list)

#stairs
#steps = 14
#for i in range(steps):
#    make_box([i*0.3,0,i*0.18], 0.6,1.2,0.18)
