#! python3 import rhinoscriptsyntax as rs import random as ran #delete everything and start from scratch allobjs=rs.AllObjects() rs.DeleteObjects(allobjs) A=5 B=A/3 thick=0.2 hgt=2.7 xcol=3 ycol=4 levels=3 f_height=0.5 f_size=0.8 #derives values: center_pt=[A*(xcol-1)/2, A*(ycol-1)/2,f_height] p_width=A*(xcol-1)+2*B p_length=A*(ycol-1)+f_size #function to create box 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]] 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): 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_heigth=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_heigth)) return(fns) #function to create a field of cloumns def make_columns(A=5.0,level=0.7, 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,level], thick, thick, hgt)) return(cls) def make_columns(A=5.0,level=0.2, thick=0.02, hgt=3.0, xcol=40, ycol=0): cls=[] for i in range(xcol): for j in range(ycol): cls.append(make_box([i*A,j*A,level], thick, thick, hgt)) return(cls) 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) def make_terrace(A=5.0,level=0.7, 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,level], A/2, thick, hgt, orientation)) return(cls) #function to create stair 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[0][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) rs.DeleteObjects(s_outline) rs.DeleteObject(path) return(hull) rs.EnableRedraw(False) #building domino 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_length, 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 #s_width= stair width pod_w=B #pod_w=depth of landing start=[pod_w,-(s_width*2+f_size/2), f_height+thick] #startpoint of stair #loop to create starcase stair_l=[] for i in range(levels): start[2]=f_height+thick+i*(thick+hgt) #z-Wert bei jedes Iteration neu gesetzt if i==levels-1: #letztes podes stair_l.append(make_podest([start[0]-pod_w,start[1]+s_width,start[2]-thick],pod_w,s_width,thick)) #sonderpodest else: stair_l.append(make_podest([start[0]-pod_w,start[1],start[2]-thick],pod_w,s_width*2,thick)) stair_l.append(make_stair(start, th, tt, int(steps/2), thick, s_width)) stair_l.append(make_podest([start[0]+(steps/2)*tt,start[1],start[2]+(steps/2)*th-thick],pod_w,s_width*2,thick)) stair_l.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_l) (f_list, c_list, p_list, stair_l)=make_domino() rs.AddLayer("foundation") rs.LayerColor("foundation", (211,211,211)) rs.ObjectLayer(f_list, "foundation") rs.AddLayer("columns") rs.LayerColor("columns", (128,128,128)) rs.ObjectLayer(c_list, "columns") rs.AddLayer("plates") rs.LayerColor("plates", (169,169,169)) rs.ObjectLayer(p_list, "plates") rs.EnableRedraw(True) #facade 1 width=0.05 depth=0.2 f_length = 40 off = A*(xcol-1)+B+depth/2 #facade offset def make_facade(insertion= [0,0,0] ,depth=0.2, width=0.1, height=(levels-1)*(hgt+thick)+thick, dist=0.4): fcd = [] for i in range(f_length): fcd.append(make_box([off,i*dist-f_size/2,f_height], depth, width, height)) return(fcd) make_facade() #facade 2 width=0.05 depth=0.2 f_length = 40 off = A*(xcol-3.7)+B+depth/2 #facade offset def make_facade(insertion= [0,0,0] ,depth=0.2, width=0.05, height=(levels-1)*(hgt+thick)+thick, dist=0.4): fcd = [] for i in range(f_length): fcd.append(make_box([off,i*dist-f_size/2,f_height], depth, width, height)) return(fcd) make_facade() #facade 3 width3=0.2 depth3=0.05 f_length3 = 25 off3 = A*(ycol-3.7)+B+depth/2 #facade offset def make_facade3(insertion=[0, 0, 0], depth3=0.05, width3=0.2, height3=(levels - 1) * (hgt + thick) + thick, dist=0.4, x_offset=8, y_offset=0, z_offset=0): fcd3 = [] for i in range(f_length3): x_position = (i * dist - (f_length3 * dist / 2)) + x_offset y_position = insertion[1] + y_offset z_position = insertion[2] + z_offset fcd3.append(make_box([x_position, y_position, z_position], depth3, width3, height3)) return fcd3 facade = make_facade3(x_offset=7, y_offset=-0.5, z_offset=0.5) #facade 4 width4=0.2 depth4=0.05 f_length4 = 34 off4 = A*(ycol-3.7)+B+depth/2 #facade offset def make_facade4(insertion=[0, 0, 0], depth4=0.05, width4=0.2, height4=(levels - 1) * (hgt + thick) + thick, dist=0.4, x_offset=0, y_offset=0, z_offset=0): fcd4 = [] for i in range(f_length4): x_position = (i * dist - (f_length4 * dist / 2)) + x_offset y_position = insertion[1] + y_offset z_position = insertion[2] + z_offset fcd4.append(make_box([x_position, y_position, z_position], depth4, width4, height4)) return fcd4 facade = make_facade4(x_offset=5.2, y_offset=15.5, z_offset=0.5) #facade 5 width5=0.2 depth5=0.05 f_length5 = 5 off5 = A*(ycol-3.7)+B+depth/2 #facade offset def make_facade5(insertion=[0, 0, 0], depth5=0.05, width5=0.2, height5=(levels - 1) * (hgt + thick) + thick, dist=0.4, x_offset=8, y_offset=0, z_offset=0): fcd5 = [] for i in range(f_length5): x_position = (i * dist - (f_length5 * dist / 2)) + x_offset y_position = insertion[1] + y_offset z_position = insertion[2] + z_offset fcd5.append(make_box([x_position, y_position, z_position], depth5, width5, height5)) return fcd5 facade = make_facade5(x_offset=-0.65, y_offset=-0.5, z_offset=0.5) def make_facade(insertion=[0, 0, 0], depth=0.2, width=0.1, dist=0.4, f_length=40, levels=3, hgt=2.7, f_height=0.5): # Berechnung der Fassadenhöhe basierend auf der Anzahl der Ebenen und der Höhe jeder Etage height = f_height + (levels - 1) * (hgt + thick) + thick # Gesamthöhe des Gebäudes fcd = [] off = A * (xcol - 1) + B + depth / 2 # Fassade-Offset (dies wird dynamisch basierend auf der Position des Gebäudes aktualisiert) for i in range(f_length): # Berechnung der Positionen der Fassadenelemente fcd.append(make_box([off + insertion[0], i * dist - f_size / 2 + insertion[1], insertion[2]], depth, width, height)) return fcd """ Cmake domino for i in range(10): xran=ran.randint(0,300) yran=ran.randint(0,500) levels=ran.randint(2,14) (f_list, c_list, p_list, stair_l)=make_domino(levels=levels) rs.MoveObjects(f_list+c_list+p_list+stair_l, (xran,yran,0)) """ #create facade x_pos = y_pos = 0 for i in range(8): x_pos = x_pos + 21 if(i < 5): y_pos = y_pos + 20 else: y_pos = y_pos - 20 levels = ran.randint(2, 13) (f_list, c_list, p_list, stair_l) = make_domino(levels=levels) rs.MoveObject(f_list + c_list + p_list + stair_l, (x_pos, y_pos, 0)) building_height = f_height + (levels - 1) * (hgt + thick) + thick # create and move facade facade1 = make_facade(insertion=[x_pos, y_pos, 0], f_length=40, levels=levels, hgt=hgt, f_height=f_height) facade2 = make_facade(insertion=[x_pos - 13.5, y_pos, 0], depth=0.2, width=0.05, f_length=40, levels=levels, hgt=hgt, f_height=f_height) facade3 = make_facade(insertion=[x_pos + 5.75, y_pos + 0.7, 0], depth=0.2, width=0.05, f_length=34, levels=levels, hgt=hgt, f_height=f_height) facade4 = make_facade(insertion=[x_pos + 11.7, y_pos - 15.3, 0], depth=0.2, width=0.05, f_length=25, levels=levels, hgt=hgt, f_height=f_height) facade5 = make_facade(insertion=[x_pos - 12.3, y_pos - 9.6, 0], depth=0.2, width=0.05, f_length=5, levels=levels, hgt=hgt, f_height=f_height) # Rotate facade rs.RotateObject(facade3, [x_pos + 7, y_pos + 5, 0], 90) rs.RotateObject(facade4, [x_pos + 10, y_pos - 14, 0], 90) rs.RotateObject(facade5, [x_pos - 5, y_pos - 5, 0], 90) # add facade to layer rs.AddLayer("foundation") rs.LayerColor("foundation", (211, 211, 211)) rs.ObjectLayer(f_list, "foundation") rs.AddLayer("columns") rs.LayerColor("columns", (128, 128, 128)) rs.ObjectLayer(c_list, "columns") rs.AddLayer("plates") rs.LayerColor("plates", (169, 169, 169)) rs.ObjectLayer(p_list, "plates") # adding facade to a layer and colour it rs.AddLayer("facades") rs.LayerColor("facades", (50, 50, 50)) # colour rs.ObjectLayer(facade1 + facade2 + facade3 + facade4 + facade5, "facades")