# -*- coding: utf-8 -*- import rhinoscriptsyntax as rs import random as ran # ------------------------------------------------------------- # Szene leeren # ------------------------------------------------------------- allobjs = rs.AllObjects() rs.DeleteObjects(allobjs) rs.EnableRedraw(False) # ------------------------------------------------------------- # Domino-Variablen # ------------------------------------------------------------- A = 5 B = A/3 thick = 0.2 hgt = 2.7 xcol = 2 ycol = 3 levels = 3 f_height= 0.5 f_size = 0.8 # ------------------------------------------------------------- # Abgeleitete Werte # ------------------------------------------------------------- center_pt = [A*(xcol-1)/2, A*(ycol-1)/2, f_height] p_width = A*(xcol-1) + 2*B p_length = A*(ycol-1) + f_size # ------------------------------------------------------------- # Hilfsfunktion: Box erstellen # ------------------------------------------------------------- def make_box(insertion=(0,0,0), xsize=10, ysize=10, zsize=10): corners = [ (0,0,0), (xsize,0,0), (xsize,ysize,0), (0,ysize,0), (0,0,zsize), (xsize,0,zsize), (xsize,ysize,zsize), (0,ysize,zsize) ] box_id = rs.AddBox(corners) # Verschieben, damit insertion die Mitte der Box-Basis wird rs.MoveObject(box_id, (-xsize/2, -ysize/2, 0)) rs.MoveObject(box_id, insertion) return box_id # ------------------------------------------------------------- # Fundament erstellen # ------------------------------------------------------------- def make_foundations(A=5.0, f_size=0.8, f_heigt=0.5, xcol=2, ycol=3): fns = [] for i in range(xcol): for j in range(ycol): fns.append(make_box((i*A, j*A, 0), f_size, f_size, f_heigt)) return fns # ------------------------------------------------------------- # Säulen erstellen # ------------------------------------------------------------- def create_columns(A=5.0, level=0.7, thick=0.2, hgt=3.0, xcol=2, ycol=3): cls = [] for i in range(xcol): for j in range(ycol): cls.append(make_box([i*A, j*A, level], thick, thick, hgt)) return cls # ------------------------------------------------------------- # NEUE Fassade-Funktion: # Erstellt Paneele, die sich exakt an den Kanten des Hauses orientieren # ------------------------------------------------------------- def make_checkerboard_facade(center_pt, p_width, p_length, levels=3, hgt=2.7, thick=0.2, panel_size=1.0, facade_thickness=0.2): """ Erzeugt eine 'Checkerboard'-Fassade um das Domino-Haus herum. Sie orientiert sich an der Plattenbreite (p_width) und -länge (p_length). """ facade_panels = [] colors = [(255,0,0),(0,255,0),(0,0,255), (255,255,0),(255,0,255),(0,255,255)] # Hauskanten berechnen house_left = center_pt[0] - p_width/2 house_right = center_pt[0] + p_width/2 house_front = center_pt[1] - p_length/2 house_back = center_pt[1] + p_length/2 # Erzeuge pro Geschoss Paneele an allen 4 Seiten for lvl in range(levels): z_base = center_pt[2] + lvl*(hgt + thick) + thick # -- Linke & rechte Seite -- # Ermitteln, wie viele Paneele in Y-Richtung passen side_height = house_back - house_front num_panels_side = int(side_height // panel_size) for i in range(num_panels_side): y_current = house_front + i*panel_size + panel_size/2 # Mitte des Paneels color_index = (lvl + i) % len(colors) # Linke Seite panel_left = make_box( (house_left - facade_thickness/2, y_current, z_base), facade_thickness, panel_size, hgt ) rs.ObjectColor(panel_left, colors[color_index]) # Rechte Seite panel_right = make_box( (house_right + facade_thickness/2, y_current, z_base), facade_thickness, panel_size, hgt ) rs.ObjectColor(panel_right, colors[(color_index+1) % len(colors)]) facade_panels.extend([panel_left, panel_right]) # -- Vorder- & Rückseite -- side_width = house_right - house_left num_panels_front = int(side_width // panel_size) for j in range(num_panels_front): x_current = house_left + j*panel_size + panel_size/2 color_index = (lvl + j) % len(colors) # Vorderseite panel_front = make_box( (x_current, house_front - facade_thickness/2, z_base), panel_size, facade_thickness, hgt ) rs.ObjectColor(panel_front, colors[color_index]) # Rückseite panel_back = make_box( (x_current, house_back + facade_thickness/2, z_base), panel_size, facade_thickness, hgt ) rs.ObjectColor(panel_back, colors[(color_index+2) % len(colors)]) facade_panels.extend([panel_front, panel_back]) return facade_panels # ------------------------------------------------------------- # Domino-Haus aufbauen # ------------------------------------------------------------- f_list = [] c_list = [] p_list = [] for i in range(levels): # Platten- und Säulenhöhe berechnen center_pt[2] = f_height + i*(thick + hgt) level = f_height + (i-1)*(hgt + thick) if i == 0: f_list = make_foundations(A, f_size, f_height, xcol, ycol) else: c_list.extend(create_columns(A, level, thick, hgt, xcol, ycol)) # Bodenplatte p_list.append(make_box(center_pt, p_width, p_length, thick)) # ------------------------------------------------------------- # Fassade erzeugen: nutze die neue Funktion # ------------------------------------------------------------- facade_panels = make_checkerboard_facade( center_pt = [A*(xcol-1)/2, A*(ycol-1)/2, f_height], # Ursprungswert p_width = p_width, p_length = p_length, levels = levels, hgt = hgt, thick = thick, panel_size = 1.0, # Größe eines Paneels (anpassbar) facade_thickness = 0.3 # Dicke der Fassade (anpassbar) ) # ------------------------------------------------------------- # Layer und Objektzuweisung # ------------------------------------------------------------- rs.AddLayer("foundation") rs.LayerColor("foundation", (220, 60, 60)) rs.ObjectLayer(f_list, "foundation") rs.AddLayer("columns") rs.LayerColor("columns", (60, 220, 60)) rs.ObjectLayer(c_list, "columns") rs.AddLayer("plates") rs.LayerColor("plates", (60, 60, 220)) rs.ObjectLayer(p_list, "plates") rs.AddLayer("facade") rs.LayerColor("facade", (200, 200, 0)) rs.ObjectLayer(facade_panels, "facade") # ------------------------------------------------------------- # Zeichnung aktualisieren # ------------------------------------------------------------- rs.EnableRedraw(True) rs.ZoomExtents()