Stempel-Element: SIA-Bilanz als platzierbares Viewport-Objekt
Neuer Element-Type "stempel" — TextEntity die automatisch eine SIA-416
Bilanz aggregiert und im Plan platziert wird. Re-rendert sich live wenn
sich Raeume im Scope aendern.
Backend (elemente.py):
- Neue SIA-Tags: GF (Geschossflaeche), AGF (Aussengeschossflaeche)
mit eigenen Labels + Pastell-Farben in _SIA_COLORS_HEX
- "stempel" als SOURCE_TYPE; eigene UserStrings:
- stempel_scope: "total" | "geschoss:<gid>"
- stempel_txt_h, stempel_font, stempel_bold, stempel_italic
- compute_sia_bilanz(doc, scope): aggregiert nach SIA-Tags, liefert
HNF/NNF/VF/FF/GF/AGF + abgeleitet NF/NGF/count + Scope-Label
- _format_bilanz_lines: kompakte Stempel-Textzeilen ("HNF 120.5 m²"),
Trennlinien + nur Kategorien > 0
- _make_stempel_text: TextEntity-Builder mit Header "Nutzflächen · {Scope}"
- _regenerate_element_body "stempel"-Branch: in-place Replace mit
aktualisiertem Text (Position bleibt aus alter Geometrie)
- _regenerate_stempel_for_geschoss: regennt alle Stempel im selben
Geschoss + alle "total"-Stempel
- Auto-Cascade: raum_outline-Regen setzt sticky-marker; nach REGEN_BUSY-
Release wird _regenerate_stempel_for_geschoss aufgerufen
- _cmd_create_stempel: GetPoint im Viewport, layer = aktives Geschoss
Raum-Sublayer, default-Scope = aktives Geschoss
- _update_wall "stempel"-Branch: scope/txtH/font/bold/italic via patch
- elemente_uebersicht: SIA-Bilanz um gf/agf/ngf erweitert; "stempel"
als KIND-Eintrag
Frontend:
- createStempel-Bridge-Export
- "Stempel"-Pill-Button in der "Raeume"-PillGroup
- StempelProperties-Component: Scope-Dropdown (Total + alle Geschosse),
Bilanz-Vorschau mit Hervorhebung der NF (Accent-Farbe)
- KIND_META + RAUM_SIA_KINDS um GF/AGF erweitert
Workflow: Pill "Stempel" klicken → Punkt im Viewport → Stempel erscheint
mit Header "Nutzflächen · EG" + Bilanz. Properties: Scope auf Total
umstellen oder anderes Geschoss waehlen. Neue Raeume taggen mit SIA-
Tag → Stempel aktualisiert sich automatisch.
This commit is contained in:
@@ -31,6 +31,7 @@ _KIND_MAP = {
|
||||
"stuetze_point": "stuetze",
|
||||
"traeger_axis": "traeger",
|
||||
"raum_outline": "raum",
|
||||
"stempel": "stempel",
|
||||
"decke_aussparung_outline": "aussparung",
|
||||
"oeffnung_point": "oeffnung", # wird zu fenster/tuer aufgeloest
|
||||
}
|
||||
@@ -131,18 +132,21 @@ def _build_overview(doc):
|
||||
if not area or area <= 0: continue
|
||||
g_id = meta.get("geschoss") or "__keingeschoss__"
|
||||
sia = (meta.get("raum_sia") or "").lower()
|
||||
if sia not in ("hnf", "nnf", "vf", "ff"):
|
||||
if sia not in ("hnf", "nnf", "vf", "ff", "gf", "agf"):
|
||||
sia = "ohne"
|
||||
b = sia_bilanz.setdefault(g_id, {
|
||||
"hnf": 0.0, "nnf": 0.0, "vf": 0.0, "ff": 0.0,
|
||||
"gf": 0.0, "agf": 0.0,
|
||||
"ohne": 0.0, "count": 0,
|
||||
})
|
||||
b[sia] += float(area)
|
||||
b["count"] += 1
|
||||
# NF + Total ableiten
|
||||
# NF/NGF/Total ableiten
|
||||
for b in sia_bilanz.values():
|
||||
b["nf"] = b["hnf"] + b["nnf"]
|
||||
b["total"] = b["hnf"] + b["nnf"] + b["vf"] + b["ff"] + b["ohne"]
|
||||
b["ngf"] = b["nf"] + b["vf"] + b["ff"]
|
||||
b["total"] = (b["hnf"] + b["nnf"] + b["vf"] + b["ff"]
|
||||
+ b["gf"] + b["agf"] + b["ohne"])
|
||||
|
||||
return {"geschosse": out_geschosse, "items": items,
|
||||
"siaBilanz": sia_bilanz}
|
||||
|
||||
Reference in New Issue
Block a user