import rhinoscriptsyntax as rs import random as ran import math rs.DeleteObjects(rs.AllObjects()) #variablen maison domino xsize=10 #xside length of box ysize=10 #yside length of box zsize=10 #zside length of box A=5 #stuetzenabstand B=A/3 #abstand stuetze zum plattenrand thick=0.2 #dicke der platten hgt=3 #raumhoehe xcol=5 #anzahl der stuetzen in x richtung ycol=5 #anzahl der stuetzen in y richtung levels=4 #anzahl der stockwerke f_height=0.5 #fundamenthoehe f_size=0.8 #fundamentseitenlaenge s_width=1.4 #stiegenbreite s_s=17 #stiege steigungshoehe s_a=29 #stiege auftrittshoehe pod_w=B #auftritt ('landing') breite stripes=60 #anzahl der streifen der fassade offs=0.05 #abstand der streifen der fassade th_stripes=0.1 #dicke der streifen float_hgt=6 #hoehe wie hoch die haeuser schweben thick_s=0.18 #dicke der treppe #derived values center_pt=[A*(xcol-1)/2,A*(ycol-1)/2,f_height] #insertion point fuer die platten p_width=A*(xcol-1)+2*B #breite der bodenplatte p_length=A*(ycol-1)+f_size #laenge der bodenplatte s_num=int(hgt/0.17) #anzahl der stufen if s_num%2: s_num=s_num-1 s_s=(hgt+thick)/s_num if(s_s>0.19): s_num=s_num+2 s_s=(hgt+thick)/s_num #neu definierte steigung s_a=0.63-2*s_s start=[0,-s_width*2-f_size/2,f_height+thick] #punkt an dem die stiege anfaengt (nicht 0,0,0) total_height=f_height+thick*levels+hgt*(levels-1) #gesamthoehe rs.EnableRedraw(False) #box definieren 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) #funktion fuer ein feld mit gruendungen def make_foundations(A=5.0,f_size=0.8,f_height=0.5,xcol=2,ycol=3): fns=[] #liste fuer foundations zu der dann die id hinzugefuegt wird 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) #funktion fuer stuetzen def make_columns(A=5.0,level=0.7,xcol=2,ycol=3,f_height=0.5,thick=0.2,hgt=2.7): cls=[] for i in range(int(xcol)): for j in range(int(ycol)): cls.append(make_box([i*A,j*A,level],thick,thick,hgt)) return(cls) #funktion fuer organische waende def make_arc (insertion,rad,thick,orientation,hgt): segs=[] list_parts=[45,90,135,180] teil=ran.choice(list_parts) 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])) segm=rs.JoinCurves(segs,delete_input=True) path=rs.AddLine([0,0,0],[0,0,hgt]) arc=rs.ExtrudeCurve(segm,path) rs.CapPlanarHoles(arc) rs.DeleteObject(segm) rs.DeleteObject(path) rs.RotateObject(arc,[0,0,0],orientation) rs.MoveObject(arc,insertion) return(arc) #funktion fuer waende def make_walls(A=5.0,level=0.7,xcol=2,ycol=3,f_height=0.5,thick=0.2,hgt=hgt,orientation=90): wls=[] for i in range(int(xcol-1)): for j in range(int(ycol-1)): ori=ran.randint(0,6) if ori<4: orientation=ori*90 wls.append(make_arc([i*A+A/4,j*A+A/4,level],A/4,thick,orientation,hgt)) return(wls) #funktion fuer podest 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) #funktion fuer stufen def make_steps(start=start,s_num=s_num,s_a=s_a,s_width=s_width,s_s=s_s,pod_w=pod_w,thick_s=thick_s): pointlist=[start] #liste mit punkten fuer die polylinie der stufen for i in range(int(s_num)): pointlist.append([pointlist[-1][0],pointlist[-1][1],pointlist[-1][2]+s_s]) pointlist.append([pointlist[-1][0]+s_a,pointlist[-1][1],pointlist[-1][2]]) pointlist.append([pointlist[-1][0],pointlist[-1][1],pointlist[-1][2]-thick_s]) pointlist.append([pointlist[0][0],pointlist[0][1],pointlist[0][2]-thick_s]) 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) #funktion fuer fassade def make_facade(start,end,r,orientation="xz"): crv1=rs.AddLine(start, end) pts=rs.DivideCurve(crv1,stripes) #laenge der kurve berechnen und so die breite jedes streifens length=rs.CurveLength(crv1) str_width=length/stripes #breite jedes streifens str_list=[] #liste mit fassadenelementen for p in pts: hgt_facade=ran.uniform(0.5, total_height) myran0=ran.randint(0,10) if orientation == "xz" and myran0<6: box=make_box(insertion=[0,0,0],xsize=str_width-offs,ysize=th_stripes,zsize=hgt_facade) hgt_move = ran.uniform(thick,total_height-hgt_facade-thick) rs.MoveObject(box,[p[0]-(str_width-offs)/2,p[1]-th_stripes/2,hgt_move]) rs.ObjectColor(box,(0,max(20,min(hgt_move*ran.randint(5,15),200)),ran.randint(50,255))) str_list.append(box) myran3=ran.randint(0,30) if myran3>25: box=make_box(insertion=[0,0,0],xsize=str_width-offs,ysize=th_stripes,zsize=-float_hgt) rs.MoveObject(box,[p[0]-(str_width-offs)/2,p[1]-th_stripes/2,f_height]) rs.ObjectColor(box,(0,max(20,min(hgt_move*ran.randint(5,15),200)),ran.randint(50,255))) str_list.append(box) elif orientation == "yz" and myran0<6: box=make_box(insertion=[0,0,0],xsize=th_stripes,ysize=str_width-offs,zsize=hgt_facade) hgt_move = ran.uniform(thick,total_height-hgt_facade-thick) rs.MoveObject(box,[p[0]-th_stripes/2,p[1]-(str_width-offs)/2,hgt_move]) rs.ObjectColor(box,(0,max(20,min(hgt_move*ran.randint(5,15),200)),ran.randint(50,255))) str_list.append(box) myran4=ran.randint(0,30) if myran4>25: box=make_box(insertion=[0,0,0],xsize=th_stripes,ysize=str_width-offs,zsize=-float_hgt) rs.MoveObject(box,[p[0]-th_stripes/2,p[1]-(str_width-offs)/2,f_height]) rs.ObjectColor(box,(0,max(20,min(hgt_move*ran.randint(5,15),200)),ran.randint(50,255))) str_list.append(box) for i in range(8): copy=rs.CopyObject(ran.choice(str_list),[0,-th_stripes*r,0]if orientation=="xz"else[-th_stripes*r,0,0]) myran=ran.randint(0, 10) str_list.append(copy) if myran>8: str_list.append(rs.CopyObject(copy,[0,-th_stripes*r,0] if orientation=="xz" else [-th_stripes*r,0,0])) myran2=ran.randint(0,10) if myran2>8: str_list.append(rs.CopyObject(copy,[0,-th_stripes*r*2,0] if orientation=="xz" else [-th_stripes*r*2,0,0])) return str_list f_list=[] #liste fuer foundations c_list=[] #liste fuer stuetzen p_list=[] #liste fuer bodenplatten s_list=[] #liste fuer stiege fc_list=[] #liste fuer fassade w_list=[] #liste fuer waende #loop fuer stockwerke des maison domino def make_maison(A=A,B=B,levels=levels,thick=0.18,xcol=xcol,ycol=ycol,hgt=hgt,f_height=f_height,f_size=f_size,s_width=s_width,s_s=s_s,s_a=s_a): msn=[] for i in range(int(levels)): center_pt[2]=f_height+i*(thick+hgt) s_num=int(hgt/0.17) #anzahl der stufen if s_num%2: s_num=s_num-1 s_s=(hgt+thick)/s_num if(s_s>0.19): s_num=s_num+2 s_s=(hgt+thick)/s_num #neu definierte steigung s_a=0.63-2*s_s #berechnung der auftrittsbreite mithilfe der schrittmassregel #center point [2] ist der dritte wert der koordinaten - also der z wert level=f_height+thick+(i-1)*(hgt+thick) start[0]=pod_w start[2]=f_height+thick+i*(thick+hgt) #startpunkt der stiege aendert sich mit jedem mal hochgehen (*i) if i