# -*- coding: utf-8 -*- import rhinoscriptsyntax as rs import math rs.EnableRedraw(False) rs.DeleteObjects(rs.AllObjects()) def generiere_gebaeude(basis, hauptachse, nebenachse, schichten, dicke, luft, verformung, rohr_radius, versatz, stuetzen, min_groesse): ellipsen_objekte = [] ellipsen_punkte = [] gebaeude_objekte = [] for i in range(schichten): # Höhe und Verformung z = basis[2] + i * (dicke + luft) skalierung = 1 + verformung * math.sin(2 * math.pi * i / schichten) verjuengung = 1 - i / schichten # Berechnete Achsenlängen aktuelle_hauptachse = hauptachse * skalierung * verjuengung - versatz aktuelle_nebenachse = nebenachse * skalierung * verjuengung - versatz if aktuelle_hauptachse < min_groesse or aktuelle_nebenachse < min_groesse: break # Zu kleine Ellipsen überspringen # Ellipse erstellen zentrum = (basis[0], basis[1], z) ebene = rs.PlaneFromFrame(zentrum, (1, 0, 0), (0, 1, 0)) ellipse = rs.AddEllipse(ebene, aktuelle_hauptachse / 2, aktuelle_nebenachse / 2) if ellipse: ellipsen_objekte.append(ellipse) gebaeude_objekte.append(ellipse) punkte = rs.DivideCurve(ellipse, stuetzen) ellipsen_punkte.append(punkte) # Extrusion der Ebene extrudiert = rs.ExtrudeCurveStraight(ellipse, zentrum, (zentrum[0], zentrum[1], z + dicke)) if extrudiert: rs.CapPlanarHoles(extrudiert) gebaeude_objekte.append(extrudiert) # Fassade for j in range(stuetzen): pfade = [ellipsen_punkte[k][j] for k in range(len(ellipsen_punkte))] if len(pfade) > 1: kurve = rs.AddInterpCurve(pfade) if kurve: rohr = rs.AddPipe(kurve, 0, rohr_radius, cap=2) if rohr: gebaeude_objekte.append(rohr) # Kurve löschenn Rohr behalten rs.DeleteObject(kurve) # Ellipsen löschen for ellipse in ellipsen_objekte: rs.DeleteObject(ellipse) return gebaeude_objekte # 1 Gebäude gebaeude_1 = generiere_gebaeude( basis=(0, 0, 0), hauptachse=12, nebenachse=10, schichten=29, dicke=0.03, luft=0.1, verformung=0.4, rohr_radius=0.01, versatz=5, stuetzen=130, min_groesse=0.5) # 2 Gebäude gebaeude_2 = generiere_gebaeude( basis=(0, 0, 1.73), hauptachse=7, nebenachse=8, schichten=25, dicke=0.04, luft=0.12, verformung=0.5, rohr_radius=0.01, versatz=4, stuetzen=120, min_groesse=1) rs.RotateObjects(gebaeude_2, (0, 0, 1.73), 35, (0, 0, 1)) # 3 Gebäude gebaeude_3 = generiere_gebaeude( basis=(0, 0, 3.37), hauptachse=7, nebenachse=6, schichten=30, dicke=0.02, luft=0.12, verformung=0.8, rohr_radius=0.01, versatz=4, stuetzen=120, min_groesse=1) rs.RotateObjects(gebaeude_3, (0, 0, 3.37), 20, (0, 0, 1)) rs.EnableRedraw(True)