Kamera-Panel + Iso-Button in der Oberleiste

Oberleiste:
- View-Gruppe: Iso-Button neu zwischen Right und Persp
- matchView: Iso = parallel ohne orthogonalen Standard-Namen,
  Perspektive = !parallel — beide via Projektions-Flag unterschieden
  (Rhino-Viewport-Name ist oft "Perspective" fuer beide)
- Camera-Knopf (Icon: videocam) oeffnet das neue Kamera-Panel
- SET_VIEW Backend: 'Iso' faelltt auf kamera._set_iso(vp, "NE")
- OPEN_KAMERA_PANEL Handler

Kamera-Panel (neu — rhino/kamera.py + src/KameraApp.jsx):
- Viewport-Name + Projektions-Toggle (Persp/Parallel)
- 4 Iso-Quick-Buttons (NW/NE/SE/SW) — true-iso 35°/45°,
  Kamera-Distanz auto aus Szenen-BBox
- Vec3-Felder fuer Kamera-Position + Blick-Ziel (numerisch
  editierbar, m)
- Distanz read-only
- Brennweite (mm) bei Persp, Frustum-Breite (m) bei Parallel
- Zoom-Extents-Button
- Presets: speichern + anwenden + loeschen, persistiert in
  doc.Strings["dossier_kamera_presets"] (JSON)
- Eto-Form-Satelliten-Fenster (420x600) via panel_base.open_satellite_window

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-20 20:41:50 +02:00
parent de1fc887f5
commit b69dd8e279
6 changed files with 630 additions and 5 deletions
+10
View File
@@ -169,6 +169,16 @@ export function toggleOverrides(on) { send('TOGGLE_OVERRIDES', { enabled: !
export function setOverridesPreset(name) { send('SET_OVERRIDES_PRESET', { name: name || null }) }
export function saveOverridesPreset(name) { send('SAVE_OVERRIDES_PRESET', { name }) }
export function openOverridesPanel() { send('OPEN_OVERRIDES_PANEL', {}) }
export function openKameraPanel() { send('OPEN_KAMERA_PANEL', {}) }
// --- Kamera-Panel ---
export function setKameraViewport(state) { send('SET_VIEWPORT', { ...state }) }
export function setKameraProjection(parallel) { send('SET_PROJECTION', { parallel: !!parallel }) }
export function setKameraIso(octant) { send('SET_ISO', { octant: octant || 'NE' }) }
export function kameraZoomExtents() { send('ZOOM_EXTENTS', {}) }
export function saveKameraPreset(name) { send('SAVE_PRESET', { name }) }
export function applyKameraPreset(id) { send('APPLY_PRESET', { id }) }
export function deleteKameraPreset(id) { send('DELETE_PRESET', { id }) }
// Ebenenkombinationen (gehosted in Oberleiste, gleicher Store wie EBENEN)
export function pickLayerCombination(name) { send('PICK_LAYER_COMBINATION', { name: name || null }) }
export function saveLayerCombination(name) { send('SAVE_LAYER_COMBINATION', { name }) }