#! python3 # SPDX-License-Identifier: AGPL-3.0-or-later # Copyright (C) 2026 Karim Gabriele Varano """One-Shot-Diagnose: dumpt alle Properties + Werte des 'Dossier Plan' Display-Modes und exportiert ihn als ini neben dem Skript. Vorgehen: 1. In Rhinos Display-Mode-Editor: 'Show HiddenLines' AUS schalten + Apply 2. _RunPythonScript /Users/karim/STUDIO/DOSSIER/rhino/_inspect_plan_mode.py 3. Resultat: zeigt alle Hidden/Tangent/Silhouette-Properties + /tmp/dossier_plan_inspect.ini So koennen wir sehen welche Property-Namen Mac Rhino tatsaechlich hat. """ import os from Rhino.Display import DisplayModeDescription target_name = "Dossier Plan" dmd = None for dm in DisplayModeDescription.GetDisplayModes(): if dm.EnglishName == target_name or dm.LocalName == target_name: dmd = dm; break if dmd is None: print("[INSPECT] 'Dossier Plan' nicht gefunden") else: attrs = dmd.DisplayAttributes print("[INSPECT] Mode gefunden: {} (Id={})".format(dmd.EnglishName, dmd.Id)) print("") print("=== ALLE DisplayAttributes Properties mit Werten ===") for n in sorted(dir(attrs)): if n.startswith("_"): continue try: v = getattr(attrs, n) if callable(v): continue sv = str(v) if len(sv) > 80: sv = sv[:77] + "..." print(" {} = {}".format(n, sv)) except Exception as ex: print(" {} = ".format(n, ex)) print("") print("=== Sub-Objekt Properties (ALLE) ===") # Erst alle Sub-Objekt-Properties autodetect (anything mit "+" im String) sub_names = set() for n in dir(attrs): if n.startswith("_"): continue try: v = getattr(attrs, n) if callable(v): continue if "DisplayPipelineAttributes+" in str(v): sub_names.add(n) except Exception: pass # Plus die expliziten Kandidaten for hard in ("CurveSettings", "ObjectSettings", "ShadingSettings", "MeshSpecificAttributes", "SubObjectDisplayMode", "ViewSpecificAttributes"): if hasattr(attrs, hard): sub_names.add(hard) for sub_name in sorted(sub_names): try: sub = getattr(attrs, sub_name) print(" --- {} ---".format(sub_name)) for n in sorted(dir(sub)): if n.startswith("_"): continue try: v = getattr(sub, n) if callable(v): continue sv = str(v) if len(sv) > 80: sv = sv[:77] + "..." print(" {} = {}".format(n, sv)) except Exception as ex: print(" {} = ".format(n, ex)) except Exception as ex: print(" {} couldn't be inspected: {}".format(sub_name, ex)) print("") print("=== ini-Export ===") # In den Desktop schreiben damit der User die Datei einfach manuell # oeffnen + mir den Inhalt schicken kann (in /tmp gehts manchmal verloren). ini_path = os.path.expanduser("~/Desktop/dossier_plan_inspect.ini") try: ok = DisplayModeDescription.ExportToFile(dmd, ini_path) print(" Export OK: {} → {}".format(ok, ini_path)) if ok and os.path.exists(ini_path): with open(ini_path, "r", encoding="utf-8", errors="ignore") as f: content = f.read() print(" ini-Inhalt ({} chars) — siehe Datei auf dem Desktop.".format(len(content))) # Falls Rhinos Log das Print durchlaesst, hier ueberhaupt rein print("===INI-START===") for line in content.split("\n"): print(line) print("===INI-END===") except Exception as ex: print(" Export-Fehler:", ex)