Framework-agnostische Python-Library zum Auslesen und Analysieren von CAD-Dateien aller Art — ein einheitlicher Reader für BIM, 2D/3D-CAD, Punktwolken, Geo/GIS, BCF und STEP. Tenantfähig, modular, produktionsreif.
Packages
Jedes Package kann einzeln installiert werden. Keine unnötigen Abhängigkeiten — nur was gebraucht wird.
IFC/DXF-Parser, Dataclasses (IFCModel, IFCRoom, DXFModel), Handler-Pipeline (Chain of Responsibility), Qualitätsprüfung.
Flächenberechnung nach DIN 277 (Ausgabe 2016) und Wohnflächenverordnung. Automatische Nutzungsklassifikation (NUF, VF, TF, KGF).
Fluchtweg-Analyse nach ASR A2.3, Feuerwiderstandsklassen (DIN 4102, EN 13501), Brandabschnitts-Erkennung, Mängelprotokoll.
GAEB-Datenaustausch (X81–X85) aus IFC-Modellen generieren. XML-Export, Excel-Ausgabe, IFC→X83 Converter. Vollständig normkonform.
Intent-Klassifikation (Raumanalyse, DIN277, GAEB, Brandschutz ...), NL2DXF Generator (Regex + LLM-Fallback), lernender Pattern-Store.
Handler Pipeline
Jeder Handler liest aus dem akkumulierten Context, verarbeitet und gibt sein Ergebnis weiter. Vollständig komponierbar.
↑ Eigene Handler: class MyHandler(BaseCADHandler) — füge beliebige Schritte in die Pipeline ein.
Code-Beispiele
Von der IFC-Datei zum GAEB-Export — oder per Natural Language zum DXF-Befehl.
from nl2cad.core.parsers import IFCParser from nl2cad.areas.din277 import DIN277Calculator from nl2cad.brandschutz.analyzer import BrandschutzAnalyzer from nl2cad.gaeb.converter import IFCX83Converter # IFC parsen parser = IFCParser() model = parser.parse("gebaeude.ifc") print(f"{model.floor_count} Geschosse, {model.total_area_m2:.1f} m² gesamt") # DIN 277 berechnen calc = DIN277Calculator() result = calc.calculate(model.rooms) print(f"NUF: {result.nutzungsflaeche_m2:.1f} m²") # Brandschutz analysieren analyzer = BrandschutzAnalyzer() bs_result = analyzer.analyze(model) for mangel in bs_result.maengel: print(f"⚠ {mangel.beschreibung}") # GAEB X83 exportieren converter = IFCX83Converter() xml_bytes = converter.convert_to_x83(model, projekt_name="Neubau EFH")
from nl2cad.core import ( CADHandlerPipeline, FileInputHandler, IFCQualityHandler, MassenHandler ) # Pipeline zusammenstellen pipeline = ( CADHandlerPipeline(continue_on_error=False) .add(FileInputHandler()) .add(IFCQualityHandler()) .add(MassenHandler()) ) # Ausführen (IFC-Bytes aus Upload) results = pipeline.run({ "file_content": ifc_bytes, "filename": "projekt.ifc", "tenant_id": "mandant-42", # ← Tenant-Context }) ctx = pipeline.get_context() print(ctx["massen"]) # MassenErgebnis print(pipeline.success) # True / False print(pipeline.warnings) # Qualitätsmeldungen
from nl2cad.nlp.intent import IntentClassifier, NLIntent from nl2cad.nlp.nl2dxf import NL2DXFGenerator from nl2cad.nlp.learning import NLLearningStore # Intent erkennen clf = IntentClassifier() result = clf.classify("Wie viele Räume hat das Gebäude?") # → IntentResult(intent=RAUMANALYSE, confidence=0.5) # NL → DXF-Befehle (Regex-Fallback, kein LLM nötig) gen = NL2DXFGenerator() dxf_result = gen.generate("Zeichne einen Raum 6 x 4 m") # → NL2DXFResult(success=True, commands=[RECT 6x4]) # Lernender Pattern-Store (tenant-isoliert per data_path) store = NLLearningStore( data_path=Path(f"/data/tenants/{tenant_id}/nl_patterns.json") ) store.add("NGF berechnen", "din277")
from dataclasses import dataclass, field from pathlib import Path # Vorgeschlagene TenantConfig-Dataclass (nl2cad-core) @dataclass class TenantConfig: tenant_id: str name: str data_root: Path = Path("/data/tenants") # Erlaubte Packages steuern (Lizenz-Modell) enabled_packages: list[str] = field(default_factory=lambda: [ "core", "areas", "brandschutz", "gaeb", "nlp" ]) # Fachliche Konfiguration pro Mandant din277_profile: str = "standard" # standard | wohnbau | gewerbebau gaeb_phase_default: str = "X83" max_file_size_mb: int = 50 @property def nl_patterns_path(self) -> Path: return self.data_root / self.tenant_id / "nl_patterns.json" # Nutzung in cad-hub (Django-Consumer) config = TenantConfig(tenant_id="mandant-42", name="Baufirma GmbH") store = NLLearningStore(data_path=config.nl_patterns_path)
Features
Ein Reader für IFC/IFC-XML/IFC-ZIP, DXF, DWG, Mesh (STL/OBJ/PLY/glTF), Punktwolken (LAS/LAZ/E57), Geo/GIS (SHP/GeoJSON/CityJSON), BCF und STEP — über eine ParserRegistry auf einen einheitlichen CADModel-Envelope.
Jede Pipeline kann tenant-isoliert laufen. NL-Lernstore, Konfiguration und Datenpfade sind pro Mandant trennbar.
Kein Django, kein FastAPI, kein HTTP. Reine Python-Library — integrierbar in jeden Stack.
Eigene Handler mit BaseCADHandler in 3 Zeilen. Chain of Responsibility, klar definierte Interfaces.
Vollständige Umsetzung der DIN 277 (2016) und Wohnflächenverordnung. Automatische Nutzungsklassifikation.
Fluchtweg-Prüfung nach ASR A2.3, Feuerwiderstandsklassen (DIN 4102 / EN 13501), Mängelprotokoll.
Vollständiger GAEB-Datenaustausch aus IFC. XML + Excel-Export. IFC → X83 Converter inklusive.
Natürlichsprachliche Queries auf BIM-Intents mappen. Lernender JSON-Store, LLM-Fallback optional.
mypy strict, ruff linting, pytest ≥ 80% Coverage. Alle Maßfelder tragen Einheits-Suffix (_m2, _m).
Multi-Tenant
nl2cad unterstützt mandantenfähigen Betrieb: Datenpfade, NL-Muster, GAEB-Konfiguration und erlaubte Packages sind pro Tenant konfigurierbar. Klicke auf einen Mandanten-Typ, um die angepasste Ansicht zu sehen.
Voller Zugriff auf alle Packages. Ideal für Entwickler und Integration in eigene Stacks.
→ Standard-AnsichtFokus auf Massenermittlung, GAEB-Export und Ausschreibungs-Workflows. Optimiert für Bauleiter.
→ Bauunternehmen-EditionIFC-Parsing, DIN 277-Analyse, Raumbucherstellung und NL2DXF für schnelle Entwurfs-Iteration.
→ Architekturbüro-EditionBrandschutz-Analyse (ASR A2.3), WoFlV-Berechnung, IFC-Qualitätsprüfung für Gutachten.
→ Gutachter-EditionArchitektur
Strikte Package-Grenzen verhindern ungewollte Abhängigkeiten. Kein Pydantic in Core, kein Django nirgends.
nl2cad-nlp (pydantic, httpx, OpenAI/Anthropic) └── nl2cad-brandschutz ──┐ └── nl2cad-gaeb │ └── nl2cad-areas ├──→ nl2cad-core (ifcopenshell, ezdxf, stdlib) └── nl2cad-core ─────┘ ┌─────────────────────────────────────────────────────────────┐ │ VERBOTEN in core / areas / gaeb / brandschutz: │ │ ✗ pydantic ✗ httpx ✗ Django ORM ✗ print() │ └─────────────────────────────────────────────────────────────┘
Mandant wechseln