Fix remaining German log messages: Panel registered, Listener active, sync all files to PROJECTS

- Fix sed $-anchor issue: 'Panel registriert' now replaced globally
- Translate: Listener aktiv, Select-Handler, Closing-Hook, Doppelklick-Handler
- Translate SPLASH messages: gesetzt/angewendet
- Translate ALIAS-LOADER, WELCOME, ELEMENTE migration messages
- Full rsync of all rhino/*.py to PROJECTS (previously partial sync missed schnitte.py, wand_grips.py, treppe_grips.py, text_editor.py, welcome.py etc.)
This commit is contained in:
2026-06-06 12:09:12 +02:00
parent b9f661cdb3
commit 9fcada260e
22 changed files with 95 additions and 95 deletions
+41 -41
View File
@@ -280,7 +280,7 @@ _KEY_TREPPE_SOLL = "dossier_treppe_soll" # JSON {s:[lo,hi,on], a:[lo
_KEY_TREPPE_2D_SHOW = "dossier_treppe_2d_show" # doc-Setting "1"/"0" — Plansymbol an/aus
# Per-Treppe Sichtbarkeits-Flags fuer 2D-Plansymbol-Bestandteile
# (UserString auf treppe_axis-Objekt). Default "1" wenn nicht gesetzt.
# (UserString auf treppe_axis-Objekt). Default "1" wenn nicht set.
_KEY_TREPPE_SHOW_TRITTE = "dossier_treppe_show_tritte"
_KEY_TREPPE_SHOW_LAUFLINIE = "dossier_treppe_show_lauflinie"
_KEY_TREPPE_SHOW_AUSSEN = "dossier_treppe_show_aussen"
@@ -350,7 +350,7 @@ _RAUM_LAYOUT_DEFAULT = [["nummer", "name"], ["funktion"], ["area"]]
# Per-Document Storage-Key fuer Raumstempel-Stile (Presets).
_KEY_RAUM_STILE = "dossier_raum_stempel_stile"
# Auf der Raum-Outline: id des zuletzt angewendeten Stils. Damit das UI
# Auf der Raum-Outline: id des zuletzt applieden Stils. Damit das UI
# anzeigen kann welcher Stil aktiv ist.
_KEY_RAUM_STIL_ID = "dossier_raum_stil_id"
@@ -414,8 +414,8 @@ _RAUM_RUNDUNGEN = ("exakt", "0.01", "0.1", "0.5", "1")
def _resolve_raum_rundung(meta, doc=None):
"""Loest die Raum-Rundung auf. Wenn am Raum eine explizite UserString-
Rundung gesetzt ist (raum_rundung != ""), gewinnt die. Sonst Default aus
dem aktiven Mass-Style. Doc-Default fallback "0.1" wenn nichts gesetzt."""
Rundung set ist (raum_rundung != ""), gewinnt die. Sonst Default aus
dem aktiven Mass-Style. Doc-Default fallback "0.1" wenn nichts set."""
explicit = (meta or {}).get("raum_rundung") or ""
if explicit in _RAUM_RUNDUNGEN: return explicit
if doc is None: doc = Rhino.RhinoDoc.ActiveDoc
@@ -658,7 +658,7 @@ def _geschoss_by_id(doc, gid):
def _active_geschoss_id(doc):
"""Liefert die ID des aktuell aktiven Geschosses (= im Ebenen-Manager
blau hervorgehoben). Falls keins gesetzt oder das aktive keine
blau hervorgehoben). Falls keins set oder das aktive keine
Geschoss-Ebene ist (z.B. Schnitt/Ansicht), wird das erste echte
Geschoss zurueckgegeben."""
try:
@@ -701,9 +701,9 @@ def _resolve_decke_z(doc, gid, dicke, uk_over, ok_over):
der natuerliche Fixpunkt: aendert sich die Dicke, wandert UK mit.
Override-Logik:
- Nur OK_override gesetzt OK = override, UK = OK - dicke
- Nur UK_override gesetzt UK = override, OK = UK + dicke
- Beide gesetzt beide literal"""
- Nur OK_override set OK = override, UK = OK - dicke
- Nur UK_override set UK = override, OK = UK + dicke
- Beide set beide literal"""
g = _geschoss_by_id(doc, gid)
okff = float(g.get("okff", 0.0)) if g else 0.0
auto_ok = okff
@@ -1425,7 +1425,7 @@ def _collect_circle(doc, center):
def _make_decke_preview_handler(committed_points):
"""Live-Preview waehrend Decken-Outline gezeichnet wird: gesetzte Segmente
"""Live-Preview waehrend Decken-Outline gezeichnet wird: sete Segmente
+ Rubberband + gestrichelte Schliessungs-Linie zurueck zum Startpunkt."""
import System.Drawing as SD
color_line = SD.Color.FromArgb(255, 95, 200, 180)
@@ -1665,7 +1665,7 @@ def _make_treppe_wendel_preview(center, start, breite, referenz, n_stufen,
def _make_treppe_l_corner_preview(p0, breite, referenz, total_n, total_h,
max_length=None):
"""Preview fuer den 2. Klick einer L-Treppe (Podest-Eck). Zeigt:
- Lauflinie + Aussenkanten (geclamped auf max_length wenn gesetzt)
- Lauflinie + Aussenkanten (geclamped auf max_length wenn set)
- Step-Lines an A_opt-Abstaenden
- Live-Label mit N1 / N2
"""
@@ -2016,7 +2016,7 @@ def _t_snap_to_wand_axis(doc, pt, tol=0.15):
def _make_preview_handler(committed_points, dicke, referenz):
"""Preview fuer Polylinie-Wand: gesetzte Punkte + Rubberband + Wand-Kanten."""
"""Preview fuer Polylinie-Wand: sete Punkte + Rubberband + Wand-Kanten."""
import System.Drawing as SD
color_axis = SD.Color.FromArgb(255, 95, 200, 180)
color_edge = SD.Color.FromArgb(180, 140, 215, 200)
@@ -2963,7 +2963,7 @@ def install_cluster_select_handler():
h = _ClusterVolumeSelectHandler()
h.Enabled = True
sc.sticky[_STICKY_CLUSTER_SELECT] = h
print("[ELEMENTE] Cluster-Volume Select-Handler aktiv")
print("[ELEMENTE] Cluster-Volume Select-Handler active")
except Exception as ex:
print("[ELEMENTE] cluster-select install:", ex)
@@ -3916,7 +3916,7 @@ def _set_layer_section_hatch(doc, layer_idx, hatch_name, scale=1.0,
def _ensure_material_sublayer(doc, geschoss_name, material_name):
"""Stellt sicher dass `<geschoss>::20_WAENDE::<material>` existiert,
mit Material-Farbe konfiguriert. Liefert Layer-Index.
Section-Hatch (2D-Schnitt) wird NICHT mehr aus dem Material gesetzt
Section-Hatch (2D-Schnitt) wird NICHT mehr aus dem Material set
der kommt vom Parent-Layer (= Ebenen-Settings). Sub-Layer haben default
keine eigene Section-Hatch, sie inherit'en Rhino-typisch ihre Optik
fuer den Schnitt vom Parent.
@@ -4004,7 +4004,7 @@ def _ensure_pbr_material(doc, mat_dict):
- PhysicallyBased.Roughness, Opacity (= 1-transparency), OpacityIor
- PhysicallyBased.Metallic = reflection (Naeherung)
- SetBitmapTexture / SetBumpTexture / SetTransparencyTexture wenn
Pfade gesetzt
Pfade set
- Texture.Repeat = (1/uvScaleM, 1/uvScaleM)"""
if not isinstance(mat_dict, dict): return -1
color = mat_dict.get("color") or "#888888"
@@ -4085,7 +4085,7 @@ def _ensure_pbr_material(doc, mat_dict):
if setter is None: return
ok = setter(p)
if not ok: return
# Repeat auf den frisch gesetzten Texture-Slot — alle
# Repeat auf den frisch seten Texture-Slot — alle
# Slot-Indices durchgehen und matchen.
try:
import Rhino.Geometry as rgg
@@ -4604,7 +4604,7 @@ def _read_meta(obj):
otrah = a.GetUserString(_KEY_OEFF_TUER_RAHMEN) or "zarge"
if otrah not in _OEFF_TUER_RAHMEN: otrah = "zarge"
# Rahmen-Offset (m, von Wand-Innenseite). Default 5cm. Wenn Legacy-
# Wert (rahmen_pos) gesetzt aber kein offset, benutzt build-Logik
# Wert (rahmen_pos) set aber kein offset, benutzt build-Logik
# weiterhin den Preset.
try: oro = float(a.GetUserString(_KEY_OEFF_RAHMEN_OFFSET) or "0.05")
except Exception: oro = 0.05
@@ -4638,7 +4638,7 @@ def _read_meta(obj):
if tart not in _TREPPE_ARTEN: tart = "gerade"
thov = a.GetUserString(_KEY_TREPPE_H_OVER) or ""
tukov = a.GetUserString(_KEY_TREPPE_UK_OVER) or ""
# 2D-Plansymbol-Flags — default True wenn nicht gesetzt
# 2D-Plansymbol-Flags — default True wenn nicht set
def _flag_on(key):
v = a.GetUserString(key)
return v != "0" # None, "", "1" → True
@@ -4657,7 +4657,7 @@ def _read_meta(obj):
except Exception: t_target_a = 0.0
try: t_podest_min = float(a.GetUserString(_KEY_TREPPE_PODEST_MIN) or "0")
except Exception: t_podest_min = 0.0
# Soll-Werte JSON, mit Defaults wenn nicht gesetzt
# Soll-Werte JSON, mit Defaults wenn nicht set
import json
tsoll = dict(_TREPPE_SOLL_DEFAULT)
soll_raw = a.GetUserString(_KEY_TREPPE_SOLL)
@@ -6739,7 +6739,7 @@ def _make_raum_stamp_text(centroid, name, nummer, funktion, area, rundung,
return tag if (tag and tag != "") else None
return None
# Layout resolven: explizit gesetzt > show_*-Flags > GF/AGF-Default
# Layout resolven: explizit set > show_*-Flags > GF/AGF-Default
# Sonderfall GF/AGF: das sind reine Flaechen-Outlines (Geschoss-
# flaeche / Aussengeschossflaeche) — kein Raum-Inhalt. Stempel
# zeigt nur 'GF 234.5 m²' bzw. 'AGF 18.0 m²' — keine Nummer/
@@ -6806,7 +6806,7 @@ def _make_raum_stamp_text(centroid, name, nummer, funktion, area, rundung,
except Exception as ex:
print("[ELEMENTE] Raum Stamp Font:", ex)
elif doc is not None and (bold or italic):
# Kein expliziter Font, aber Stil gesetzt — auf Default-Font
# Kein expliziter Font, aber Stil set — auf Default-Font
# bold/italic anwenden
try:
cur_idx = te.FontIndex
@@ -8542,7 +8542,7 @@ def _regenerate_element(doc, element_id):
geom, geschoss_name)
finally:
sc.sticky[_REGEN_BUSY] = _was_busy
# Wenn ein raum_outline-Regen einen Stempel-Dirty-Marker gesetzt hat
# Wenn ein raum_outline-Regen einen Stempel-Dirty-Marker set hat
# (oder generell raeumlich-Aenderungen), Stempel im selben Geschoss
# (+ Total) neu rechnen. Lauft AUSSERHALB des REGEN_BUSY-Blocks damit
# die Stempel selber regen koennen.
@@ -9326,7 +9326,7 @@ def _regenerate_element_body(doc, element_id, src_obj, meta, geom, geschoss_name
sw_attrs.SetUserString("dossier_oeff_piece", "schwung")
doc.Objects.AddCurve(crv, sw_attrs)
# Sturzlinien (Lintel-Projektion) — nur bei 1:100 Tueren mit
# explizit gesetztem oeff_sturz. Bei standard/detail uebernimmt
# explizit setem oeff_sturz. Bei standard/detail uebernimmt
# der Rahmen-Brep die Sturz-Darstellung visuell.
old_st = list(_find_objects_by_wall_id(doc, op_meta["id"],
"oeffnung_sturz"))
@@ -9452,7 +9452,7 @@ def _regenerate_element_body(doc, element_id, src_obj, meta, geom, geschoss_name
layers_json = (_json.dumps(layers_def, ensure_ascii=False)
if is_layered else "")
# Per-Schicht Material-Lookup: wenn ein Material-Name aus der
# Library gesetzt ist, nimm dessen Farbe/Hatch + leg den Brep auf
# Library set ist, nimm dessen Farbe/Hatch + leg den Brep auf
# die Material-Sub-Ebene (Section-Hatch greift dann bei Clipping
# Planes). Sonst Fallback auf inline color + Standard-Wand-Layer.
for idx, (lbrep, color, lname) in enumerate(layer_breps):
@@ -9790,7 +9790,7 @@ def _regenerate_element_body(doc, element_id, src_obj, meta, geom, geschoss_name
# Override). Der ModifyAttributes-Aufruf oben loest KEIN
# ReplaceRhinoObject-Event aus, also wuerde der Override-Listener
# die neue Hatch sonst nicht erreichen. Bei force_solid haben wir
# die Farbe schon direkt gesetzt — das hier wirkt idempotent.
# die Farbe schon direkt set — das hier wirkt idempotent.
try:
import overrides as _ov
cfg = _ov.load_config(doc)
@@ -11541,7 +11541,7 @@ class ElementeBridge(panel_base.BaseBridge):
referenz_def = _last("oeff_referenz", "mid")
darst_def = "auto"
tuer_rahmen_def = "zarge"
# Pending-Style-ID aus sticky (von Stil-Picker gesetzt). Falls noch
# Pending-Style-ID aus sticky (von Stil-Picker set). Falls noch
# kein Style gepickt, nutzen wir den zuletzt-aktiven fuer diesen typ
# als Default-Source.
active_sid = get_active_oeff_style_id(doc, typ)
@@ -11819,7 +11819,7 @@ class ElementeBridge(panel_base.BaseBridge):
l_podest_mode = _last("treppe_l_podest_mode", "kompakt")
if l_podest_mode not in ("kompakt", "explizit"): l_podest_mode = "kompakt"
# Soll-Werte (Editable in der Treppe-Property-Card) aus sticky laden.
# Default falls noch nichts gesetzt: 0.15-0.20 / 0.21-0.35 / 0.60-0.65.
# Default falls noch nichts set: 0.15-0.20 / 0.21-0.35 / 0.60-0.65.
soll_last = _last("treppe_soll", None)
soll = dict(_TREPPE_SOLL_DEFAULT)
if soll_last:
@@ -12998,7 +12998,7 @@ class ElementeBridge(panel_base.BaseBridge):
except Exception as ex:
print("[ELEMENTE] apply stil {} -> {}: {}".format(sid, eid, ex))
if n_applied > 0:
print("[ELEMENTE] Stempel-Stil '{}' auf {} Raum/Raeume angewendet".format(
print("[ELEMENTE] Stempel-Stil '{}' auf {} Raum/Raeume applied".format(
stil.get("name"), n_applied))
self._send_state()
@@ -13093,7 +13093,7 @@ class ElementeBridge(panel_base.BaseBridge):
print("[ELEMENTE] apply stempel-stil {} -> {}: {}".format(
sid, eid, ex))
if n > 0:
print("[ELEMENTE] Stempel-Stil '{}' auf {} Stempel angewendet".format(
print("[ELEMENTE] Stempel-Stil '{}' auf {} Stempel applied".format(
stil.get("name"), n))
self._send_state()
@@ -13288,7 +13288,7 @@ class ElementeBridge(panel_base.BaseBridge):
print("[ELEMENTE] Swisstopo-Import: {} neue Objekte".format(len(new_objs)))
if not new_objs: return
# Target-Layer finden + Objekte verschieben (nur wenn sub_name gesetzt)
# Target-Layer finden + Objekte verschieben (nur wenn sub_name set)
if sub_name:
z_id = doc.Strings.GetValue("dossier_active_id")
if not z_id:
@@ -13433,7 +13433,7 @@ class ElementeBridge(panel_base.BaseBridge):
self._push_log("Achtung: kein aktives Geschoss — Objekte bleiben auf Default-Layer")
# Bestehende swisstopo-Objekte loeschen wenn gewuenscht.
# Tag wird beim Import gesetzt (UserString dossier_swisstopo_kind).
# Tag wird beim Import set (UserString dossier_swisstopo_kind).
if replace_existing:
self._push_log("Loesche bestehende swisstopo-Objekte (alte Imports)...")
removed = 0
@@ -14974,7 +14974,7 @@ class ElementeBridge(panel_base.BaseBridge):
tobe_dsh = _flag("obereDashed", "treppe_obere_dashed", False)
# Schrittmass-Lock: wenn aktiv, recompute n_stufen damit S
# konstant bleibt. Beim Aktivieren via Patch wird targetS auf
# aktuelles S gesetzt (sofern Patch keinen Wert mitgibt).
# aktuelles S set (sofern Patch keinen Wert mitgibt).
tlock_s = _flag("lockS", "treppe_lock_s", False)
old_target_s = float(old_meta.get("treppe_target_s", 0.0) or 0.0)
old_target_a = float(old_meta.get("treppe_target_a", 0.0) or 0.0)
@@ -15480,7 +15480,7 @@ def _apply_wand_z_drag_constraint(new_obj, meta):
Delta-Logik: max-magnitude der zwei Endpunkt-Z's gewinnt — entspricht
'letzter Drag gewinnt' wenn nur ein End-Grip gezogen wurde.
Geometry-Z wird auf 0 zurueckgesetzt.
Geometry-Z wird auf 0 zurueckset.
"""
geom = new_obj.Geometry
# Sticky reset — bei JEDEM Replace, damit kein alter Delta haengt
@@ -15615,7 +15615,7 @@ def _apply_oeffnung_constraint(new_obj, meta, old_obj=None):
target_x, target_y = pt_new.X, pt_new.Y
# Wenn die Wand gerade migrate'd wurde (Rotation/Reshape/XY-Move) →
# XY-Projektion HIER UEBERSPRINGEN. Migrate hat den Punkt schon per
# Bogenlaengen-Mapping auf die neue Achse gesetzt. Eine zweite XY-
# Bogenlaengen-Mapping auf die neue Achse set. Eine zweite XY-
# Projektion mit ClosestPoint(pt_old) auf der NEUEN Achse wuerde die
# Position wieder verschieben (Rotation: pt_old liegt nicht mehr auf
# der neuen Achse → ClosestPoint+Tangent stimmen nicht zusammen).
@@ -16005,7 +16005,7 @@ def _migrate_openings_to_new_axis(wall_id, old_geom, new_geom, old_positions=Non
new_len = new_geom.GetLength()
except Exception: return
if old_len < 1e-9 or new_len < 1e-9: return
# Wand-UK aufloesen damit Oeffnungs-Punkte auf UK+Brueestung gesetzt
# Wand-UK aufloesen damit Oeffnungs-Punkte auf UK+Brueestung set
# werden (= visuell auf Unterkante Oeffnung). Sonst landen sie auf
# reiner Brueest-Hoehe und der nachfolgende Constraint interpretiert
# die Diskrepanz als User-Z-Drag → Brueest dropt.
@@ -16022,7 +16022,7 @@ def _migrate_openings_to_new_axis(wall_id, old_geom, new_geom, old_positions=Non
wall_uk = 0.0
# Migrierten Wand registrieren — der Constraint soll fuer Oeffnungen
# dieser Wand die XY-Projektion ueberspringen (migrate hat XY bereits
# via Bogenlaengen-Mapping korrekt gesetzt).
# via Bogenlaengen-Mapping korrekt set).
migrated = sc.sticky.get("_dossier_migrated_walls")
if not isinstance(migrated, set):
migrated = set()
@@ -16498,7 +16498,7 @@ def _on_select_objects(sender, e):
So bewegen sich beide synchron bei Move/Gumball, und die Endpunkte
der Lauflinie sind als Grips zum Drag verfuegbar.
Partner-Selection wird AUCH bei hidden Layern angewendet damit der
Partner-Selection wird AUCH bei hidden Layern applied damit der
Pure-Transform-Pfad (CommandEnd) die ganze Treppe als zusammenhaengendes
Element behandelt und das 3D-Volume mitbewegt selbst wenn nur das 2D-
Symbol sichtbar ist. GripsOn aber NUR auf sichtbaren Sources (Grips auf
@@ -16867,8 +16867,8 @@ def _migrate_referenz_layer_once(doc):
if doc.Objects.ModifyAttributes(obj, a, True):
n_moved += 1
except Exception: pass
print("[ELEMENTE] Referenz-Migration (v3): {} Geschoss(e) registriert, "
"{} Objekte bewegt, {} eingeblendet".format(
print("[ELEMENTE] Reference migration (v3): {} floor(s) registered, "
"{} objects moved, {} shown".format(
n_geschosse, n_moved, n_shown))
# Finaler Broadcast — falls _find_ebene_sublayer_name den Eintrag
# nicht neu angelegt hat (z.B. weil er schon existiert) wird das
@@ -17649,7 +17649,7 @@ def _on_command_end(sender, e):
return
name = sc.sticky.get(_UT_ACTIVE_KEY)
if not name: return
# _UT_ACTIVE_KEY bleibt gesetzt bis am Ende der Funktion — sonst feuern
# _UT_ACTIVE_KEY bleibt set bis am Ende der Funktion — sonst feuern
# gestaltungs Listener auf die Replace-Events die wir hier selber
# erzeugen (Pure-Translate translates Volumen via Replace; Regen-Pfad
# ersetzt Sub-Volumen). Cleanup im finally-Block am Ende.
@@ -17677,7 +17677,7 @@ def _on_command_end(sender, e):
print("[ELEMENTE] stamp-sync:", ex)
# RedrawEnabled wurde idR schon beim ersten Object-Event nach dem
# User-Klick auf False gesetzt (`_suppress_redraw_until_cmd_end`). Den
# User-Klick auf False set (`_suppress_redraw_until_cmd_end`). Den
# gemerkten prev-Wert lesen. Falls kein Event gefeuert hat (z.B. Move
# ohne tatsaechliche Aenderung), suppressen wir jetzt selber.
if sc.sticky.get("_dossier_cmd_redraw_suppressed"):
@@ -18211,7 +18211,7 @@ def _on_command_end(sender, e):
# Regen ausloesen → mehrere Regens pro Wand. Wir machen am Schluss EINEN
# Regen pro affected_wall — viel schneller bei mehreren Oeffnungen.
sc.sticky["_dossier_skip_sync_regen"] = True
# RedrawEnabled wurde schon in _on_command_begin auf False gesetzt —
# RedrawEnabled wurde schon in _on_command_begin auf False set —
# damit unterdruecken wir auch Rhinos automatischen Post-Move-Redraw
# (sonst kurzer Mismatch-Frame: Oeffnung an neuer Pos, Wand-Loch noch
# an alter Pos).