import rhinoscriptsyntax as rs import random as ran import math #cleanup and start from scratch rs.DeleteObjects(rs.AllObjects()) rs.EnableRedraw(False) #variables #unit: meters arc_angle=6 #part angle - one segment spans x degrees of the arc curve segs=5 #segments radius=40 #radius of start arc line width=3 #width of bridge thick=0.2 #thickness of bridge part hgt=3 #height of columns hel_th=0.04 #helix radius hel_pip=0.07 #helix radius for piping hgt_dome=2.5 #dome height (from height to peak) side_arc_hgt=1 #arc on the side of the pavilion height #derived values domes=segs-1 #one less than segments #length of base curve #segments - daraus abgeleitet #amount of domes/parts #height of dome (min 2.7) #abstand columns #bridge thickness #columns helix thickness (spirals) - thickness columns #thickness linien im oberen teil #thickness dome oberer teil #thickness base columns #diameter base columns #thickness kapitell columns #diameter kapitell columns #surface fuer domes: mit sweep2 - gitter dann mit pull #evt. unterschiedliche arten von saeulen #lists inner_pts=[] #list for inner points of curve outer_pts=[] #list for outer points of curve cls=[] #list for columns bridge=[] #list for bridge domes=[] #list for domes #functions #create function for creating a baseline (as stretched out sine curve) def create_base(width=width,segs=segs): angle=segs*arc_angle baseline_inner=rs.AddArc([0,0,0],radius,angle) inner_pts.extend(rs.DivideCurve(baseline_inner,segs)) for pt in inner_pts: #checking points rs.AddPoint(pt) baseline_outer=rs.OffsetCurve(baseline_inner,[0,-1,0],width) outer_pts.extend(rs.DivideCurve(baseline_outer,segs)) for pt in outer_pts: #checking points rs.AddPoint(pt) brd=rs.JoinCurves([baseline_inner,baseline_outer,rs.AddLine(outer_pts[-1],inner_pts[-1]),rs.AddLine(outer_pts[0],inner_pts[0])],delete_input=True) #close base curve for bridge brd_srf=rs.ExtrudeCurve(rs.OffsetCurve(brd,[0,1,0],0.2),rs.AddLine([0,0,0],[0,0,-thick])) #create surface rs.CapPlanarHoles(brd_srf) return(baseline_inner,baseline_outer) create_base() def columns(): plane=rs.AddPlaneSurface(rs.WorldXYPlane(),100,100) rs.ScaleObject(plane,[50,50,0],[5,5,0]) spirals=[] for pt in inner_pts: #rs.AddLine(pt,[pt[0],pt[1],hgt]) #check height sp1=rs.AddSpiral([pt[0],pt[1],hgt],pt,1.5,8,hel_th) sp2=rs.RotateObject(sp1,pt,120,copy=True) sp3=rs.RotateObject(sp2,pt,120,copy=True) spirals.append(rs.AddPipe(sp1,parameters=[0,1],radii=[hel_pip,hel_pip],cap=1)) spirals.append(rs.AddPipe(sp2,parameters=[0,1],radii=[hel_pip,hel_pip],cap=1)) spirals.append(rs.AddPipe(sp3,parameters=[0,1],radii=[hel_pip,hel_pip],cap=1)) rs.BooleanUnion(cls,delete_input=True) for pt in outer_pts: #rs.AddLine(pt,[pt[0],pt[1],hgt]) #check height sp1=rs.AddSpiral([pt[0],pt[1],hgt],pt,1.5,8,hel_th) sp2=rs.RotateObject(sp1,pt,120,copy=True) sp3=rs.RotateObject(sp2,pt,120,copy=True) spirals.append(rs.AddPipe(sp1,parameters=[0,1],radii=[hel_pip,hel_pip],cap=1)) spirals.append(rs.AddPipe(sp2,parameters=[0,1],radii=[hel_pip,hel_pip],cap=1)) spirals.append(rs.AddPipe(sp3,parameters=[0,1],radii=[hel_pip,hel_pip],cap=1)) for spiral in spirals: result=rs.SplitBrep(spiral, plane,delete_input=True) #split columns in half (to delete lower part cls.append(result) objects=rs.AllObjects() for obj in objects: bbox=rs.BoundingBox(obj) #create bounding box (like cage) min_z=min(pt.Z for pt in bbox) #look at all the points in the bounding box and determine if the lowest z-value is below 0.1 if min_z<(-thick-0.01): rs.DeleteObject(obj) #delete objects below z = 0 (bottom part of columns) rs.DeleteObject(plane) #it was too complicated to create a helix with a specific height (mathematical function required)- so i cut the columns in half at the XY Plane columns() def dome(): dgs=[] #list with lines secs=[] #list with intersections arcs=[] #list with arcs for the sides for i in range(len(inner_pts)-1): #make lines for the center of the pavilion l1=rs.AddLine(inner_pts[i],outer_pts[i+1]) l2=rs.AddLine(inner_pts[i+1],outer_pts[i]) arc_point_inner=rs.VectorDivide(rs.VectorAdd(inner_pts[i],inner_pts[i+1]),2) arc_point_outer=rs.VectorDivide(rs.VectorAdd(outer_pts[i],outer_pts[i+1]),2) arc_point_inner[2]=arc_point_inner[2]+side_arc_hgt arc_point_outer[2]=arc_point_outer[2]+side_arc_hgt a1=rs.AddArc3Pt(inner_pts[i],inner_pts[i+1],arc_point_inner) a2=rs.AddArc3Pt(outer_pts[i],outer_pts[i+1],arc_point_outer) intersection=rs.CurveCurveIntersection(l1, l2) dgs.append(l1) dgs.append(l2) arcs.append(a1) arcs.append(a2) for inter in intersection: if len(inter)>1: #curvecurveintersection produces not just the coordinates: make sure it produces more than 0 point=inter[1] #get the coordinates of the intersection points secs.append(point) rs.MoveObjects(dgs,[0,0,hgt]) #move all lines to correct position rs.MoveObjects(arcs,[0,0,hgt]) for i in secs: rs.AddLine([i[0],i[1],hgt],[i[0],i[1],hgt+hgt_dome]) dome() ######## #plan #create line - offset line, divide lines in segments (same number) - rebuild - put points in list - put columns at points - connect points with dome (diagonal with vector functions) #connect offset lines - close crv - extrude crv - bridge (extrude downwards) #sweep dome lines to surface (4 open surfaces) #draw pattern on floor - pull pattern onto surfaces #make a 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) """ #layers rs.AddLayer("bridge") rs.LayerColor("bridge", (255,255,0)) rs.ObjectLayer(bridge,"bridge") rs.AddLayer("domes") rs.LayerColor("domes", (0,255,255)) rs.ObjectLayer(domes,"domes") rs.AddLayer("columns") rs.LayerColor("columns", (255,255,255)) rs.ObjectLayer(cls,"columns") #fix """ #cleanup #rs.Command("_SelCrv _Enter") #crvs=rs.SelectedObjects() #rs.DeleteObjects(crvs) #rs.Command("_Selpt _Enter") #too_many_points=rs.SelectedObjects() #rs.DeleteObjects(too_many_points) rs.EnableRedraw(True)