import rhinoscriptsyntax as rs rs.EnableRedraw(False) rs.DeleteObjects(rs.AllObjects()) # Turm ci = rs.AddCircle((0, 0, 20), 3) ci2 = rs.AddCircle((0, 0, 0), 5) pt = rs.DivideCurve(ci, 13) pt2 = rs.DivideCurve(ci2, 13) lines = [] li = rs.AddLine(pt[0], pt2[4]) for i in range(13): lines.append(rs.RotateObject(li, (0, 0, 0), 360 / 12 * i, copy=True)) # Loftflächen hinzufügen und Linien löschen rs.AddLoftSrf((lines[1], lines[2])) rs.AddLoftSrf((lines[3], lines[4])) rs.AddLoftSrf((lines[5], lines[6])) rs.AddLoftSrf((lines[7], lines[8])) rs.AddLoftSrf((lines[7], lines[8])) rs.AddLoftSrf((lines[9], lines[10])) rs.AddLoftSrf((lines[11], lines[12])) for line in lines: rs.DeleteObject(line) lines2 = [] li2 = rs.AddLine(pt[4], pt2[0]) for i in range(13): lines2.append(rs.RotateObject(li2, (0, 0, 0), 360 / 13 * i, copy=True)) # Loftflächen hinzufügen und Linien löschen rs.AddLoftSrf((lines2[0], lines2[0])) rs.AddLoftSrf((lines2[2], lines2[1])) rs.AddLoftSrf((lines2[4], lines2[3])) rs.AddLoftSrf((lines2[6], lines2[5])) rs.AddLoftSrf((lines2[8], lines2[7])) rs.AddLoftSrf((lines2[10], lines2[9])) rs.AddLoftSrf((lines2[12], lines2[11])) for line in lines2: rs.DeleteObject(line) # Stern # Fünfeck erstellen pts = rs.DivideCurve(ci, 5) pts.append(pts[0]) five = rs.AddPolyline(pts) rs.DeleteObject(ci) # Liste der Fünfecke penta_l = [five] for i in range(5): axis = rs.VectorCreate(pts[i], pts[i + 1]) penta = rs.RotateObject(five, pts[i], 243.43, axis, copy=True) penta_l.append(penta) penta_l2 = [five] for i in range(5): axis = rs.VectorCreate(pts[i], pts[i + 1]) penta = rs.RotateObject(five, pts[i], 116.57, axis, copy=True) penta_l2.append(penta) # Drehung um 180 Grad in waagrechter Richtung for penta in penta_l2: rs.RotateObject(penta, [0, 0, 0], 180, [0, 0, 1], copy=False) # Verschiebung um 7.854 in z-Richtung translation_vector = [0, 0, 7.854] for penta in penta_l2: rs.MoveObject(penta, translation_vector) # Alle Flächen aus den Fünfecken erstellen all_surfaces = [] for penta in penta_l + penta_l2: surface = rs.AddPlanarSrf(penta) if surface: all_surfaces.append(surface) print(f"Planar surface created: {surface}") def add_spike_to_face(surface, spike_length): """ Fügt einer gegebenen Fläche eine Zacke hinzu und erstellt ein Volumen. :param surface: Die Fläche, der die Zacke hinzugefügt wird. :param spike_length: Die Länge der Zacke. :return: Das resultierende Volumen. """ if not rs.IsSurface(surface): print("Das Objekt ist keine Fläche.") return None # Mittelpunkt der Fläche finden centroid = rs.SurfaceAreaCentroid(surface)[0] # Eckpunkte der Fläche abrufen boundary = rs.DuplicateSurfaceBorder(surface, type=1) vertices = rs.PolylineVertices(boundary) rs.DeleteObject(boundary) if not vertices or len(vertices) < 3: print("Ungültige Fläche.") return None # Normale der Fläche berechnen normal = rs.SurfaceNormal(surface, [0.5, 0.5]) # Überprüfen, ob die Normale nach innen zeigt test_vector = rs.VectorCreate(vertices[0], centroid) if rs.VectorDotProduct(normal, test_vector) < 0: # Normale umkehren, wenn nach innen normal = rs.VectorReverse(normal) # Berechnung der Spitze der Zacke spike_tip = rs.PointAdd(centroid, rs.VectorScale(normal, spike_length)) # Pyramide spike_faces = [] for i in range(len(vertices)): next_vertex = vertices[(i + 1) % len(vertices)] triangle = rs.AddSrfPt([vertices[i], next_vertex, spike_tip]) if triangle: spike_faces.append(triangle) # Pyramidenflächen zu Volumen if spike_faces: solid_spike = rs.JoinSurfaces(spike_faces, delete_input=True) return solid_spike return None # Zacke zu jeder Fläche hinzufügen spike_length = 10.0 for surface in all_surfaces: add_spike_to_face(surface, spike_length) rs.EnableRedraw(True)