import rhinoscriptsyntax as rs import random as ran allobjs = rs.AllObjects() rs.DeleteObjects(allobjs) xsize = 10 # xsize lenght of box ysize = 12 # ysize lenght of box zsize = 6 # zsize lenght of box A = 3 # module size (distance between columns) B = A/3 # thick = 0.2 # thickness of all stabs hgt = 3.0 # height of the room xcol = 3 # columns in x direction ycol = 5 # columns in y direction levels = 6 # number of floor plates f_height = 0.5 # foundation size f_size = 0.8 # foundation edge size center_pt = [A*(xcol-1)/2,A*(ycol-1)/2, 0.5] # 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 centre point def make_box(insertion = [0,0,0],xsize = 10,ysize = 10,zsize = 10): 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)] mybox = rs.AddBox(corners) rs.MoveObject(mybox,(-xsize/2,-ysize/2,0)) rs.MoveObject(mybox, insertion) return(mybox) #function to create box at corner point def make_podest(insertion = [0,0,0],xsize = 10,ysize = 10,zsize = 10): 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)] mybox = rs.AddBox(corners) rs.MoveObject(mybox, insertion) return(mybox) #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 = [] 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, levels = 0.5, thick = 0.2, hgt = 3.0, xcol = 2, ycol = 3): cls = [] for i in range(xcol): for j in range(ycol): cls.append(make_box([i*A,j*A, levels], thick , thick , hgt)) return(cls) #for p in pts: # rs.AddPoint(p) #create arc walls def make_arc(insertion, rad, thick, hgt, orientation): segs=[] segs.append(rs.AddArc([0,0,0], rad, 180)) segs.append(rs.AddArc([0,0,0], rad - thick, 180)) segs.append(rs.AddLine([rad,0,0],[rad - thick,0,0])) segs.append(rs.AddLine([-(rad - thick),0,0],[-rad ,0,0])) crv = rs.JoinCurves(segs, delete_input=True) path = rs.AddLine([0,0,0],[0,0,hgt]) arc = rs.ExtrudeCurve(crv, path) rs.CapPlanarHoles(arc) rs.DeleteObject(crv) rs.DeleteObject(path) rs.RotateObject(arc,[0,0,0], orientation) rs.MoveObject(arc, insertion) return(arc) #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.DeleteObjects((s_outline, path)) rs.CapPlanarHoles(hull) return(hull) def make_terrace(A = 5.0, levels = 0.5, thick = 0.2, hgt = 3.0, xcol = 2, ycol = 3): cls = [] for i in range(xcol-1): for j in range(ycol-1): ori = ran.randint(0,6) if ori<4: orientation = ori*90 cls.append(make_arc([i*A+(A/2),j*A+(A/2), levels], A/2 , thick , hgt, orientation)) return(cls) #function to create fassade #building dom-ino def make_domino(A = A, B = B, thick = thick, hgt = hgt, levels = levels, xcol = xcol, ycol = ycol, f_height = f_height, f_size = f_size): 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)) if (i%2): c_list.extend(make_terrace(A, level, thick, hgt, xcol, ycol)) p_list.append(make_box(center_pt, p_width, p_lenght, thick)) level = f_height + thick + (levels-1)*(hgt+thick) c_list.extend(make_terrace(A, level, thick, hgt, xcol, ycol)) #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), f_height+thick] #startpoint of stair end = [pod_w,A*(s_width/2+f_size*2), f_height+thick] #loop to create staircase: stair_1 = [] for i in range(levels): start[2] = f_height+thick + i*(thick+hgt) #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)) #sonderpodest 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)) stair_2 = rs.RotateObjects(stair_1, center_pt, 180, (0,0,1), True) return(f_list,c_list,p_list, stair_1, stair_2) """ stair_2 = [] for i in range(levels): end[2] = f_height+thick + i*(thick + hgt) #z-wert bei jeder iteration neu gesetzt if i==levels-1: stair_2.append(make_stair(end, th, tt, int(steps), thick, s_width)) return(f_list,c_list,p_list,stair_1, stair_2) """ #(f_list,c_list,p_list, stair_1) = make_domino() """ rs.AddLayer("foundation") rs.LayerColor("foundation", (70, 40, 220)) rs.ObjectLayer(f_list,"foundation") rs.AddLayer("columns") rs.LayerColor("columns", (80, 100, 30)) rs.ObjectLayer(c_list,"columns") rs.AddLayer("plates") rs.LayerColor("plates", (100, 220, 70)) rs.ObjectLayer(p_list,"plates") print f_list print c_list print p_list """ my_c = rs.AddSpiral([0,0,0],[0,0,1],0,1.5,100,1) pts = rs.DivideCurve(my_c, 25) for i in pts: levels = ran.randint(2,6) (f_list, c_list, p_list, stair_l , stair_2) = make_domino(levels=levels) rs.MoveObjects(f_list + c_list + p_list + stair_l+ stair_2, i) param = rs.CurveClosestPoint(my_c,i) normal = rs.CurveTangent(my_c, param) angle = rs.Angle([0,0,0], normal) [0] rs.RotateObjects(f_list + c_list + p_list + stair_l+ stair_2, i,angle) """ # random position and levels for i in range(10): xran= ran.randint(0,80) yran= ran.randint(0,100) levels=ran.randint(2,7) (f_list, c_list, p_list, stair_l, stair_2) = make_domino(levels=levels) rs.MoveObjects(f_list + c_list + p_list + stair_l+ stair_2,(xran,yran,0)) """ rs.EnableRedraw(True)