Addon-Entwicklung Übersicht
Rayforge verwendet ein auf pluggy basierendes Addon-System, mit dem du Funktionen erweitern, neue Maschinentreiber hinzufügen oder benutzerdefinierte Logik integrieren kannst, ohne den Kerncode zu ändern.
Schnellstart
Der schnellste Weg zum Einstieg ist das offizielle rayforge-addon-template. Forke oder klone es, benenne das Verzeichnis um und aktualisiere die Metadaten entsprechend deinem Addon.
Wie Addons funktionieren
Der AddonManager durchsucht das Verzeichnis addons nach gültigen Addons. Ein Addon ist einfach ein Verzeichnis, das eine rayforge-addon.yaml-Manifestdatei zusammen mit deinem Python-Code enthält.
So sieht ein typisches Addon aus:
my-rayforge-addon/
├── rayforge-addon.yaml <-- Erforderliches Manifest
├── my_addon/ <-- Dein Python-Paket
│ ├── __init__.py
│ ├── backend.py <-- Backend-Einstiegspunkt
│ └── frontend.py <-- Frontend-Einstiegspunkt (optional)
├── assets/ <-- Optionale Ressourcen
├── locales/ <-- Optionale Übersetzungen (.po-Dateien)
└── README.md
Dein erstes Addon
Lass uns ein einfaches Addon erstellen, das einen benutzerdefinierten Maschinentreiber registriert. Erstelle zuerst das Manifest:
name: my_laser_driver
display_name: "My Laser Driver"
description: "Adds support for the XYZ laser cutter."
api_version: 9
author:
name: Jane Doe
email: jane@example.com
provides:
backend: my_addon.backend
Erstelle nun das Backend-Modul, das deinen Treiber registriert:
import pluggy
hookimpl = pluggy.HookimplMarker("rayforge")
@hookimpl
def register_machines(machine_manager):
"""Register our custom machine driver."""
from .my_driver import MyLaserMachine
machine_manager.register("my_laser", MyLaserMachine)
Das war's! Dein Addon wird jetzt geladen, wenn Rayforge startet, und dein Maschinentreiber steht den Benutzern zur Verfügung.
Die Manifest-Dokumentation behandelt alle verfügbaren Konfigurationsoptionen.
Einstiegspunkte verstehen
Addons können zwei Einstiegspunkte bereitstellen, die zu unterschiedlichen Zeiten geladen werden:
Der Backend-Einstiegspunkt wird sowohl im Hauptprozess als auch in Worker-Prozessen geladen. Verwende diesen für Maschinentreiber, Schritttypen, Ops-Produzenten und Transformatoren oder jede Kernfunktionalität, die keine UI-Abhängigkeiten benötigt.
Der Frontend-Einstiegspunkt wird nur im Hauptprozess geladen. Hier platzierst du UI-Komponenten, GTK-Widgets, Menüeinträge und alles, was Zugriff auf das Hauptfenster benötigt.
Beide werden als gepunktete Modulpfade wie my_addon.backend angegeben.
Verbindung zu Rayforge mit Hooks
Rayforge verwendet pluggy-Hooks, um Addons in die Anwendung zu integrieren. Dekoriere einfach deine Funktionen mit @pluggy.HookimplMarker("rayforge"):
import pluggy
from rayforge.context import RayforgeContext
hookimpl = pluggy.HookimplMarker("rayforge")
@hookimpl
def rayforge_init(context: RayforgeContext):
"""Called when Rayforge is fully initialized."""
# Your setup code here
pass
@hookimpl
def on_unload():
"""Called when the addon is being disabled or unloaded."""
# Clean up resources here
pass
Die Hooks-Dokumentation beschreibt jeden verfügbaren Hook und wann er aufgerufen wird.
Deine Komponenten registrieren
Die meisten Hooks erhalten ein Registrierungsobjekt, mit dem du deine benutzerdefinierten Komponenten registrierst:
@hookimpl
def register_steps(step_registry):
from .my_step import MyCustomStep
step_registry.register(MyCustomStep)
@hookimpl
def register_actions(action_registry):
from .actions import setup_actions
setup_actions(action_registry)
Die Registries-Dokumentation erklärt jede Registrierung und wie du sie verwendest.
Auf Rayforges Daten zugreifen
Der rayforge_init-Hook gibt dir Zugriff auf ein RayforgeContext-Objekt. Über diesen Kontext kannst du auf alles in Rayforge zugreifen:
Du kannst die aktuell aktive Maschine über context.machine abrufen oder auf alle Maschinen über context.machine_mgr zugreifen. Das Objekt context.config enthält globale Einstellungen, während context.camera_mgr Zugriff auf Kamera-Feeds bietet. Für Materialien verwendest du context.material_mgr und für Verarbeitungsrezepte context.recipe_mgr. Der G-Code-Dialekt-Manager ist als context.dialect_mgr verfügbar, und KI-Funktionen laufen über context.ai_provider_mgr. Für die Lokalisierung prüfst du context.language auf den aktuellen Sprachcode. Der Addon-Manager selbst ist als context.addon_mgr verfügbar, und wenn du kostenpflichtige Addons erstellst, übernimmt context.license_validator die Lizenzvalidierung.
Übersetzungen hinzufügen
Addons können Übersetzungen mit Standard-.po-Dateien bereitstellen. Organisiere sie wie folgt:
my-rayforge-addon/
├── locales/
│ ├── de/
│ │ └── LC_MESSAGES/
│ │ └── my_addon.po
│ └── es/
│ └── LC_MESSAGES/
│ └── my_addon.po
Rayforge kompiliert .po-Dateien automatisch zu .mo-Dateien, wenn dein Addon geladen wird.
Testen während der Entwicklung
Um dein Addon lokal zu testen, erstelle einen symbolischen Link von deinem Entwicklungsordner zum Addons-Verzeichnis von Rayforge.
Finde zuerst dein Konfigurationsverzeichnis. Unter Windows ist es C:\Users\<Benutzer>\AppData\Local\rayforge\rayforge\addons. Unter macOS suche in ~/Library/Application Support/rayforge/addons. Unter Linux ist es ~/.config/rayforge/addons.
Erstelle dann den Symlink:
ln -s /path/to/my-rayforge-addon ~/.config/rayforge/addons/my-rayforge-addon
Starte Rayforge neu und prüfe die Konsole auf eine Meldung wie Loaded addon: my_laser_driver.
Dein Addon teilen
Wenn du bereit bist, dein Addon zu teilen, pushe es in ein öffentliches Git-Repository auf GitHub oder GitLab. Reiche es dann beim rayforge-registry ein, indem du das Repository forkest, die Metadaten deines Addons hinzufügst und einen Pull Request öffnest.
Nach der Annahme können Benutzer dein Addon direkt über den Addon-Manager von Rayforge installieren.