CH NEO-ZÜRICH AUSGABE
WETTER · SAURER REGEN 12°C
BLEND DES TAGES · 07/ROGUE
EST. 2027
DIE AEC CYBER MORGENZEITUNG

PAZ Kaffi

DESIGN · ABBRUCH · KOFFEIN · DEPESCHE
AUSGABE 1025 · 25 October 2026
SENDUNG 04:42 MEZ
2'400 BOGEN GEDRUCKT
LESEZEIT · 47 MIN
CAD als Code mit build123d: Eine Zahl ändern, Kassette mit 220 Löchern neu bauen
Akademie
FRAME · 06:50
25-10-2026

CAD als Code mit build123d: Eine Zahl ändern, Kassette mit 220 Löchern neu bauen

Modelliere mit build123d eine 1200 x 600 mm Aluminium-Kassette mit 220 Löchern in Python. Berechne Masse, Öffnung, exportiere STEP.

Ein Rhino-Nutzer zeichnet einen Körper, aber ein build123d-Nutzer schreibt das Programm, das ihn erzeugt. Das ist Code-CAD im Kern. Jede Dimension des Bauteils ist eine benannte Zahl oben in einer Datei — eine Zahl ändern, Run drücken, der ganze Körper wird neu erstellt: Löcher, Rundungen, Masse, Export. In diesem Tutorial schreibst du einen Bildschirm Python, der eine 1200 x 600 x 3 mm Aluminium-Fassadenkassette modelliert. Sie hat 220 Perforationen, die Reihe für Reihe wachsen, von 8 mm unten bis 30 mm oben, plus vier Befestigungslöcher. Das Skript druckt die Masse und die Öffnungsfläche, dann schreibt es eine STEP-Datei, die in Rhino 8 öffnet.

Der Aufhänger: build123d 0.13.0 kam am 21. September 2026, und Code-CAD erreichte dieses Jahr immer wieder die Hacker News Titelseite. Hackaday beschrieb das in Rust geschriebene SolidCraft diesen Monat und gab die prägnanteste Definition der Idee: In einer parametrischen Timeline existiert das Modell „als Summe einer Sequenz von Operationen”. build123d nimmt diesen Satz wörtlich. Die Sequenz ist deine Python-Datei.

Das Werkzeug: build123d, von Roger Maitland (GitHub: gumyr) und weiteren Beiträgern, unter Apache 2.0 veröffentlicht. Seine README beschreibt es als „ein Python-basiertes, parametrisches (BREP) Modellierungsgerüst für 2D und 3D CAD”, aufgebaut auf dem Open Cascade geometrischen Kernel. Ein Kernel ist die Maschine unter einem CAD-Programm, die Schnitte, Boolesche Operationen und genaue Flächen berechnet. Maitlands README kreditiert seine Herkunft schlicht: build123d „ist aus Teilen von CadQuery abgeleitet” und wurde in ein eigenständiges Gerüst mit seiner eigenen Builder-Syntax umgestaltet. Einen Kernel zu nehmen, den nur wenige Spezialisten fahren konnten, und ihn in eine Bibliothek zu verwandeln, die ein Architekt am Sonntag liest, ist Ingenieursarbeit — und die schwerere Hälfte. Rhino und Grasshopper bleiben die Hauswerkzeuge für Design-Exploration. build123d ergänzt das für präzise, wiederholbare Teile, die zur Fabrikation übergeben werden: ein Skript, hundert Varianten, exakte BREP-Körper. BREP bedeutet Boundary Representation, ein Körper, der durch seine genauen Begrenzungsflächen beschrieben wird, nicht durch ein Mesh von Dreiecken.

Setup: build123d 0.13 benötigt Python 3.11 oder neuere (und unter 3.15). Rhino 8 liefert sein eigenes CPython 3.9 für ScriptEditor, daher lebt build123d in einer eigenen Python-Umgebung neben Rhino, nicht darin. Der Übergabepunkt zwischen den zwei ist die STEP-Datei. Das ist Arbeitsteilung: das Skript macht das Bauteil, Rhino platziert es im Gebäude.

