Files
DOSSIER/rhino/_clean_display_modes.py
T
karim 13a5e1eb7a AGPL-3.0 Dual-Lizenz + Pill-Stil-UI + Section-Style-Overhaul + Plan-Mode-Template
Lizenz:
- AGPL-3.0 LICENSE-File im Repo-Root (GNU Volltext)
- SPDX-Header + Copyright in allen Source-Files (Python/JSX/JS/Rust)
- license-Feld in package.json + Cargo.toml
- About-App komplett neu: Dual-Lizenz-Block (AGPL + Commercial),
  openbureau-Branding, Version-Pills, made-in-Switzerland-Footer

UI-Restyle (3 Wellen) — alle Dialoge + Satellites + Panel-Sidebars
auf gemeinsamen Pill-Stil aus BarControls (BarToggle/BarButton/BarCombo):
- Welle 1: GeschossDialog/Settings, AusschnittSettings, LayoutDialog
- Welle 2: ConfirmDeleteEbene, Kamera, MasseSettings, Osm, Swisstopo,
  TextEditor, AusschnittLayerDialog, LayerCombinations
- Welle 3: LayoutsApp, MassstabApp, WerkzeugeApp, OverridesApp,
  ZeichnungsebenenApp; Werkzeuge mit ElementeApp-PillGroup-Layout

GeschossDialog Header-Refactor: +Geschoss/+Zeichnung in Toolbar oben,
move-Pfeile-Spalte breiter (kein Overlap mit G-Haken)

Ausschnitte Rows als Pills, kein Outer-Border ums Suchfeld

Section-Style komplett neu (gestaltung.py + GestaltungApp.jsx):
- ObjectSectionAttributesSource.FromObject (richtiger Enum-Name fuer Mac)
- HatchPatternPrintColor + BoundaryPrintColor mit-setzen (Display = Print)
- BoundaryColor nur bei explizitem User-Override, sonst Rhino-Default
- background_color_hex Parameter (BackgroundFillMode=SolidColor)
- Readback aus GetCustomSectionStyle statt direkt aus Attributes
- UI: Schnittkante > Section Style > Solid-Fill mit proper SectionHead
- 'Boundary' (3D Pen) -> 'Background' weil sich's wie Section-Hintergrund verhaelt

Plan-Mode 'Dossier Plan' via Template:
- rhino/templates/dossier_plan.ini wird direkt geladen
- Fallback auf Technical-Clone + ini-Patch wenn Template fehlt
- Auto-Cleanup von Orphan-Modes vor Import (Name- oder Guid-Match)
- ClipSectionUsage=1 + TechnicalMask=15 als bekannte Soll-Werte
- Bei Template-Pfad keine ini-Patches (1:1 wie User exportiert)
- Sanity-Print listet alle registrierten Modes nach Anlegen

Bridge-Unification: 4 Settings-Apps (Ebenen/Project/Geschoss*Dialog)
benutzen jetzt chunkende send() statt eigene bridgeSend ohne Chunk-
Logik -> grosse Payloads (Hatch-Refs etc.) kommen nicht mehr truncated
bei Python an (loeste 'JSON-Fehler char 990'-Regression in Ebenen-
Settings)

Library-Imports robust: 'import library' jetzt Top-Level in elemente.py
+ rhinopanel.py (statt Lazy in Methoden) -> 'No module named library'-
Crashes weg auch wenn sys.path zwischendurch resettet wird

Tools fuer Display-Mode-Maintenance:
- _clean_display_modes.py (loescht alle Custom-Modes, Built-ins bleiben)
- _inspect_plan_mode.py / _inspect_obj_section.py / _inspect_obj_boundary.py
  (Diagnose-Skripte fuer SectionStyle-Property-Reverse-Engineering)
- _reset_rhino_settings.sh (Backup + Nuke der Rhino-Settings als
  letzte Bastion gegen korrupte Display-Modes)
2026-05-26 17:09:18 +02:00

67 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#! python3
# SPDX-License-Identifier: AGPL-3.0-or-later
# Copyright (C) 2026 Karim Gabriele Varano
"""Loescht ALLE Custom-Display-Modes (User-erstellte) — laesst die Rhino-
Built-ins (Wireframe, Shaded, Rendered, Ghosted, XRay, Technical, Artistic,
Pen, Monochrome, Arctic, Raytraced) in Ruhe.
Loescht auch Orphan-Modes ohne Namen (die manchmal bei abgebrochenen
Imports hierbleiben und Rhino zum Crash bringen wenn man sie anklickt).
Vorgehen:
_RunPythonScript /Users/karim/STUDIO/DOSSIER/rhino/_clean_display_modes.py
"""
from Rhino.Display import DisplayModeDescription
BUILTIN_NAMES = {
"Wireframe", "Shaded", "Rendered", "Ghosted",
"X-Ray", "XRay", "X Ray",
"Technical", "Artistic", "Pen", "Monochrome",
"Arctic", "Raytraced",
}
deleted = []
kept = []
errors = []
for dm in list(DisplayModeDescription.GetDisplayModes()):
name_en = name_local = None
try: name_en = dm.EnglishName
except Exception: pass
try: name_local = dm.LocalName
except Exception: pass
name_display = name_en or name_local or "(Orphan, kein Name)"
is_builtin = (name_en in BUILTIN_NAMES) or (name_local in BUILTIN_NAMES)
if is_builtin:
kept.append(name_display)
continue
# Custom oder Orphan → loeschen
try:
dm_id = dm.Id
ok = DisplayModeDescription.DeleteDisplayMode(dm_id)
if ok:
deleted.append("{} ({})".format(name_display, dm_id))
else:
errors.append("{} → DeleteDisplayMode returned False".format(name_display))
except Exception as ex:
errors.append("{}{}".format(name_display, ex))
print("[CLEAN] Display-Modes gesaeubert.")
print("[CLEAN] Built-ins behalten ({}):".format(len(kept)))
for n in kept:
print("{}".format(n))
print("")
print("[CLEAN] Geloescht ({}):".format(len(deleted)))
for n in deleted:
print(" × {}".format(n))
if errors:
print("")
print("[CLEAN] Fehler ({}):".format(len(errors)))
for e in errors:
print(" ! {}".format(e))
print("")
print("[CLEAN] Fertig. Jetzt _reset_panels.py laufen lassen damit der")
print("[CLEAN] Plugin den 'Dossier Plan' aus dem Template neu importiert.")