// SPDX-License-Identifier: AGPL-3.0-or-later // Copyright (C) 2026 Karim Gabriele Varano using Rhino; using Rhino.PlugIns; namespace DOSSIER; /// /// DOSSIER-Plugin. Drei Aufgaben: /// 1. Bootstrappt beim Plugin-Load die Python-Module: Panels, Aliases, /// View-Modes, BeginCommand-Hook, Welcome-Screen (alles ueber rhino/startup.py). /// 2. Registriert native Rhino-Commands (dWall, dDoor, dStair, ...) die /// jeweils das passende Python-Script in rhino/aliases/cmd/ ausfuehren. /// 3. Loest das Echo-/Autocomplete-Problem der frueheren Keyboard-Macros /// (jetzt zeigt die History "dWall" statt "_-RunPythonScript ..."). /// /// Installation: Plugin via _PluginManager → Install... registrieren. Beim /// naechsten Rhino-Start laeuft DOSSIER automatisch. Kein zusaetzlicher /// StartupCommands-XML-Eintrag noetig. /// public class DossierPlugin : PlugIn { public DossierPlugin() { Instance = this; } public static DossierPlugin Instance { get; private set; } = null!; /// Plugin bei jedem Rhino-Start automatisch laden — default ist /// "WhenNeeded" (erst beim ersten Command-Aufruf). Wir brauchen aber /// AtStartup, damit OnLoad → startup.py-Bootstrap immer feuert. public override PlugInLoadTime LoadTime => PlugInLoadTime.AtStartup; protected override LoadReturnCode OnLoad(ref string errorMessage) { var root = DossierPaths.Root; if (root is null) { errorMessage = "DOSSIER Root nicht gefunden. Setze Env-Var DOSSIER_HOME " + "auf den DOSSIER-Repo-Ordner (z.B. /Users/karim/STUDIO/DOSSIER) " + "oder leg ein File ~/.dossier_home an."; return LoadReturnCode.ErrorShowDialog; } RhinoApp.WriteLine($"[DOSSIER] Plugin geladen (root={root})"); // Python-Bootstrap deferred auf Idle — OnLoad feuert vor Eto-UI-Init, // Panels brauchen aber MainWindow + Idle-Event. PythonRunner.RunDeferred // wartet auf naechstes Idle und ruft dann startup.py auf. PythonRunner.RunDeferred(DossierPaths.StartupPy, "startup"); return LoadReturnCode.Success; } }