# Windows (macOS/Linux: source cad-env/bin/activate)
python --version              # muss 3.11 oder neuer sein
python -m venv cad-env
cad-envScriptsactivate
pip install build123d
python -c "import build123d; print(build123d.__version__)"    # 0.13.0

Bei Import kann build123d eine Font-Warnzeile drucken („name table stringOffset incorrect”). Sie ist harmlos, ignoriere sie. Ein venv, oder virtuelle Umgebung, ist ein privater Ordner von Python-Paketen. Er hält die Bibliotheken dieses Projekts weg von allem anderen auf der Maschine.

Erste Schritte:

  1. Erstelle first.py im Algebra-Modus, in dem sich Körper mit + und – wie Zahlen kombinieren:
    from build123d import *
    
    plate = Box(200, 100, 10) - Cylinder(radius=15, height=10)
    print(plate.volume)
    export_step(plate, "first.step")
  2. Starte python first.py. Es druckt 192931.41652942295.
  3. Kontrolliere von Hand: 200 × 100 × 10 = 200.000 mm³, minus π × 15² × 10 = 7.068,6 mm³, bleiben 192.931,4 mm³. Das stimmt bis zur letzten Dezimalstelle. Box und Cylinder sind beide um den Ursprung zentriert, daher landet das Loch in der Mitte. Einheiten sind standardmässig Millimeter.
  4. In Rhino 8, nutze Datei > Importieren und wähle first.step. Dein erstes Programm ist nun ein Körper auf der Zeichenfläche.

Der Code, erklärt: Hier ist panel.py im Builder-Modus, in dem with-Blöcke Arbeitsbereiche öffnen und Formen darin verbinden sich automatisch.

# panel.py - eine perforierte Fassadenplatte, jede Zahl ein Parameter
from build123d import *

W, H, T = 1200, 600, 3        # Plattenbreite, -höhe, -dicke (mm)
CORNER = 20                   # Eckradius (mm)
PITCH = 50                    # Lochabstand (mm)
D_MIN, D_MAX = 8, 30          # kleinstes und grösstes Loch (mm)
ROWS, COLS = 10, 22           # Perforationsgitter

with BuildPart() as panel:
    with BuildSketch():
        RectangleRounded(W, H, CORNER)
    extrude(amount=T)

    top = panel.faces().sort_by(Axis.Z)[-1]          # die Fläche, in die wir bohren
    with BuildSketch(top):
        for r in range(ROWS):
            d = D_MIN + (D_MAX - D_MIN) * r / (ROWS - 1)  # Reihe 0 klein, obere Reihe gross
            y = (r - (ROWS - 1) / 2) * PITCH
            with Locations((0, y)):
                with GridLocations(PITCH, PITCH, COLS, 1):
                    Circle(d / 2)
        with GridLocations(W - 60, H - 60, 2, 2):        # vier Befestigungslöcher
            Circle(11 / 2)
    extrude(amount=-T, mode=Mode.SUBTRACT)

part = panel.part
open_area = 1 - part.volume / (W * H * T)
print(f"volume {part.volume / 1000:.0f} cm3, mass {part.volume * 2.7e-6:.2f} kg (aluminium)")
print(f"open area {open_area:.1%}, faces {len(part.faces())}")
export_step(part, "panel.step")
export_stl(part, "panel.stl")

Starte python panel.py. Es dauert etwa neun Sekunden und druckt:

volume 1945 cm3, mass 5.25 kg (aluminium)
open area 9.9%, faces 234

Zeilen 4–8 — die Konstanten sind das Design: Ein Grasshopper-Nutzer kennt diese als Schieber. Hier sind sie benannte Zahlen an einer Stelle, jede mit ihrer Einheit im Kommentar. Ein Parameter ist einfach ein Wert, den der Rest des Programms liest, statt zu wiederholen. PITCH ändern und alle Löcher bewegen sich, weil keine andere Zeile 50 fest codiert.

