Raumstempel-Panel: Hoehe + Ausrichtung weg, kommt aus Oberleiste
UX-Konsolidierung: Texthoehe und Ausrichtung wurden bisher doppelt gesetzt (Panel + Oberleiste-Text-Block). Jetzt nur noch via Oberleiste wenn der Stempel selektiert ist — Panel zeigt nur noch den Skala-Modus (fix/masstab) als kompakten Dropdown. Backend: _sync_raum_stamps_to_source spiegelt jetzt auch TextHorizontalAlignment vom Stempel zur Source (Left/Center/Right → links/mid/rechts). Damit kommt die User-Wahl aus der Oberleiste sauber in die UserStrings — und wird beim naechsten Regen + bei Stil-Speichern korrekt uebernommen. Frontend RaumProperties: - Ausrichtung-Zeile (3 BarToggles) raus - Hoehe-Zeile reduziert auf Skala-Modus-Dropdown: "fix · Hoehe = Oberleiste-Wert (m)" | "masstab · skaliert mit Plan-Massstab" - Local-State txtH + setTxtH entfernt (unused) - Stempel-Stil-Speichern liest weiter raum.txtH + raum.align (kommen jetzt vom Sync) → captured korrekt
This commit is contained in:
+18
-1
@@ -12388,6 +12388,20 @@ def _sync_raum_stamps_to_source(doc):
|
|||||||
except Exception: new_bold = False
|
except Exception: new_bold = False
|
||||||
try: new_ital = bool(cur_font.Italic) if cur_font else False
|
try: new_ital = bool(cur_font.Italic) if cur_font else False
|
||||||
except Exception: new_ital = False
|
except Exception: new_ital = False
|
||||||
|
# Alignment aus der TextEntity — Mapping Rhino-Enum →
|
||||||
|
# raum_align-String. Wenn Oberleiste die Ausrichtung via
|
||||||
|
# TextHorizontalAlignment setzt, hier auf "links/mid/rechts"
|
||||||
|
# mappen damit der naechste Regen die User-Wahl uebernimmt.
|
||||||
|
try:
|
||||||
|
h_align = te.TextHorizontalAlignment
|
||||||
|
if h_align == Rhino.DocObjects.TextHorizontalAlignment.Left:
|
||||||
|
new_align = "links"
|
||||||
|
elif h_align == Rhino.DocObjects.TextHorizontalAlignment.Right:
|
||||||
|
new_align = "rechts"
|
||||||
|
else:
|
||||||
|
new_align = "mid"
|
||||||
|
except Exception:
|
||||||
|
new_align = meta.get("raum_align", "mid")
|
||||||
# Nur schreiben wenn was geaendert hat — vermeidet Modify-
|
# Nur schreiben wenn was geaendert hat — vermeidet Modify-
|
||||||
# Storms bei jedem Idle-Tick.
|
# Storms bei jedem Idle-Tick.
|
||||||
old_dx = float(meta.get("raum_stamp_dx", 0.0))
|
old_dx = float(meta.get("raum_stamp_dx", 0.0))
|
||||||
@@ -12396,6 +12410,7 @@ def _sync_raum_stamps_to_source(doc):
|
|||||||
old_face = meta.get("raum_txt_font", "") or ""
|
old_face = meta.get("raum_txt_font", "") or ""
|
||||||
old_bold = bool(meta.get("raum_txt_bold", False))
|
old_bold = bool(meta.get("raum_txt_bold", False))
|
||||||
old_ital = bool(meta.get("raum_txt_italic", False))
|
old_ital = bool(meta.get("raum_txt_italic", False))
|
||||||
|
old_align = meta.get("raum_align", "mid")
|
||||||
# Im masstab-Modus ist die TextHeight am Stempel abgeleitet
|
# Im masstab-Modus ist die TextHeight am Stempel abgeleitet
|
||||||
# (paper_mm * scale / 1000) — NICHT zurueck-spiegeln, sonst
|
# (paper_mm * scale / 1000) — NICHT zurueck-spiegeln, sonst
|
||||||
# waere der naechste Regen sofort verschoben. Wenn der User
|
# waere der naechste Regen sofort verschoben. Wenn der User
|
||||||
@@ -12409,7 +12424,8 @@ def _sync_raum_stamps_to_source(doc):
|
|||||||
(sync_height and abs(new_h - old_h) > 1e-6) or
|
(sync_height and abs(new_h - old_h) > 1e-6) or
|
||||||
new_face != old_face or
|
new_face != old_face or
|
||||||
new_bold != old_bold or
|
new_bold != old_bold or
|
||||||
new_ital != old_ital
|
new_ital != old_ital or
|
||||||
|
new_align != old_align
|
||||||
)
|
)
|
||||||
if not changed: continue
|
if not changed: continue
|
||||||
attrs = src_obj.Attributes.Duplicate()
|
attrs = src_obj.Attributes.Duplicate()
|
||||||
@@ -12417,6 +12433,7 @@ def _sync_raum_stamps_to_source(doc):
|
|||||||
"{:.6f}".format(new_dx))
|
"{:.6f}".format(new_dx))
|
||||||
attrs.SetUserString(_KEY_RAUM_STAMP_DY,
|
attrs.SetUserString(_KEY_RAUM_STAMP_DY,
|
||||||
"{:.6f}".format(new_dy))
|
"{:.6f}".format(new_dy))
|
||||||
|
attrs.SetUserString(_KEY_RAUM_ALIGN, new_align)
|
||||||
if sync_height:
|
if sync_height:
|
||||||
attrs.SetUserString(_KEY_RAUM_TXT_H,
|
attrs.SetUserString(_KEY_RAUM_TXT_H,
|
||||||
"{:.4f}".format(new_h))
|
"{:.4f}".format(new_h))
|
||||||
|
|||||||
+17
-50
@@ -920,20 +920,14 @@ function RaumProperties({ raum, geschosse, onUpdate, onDelete, hatchPatterns, fo
|
|||||||
const [name, setName] = useState(raum.name || 'Raum')
|
const [name, setName] = useState(raum.name || 'Raum')
|
||||||
const [nummer, setNummer] = useState(raum.nummer || '')
|
const [nummer, setNummer] = useState(raum.nummer || '')
|
||||||
const [funktion, setFunktion] = useState(raum.funktion || '')
|
const [funktion, setFunktion] = useState(raum.funktion || '')
|
||||||
// Texthoehe lokal puffern — Modus bestimmt Einheit (m bei fix, mm bei masstab)
|
// Texthoehe (raum.txtH) + Ausrichtung (raum.align) werden via Oberleiste
|
||||||
|
// gesetzt — kein Local-State noetig, Stil-Speichern liest direkt aus raum.
|
||||||
const txtModus = raum.txtModus || 'fix'
|
const txtModus = raum.txtModus || 'fix'
|
||||||
const txtHDisplay = (() => {
|
|
||||||
const v = parseFloat(raum.txtH)
|
|
||||||
if (Number.isNaN(v)) return ''
|
|
||||||
return String(v)
|
|
||||||
})()
|
|
||||||
const [txtH, setTxtH] = useState(txtHDisplay)
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
setName(raum.name || 'Raum')
|
setName(raum.name || 'Raum')
|
||||||
setNummer(raum.nummer || '')
|
setNummer(raum.nummer || '')
|
||||||
setFunktion(raum.funktion || '')
|
setFunktion(raum.funktion || '')
|
||||||
setTxtH(txtHDisplay)
|
}, [raum.id, raum.name, raum.nummer, raum.funktion])
|
||||||
}, [raum.id, raum.name, raum.nummer, raum.funktion, raum.txtH, raum.txtModus])
|
|
||||||
|
|
||||||
// Aktueller Wert von raum_fuellung: "" | "Solid" | "Hatch1" | … | "ByLayer"
|
// Aktueller Wert von raum_fuellung: "" | "Solid" | "Hatch1" | … | "ByLayer"
|
||||||
const fuell = raum.fuellung || ''
|
const fuell = raum.fuellung || ''
|
||||||
@@ -1075,48 +1069,21 @@ function RaumProperties({ raum, geschosse, onUpdate, onDelete, hatchPatterns, fo
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Skala-Modus: fix = Modellhoehe in m (Oberleiste setzt direkt);
|
||||||
|
masstab = Paper-mm @ Plan-Massstab (Oberleiste-Hoehe wird zur
|
||||||
|
Render-Zeit berechnet, nicht gespiegelt). Hoehe + Ausrichtung
|
||||||
|
werden via Oberleiste-Text-Block gesetzt wenn der Stempel
|
||||||
|
selektiert ist — _sync_raum_stamps_to_source spiegelt die
|
||||||
|
Werte automatisch auf die Source-UserStrings. */}
|
||||||
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
|
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
|
||||||
<span style={{ fontSize: 10, color: 'var(--text-secondary)', width: 60 }}>Ausrichtung</span>
|
<span style={{ fontSize: 10, color: 'var(--text-secondary)', width: 60 }}>Skala</span>
|
||||||
<div style={{ flex: 1, display: 'flex', gap: 3 }}>
|
<select value={txtModus}
|
||||||
{RAUM_ALIGN.map(a => (
|
onChange={(e) => onUpdate({ txtModus: e.target.value })}
|
||||||
<BarToggle key={a.code}
|
title="fix: Hoehe in m via Oberleiste · masstab: Paper-mm via Massstab"
|
||||||
icon={a.icon}
|
style={{ flex: 1, fontSize: 11 }}>
|
||||||
active={(raum.align || 'mid') === a.code}
|
<option value="fix">fix · Hoehe = Oberleiste-Wert (m)</option>
|
||||||
onClick={() => onUpdate({ align: a.code })}
|
<option value="masstab">masstab · skaliert mit Plan-Massstab</option>
|
||||||
title={a.label} />
|
</select>
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Texthoehe + Modus: fix = m, masstab = mm-auf-Papier (skaliert mit
|
|
||||||
aktivem Plan-Massstab). Bei masstab wirkt jede Massstabs-
|
|
||||||
Aenderung der Oberleiste auch auf den Stempel. */}
|
|
||||||
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
|
|
||||||
<span style={{ fontSize: 10, color: 'var(--text-secondary)', width: 60 }}>Höhe</span>
|
|
||||||
<div style={{ flex: 1, display: 'flex', gap: 4, alignItems: 'center' }}>
|
|
||||||
<select value={txtModus}
|
|
||||||
onChange={(e) => onUpdate({ txtModus: e.target.value })}
|
|
||||||
title="Modus: fix = Modellhoehe in Meter; masstab = Paper-mm, skaliert mit aktivem Plan-Massstab"
|
|
||||||
style={{ flex: 1, fontSize: 11 }}>
|
|
||||||
<option value="fix">fix (m)</option>
|
|
||||||
<option value="masstab">masstab (mm)</option>
|
|
||||||
</select>
|
|
||||||
<input type="text" value={txtH}
|
|
||||||
onChange={(e) => setTxtH(e.target.value)}
|
|
||||||
onBlur={() => {
|
|
||||||
const v = parseFloat(txtH)
|
|
||||||
if (v > 0 && v !== raum.txtH) onUpdate({ txtH: v })
|
|
||||||
else setTxtH(txtHDisplay)
|
|
||||||
}}
|
|
||||||
onKeyDown={(e) => { if (e.key === 'Enter') e.target.blur() }}
|
|
||||||
title={txtModus === 'masstab' ? 'Texthoehe in Paper-mm' : 'Texthoehe in m'}
|
|
||||||
style={{ width: 56, fontSize: 11, textAlign: 'right',
|
|
||||||
fontFamily: 'DM Mono, monospace' }} />
|
|
||||||
<span style={{ fontSize: 9, color: 'var(--text-muted)',
|
|
||||||
minWidth: 14 }}>
|
|
||||||
{txtModus === 'masstab' ? 'mm' : 'm'}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
|
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
|
||||||
|
|||||||
Reference in New Issue
Block a user