Raumstempel: masstab-Modus — Texthoehe als Paper-mm @ Plan-Massstab
Neuer UserString dossier_raum_txt_modus = "fix" | "masstab" (default fix).
- fix: raum_txt_h ist Meter (Modellhoehe, bisheriges Verhalten)
- masstab: raum_txt_h ist Paper-mm. Render-Hoehe (m) =
paper_mm * applied_scale / 1000 — wird zur Render-Zeit aus
massstab.get_applied_scale_ratio() gelesen, Fallback 1:100.
Massstab-Sync:
- massstab._apply_scale ruft nach Skala-Wechsel elemente.regen_masstab_raeume(doc)
→ alle Raeume im masstab-Modus regennen automatisch, Texthoehe folgt der
neuen Skala (z.B. Switch 1:100 → 1:50 halbiert die Modellhoehe).
_sync_raum_stamps_to_source masstab-aware: im masstab-Modus wird die
TextHeight am Stempel NICHT zurueck auf raum_txt_h gespiegelt (sie ist
abgeleitet, nicht die Wahrheit) — sonst waere der naechste Regen sofort
falsch positioniert. Offset + Font/Style werden weiterhin gespiegelt.
UI: Modus-Toggle "fix m" / "masstab mm" + Hoehen-Input + Einheits-Suffix
in RaumProperties zwischen Ausrichtung und Funktion.
This commit is contained in:
+42
-1
@@ -887,11 +887,20 @@ function RaumProperties({ raum, geschosse, onUpdate, onDelete, hatchPatterns, fo
|
||||
const [name, setName] = useState(raum.name || 'Raum')
|
||||
const [nummer, setNummer] = useState(raum.nummer || '')
|
||||
const [funktion, setFunktion] = useState(raum.funktion || '')
|
||||
// Texthoehe lokal puffern — Modus bestimmt Einheit (m bei fix, mm bei masstab)
|
||||
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(() => {
|
||||
setName(raum.name || 'Raum')
|
||||
setNummer(raum.nummer || '')
|
||||
setFunktion(raum.funktion || '')
|
||||
}, [raum.id, raum.name, raum.nummer, raum.funktion])
|
||||
setTxtH(txtHDisplay)
|
||||
}, [raum.id, raum.name, raum.nummer, raum.funktion, raum.txtH, raum.txtModus])
|
||||
|
||||
// Aktueller Wert von raum_fuellung: "" | "Solid" | "Hatch1" | … | "ByLayer"
|
||||
const fuell = raum.fuellung || ''
|
||||
@@ -1027,6 +1036,38 @@ function RaumProperties({ raum, geschosse, onUpdate, onDelete, hatchPatterns, fo
|
||||
</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: 3, alignItems: 'center' }}>
|
||||
<BarToggle label="fix m" active={txtModus === 'fix'}
|
||||
icon="straighten"
|
||||
onClick={() => onUpdate({ txtModus: 'fix' })}
|
||||
title="Fixe Modellhoehe in Meter" />
|
||||
<BarToggle label="masstab mm" active={txtModus === 'masstab'}
|
||||
icon="aspect_ratio"
|
||||
onClick={() => onUpdate({ txtModus: 'masstab' })}
|
||||
title="Paper-mm @ aktivem Plan-Massstab — skaliert automatisch mit" />
|
||||
<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: 50, fontSize: 11,
|
||||
fontFamily: 'DM Mono, monospace' }} />
|
||||
<span style={{ fontSize: 9, color: 'var(--text-muted)',
|
||||
minWidth: 18 }}>
|
||||
{txtModus === 'masstab' ? 'mm' : 'm'}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
|
||||
<span style={{ fontSize: 10, color: 'var(--text-secondary)', width: 60 }}>Funktion</span>
|
||||
<input type="text" value={funktion}
|
||||
|
||||
Reference in New Issue
Block a user