Zeilen 10–13 — die Platte: with BuildPart() as panel: öffnet einen Arbeitsraum für ein 3D-Bauteil. Darin öffnet BuildSketch() eine flache Zeichnung auf der XY-Ebene. RectangleRounded(W, H, CORNER) zeichnet die Kontur mit 20 mm Ecken, und extrude(amount=T) drückt sie zu einer 3 mm Platte hoch. Einrückung ist die Grammatik hier: Was in einem with-Block sitzt, gehört zu diesem Arbeitsraum.

Zeile 15 — auswählen durch Fragen: panel.faces().sort_by(Axis.Z)[-1] holt jede Fläche, sortiert sie nach Höhe und nimmt die letzte, die höchste. Du stelltest eine Frage, und die Antwort bleibt korrekt, auch wenn T sich ändert. Auswahl durch Abfrage ist die Kernidee von Code-CAD.

Zeilen 16–24 — die gestufte Schleife: Eine Schleife wiederholt einen Block einmal pro Wert, hier einmal pro Reihe r von 0 bis 9. r / (ROWS - 1) läuft von 0 bis 1, daher läuft der Durchmesser d linear von 8 bis 30 mm. Locations((0, y)) verschiebt jede Reihe vertikal, zentriert auf der Platte. GridLocations(PITCH, PITCH, COLS, 1) wiederholt den Kreis 22 Mal über. In der exportierten Datei laufen die Radien von 4,0 mm in der Reihe bei y = -225 bis 15,0 mm bei y = +225, daher sitzen die grossen Löcher oben, wo mehr Tageslicht und Sicht erwünscht sind. Das zweite GridLocations platziert vier 11 mm Befestigungslöcher 30 mm von jedem Rand.

Zeile 25 — ein Schnitt, 224 Löcher: extrude(amount=-T, mode=Mode.SUBTRACT) drückt jeden Kreis abwärts durch die Platte und entfernt ihn in einer einzigen Booleschen Operation. Der Anfängerfehler ist, mode=Mode.SUBTRACT zu vergessen. Die Kreise werden dann als 3 mm Scheiben oben auf der Platte hinzugefügt. Du siehst es sofort, weil das Volumen steigt, statt zu sinken.

Zeilen 27–32 — die ausgedruckten Kontrollrechnungen und der Export: Volumen ist in mm³. 2.7e-6 kg/mm³ ist Aluminiums Dichte, 2,7 g/cm³. Öffnungsfläche ist eins minus Körpervolumen geteilt durch Plattenvolumen von 2.160.000 mm³. Eine Handrechnung der Lochabflächen gibt auch 9,9 %. Flächenanzahl: oben und unten, 8 Kanten (4 Seiten plus 4 Rundungen), und 224 Lochwände machen 234. Die STEP-Datei ist etwa 0,9 MB und die STL etwa 5,7 MB. Sie reimportiert als ein gültiger Körper mit einer 1200,0 x 600,0 x 3,0 Begrenzungsbox.

Ein Benchmark auf dem ModelRift-Blog, diskutiert auf Hacker News am 12. September, hatte KI-Agenten druckbare Teile in CadQuery und OpenSCAD modellieren. Jedes Bauteil endete druckbar, aber die Läufe trafen 16 Fehler, „9 davon erwähnte das Werkzeug überhaupt nicht”. Wer auch immer den CAD-Code schreibt, Mensch oder Modell, kontrolliere den Körper: sein Volumen, seine Gültigkeit, eine Handrechnung.

←HEUTE: Eine 1200 x 600 mm Kassette ist 32 Zeilen Python und eine 0,9 MB STEP-Datei im Oktober 2026.
→3012: Die Platte überlebt ihre Software, weil ihr Rezept Klartext ist und ihr Körper ein offener ISO-Standard.
Fulcrum: Ein Bauteil, das du neu laufen kannst, ist ein Bauteil, das du reparieren kannst.

