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=3 #anzahl der stuetzen in x richtung ycol=4 #anzahl der stuetzen in y richtung levels=6 #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_width=1 #podest breite stripes=50 #anzahl der streifen der fassade offs=0.05 #abstand der streifen der fassade th_stripes=0.1 #dicke der streifen #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(round(hgt/0.17)) #anzahl der stufen s_s=(hgt+thick)/s_num #neu definierte steigung s_a=0.63-2*s_s #berechnung der auftrittsbreite mithilfe der schrittmassregel startpt=[-B,-s_width-f_size/2,f_height] #punkt an dem die stiege anfaengt (nicht 0,0,0) total_height=f_height+thick*levels+hgt*(levels-1) #gesamthoehe #selbst geschriebene funktion definieren fuer die box, mit variablen, die spaeter reingeschrieben werden #man kann auch einen default wert definieren #man kann auch einen punkt definieren, an den das spaeter bewegt wird #fuer den kann man entweder auch einen default wert definieren #man muss nicht fuer alle variablen einen default wert definieren, dann muss man spaeter nur einen eingeben 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 dem 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 stufen def make_steps(s_a=s_a,s_width=s_width,s_s=s_s,pod_width=pod_width): crns_stps=[[0,0,0],[s_a,0,0],[s_a,s_width,0],[0,s_width,0], [0,0,s_s],[s_a,0,s_s],[s_a,s_width,s_s],[0,s_width,s_s]] crns_pod=[[0,0,0],[pod_width,0,0],[pod_width,s_width,0],[0,s_width,0], [0,0,thick],[pod_width,0,thick],[pod_width,s_width,thick],[0,s_width,thick]] steps=[] #liste der stufen for h in range(s_num+1): if h!=s_num and h!=0: #es darf nicht die letzte stufe sein box=rs.AddBox(crns_stps) steps.append(box) rs.MoveObject(box,(pod_width+(h-1)*s_a, 0, h*s_s)) box=rs.AddBox(crns_stps) steps.append(box) rs.MoveObject(box,(pod_width+(h-1)*s_a, 0, (h-1)*s_s)) if h==0: box=rs.AddBox(crns_pod) steps.append(box) rs.MoveObject(box,(h*s_a,0,h*s_s)) if h==s_num: box=rs.AddBox(crns_pod) steps.append(box) rs.MoveObject(box,(pod_width+(h-1)*s_a,0,h*s_s)) box=rs.AddBox(crns_stps) steps.append(box) rs.MoveObject(box,(pod_width+(h-1)*s_a, 0, (h-1)*s_s)) return(steps) #funktion fuer stiege def make_stairs(B, s_width, f_size, f_height, startpt): strs=[] strs.extend(rs.MoveObjects(make_steps(),startpt)) return(strs) #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) if orientation == "xz": 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) elif orientation == "yz": 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) 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>7: 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>7: 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 #loop fuer stockwerke des maison domino for i in range(int(levels)): center_pt[2]=f_height+i*(thick+hgt) #center point [2] ist der dritte wert der koordinaten - also der z wert level=f_height+thick+(i-1)*(hgt+thick) if i