import rhinoscriptsyntax as rs import random as ran import math rs.DeleteObjects(rs.AllObjects()) rs.EnableRedraw(False) highest_hgt = 30 #highest point of the bridge lowest_hgt = -30 #lowest point of the bridge sup_str_hgt = -30 #lowest point of the support structure cr_pt_dis = 80 #distance between crossing point and middle side_stair_len= 60 #length of the side stair half_bridge_len = cr_pt_dis+side_stair_len #halv the lenght of the bridge in total up_stair_width = 14 #width of upper stair sup_str_width = up_stair_width+2 #width of support structure down_stair_width = 8 #width of lower stair side_stair_width = up_stair_width+down_stair_width*2 #width of side stair sup_thick = 0.5 #thickness of support structure pod_rad=side_stair_width+0 #radius of the circle podest smaller_pod_rad=pod_rad-18 con_pod_width = 4 #half the width of the connection podest rail_dis = 8 #distance between the vertical parts of the rail 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) ####################### #create rails ####################### upper_bow_m = rs.AddInterpCurve(([0,0,highest_hgt], [cr_pt_dis,0,0]),3, start_tangent=([1,0,0]), end_tangent=[(half_bridge_len-cr_pt_dis),0,sup_str_hgt]) rs.ReverseCurve(upper_bow_m) sup_str_1 = rs.AddLine([cr_pt_dis,-(up_stair_width)/2+sup_thick/2,0],[half_bridge_len,-(sup_str_width/2+sup_thick/2),sup_str_hgt]) sup_str_2 = lower_bow_2= rs.MirrorObject(sup_str_1, [0,0,0], [1,0,0], copy=True) lower_bow_1= rs.AddInterpCurve(([0,(-up_stair_width/2-down_stair_width),lowest_hgt],[cr_pt_dis,(-up_stair_width/2-down_stair_width/2),0]),3,start_tangent=([1,0,0]), end_tangent=[1,0,0.3]) lower_bow_2= rs.MirrorObject(lower_bow_1, [0,0,0], [1,0,0], copy=True) side_bow= rs.AddInterpCurve(([cr_pt_dis,0,0],[half_bridge_len,0,0]),3,start_tangent=([1,0,0.3]), end_tangent=[1,0,0]) #create podest circles big_circle=rs.AddCylinder([half_bridge_len+pod_rad-3,0,0],1.5,pod_rad) small_circle=rs.AddCylinder([half_bridge_len+pod_rad-3,0,0],1.5, smaller_pod_rad) circle_podest=rs.BooleanDifference(big_circle,small_circle) #create support structure rec1 = rs.AddRectangle([cr_pt_dis,-up_stair_width/2+sup_thick/2,0],sup_thick,sup_thick) rs.RotateObject(rec1,(cr_pt_dis,0,0),90, axis=(0,1,0)) rs.AddSweep1(sup_str_1, [rec1], closed=True) rec2 = rs.AddRectangle([cr_pt_dis,up_stair_width/2-sup_thick/2,0],sup_thick,sup_thick) rs.RotateObject(rec2,(cr_pt_dis,0,0),90, axis=(0,1,0)) rs.AddSweep1(sup_str_2, [rec2], closed=True) ######### #create upper stairs ######### c_len= rs.CurveLength(upper_bow_m) p_num=int(c_len/3) seg_len = c_len/p_num pts=rs.DivideCurve(upper_bow_m, p_num, create_points=True, return_points=True) upper_stair_l=[] i=0 for p in pts: ysize= up_stair_width- 0.15*i box= make_box(p, xsize=seg_len, ysize=ysize, zsize=1.5) upper_stair_l.append(box) i=i+1 ######### #create lower stairs ######### c_len= rs.CurveLength(lower_bow_1) p_num=c_len/3 seg_len = c_len/p_num pts=rs.DivideCurveEquidistant(lower_bow_1, seg_len, create_points=True, return_points=True) lower_stair_l_1=[] for p in pts: param=rs.CurveClosestPoint(lower_bow_1,p) normal= rs.CurveTangent(lower_bow_1, param) t_angle=rs.Angle([0,0,0],normal)[0] box= make_box(p, xsize=seg_len, ysize=down_stair_width, zsize=1.5) rs.RotateObject(box,p, t_angle, [0,0,1]) lower_stair_l_1.append(box) c_len= rs.CurveLength(lower_bow_2) p_num=c_len/3 seg_len = c_len/p_num pts=rs.DivideCurveEquidistant(lower_bow_2, seg_len, create_points=True, return_points=True) lower_stair_l_2=[] for p in pts: param=rs.CurveClosestPoint(lower_bow_2,p) normal= rs.CurveTangent(lower_bow_2, param) t_angle=rs.Angle([0,0,0],normal)[0] box= make_box(p, xsize=seg_len, ysize=down_stair_width, zsize=1.5) rs.RotateObject(box,p, t_angle, [0,0,1]) lower_stair_l_2.append(box) ######### #create side stairs ######### c_len= rs.CurveLength(side_bow) p_num=c_len/3 seg_len = c_len/p_num pts=rs.DivideCurveEquidistant(side_bow, seg_len, create_points=True, return_points=True) p_num2= len(pts) side_stair_l=[] i=0 for p in pts: x =math.sin(i/(p_num2-1)* math.pi) y_size= side_stair_width- x*(side_stair_width/3.5) box= make_box(p, xsize=seg_len, ysize=y_size, zsize=1.5) side_stair_l.append(box) i=i+1 ################ #create connection podest ################ insertion=[0,(-up_stair_width/2-down_stair_width/2),lowest_hgt] xsize=con_pod_width ysize=up_stair_width+down_stair_width zsize=1.5 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]] cap_box=rs.AddBox(corners) rs.MoveObject(cap_box, insertion) ################ #cap circle podest ################ insertion=[half_bridge_len+1.2,-(side_stair_width+10)/2,-5] xsize=-10 ysize=(side_stair_width+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]] cap_box=rs.AddBox(corners) rs.MoveObject(cap_box, insertion) rs.BooleanDifference(circle_podest, cap_box ,delete_input=True) ################ #create hand rail ################ #create lower inner rails l_i_rail_line_1= rs.AddInterpCurve(([0,(-up_stair_width/2-down_stair_width/2),lowest_hgt+10],[cr_pt_dis,(-up_stair_width/2),10]),3,start_tangent=([1,0,0]), end_tangent=[1,0,0.3]) l_i_rail_line_2 =rs.MirrorObject(l_i_rail_line_1, [0,0,0], [1,0,0], copy=True) c_len= rs.CurveLength(l_i_rail_line_1) parts=c_len/rail_dis pts=rs.DivideCurveEquidistant(l_i_rail_line_1, parts, create_points=True, return_points=True) list_l_i_rail_line_1=[] for i in range(1,len(pts)): box= make_box(pts[i], xsize=0.01, ysize=0.01, zsize=-10) list_l_i_rail_line_1.append(box) l_i_rail_1 = rs.AddPipe(l_i_rail_line_1,0, 0.25) c_len= rs.CurveLength(l_i_rail_line_2) parts=c_len/rail_dis pts=rs.DivideCurveEquidistant(l_i_rail_line_2, parts, create_points=True, return_points=True) list_l_i_rail_line_2=[] for i in range(1,len(pts)): box= make_box(pts[i], xsize=0.01, ysize=0.01, zsize=-10) list_l_i_rail_line_2.append(box) l_i_rail_2 = rs.AddPipe(l_i_rail_line_2,0, 0.25) insertion=[-1,((-up_stair_width/2-down_stair_width/2-2)),lowest_hgt] xsize=con_pod_width+1 ysize=up_stair_width+down_stair_width+4 zsize=12 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]] cap_box2=rs.AddBox(corners) rs.MoveObject(cap_box2, insertion) rs.BooleanDifference(l_i_rail_1, cap_box2 ,delete_input=True) insertion=[-1,((-up_stair_width/2-down_stair_width/2-2)),lowest_hgt] xsize=con_pod_width+1 ysize=up_stair_width+down_stair_width+4 zsize=12 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]] cap_box2=rs.AddBox(corners) rs.MoveObject(cap_box2, insertion) rs.BooleanDifference(l_i_rail_2, cap_box2 ,delete_input=True) #create lower outer raisl l_o_rail_line_1= rs.AddInterpCurve(([0,(-up_stair_width/2-down_stair_width*1.5),lowest_hgt+10],[cr_pt_dis,(-up_stair_width/2-down_stair_width),10]),3,start_tangent=([1,0,0]), end_tangent=[1,0,0.3]) l_o_rail_line_2 =rs.MirrorObject(l_o_rail_line_1, [0,0,0], [1,0,0], copy=True) c_len= rs.CurveLength(l_o_rail_line_1) parts=c_len/rail_dis pts=rs.DivideCurveEquidistant(l_o_rail_line_1, parts, create_points=True, return_points=True) list_l_o_rail_line_1=[] for i in range(0,len(pts)): box= make_box(pts[i], xsize=0.01, ysize=0.01, zsize=-10) list_l_o_rail_line_1.append(box) l_o_rail_1 = rs.AddPipe(l_o_rail_line_1,0, 0.25) c_len= rs.CurveLength(l_o_rail_line_2) parts=c_len/rail_dis pts=rs.DivideCurveEquidistant(l_o_rail_line_2, parts, create_points=True, return_points=True) list_l_o_rail_line_2=[] for i in range(0,len(pts)): box= make_box(pts[i], xsize=0.01, ysize=0.01, zsize=-10) list_l_o_rail_line_2.append(box) l_o_rail_2 = rs.AddPipe(l_o_rail_line_2,0, 0.25) #create side rails s_rail_line_1 = rs.AddInterpCurve(([cr_pt_dis,-up_stair_width/2-down_stair_width,10],[half_bridge_len,-up_stair_width/2-down_stair_width,10]),3,start_tangent=([1,0.3,0.31415]), end_tangent=[1,-0.31415,0]) s_rail_line_2 =rs.MirrorObject(s_rail_line_1, [0,0,0], [1,0,0], copy=True) c_len= rs.CurveLength(s_rail_line_1) parts=c_len/rail_dis pts=rs.DivideCurveEquidistant(s_rail_line_1, parts, create_points=True, return_points=True) list_s_rail_line_1=[] for i in range(1,len(pts)): box= make_box(pts[i], xsize=0.01, ysize=0.01, zsize=-10) list_s_rail_line_1.append(box) s_rail_1 = rs.AddPipe(s_rail_line_1,0, 0.25) c_len= rs.CurveLength(s_rail_line_2) parts=c_len/rail_dis pts=rs.DivideCurveEquidistant(s_rail_line_2, parts, create_points=True, return_points=True) list_s_rail_line_2=[] for i in range(1,len(pts)): box= make_box(pts[i], xsize=0.01, ysize=0.01, zsize=-10) list_s_rail_line_2.append(box) s_rail_2 = rs.AddPipe(s_rail_line_2,0, 0.25) #create upper rails u_rail_line_1 = rs.AddInterpCurve(([0,-up_stair_width/2+2,highest_hgt+10], [cr_pt_dis,-up_stair_width/2,10]),3, start_tangent=([1,0,0]), end_tangent=[(half_bridge_len-cr_pt_dis),0,sup_str_hgt]) u_rail_line_2 =rs.MirrorObject(u_rail_line_1, [0,0,0], [1,0,0], copy=True) c_len= rs.CurveLength(u_rail_line_1) parts=c_len/rail_dis pts=rs.DivideCurve(u_rail_line_1, parts, create_points=True, return_points=True) list_u_rail_line_1=[] for i in range(0,len(pts)): box= make_box(pts[i], xsize=0.01, ysize=0.01, zsize=-10) list_u_rail_line_1.append(box) u_rail_1 = rs.AddPipe(u_rail_line_1,0, 0.25) c_len= rs.CurveLength(u_rail_line_2) parts=c_len/rail_dis pts=rs.DivideCurve(u_rail_line_2, parts, create_points=True, return_points=True) list_u_rail_line_2=[] for i in range(0,len(pts)): box= make_box(pts[i], xsize=0.01, ysize=0.01, zsize=-10) list_u_rail_line_2.append(box) u_rail_2 = rs.AddPipe(u_rail_line_2,0, 0.25) #create connection podest rail con_rail_line = rs.AddLine([con_pod_width,(-up_stair_width/2-down_stair_width/2),lowest_hgt+10], [con_pod_width,-(-up_stair_width/2-down_stair_width/2),lowest_hgt+10]) c_len= rs.CurveLength(con_rail_line) parts=c_len/rail_dis pts=rs.DivideCurve(con_rail_line, parts, create_points=True, return_points=True) list_con_rail_line=[] for i in range(0,len(pts)): box= make_box(pts[i], xsize=0.01, ysize=0.01, zsize=-10) list_con_rail_line.append(box) con_rail = rs.AddPipe(con_rail_line,0, 0.25) #create circle podest inner rail cpod_i_rail_line = rs.AddCircle([half_bridge_len+pod_rad-3,0,10],smaller_pod_rad) c_len= rs.CurveLength(cpod_i_rail_line) parts=c_len/rail_dis pts=rs.DivideCurve(cpod_i_rail_line, parts, create_points=True, return_points=True) list_cpod_i_rail_line=[] for i in range(0,len(pts)): box= make_box(pts[i], xsize=0.01, ysize=0.01, zsize=-10) list_cpod_i_rail_line.append(box) cpod_i_rail = rs.AddPipe(cpod_i_rail_line,0, 0.25) #create circle podest outer rail cpod_o_rail_line = rs.AddCircle([half_bridge_len+pod_rad-3,0,10],pod_rad) c_len= rs.CurveLength(cpod_o_rail_line) parts=c_len/rail_dis p_num= int((c_len/rail_dis)) pts=rs.DivideCurve(cpod_o_rail_line, parts, create_points=True, return_points=True) list_cpod_o_rail_line_1=[] for i in range(2,(int(p_num/2-1))): box= make_box(pts[i], xsize=0.01, ysize=0.01, zsize=-10) list_cpod_o_rail_line_1.append(box) for i in range((int(p_num/2+3)),(p_num-1)): box= make_box(pts[i], xsize=0.01, ysize=0.01, zsize=-10) list_cpod_o_rail_line_1.append(box) cpod_o_rail = rs.AddPipe(cpod_o_rail_line,0, 0.25) insertion=[half_bridge_len-5,-(side_stair_width)/2,0] xsize=pod_rad*2+5 ysize=side_stair_width zsize=12 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]] cap_box1=rs.AddBox(corners) rs.MoveObject(cap_box1, insertion) rs.BooleanDifference(cpod_o_rail, cap_box1 ,delete_input=True) allobjs=rs.AllObjects() rs.MirrorObjects(allobjs,[0,0,0],[0,-10,0],copy=True) rs.EnableRedraw(True)