IfcOpenShell 0.9.0: Dein erstes Python-Türenverzeichnis mit Brandschutzcheck
IfcOpenShell 0.9.0 neu geschrieben. Mit pip installieren, beliebige IFC öffnen, Türenverzeichnis als CSV schreiben, fehlende FireRatings flaggen.
IfcOpenShell 0.9.0 ist raus. Gemäss den IfcOpenShell-v0.9.0-Versionshinweisen auf GitHub ist es «der letzte grosse Meilenstein vor IfcOpenShell 1.0». Gemäss PyPI wurde das Python-Paket ifcopenshell 0.9.0 am 29. September 2026 hochgeladen, und der Release-Tag ifcopenshell-v0.9.0 folgte auf GitHub am 1. Oktober 2026. Darunter hat die Community das IFC-Datenmodell und den Parser von Grund auf neu aufgebaut. Oben ist das Python, das Architekten tatsächlich schreiben, noch immer eine Handvoll Zeilen. Der Motor ist neu und das Interface, das man berührt, noch überschaubar – ein guter Moment, die Grundzüge zu lernen.
Jedes Schweizer Büro empfängt IFC-Dateien vom Ingenieur, dem Fassadenplaner und dem anderen Architekten des Wettbewerb-Teams. Die meisten dieser Dateien werden in einem Viewer geöffnet, gedreht und geschlossen. Niemand stellt ihnen eine Frage, aber die Antworten sind bereits in der Datei. Jede Tür darin hat entweder eine Brandschutzklasse oder nicht, und man kann alle lesen, bevor der Kaffee kalt wird.
Was die Community tatsächlich ausgeliefert hat
Die IfcOpenShell-Versionshinweise berichten in ihrem Highlights-Abschnitt von einem kompletten Neuaufbau des C++-IFC-Datenmodells und Parsers. Dies ist das «v1.0-Datenmodell»: Es basiert auf weak_ptr, hat eine Plug-in-Architektur für Schemas, Geometrie-Kernel und Serialisierer und unterstützt Lazy-Loading sowie seitenweises Parsing. Dieselben Highlights nennen zwei neue Geometrie-Kernel, Manifold und Passthrough, sowie Bonsai Viewer, einen neuen Web- und Desktop-Viewer mit GPU-Unterstützung. Bonsai Viewer bringt ein .ifcview-Cache-Format, Streaming, Verbund, Messwerkzeuge und einen WebAssembly-Build. Laut PyPI decken vorkompilierte Wheels Python 3.10 bis 3.15 unter der LGPLv3+-Lizenz ab. Die offizielle Installationsanleitung auf docs.ifcopenshell.org nennt denselben Python-3.10–3.15-Bereich und gibt einen einzigen Befehl an: pip install ifcopenshell.
Hinter dieser Ein-Zeilen-Installation stecken Jahre unspektakulärer Arbeit. Hunderte Menschen haben zu IfcOpenShell beigetragen. Zu den sichtbaren Kern-Beitragenden auf ifcopenshell.org gehören Dion Moult (der PyPI-Autor), Thomas Krijnen (aothms auf GitHub), Bruno Postle und Andrej730. Einen Parser zu bauen ist die halbe Arbeit. Die andere Hälfte ist, ihn in ein Wheel zu verwandeln, das sauber auf einem Büro-Laptop installiert, mit dokumentierten Helfern in ifcopenshell.util und einem Viewer, der im Browser läuft – und diese Hälfte ist oft die schwierigere. Diese Maintainer sind der Grund, dass ein Türenverzeichnis mit pip beginnt.
Eine Zeile lesen, bevor du eine schreibst
IFC ist kein kompiliertes Format. Es ist reiner Text, standardisiert von buildingSMART International, und man kann es in Notepad öffnen. Hier ist eine veranschaulichende IFC4-Türen-Zeile der Art, die ein Exporter schreibt:
#152=IFCDOOR('2O2Fr$t4X7Zf8NOew3FLOH',#5,'T02',$,$,#160,#170,$,2.1,0.9,.DOOR.,$,$);#152ist die lokale Kennung der Zeile. Andere Zeilen verweisen über sie auf diese Tür.'2O2Fr$t4X7Zf8NOew3FLOH'ist die 22-stellige GlobalId, die exportübergreifend stabil bleibt.#5verweist auf die Owner History (wer das Element erstellt hat und wann).'T02'ist der Name. Die zwei$danach sind eine leere Description und ein leerer ObjectType.#160, #170verweisen auf Placement (wo die Tür sitzt) und die Geometrie-Darstellung (wie sie aussieht).2.1, 0.9sind OverallHeight und OverallWidth in den Projekteinheiten (2,1 m mal 0,9 m hier)..DOOR.ist die PredefinedType-Enumeration.
Sieh, was aus dieser Zeile fehlt: das Brandschutzrating. Es sitzt in einem separaten Property Set, Pset_DoorCommon, das buildingSMART International definiert und das die Tür mit einer Beziehung anderswo in der Datei verlinkt. Das Skript unten folgt diesem Link für dich.
←HEUTE: IfcOpenShell 0.9.0 lässt sich mit einem pip-Befehl auf Python 3.10–3.15 installieren und liest jeden IFC4-Export.
→3012: Die Gebäude in Zürich, die heute noch repariert werden, sind die, deren Daten in einem Format geschrieben wurden, das jeder lesen kann.
Fulcrum: Eine offene Textdatei wird nur zur Infrastruktur, wenn normale Praktiker sie abfragen, nicht nur anschauen.
Das Tool: IfcOpenShell ist das freie, LGPLv3+-Toolkit zum Lesen und Schreiben von IFC. Es wird von einer offenen Community gepflegt und treibt Bonsai an (das native-IFC-Add-on für Blender), IfcTester für IDS-Checks und nun Bonsai Viewer. Ein Nachmittag lohnt sich, weil es «das Modell, das wir erhalten haben» in Daten verwandelt, die man zählen, filtern und zurückschicken kann.
Setup: Python 3.11 oder neuer von python.org installieren. Dann in einer frischen virtuellen Umgebung arbeiten. Wenn ein älteres ifcopenshell systemweit installiert ist, kann Python diese Kopie statt der neuen importieren, und das venv schliesst das aus.
mkdir ifc-doors && cd ifc-doors
python -m venv .venv
.venvScriptsactivate # macOS/Linux: source .venv/bin/activate
pip install ifcopenshell==0.9.0
python -c "import ifcopenshell; print(ifcopenshell.version)"
# expected output: 0.9.0Erste Schritte:
- Eine echte Datei nehmen: den eigenen IFC-Export des Büros oder eine beliebige IFC4-Datei aus einem aktuellen Projekt, egal ob sie aus einem Archicad-Workflow oder dem Tool eines Beraters stammt. In den Ordner kopieren.
- Das Folgende als
door_schedule.pyspeichern. Es öffnet das Modell, läuft durch jede Tür, liestPset_DoorCommonund das enthaltende Geschoss und schreibt eine CSV.
import csv, sys
import ifcopenshell
import ifcopenshell.util.element as ue
import ifcopenshell.util.selector as us
model = ifcopenshell.open(sys.argv[1], lazy=True)
print("Schema:", model.schema, "| ifcopenshell", ifcopenshell.version)
rows = []
for d in us.filter_elements(model, "IfcDoor"):
common = ue.get_psets(d).get("Pset_DoorCommon", {})
storey = ue.get_container(d)
rows.append({
"GlobalId": d.GlobalId,
"Name": d.Name,
"Storey": storey.Name if storey else "",
"Width_m": d.OverallWidth,
"FireRating": common.get("FireRating", ""),
"IsExternal": common.get("IsExternal", ""),
})
with open("door_schedule.csv", "w", newline="", encoding="utf-8") as fh:
w = csv.DictWriter(fh, fieldnames=list(rows[0]))
w.writeheader(); w.writerows(rows)
missing = [r["Name"] for r in rows if not r["FireRating"]]
print(f"{len(rows)} doors written; {len(missing)} without FireRating: {missing}")- Führe aus:
python door_schedule.py my_model.ifc, dann öffnedoor_schedule.csvin Excel oder LibreOffice. Der PAZ Research Desk führte es am 2. Oktober 2026 auf Windows mit ifcopenshell 0.9.0 auf einer dreier-Türen-IFC4-Testdatei aus. Es generierte eine korrekte CSV und gab1 ohne FireRating: ['T02']aus. - Lies die Vorbehalte, bevor du den Zahlen traust.
OverallWidthrichtet sich nach den Projekteinheiten der Datei: Meter in dieser Testdatei, oft Millimeter in echten Exports.lazy=Trueist neu in 0.9 und wurde bisher nur an einer kleinen Datei getestet.
Die zwei Helfer mit der echten Arbeit sind in der 0.9.0-API-Referenz dokumentiert. Laut der ifcopenshell.util.element-Doku ruft get_psets Property Sets mit ihren Eigenschaftsnamen und -werten ab, und get_container gibt den räumlichen Struktur-Container zurück – hier das Geschoss. Dieselben ifcopenshell.util-Helfer begegnen dir wieder bei IDS-Checks mit IfcTester und in Bonsai. Darum startet der Python-Track in den PAZ-Workshops hier, nicht mit Syntax-Drills.
Eine Einschränkung: Die Datei sagt nur, was der Exporter schreiben wollte. Eine Tür ohne Pset_DoorCommon gibt ein leeres Dict zurück, keinen Fehler, also kann «kein Rating» bedeuten, dass das Rating nie zugewiesen oder einfach nicht exportiert wurde. Entweder Fall, es lohnt sich, diese Frage an den Modellverantwortlichen zu schicken – und jetzt kommt sie mit einer GlobalId mit.
Atelier: Für ein kleines Büro in Zürich, das auf erhaltene IFCs abstimmt, braucht eine Modellkontrolle keinen Autorensitz und keinen Spezialisten mehr. Es braucht ein venv und etwa dreissig Zeilen, die ein Junior mit einem KI-Assistenten an der Seite lesen kann, und das ändert, wer im Team dem Modell schwierige Fragen stellen darf. Montagszug: door_schedule.py auf die letzte IFC deines Büros laufen lassen und die Liste der Türen ohne FireRating dem Modellverantwortlichen vor der nächsten Abstimmung mailen.
Hack: Frag den Selector nach Türen ohne Rating in einem Filterstring. Laut IfcOpenShell-Selector-Syntax nehmen Property-Filter die Form Pset.Prop=value an, mit Operatoren = != > >= < <= *= !*=. Mit = NULL bekommst du die Elemente, denen die Eigenschaft fehlt; die Doku zeigt die Inverse, != NULL, um die Elemente mit der Eigenschaft zu finden. Fünf Zeilen, keine Loop-Logik:
import ifcopenshell
import ifcopenshell.util.selector as us
model = ifcopenshell.open("my_model.ifc")
for d in us.filter_elements(model, "IfcDoor, Pset_DoorCommon.FireRating = NULL"):
print(d.GlobalId, d.Name)Wenn das läuft, versuch den Stretch, den die Doku andeutet: Tausch IfcDoor gegen IfcWall und Pset_DoorCommon gegen Pset_WallCommon. Die Doku zeigt IfcWall, Pset_WallCommon.ThermalTransmittance>1.5 als U-Wert-Filter – praktisch, wenn der Energieberater anfragt.
Zum Lernen:
- IfcOpenShell v0.9.0 Versionshinweise auf GitHub. Den Highlights-Abschnitt lesen; der Detailabschnitt darunter ist als KI-generiert gekennzeichnet.
- IfcOpenShell-Python-Installationsanleitung (0.9.0)
- Selector-Syntax: die Filtersprache hinter dem Hack
- ifcopenshell.util.element-API-Referenz: get_psets, get_container und mehr
- ifcopenshell 0.9.0 auf PyPI
- Eine Momo-Notiz: das Skript im Projektordner neben der geprüften IFC speichern. Dein Kollege nächstes Jahr wird es dir danken.
Ein Wort aus dem späten 2070er. Die Gebäude, die schlecht gealtert sind in meiner Zeit, waren nicht die hässlichen. Es waren die, die keiner reparieren konnte, weil die Datei, die sie beschrieb, dunkel wurde mit ihrem Anbieter. Eine IFC, die man in Notepad lesen und mit LGPL-Code abfragen kann, ist das Gegenteil. Sich jetzt angewöhnen, sie abzufragen: ein Nachmittag.
Öffne die letzte IFC auf deinem Server und frag sie, welche Türen kein Brandschutzrating haben.
PAZ Kaffi · interdisziplinäre Redaktionsarbeit, geleitet von der PAZ Academy