# -*- coding: utf-8 -*- import rhinoscriptsyntax as rs import math import random as ran # Szene leeren und Redraw deaktivieren rs.DeleteObjects(rs.AllObjects()) rs.EnableRedraw(False) ######################################################################### # Parameter für die Spiralstreppe(n) ######################################################################### total_steps = 300 # Anzahl der Stufen pro Treppe (höhere Treppe) riser_height = 0.17 # Höhe pro Stufe (17 cm, realmaßlich) tread_length = 0.28 # Auftritt (Trittfläche) in Meter (28 cm) stair_width = 1.20 # Breite der Stufe (1,20 m, ausreichend Platz zum Begehen) spiral_turns = 4.0 # Anzahl Umdrehungen der Treppe (z.B. 4 Umdrehungen) bottom_radius = 12.0 # Start-Radius der äußeren Treppe (hier zugleich der Radius des Säulenkreises) top_radius = 0.0 # Endet im Mittelpunkt num_staircases = 9 # Es werden 9 Spiralstreppe erzeugt – alle mit gleichem Spiralverlauf, aber jeweils mit einem Winkeloffset ######################################################################### # Parameter für die Säulen ######################################################################### col_count = 48 # Doppelte Säulenanzahl (48 statt 24) col_radius = bottom_radius # Säulen sollen an der äußeren Treppe anliegen col_height = total_steps * riser_height # Säulenhöhe entspricht der Höhe der höchsten Treppe column_color = (160, 160, 160) ######################################################################### # Funktion: Erzeuge eine Spiralstreppe mit Startwinkeloffset ######################################################################### def create_spiral_stairs(total_steps, bottom_radius, top_radius, spiral_turns, riser_height, tread_length, stair_width, start_angle=0.0): """ Erzeugt eine Spiralstreppe aus 'total_steps' Stufen, die linear vom bottom_radius (bei i=0) bis zum top_radius (bei i=total_steps-1) konvergiert und sich über 'spiral_turns' volle Umdrehungen windet. start_angle verschiebt den gesamten Verlauf um den angegebenen Winkel (in Grad). """ stairs = [] total_angle = 360.0 * spiral_turns angle_per_step = total_angle / (total_steps - 1) if total_steps > 1 else 0 for i in range(total_steps): # Gesamtwinkel inkl. Startoffset angle_deg = start_angle + i * angle_per_step angle_rad = math.radians(angle_deg) t = i / float(total_steps - 1) if total_steps > 1 else 0 current_radius = bottom_radius + (top_radius - bottom_radius) * t # Position in XY: auf einem Kreis mit current_radius, entsprechend des Winkels x = current_radius * math.cos(angle_rad) y = current_radius * math.sin(angle_rad) z = i * riser_height # Erzeuge die Stufe als Box (ursprünglich in XY-Ebene) step_id = rs.AddBox([ (0, 0, 0), (tread_length, 0, 0), (tread_length, stair_width, 0), (0, stair_width, 0), (0, 0, riser_height), (tread_length, 0, riser_height), (tread_length, stair_width, riser_height), (0, stair_width, riser_height) ]) # Rotation: Damit die Frontkante (ursprünglich entlang der X-Achse von 0 bis tread_length) # tangential zur Kreisbahn liegt, drehen wir um (angle_deg+90) rs.RotateObject(step_id, (0, 0, 0), angle_deg + 90, axis=(0, 0, 1)) # Verschiebung: In lokalen Koordinaten liegt der Mittelpunkt der Frontkante bei (tread_length/2, 0, 0) # Wir schieben so, dass dieser Punkt bei (x,y,z) liegt. shift_x = x - (tread_length / 2.0) * math.cos(math.radians(angle_deg + 90)) shift_y = y - (tread_length / 2.0) * math.sin(math.radians(angle_deg + 90)) rs.MoveObject(step_id, (shift_x, shift_y, z)) stairs.append(step_id) return stairs ######################################################################### # Funktion: Säulen erzeugen (als Zylinder) ######################################################################### def create_columns(count, radius, height, col_radius=0.15): cols = [] for i in range(count): angle = (360.0 / count) * i angle_rad = math.radians(angle) x = radius * math.cos(angle_rad) y = radius * math.sin(angle_rad) base_circle = rs.AddCircle((x, y, 0), col_radius) line = rs.AddLine((x, y, 0), (x, y, height)) cyl = rs.ExtrudeCurve(base_circle, line) rs.CapPlanarHoles(cyl) rs.DeleteObject(base_circle) rs.DeleteObject(line) cols.append(cyl) return cols ######################################################################### # Hauptteil: Mehrere Spiralstreppe erzeugen (mit Winkeloffset) ######################################################################### all_stairs = [] for i in range(num_staircases): # Berechne den Winkeloffset so, dass die 9 Treppen gleichmäßig im Kreis verteilt sind. start_angle = (360.0 / num_staircases) * i stairs = create_spiral_stairs( total_steps = total_steps, bottom_radius = bottom_radius, top_radius = top_radius, spiral_turns = spiral_turns, riser_height = riser_height, tread_length = tread_length, stair_width = stair_width, start_angle = start_angle ) # Optional: Zufällige oder feste Farbe für die Treppen (hier einheitlich gesetzt) for sid in stairs: rs.ObjectColor(sid, (200, 50, 50)) all_stairs.extend(stairs) ######################################################################### # Säulen erzeugen – sie sollen an der äußersten Treppe anliegen ######################################################################### col_objs = create_columns(col_count, col_radius, col_height, col_radius=0.15) for col in col_objs: rs.ObjectColor(col, column_color) ######################################################################### # Layer-Zuweisung und Anzeige ######################################################################### if not rs.IsLayer("Stairs"): rs.AddLayer("Stairs", (220,220,220)) rs.ObjectLayer(all_stairs, "Stairs") if not rs.IsLayer("Columns"): rs.AddLayer("Columns", (200,200,200)) rs.ObjectLayer(col_objs, "Columns") rs.EnableRedraw(True) rs.ZoomExtents()