Panels poliert: Ebenenkombi in Oberleiste, Satelliten-Dialoge, Caps weg, Perf

- Ebenenkombination raus aus Ebenen-Panel, in Oberleiste-Topbar +
  Editor-Satellite (AusschnittLayerDialog embedded). doc.Strings
  haelt active_comb_name, auto-clear bei manueller Eye/Lock-Aenderung.
- EbenenSettingsDialog jetzt Satellite mit Ebene-Picker-Dropdown
  (auto-save on switch via SAVE_KEEP).
- Per-Ausschnitt Einstellungen-Satellite (Massstab, Display, Overrides,
  Ebenenkombi). Alte 'Sichtbarkeit bearbeiten'-Option entfernt.
- Layouts/Ausschnitte: Top-Header weg, Sticky-Footer mit Anzahl +
  Aktionen. LayoutDialog ist jetzt Satellite mit Format-Live-Preview.
- Panel-Captions + Default-Ebenen-Namen auf Mixed-Case (Ausschnitte,
  Ebenen, Waende ...). Nur DOSSIER bleibt caps.
- DimensionenApp: Card-Optik raus, REF-Wuerfel mit Kreisen statt
  Quadraten + Hover-Scale.
- GeschossManager angeglichen an EbenenManager: Rechtsklick-Menue,
  Lock-Button, Delete-X, Duplizieren. layer_builder honoriert z.locked.
- Active Sublayer folgt jetzt dem Geschoss-Wechsel (gleicher Code
  unter neuem Parent).

Performance Geschoss-Wechsel:
- elemente._send_state() ersetzt durch _notify_active_geschoss()
  (Partial-Push statt 200+ Elements re-enumerieren).
- _apply_visibility dedupe via sticky last-applied-signature
  (STATE_SYNC-Echo loopt nicht mehr durch alle Layer).
- _update_clipping nur wenn alt oder neu hasClipping=True.
- Redundante doc.Views.Redraw() im CPlane-Pfad entfernt — die folgende
  apply_visibility-Roundtrip redrawt 30ms spaeter ohnehin.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-19 03:58:28 +02:00
parent e3918cb155
commit 95031ee2c0
29 changed files with 1708 additions and 713 deletions
+44
View File
@@ -0,0 +1,44 @@
import { useState, useEffect } from 'react'
import AusschnittLayerDialog from './components/AusschnittLayerDialog'
import { onMessage, notifyReady } from './lib/rhinoBridge'
function send(type, payload) {
if (!window.RHINO_MODE) { console.log('[LayerCombinations] →', type, payload); return }
document.title = 'RHINOMSG::' + JSON.stringify({ type, payload: payload || {} })
}
export default function LayerCombinationsApp() {
const [layers, setLayers] = useState([])
const [presets, setPresets] = useState([])
useEffect(() => {
onMessage('LAYER_COMBINATIONS_STATE', ({ layers: ls, presets: ps }) => {
if (Array.isArray(ls)) setLayers(ls)
if (Array.isArray(ps)) setPresets(ps)
})
notifyReady()
}, [])
return (
<div style={{
position: 'absolute', inset: 0,
background: 'var(--bg-base)',
display: 'flex',
fontFamily: 'var(--font)',
color: 'var(--text-primary)',
}}>
<AusschnittLayerDialog
embedded
snapName="Ebenenkombinationen"
layers={layers}
presets={presets}
onClose={() => send('CANCEL')}
onSave={(draft) => send('APPLY_COMBINATION', {
layers: draft.map(l => ({ id: l.id, visible: l.visible, locked: l.locked })),
})}
onSavePreset={(name, layerStates) => send('SAVE_PRESET', { name, layers: layerStates })}
onDeletePreset={(name) => send('DELETE_PRESET', { name })}
/>
</div>
)
}