import rhinoscriptsyntax as rs import math def create_bridge(): # Bridge Parameters bridge_length = 1000 bridge_height = 250 # Main arch height cable_count = 16 # Reduced for a cleaner look tower_width = 60 tower_height = 650 # Taller towers for better proportions road_width = 80 road_thickness = 10 railing_height = 50 railing_offset = 2 cable_thickness = 6 # Create bridge towers with more realistic proportions and a central roadway passage def create_tower(x_offset): base = rs.AddRectangle(rs.WorldXYPlane(), tower_width, tower_width / 2) rs.MoveObject(base, (x_offset, 0, 0)) tower = rs.ExtrudeCurveStraight(base, (0, 0, 0), (0, 0, tower_height)) rs.CapPlanarHoles(tower) # Create an arch opening in the tower for the road passage arch_curve = rs.AddArc3Pt((x_offset, 0, 0), (x_offset + tower_width / 2, 0, 120), (x_offset + tower_width, 0, 0)) arch_srf = rs.ExtrudeCurveStraight(arch_curve, (0, -5, 0), (0, 5, 0)) rs.BooleanDifference(tower, arch_srf) # Add cross-beams on the towers for a lattice structure for height in range(120, tower_height, int(tower_height / 5)): cross_beam = rs.AddLine((x_offset, 0, height), (x_offset + tower_width, 0, height)) rs.AddPipe(cross_beam, 0, cable_thickness / 3, cap=2) return tower # Adjust tower positions to be more central tower1 = create_tower(-bridge_length / 4) tower2 = create_tower(bridge_length / 4) # Create main cable (parabola) as a pipe cable_points = [] for i in range(cable_count + 1): x = i * (bridge_length / cable_count) - bridge_length / 2 z = -(4 * bridge_height / (bridge_length ** 2)) * (x ** 2) + bridge_height cable_points.append((x, 0, z)) main_cable_curve = rs.AddInterpCurve(cable_points) if main_cable_curve: main_cable = rs.AddPipe(main_cable_curve, 0, cable_thickness, cap=2) # Create connecting cables as pipes for i in range(cable_count + 1): start_point = cable_points[i] end_point = (cable_points[i][0], 0, 0) # Connection to the roadway if rs.IsPoint(start_point) and rs.IsPoint(end_point): cable = rs.AddLine(start_point, end_point) if cable: rs.AddPipe(cable, 0, cable_thickness / 2, cap=2) # Create the roadway as a solid road_plane = rs.WorldXYPlane() roadway_base = rs.AddRectangle(road_plane, bridge_length, road_width) rs.MoveObject(roadway_base, (-bridge_length / 2, -road_width / 2, -road_thickness)) roadway = rs.ExtrudeCurveStraight(roadway_base, (0, 0, 0), (0, 0, road_thickness)) rs.CapPlanarHoles(roadway) # Add railings as solids def create_railing(offset): points = [(-bridge_length / 2, offset, 0), (-bridge_length / 2, offset, railing_height), (bridge_length / 2, offset, railing_height), (bridge_length / 2, offset, 0)] railing_curve = rs.AddPolyline(points) if railing_curve: railing = rs.ExtrudeCurveStraight(railing_curve, (0, 0, 0), (0, 0, 2)) rs.CapPlanarHoles(railing) return railing left_railing = create_railing(-road_width / 2 - railing_offset) right_railing = create_railing(road_width / 2 + railing_offset) # Add vertical supports as solid pillars (reduced number for better realism) vertical_support_positions = [-bridge_length / 3, bridge_length / 3] for x in vertical_support_positions: support = rs.AddRectangle(rs.WorldXYPlane(), 10, road_thickness) rs.MoveObject(support, (x, -road_width / 2, -tower_height / 4)) extruded_support = rs.ExtrudeCurveStraight(support, (0, 0, 0), (0, 0, tower_height / 4)) rs.CapPlanarHoles(extruded_support) # Group all components components = [tower1, tower2, main_cable, roadway, left_railing, right_railing] rs.AddGroup("Bridge") rs.AddObjectsToGroup(components, "Bridge") print("Bridge created successfully!") create_bridge()