Aus den späten 2070ern waren die Fassaden, die am schlechtesten alterten, diejenigen, deren Plattengeometrie nur in einer toten proprietären Datei lebte, daher konnte eine beschädigte Kassette nicht neu gemacht werden. Ein Text-Skript plus STEP-Datei (ISO 10303) ist das Gegenteil: Ein 25-Jähriger kann beide in einem Klartext-Editor und einem freien Kernel öffnen. Wähle Formate mit diesem Leser im Kopf.

Atelier: Ein Schweizer Fassadenplanungsbüro, das eine perforierte Kassettenfamilie für einen Metallarbeiter vorbereitet, entwirft und erforscht in Rhino und Grasshopper, dann übergibt die vereinbarten Parameter an ein Skript, das einen exakten STEP pro Plattentyp für das CAM des Fabrikanten schreibt. Das Modell hört auf, die Zeichnung zu sein, und wird ein Rezept, das das Büro versionieren, diff und neu laufen kann, wenn sich das Gitter die Nacht vor der Ausschreibung ändert. Montagszug: Wähle den Plattentyp, den dein Büro am häufigsten zeichnet, schreibe seine Dimensionen als die erste fünf Zeilen eines build123d-Skripts, und speichere dieses Skript im selben Projektordner wie die Rhino-Datei.

Hack: Öffne die Perforation breiter, indem du eine einzige Zahl bearbeitest, und sage das Ergebnis voraus, bevor du es laufen lässt. Grössere obere Löcher sollten mehr Öffnungsfläche und weniger Masse bedeuten, während die Flächenanzahl gleich bleibt, weil es immer noch 224 Löcher gibt. Zeile 7 ändern, laufen lassen und vergleichen:

# panel.py, Zeile 7 — die einzige Änderung
D_MIN, D_MAX = 8, 40          # war 8, 30
# python panel.py  ->  volume 1805 cm3, mass 4.87 kg (aluminium)
#                      open area 16.4%, faces 234

Öffnungsfläche steigt von 9,9 % auf 16,4 % und die Kassette verliert 0,38 kg. Der engste Steg zwischen Nachbarlöchern der oberen Reihe ist jetzt 10 mm (ein 50 mm Abstand minus ein 40 mm Loch). Ob 10 mm genug ist, ist eine Frage für den Fassadenplaner, nicht für das Skript. Das ist der Trade-off in klaren Worten: das Skript macht die Variante sofort, aber es kann sie nicht freigeben.

Stille Anerkennung: Hinter jeder Booleschen Operation hier sitzt der Open Cascade Kernel, Jahrzehnte von Geometrie-Code, gepflegt von Ingenieuren, die fast niemand namentlich nennt, und Maitlands Arbeit, ihn eine Baumeister-Sprache sprechen zu lassen. Bei PAZ, einem Rhino-Zentrum hier in der Schweiz, unterrichten wir Rhino 8 und Grasshopper; Code-CAD ist die nächste Schublade in derselben Werkzeugkiste. Zwei Sprachen, ein Gebäude, null Dialoge.

Lerne:

Klone das Repo, starte first.py, kontrolliere das Volumen von Hand, und ändere dann eine Zahl in panel.py vor Mittag.

GEMELDET AUS
MIT-UNTERZEICHNER
PAZ Academy
VERTRAUEN
HIGH
NACHDRUCKE
© PAZ - PARAMETRIC ACADEMY ZURICH · ALLE RECHTE VORBEHALTEN

PAZ Kaffi · interdisziplinäre Redaktionsarbeit, geleitet von der PAZ Academy

⚑ FEHLER MELDEN · KORREKTUR EINSENDEN
◂ ZURÜCK ZUR TITELSEITE · PAZ KAFFI

© 2026 PAZ Academy.