import rhinoscriptsyntax as rs import random as ran # delete everything and start from scratch rs.DeleteObjects(rs.AllObjects()) rs.EnableRedraw(False) # variables hgt = 170 angle = 0.4 x = 18 y = 10 # generating the main body of the tower: # base shape of the tower extra_val = x/2 base_crv = rs.AddPolyline([[0,0,0], [0,y*2,0], [x,y*2+extra_val,0], [x*2,y*2,0], [x*2,0,0], [x,-extra_val,0], [0,0,0]], None) base_crv_srf = rs.AddPlanarSrf(base_crv) rail_1 = rs.AddLine([x,y,0],[x,y,hgt]) upper_crv=rs.CopyObject(base_crv, (0,0,hgt)) rs.RotateObject(upper_crv, [x,y,0], 360*angle) line = rs.AddLine([0,0,0],[x*2,y*2,0]) len=rs.Distance([0,0,0],[x*2,y*2,0]) spiral=rs.AddSpiral([x,y,0],[x,y,hgt], hgt*(1/angle), angle, len/2) rs.RotateObject(spiral, [x,y,0],30) body=rs.AddSweep2((spiral,rail_1),(base_crv, upper_crv)) rs.CapPlanarHoles(body) # splitting the main body hgt_box = 8 width = hgt*1.5 box=rs.AddBox(([0,0,0],[width,0,0], [width,width,0], [0,width,0],[0,0,hgt_box],[width,0,hgt_box], [width,width,hgt_box], [0,width,hgt_box])) z_val = hgt*0.75 rs.MoveObject(box, [-20,-20,z_val]) rs.BooleanDifference(body, box) rs.DeleteObjects((base_crv, upper_crv, rail_1, spiral,line)) # create the base: # small cylindric plinth rad_pl_small = x hgt_small = hgt*0.1 rs.AddCylinder([x,y,0], -hgt_small, rad_pl_small, True) # larger cylindric plinth rad_pl_large = rad_pl_small*1.4 hgt_large = hgt_small rs.AddCylinder([x,y,-hgt_small], -hgt_large, rad_pl_large, True) # cubic base base = rs.AddRectangle([x,y,-hgt_small-hgt_large], hgt*0.35, hgt*0.35) cube_base = rs.MoveObject(base, ((-(hgt*0.35)/2),(-(hgt*0.35)/2),0)) base_srf = rs.AddPlanarSrf(cube_base) rail_2 = rs.AddLine([x,y,-x*-0.1],[x,y,-31]) cube_plinth = rs.ExtrudeSurface(base_srf, rail_2,True) rs.DeleteObjects((base,rail_2)) # create the side part of the tower hgt_small = hgt*0.10 help_pt1 = rs.AddPoint([0,y,0]) help_pt2 = rs.AddPoint([0,y,hgt]) rail_side1 = rs.AddLine(help_pt1, help_pt2) #rs.DeleteObjects((help_pt1,help_pt2)) rect = rs.AddPolyline(([3,5,-hgt_small], [-7,5,-hgt_small], [-7,hgt_small,-hgt_small], [3,hgt_small,-hgt_small], [3,5,-hgt_small]), None) rect2 = rs.CopyObject(rect, [0,0,hgt+(hgt*0.10)]) lower_p = rs.AddSweep1(rail_side1, (rect, rect2), True) rs.CapPlanarHoles(lower_p) rs.MoveObjects((lower_p,rail_side1,rect,rect2), [4,0,0]) rail_side2 = rs.AddLine([-7,y,hgt],[5,y,hgt]) rect3 = rs.AddPolyline(([-7,5,hgt],[-7,hgt_small,hgt],[-7,hgt_small,hgt+10],[-7,5,hgt+10],[-7,5,hgt]),False) rect4 = rs.CopyObject(rect3, [x,0,0]) upper_p = rs.AddSweep1(rail_side2, (rect3,rect4), True) rs.MoveObjects((upper_p,rail_side2,rect3,rect4),[4,0,0]) rs.CapPlanarHoles(upper_p) rs.DeleteObjects((help_pt1,help_pt2,rail_side1,rect,rect2,rect3,rect4,rail_side2)) # create top part of the tower: # larger cylinder dist = hgt*0.05 rs.AddCylinder([x,y,hgt],dist,y,True) # smaller cylinder rad_base = hgt_small/2 rad_factor = 0.5 rs.AddCylinder([x,y,(hgt+dist)],y,rad_base*rad_factor,True) # spike/antenna end_pt = hgt*1.4 ant_line = rs.AddLine([x,y,(hgt+dist+y)],[x,y,end_pt]) rad1 = 1.2 circ_ant_base = rs.AddCircle([x,y,(hgt+dist+y)],rad1) dots_base = rs.DivideCurve(circ_ant_base,8,False,True) top = rs.AddPoint([x,y,end_pt]) for d in dots_base: vertical_grid = rs.AddLine(d, top) rs.AddPipe(vertical_grid,0,0.05,0,0,False) rs.DeleteObject(vertical_grid) rs.DeleteObjects((top, ant_line, circ_ant_base)) # create the columns base_circ = rs.AddCircle([x,y,0],x*0.75) num_col = y pts = rs.DivideCurve(base_circ, num_col, False, True) guide = rs.AddLine([x,y,0], [x,y,hgt]) col_circs = [] for p in pts: small_circ1 = rs.AddCircle(p, 0.5) small_circ2 = rs.CopyObjects(small_circ1, (0,0,hgt)) cols = rs.AddSweep1(guide, (small_circ1, small_circ2), False) rs.DeleteObjects((small_circ1)) rs.DeleteObjects((base_circ, guide)) # details: # windows: # upper elements guide_circ = rs.AddCircle((x,y,hgt+dist),rad_base*rad_factor) num_up_pts = x*0.5 upper_pts = rs.DivideCurve(guide_circ, num_up_pts, False, True) upper_rects = [] for u in upper_pts: x_val = 2 z_val = 6 rect_crv = rs.AddPolyline(([0,0,0],[x_val,0,0],[x_val,0,z_val],[0,0,z_val],[0,0,0]), None) rect_srf = rs.AddPlanarSrf(rect_crv) crv_extrude1 = rs.AddLine((0,0,0),(0,-0.2,0)) extruded_rect = rs.ExtrudeSurface(rect_srf, crv_extrude1) rects = rs.CopyObjects(extruded_rect, u) rs.ObjectColor(rects, 250) param = rs.CurveClosestPoint(guide_circ,u) normal = rs.CurveTangent(guide_circ, param) angle = rs.Angle([0,0,0], normal) [0] angle_add_on = 8 rs.RotateObjects(rects, u, angle+angle_add_on, None, False) rs.DeleteObjects((rect_crv, rect_srf,crv_extrude1,extruded_rect)) rs.DeleteObject((guide_circ)) # plinth elements guide_circ2 = rs.AddCircle((x,y,-15),rad_pl_small) num_low_pts = 20 lower_pts = rs.DivideCurve(guide_circ2, num_low_pts, False, True) lower_rects = [] for u in lower_pts: x_val = 2.5 z_val = 10 rect_crv = rs.AddPolyline(([0,0,0],[x_val,0,0],[x_val,0,z_val],[0,0,z_val],[0,0,0]), None) rect_srf = rs.AddPlanarSrf(rect_crv) crv_extrude2 = rs.AddLine((0,0,0),(0,-0.2,0)) extruded_rect = rs.ExtrudeSurface(rect_srf, crv_extrude2) rects = rs.CopyObjects(extruded_rect, u) rs.ObjectColor(rects, 250) param = rs.CurveClosestPoint(guide_circ2,u) normal = rs.CurveTangent(guide_circ2, param) angle = rs.Angle([0,0,0], normal) [0] angle_add_on = 3 rs.RotateObjects(rects, u, angle+angle_add_on, None, False) rs.DeleteObjects((rect_crv, rect_srf,crv_extrude2,extruded_rect)) rs.DeleteObject((guide_circ2)) # details spike detail_place = hgt*1.2 detail_hgt = 2.5 detail_rail = rs.AddLine((0,0,detail_place), (0,0,detail_place+detail_hgt)) rad_detail = 1.5 detail_base = rs.AddCircle((x,y,detail_place), rad_detail) detail_srf = rs.AddPlanarSrf(detail_base) detail_1 = rs.ExtrudeSurface(detail_srf,detail_rail, True) detail_2_place = rs.CopyObject(detail_1, (0,0,detail_place/2)) detail_2 = rs.ScaleObject(detail_2_place, (x,y,hgt), (0.5,0.5,0.5), False) rs.DeleteObjects((detail_rail,detail_base))