import rhinoscriptsyntax as rs import math # delete everything and start from scratch rs.DeleteObjects(rs.AllObjects()) rs.EnableRedraw(False) # add base point base_p = rs.AddPoint([0, 0, 0]) # create polygon def create_polygon(center, num_sides, radius): if num_sides < 3: return None, None # calculate the angles angle_step = 2 * math.pi / num_sides vertices = [] for i in range(num_sides): angle = i * angle_step x = center[0] + radius * math.cos(angle) y = center[1] + radius * math.sin(angle) z = center[2] vertices.append((x, y, z)) # close polygon vertices.append(vertices[0]) # create polygon as polyline polygon_id = rs.AddPolyline(vertices) return polygon_id, vertices def add_line_from_polygon(vertices, line_length): # create sides start_pt = vertices[0] end_pt = vertices[1] # midpoint of the side midpoint = ( (start_pt[0] + end_pt[0]) / 2, (start_pt[1] + end_pt[1]) / 2, (start_pt[2] + end_pt[2]) / 2 ) # add a line from midpoint line_end = (midpoint[0] + line_length, midpoint[1], 0) h_line = rs.AddLine(midpoint, line_end) rs.RotateObject(h_line, midpoint, 20, axis=None, copy=False) return midpoint, h_line # parameters for polygons center = [0, 0, 0] num_sides = 9 # radii for polygons radii = [100, 1000, 1400] # list of points of all polygons polygon_points = {} # create polygons for radius in radii: polygon_id, vertices = create_polygon(center, num_sides, radius) if polygon_id: # save vertices polygon_points[radius] = vertices # add the line to the middle polygon midpoint_line_l = 900 if radius == 1000: midpoint, h_line = add_line_from_polygon(vertices, midpoint_line_l) # add a vertical line to the smallest polygon smallest_polygon_points = polygon_points[100] middle_polygon_points = polygon_points[1000] largest_polygon_points = polygon_points[1400] if len(smallest_polygon_points) > 3 and len(middle_polygon_points) > 3: start_point = smallest_polygon_points[num_sides] end_point = (start_point[0], start_point[1], start_point[2] + 1500) vertical_line_id = rs.AddLine(start_point, end_point) next_point = middle_polygon_points[num_sides] tilted_line_id = rs.AddLine(end_point, next_point) tilted_points = rs.DivideCurve(tilted_line_id, 2, create_points=False, return_points=True) if tilted_points: tilted_point = tilted_points[0] tilted_point = ( tilted_point[0] + 770, # move X tilted_point[1], # keep Y tilted_point[2] - 585 # move Z ) curve = rs.AddCurve([end_point, tilted_point, (middle_polygon_points[num_sides][0], middle_polygon_points[num_sides][1], 0)], degree=2) # make petal_1 curves p1_line1 = rs.AddLine(end_point, midpoint) p1_line2 = rs.AddLine(midpoint, middle_polygon_points[num_sides]) p1_curves = [p1_line1, p1_line2, curve] # create petal petal1_1 = rs.AddNetworkSrf(p1_curves, continuity=1, edge_tolerance=0, interior_tolerance=0, angle_tolerance=0) # mirror and rotate petals1 to create flower petal1_2 = rs.MirrorObject(petal1_1, smallest_polygon_points[num_sides], middle_polygon_points[num_sides], copy=True) all_petals1 = [petal1_1, petal1_2] for i in range(num_sides): if i > 0: rotated_petals1 = rs.RotateObjects((petal1_1, petal1_2), base_p, 360 / num_sides * i, axis=None, copy=True) all_petals1.extend(rotated_petals1) # create layer for petals1 with material layer_name_1 = "Petal 1" layer_color_1 = (191,80,255) rs.AddLayer(layer_name_1, layer_color_1) for petal1 in all_petals1: rs.ObjectLayer(petal1, layer_name_1) if not rs.LayerMaterialIndex(layer_name_1): material_index = rs.AddMaterialToLayer(layer_name_1) rs.MaterialName(material_index, "Paint Material") rs.MaterialColor(material_index, layer_color_1) rs.MaterialType(material_index, 3) rs.MaterialShine(material_index, 0.5) # make door curves d1_h1 = 300 d1_ep1 = (midpoint[0], midpoint[1], midpoint[2] + d1_h1) d1_line1 = rs.AddLine(midpoint, d1_ep1) d1_line2 = rs.AddLine(d1_ep1, largest_polygon_points[num_sides]) d1_line3 = rs.AddLine(midpoint, largest_polygon_points[num_sides]) door_curves = [d1_line1, d1_line2, d1_line3] # create door door_1 = rs.AddNetworkSrf(door_curves, continuity=1, edge_tolerance=0, interior_tolerance=0, angle_tolerance=0) # mirror and rotate doors door_2 = rs.MirrorObject(door_1, smallest_polygon_points[num_sides], middle_polygon_points[num_sides], copy=True) all_doors = [door_1, door_2] # Keep track of all created doors for i in range(num_sides): if i > 0: # Create rotated copies of door_1 and door_2 rotated_doors = rs.RotateObjects((door_1, door_2), base_p, 360 / num_sides * i, axis=None, copy=True) all_doors.extend(rotated_doors) # Add these new doors to the list # create layer for doors with material layer_doors = "Doors" layer_color_doors = (255, 127, 255) rs.AddLayer(layer_doors, layer_color_doors) for door in all_doors: rs.ObjectLayer(door, layer_doors) if not rs.LayerMaterialIndex(layer_doors): material_index = rs.AddMaterialToLayer(layer_doors) rs.MaterialName(material_index, "Plastic Material") rs.MaterialColor(material_index, layer_color_doors) rs.MaterialType(material_index, 2) # 2 = plastic rs.MaterialShine(material_index, 0.8) # make petal_2 and petal_3 curves p3_h2 = 500 line_end_point = rs.CurveEndPoint(h_line) vertical_line_end = ( line_end_point[0], # keep X line_end_point[1], # keep Y line_end_point[2] + p3_h2 # move Z ) # add vertical lines v_line = rs.AddLine(line_end_point, vertical_line_end) # create a line for division p3_hl1 = rs.AddLine(vertical_line_end, d1_ep1) divided_points = rs.DivideCurve(p3_hl1, 2, create_points=False, return_points=True) if divided_points: mid_div_point = divided_points[0] p3_h3 = 300 p3_hy = 110 p3_h4 = 200 control_point = ( mid_div_point[0] - p3_h3, # move X mid_div_point[1] - p3_hy, # move Y mid_div_point[2] + p3_h4 # move Z ) control_curve = rs.AddCurve([vertical_line_end, control_point, d1_ep1], degree=2) end_point_2 = ((middle_polygon_points[num_sides][0]), (middle_polygon_points[num_sides][1]), (middle_polygon_points[num_sides][2]) + 1000) rs.AddLine(middle_polygon_points[num_sides], end_point_2) p3_hl2 = rs.AddLine(end_point_2, largest_polygon_points[num_sides]) divided_points_2 = rs.DivideCurve(p3_hl2, 2, create_points=False, return_points=True) if divided_points_2: mid_div_point_2 = divided_points_2[0] p3_h5 = 400 p3_h6 = 500 control_point_2= ( mid_div_point_2[0] + p3_h5, # move X mid_div_point_2[1], # keep Y mid_div_point_2[2] - p3_h6 # move Z ) p2_line1 = rs.AddCurve([end_point_2, control_point_2, largest_polygon_points[num_sides]], degree=2) p2_line2 = rs.AddLine(d1_ep1, end_point_2) p2_curves = [p2_line1, p2_line2, d1_line2] petal2_1 = rs.AddNetworkSrf(p2_curves, continuity=1, edge_tolerance=0, interior_tolerance=0, angle_tolerance=0) # mirror and rotate petals2 to create flower petal2_2 = rs.MirrorObject(petal2_1, smallest_polygon_points[num_sides], middle_polygon_points[num_sides], copy=True) all_petals2 = [petal2_1, petal2_2] for i in range(num_sides): if i > 0: rotated_petals2 = rs.RotateObjects((petal2_1, petal2_2), base_p, 360 / num_sides * i, axis=None, copy=True) all_petals2.extend(rotated_petals2) # create layer for petals2 with material layer_name_2 = "Petal 2" layer_color_2 = (191,145,255) rs.AddLayer(layer_name_2, layer_color_2) for petal2 in all_petals2: rs.ObjectLayer(petal2, layer_name_2) if not rs.LayerMaterialIndex(layer_name_2): material_index = rs.AddMaterialToLayer(layer_name_2) rs.MaterialName(material_index, "Paint Material") rs.MaterialColor(material_index, layer_color_2) rs.MaterialType(material_index, 3) rs.MaterialShine(material_index, 0.5) p3_line1 = rs.AddLine(largest_polygon_points[num_sides],vertical_line_end) # divide p3_line1 to find its midpoint divided_points_p3_line1 = rs.DivideCurve(p3_line1, 2, create_points=False, return_points=True) if divided_points_p3_line1: mid_p3_point = divided_points_p3_line1[0] p3_h7 = 150 p3_h8 = 200 p3_h9 = 300 control_point_p3 = ( mid_p3_point[0] + p3_h7, # move X mid_p3_point[1] + p3_h8, # move Y mid_p3_point[2] + p3_h9 # move Z ) # create a control point curve using the adjusted midpoint p3_curve = rs.AddCurve([largest_polygon_points[num_sides], control_point_p3, vertical_line_end], degree=2) p3_curves = [p3_curve, d1_line2, control_curve] petal3_1 = rs.AddNetworkSrf(p3_curves, continuity=1, edge_tolerance=0, interior_tolerance=0, angle_tolerance=0) # mirror and rotate petals3 to create flower petal3_2 = rs.MirrorObject(petal3_1, smallest_polygon_points[num_sides], middle_polygon_points[num_sides], copy=True) all_petals3 = [petal3_1, petal3_2] for i in range(num_sides): if i > 0: rotated_petals3 = rs.RotateObjects((petal3_1, petal3_2), base_p, 360 / num_sides * i, axis=None, copy=True) all_petals3.extend(rotated_petals3) # create layer for petals3 with material layer_name_3 = "Petal 3" layer_color_3 = (191,191,255) rs.AddLayer(layer_name_3, layer_color_3) for petal3 in all_petals3: rs.ObjectLayer(petal3, layer_name_3) if not rs.LayerMaterialIndex(layer_name_3): material_index = rs.AddMaterialToLayer(layer_name_3) rs.MaterialName(material_index, "Paint Material") rs.MaterialColor(material_index, layer_color_3) rs.MaterialType(material_index, 3) rs.MaterialShine(material_index, 0.5) # create a star shape def create_star(center, num_sides, radius, inner_radius): if num_sides < 5 or num_sides % 2 == 0: return None angle_step = math.pi / num_sides vertices = [] for i in range(num_sides * 2): angle = i * angle_step r = radius if i % 2 == 0 else inner_radius x = center[0] + r * math.cos(angle) y = center[1] + r * math.sin(angle) z = center[2] vertices.append((x, y, z)) vertices.append(vertices[0]) polygon_id = rs.AddPolyline(vertices) return polygon_id # parameters for star star_radius = 3000 star_inner_radius = 2500 # create star star = create_star(center, num_sides, star_radius, star_inner_radius) off_1 = 100 off_2 = 300 rs.OffsetCurve(star,[2500,915,0], off_1, normal=None, style=1) rs.OffsetCurve(star,[2100,915,0], off_2, normal=None, style=1) rs.EnableRedraw(True) # create pool curves # delete extra lines rs.DeleteObjects([base_p, h_line, vertical_line_id, tilted_line_id, v_line, p3_hl1, p3_hl2, p3_curve, p2_line1, control_curve, curve, polygon_id, d1_line1, d1_line2, d1_line1])