🏗️ Python · BIM · CAD · Baubranche

nl2cad
IFC · DXF/DWG · Mesh · Punktwolke · Geo · BCF · STEP

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.

pip install nl2cad-core nl2cad-areas nl2cad-gaeb
Python 3.11+ MIT Lizenz Multi-Tenant Framework-agnostisch 8 Formatfamilien IFC4 · DXF R2018

Modulare Library-Architektur

Jedes Package kann einzeln installiert werden. Keine unnötigen Abhängigkeiten — nur was gebraucht wird.

nl2cad-core
IFC/DXF Parser & Pipeline
🏗️

IFC/DXF-Parser, Dataclasses (IFCModel, IFCRoom, DXFModel), Handler-Pipeline (Chain of Responsibility), Qualitätsprüfung.

ifcopenshell ezdxf stdlib only
nl2cad-areas
DIN 277 & WoFlV Rechner
📐

Flächenberechnung nach DIN 277 (Ausgabe 2016) und Wohnflächenverordnung. Automatische Nutzungsklassifikation (NUF, VF, TF, KGF).

nl2cad-core
nl2cad-brandschutz
Brandschutz-Analyse
🔥

Fluchtweg-Analyse nach ASR A2.3, Feuerwiderstandsklassen (DIN 4102, EN 13501), Brandabschnitts-Erkennung, Mängelprotokoll.

nl2cad-core nl2cad-areas
nl2cad-gaeb
GAEB X81–X85 Generator
📋

GAEB-Datenaustausch (X81–X85) aus IFC-Modellen generieren. XML-Export, Excel-Ausgabe, IFC→X83 Converter. Vollständig normkonform.

nl2cad-core openpyxl
nl2cad-nlp
Natural Language → CAD
🧠

Intent-Klassifikation (Raumanalyse, DIN277, GAEB, Brandschutz ...), NL2DXF Generator (Regex + LLM-Fallback), lernender Pattern-Store.

nl2cad-core pydantic httpx

Chain of Responsibility

Jeder Handler liest aus dem akkumulierten Context, verarbeitet und gibt sein Ergebnis weiter. Vollständig komponierbar.

📁
FileInputHandler
IFC / DXF erkennen & parsen
IFCQualityHandler
Modell-Qualität prüfen
📊
MassenHandler
Massenermittlung
📐
DIN277Handler
Nutzflächen berechnen
🔥
BrandschutzHandler
Mängel analysieren
📋
GAEBHandler
LV exportieren

↑ Eigene Handler: class MyHandler(BaseCADHandler) — füge beliebige Schritte in die Pipeline ein.

In 3 Zeilen produktionsreif

Von der IFC-Datei zum GAEB-Export — oder per Natural Language zum DXF-Befehl.

Python 3.11+
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)

Produktionsreif aus der Box

📂

Formate aller Art

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.

🏢

Multi-Tenant ready

Jede Pipeline kann tenant-isoliert laufen. NL-Lernstore, Konfiguration und Datenpfade sind pro Mandant trennbar.

🔌

Framework-agnostisch

Kein Django, kein FastAPI, kein HTTP. Reine Python-Library — integrierbar in jeden Stack.

⛓️

Erweiterbare Pipeline

Eigene Handler mit BaseCADHandler in 3 Zeilen. Chain of Responsibility, klar definierte Interfaces.

📏

DIN 277 & WoFlV

Vollständige Umsetzung der DIN 277 (2016) und Wohnflächenverordnung. Automatische Nutzungsklassifikation.

🔥

Brandschutz-Analyse

Fluchtweg-Prüfung nach ASR A2.3, Feuerwiderstandsklassen (DIN 4102 / EN 13501), Mängelprotokoll.

📋

GAEB X81–X85

Vollständiger GAEB-Datenaustausch aus IFC. XML + Excel-Export. IFC → X83 Converter inklusive.

🧠

NL-Intent-Klassifikation

Natürlichsprachliche Queries auf BIM-Intents mappen. Lernender JSON-Store, LLM-Fallback optional.

🔬

Strict Typing & Tests

mypy strict, ruff linting, pytest ≥ 80% Coverage. Alle Maßfelder tragen Einheits-Suffix (_m2, _m).

Eine Library, viele Mandanten

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.

Klare Dependency-Grenzen

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