import rhinoscriptsyntax as rs import random as ran 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=2 #anzahl der stuetzen in x richtung ycol=3 #anzahl der stuetzen in y richtung levels=3 #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) f_list=[] #liste fuer foundations c_list=[] #liste fuer stuetzen p_list=[] #liste fuer bodenplatten s_list=[] #liste fuer stiege #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 i7: str_list.append(rs.CopyObject(copy,[0,-th_stripes*r,0])) myran2=ran.randint(0,10) if myran2>7: str_list.append(rs.CopyObject(copy,[0,-th_stripes*r*2,0])) return str_list def make_facade_yz(start,end,r): 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) 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) rs.MoveObject(box,[p[0]-(th_stripes/2),p[1],hgt_move+thick]) str_list.append(box) for i in range(8): copy=rs.CopyObject(ran.choice(str_list),[-th_stripes*r,0,0]) myran=ran.randint(0, 10) str_list.append(copy) #streifen multiplizieren in manchen faellen - zufallsgeneriert if myran>6: str_list.append(rs.CopyObject(copy,[-th_stripes*r,0,0])) myran2=ran.randint(0,10) if myran2>8: str_list.append(rs.CopyObject(copy,[-th_stripes*r*2,0,0])) return str_list fc_list=[] #liste fuer fassade #fassade horizontal bei der stiege fc_list.extend(make_facade_xz(start=[-B,-s_width-f_size/2,0],end=[-B+p_width,-s_width-f_size/2, 0],r=1)) #fassade horizontal oben fc_list.extend(rs.MoveObjects(make_facade_xz(start=[-B,-s_width-f_size/2,0],end=[-B+p_width,-s_width-f_size/2, 0],r=(-1)),[0,p_length+s_width+th_stripes,0])) #fassade vertikal links fc_list.extend(make_facade_yz(start=[-B,-s_width-f_size/2,0],end=[-B,p_length-f_size/2, 0],r=1)) #fassade vertikal rechts fc_list.extend(rs.MoveObjects(make_facade_yz(start=[-B,-s_width-f_size/2,0],end=[-B,p_length-f_size/2, 0],r=-1),[p_width+th_stripes,0])) rs.AddLayer("facade") rs.LayerColor("facade", (255,191,191)) rs.ObjectLayer(fc_list,"facade") #aufraeumen rs.Command("_SelCrv _Enter") crvs = rs.SelectedObjects() rs.DeleteObjects(crvs) rs.EnableRedraw(True)