Zum Inhalt springen
> 💻 🧠 Code 1001 > Lektion 5. Speichern und Laden von Einstellungen

Lektion 5. Speichern und Laden von Einstellungen

  • von

Teil 1. Wie speichert FreeCAD Einstellungen?
FreeCAD bietet einen integrierten Mechanismus zum Speichern von Benutzerparametern – über den Parameter Manager.

Dieser arbeitet mit einer hierarchischen Parameterdatenbank, ähnlich der Windows-Registry.

Wichtige Methoden:

# Abrufen einer Parametergruppe
params = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/MyAddon")

# Wert speichern
params.SetFloat("LastLength", 30.0)
params.SetString("LastName", "MyBox")

# Wert laden (mit Standardwert)
length = params.GetFloat("LastLength", 10.0)  # 10.0, falls der Parameter nicht existiert
name = params.GetString("LastName", "DefaultBox")

Der Pfad "User parameter:BaseApp/Preferences/..." ist der Standardort für Benutzereinstellungen.


Teil 2. Aktualisiertes Addon: „Box Builder mit Speicherfunktion“
Wir erweitern das bisherige Addon um das Speichern und Laden der letzten Werte.

Datei box_builder_workbench.py (aktualisierte Version):

# box_builder_workbench.py
import FreeCAD, FreeCADGui
from PySide import QtGui, QtCore

# === PFAD ZU DEN EINSTELLUNGEN ===
PARAM_PATH = "User parameter:BaseApp/Preferences/BoxBuilderAddon"

def get_saved_settings():
    """Lädt gespeicherte Einstellungen oder gibt Standardwerte zurück"""
    params = FreeCAD.ParamGet(PARAM_PATH)
    return {
        "length": params.GetFloat("LastLength", 30.0),
        "width": params.GetFloat("LastWidth", 20.0),
        "height": params.GetFloat("LastHeight", 10.0),
        "name": params.GetString("LastName", "CustomBox")
    }

def save_settings(length, width, height, name):
    """Speichert aktuelle Einstellungen"""
    params = FreeCAD.ParamGet(PARAM_PATH)
    params.SetFloat("LastLength", length)
    params.SetFloat("LastWidth", width)
    params.SetFloat("LastHeight", height)
    params.SetString("LastName", name)

# === BOX-ERSTELLUNGSFUNKTION ===
def create_box(length, width, height, name="CustomBox"):
    doc = FreeCAD.ActiveDocument
    if not doc:
        doc = FreeCAD.newDocument("BoxBuilder")

    # Eindeutiger Name
    base_name = name
    index = 1
    obj_name = base_name
    while obj_name in [obj.Name for obj in doc.Objects]:
        obj_name = f"{base_name}_{index}"
        index += 1

    box = doc.addObject("Part::Box", obj_name)
    box.Length = length
    box.Width = width
    box.Height = height
    doc.recompute()
    return box

# === DIALOGFENSTER ===
class BoxBuilderDialog(QtGui.QDialog):
    def __init__(self):
        super(BoxBuilderDialog, self).__init__()
        self.setWindowTitle("Box Builder")
        self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
        self.resize(300, 180)

        # Gespeicherte Einstellungen laden
        settings = get_saved_settings()

        # Eingabefelder
        self.length_input = QtGui.QLineEdit(str(settings["length"]))
        self.width_input = QtGui.QLineEdit(str(settings["width"]))
        self.height_input = QtGui.QLineEdit(str(settings["height"]))
        self.name_input = QtGui.QLineEdit(settings["name"])

        # Schaltflächen
        self.create_button = QtGui.QPushButton("Box erstellen")
        self.cancel_button = QtGui.QPushButton("Abbrechen")

        # Verbindungen
        self.create_button.clicked.connect(self.on_create)
        self.cancel_button.clicked.connect(self.reject)

        # Layout
        layout = QtGui.QFormLayout()
        layout.addRow("Name:", self.name_input)
        layout.addRow("Länge (mm):", self.length_input)
        layout.addRow("Breite (mm):", self.width_input)
        layout.addRow("Höhe (mm):", self.height_input)

        button_layout = QtGui.QHBoxLayout()
        button_layout.addWidget(self.create_button)
        button_layout.addWidget(self.cancel_button)

        main_layout = QtGui.QVBoxLayout()
        main_layout.addLayout(layout)
        main_layout.addLayout(button_layout)
        self.setLayout(main_layout)

    def on_create(self):
        try:
            name = self.name_input.text().strip()
            if not name:
                name = "CustomBox"
            length = float(self.length_input.text())
            width = float(self.width_input.text())
            height = float(self.height_input.text())

            if length <= 0 or width <= 0 or height <= 0:
                raise ValueError("Alle Abmessungen müssen positiv sein")

            # Objekt erstellen
            create_box(length, width, height, name)

            # Einstellungen speichern
            save_settings(length, width, height, name)
            self.accept()

        except ValueError as e:
            QtGui.QMessageBox.warning(self, "Eingabefehler", f"Ungültige Eingabe:\n{str(e)}")

# === BEFEHL UND ARBEITSUMGEBUNG (unverändert) ===
class BoxBuilderCommand:
    def GetResources(self):
        return {
            "MenuText": "Box Builder",
            "ToolTip": "Erstelle eine Box mit benutzerdefinierten Abmessungen"
        }

    def Activated(self):
        dialog = BoxBuilderDialog()
        dialog.exec_()

    def IsActive(self):
        return True

class BoxBuilderWorkbench(FreeCADGui.Workbench):
    MenuText = "Box Builder"
    ToolTip = "Erstelle benutzerdefinierte Boxen mit grafischer Oberfläche"

    def Initialize(self):
        self.list = ["BoxBuilderCommand"]
        self.appendToolbar("Box-Werkzeuge", self.list)
        self.appendMenu("Box Builder", self.list)

    def GetClassName(self):
        return "Gui::PythonWorkbench"

FreeCADGui.addCommand("BoxBuilderCommand", BoxBuilderCommand())

Was hat sich geändert?

  1. Funktionen hinzugefügt:
  • get_saved_settings() – lädt die letzten Werte
  • save_settings() – speichert die aktuellen Werte
  1. Pfad zu den Parametern:
    → Alle Einstellungen werden in einer separaten Gruppe gespeichert, ohne andere Addons zu beeinträchtigen.
  2. Namensfeld zur Benutzeroberfläche hinzugefügt.
  3. Beim Start des Fensters werden die Felder mit gespeicherten Werten ausgefüllt.
  4. Nach der Erstellung werden die aktuellen Werte automatisch gespeichert.

Funktionsprüfung

  1. FreeCAD starten
  2. Box Builder öffnen
  3. Beispielwerte eingeben:
  • Name: MyTestBox
  • Länge: 50
  • Breite: 30
  • Höhe: 20
  1. Auf „Box erstellen“ klicken
  2. FreeCAD schließen
  3. Erneut starten
  4. Box Builder öffnen

→ Die Felder sollten mit denselben Werten ausgefüllt sein!


Wo werden diese Einstellungen gespeichert?

  • Windows: In der Registry (HKEY_CURRENT_USER\SOFTWARE\FreeCAD\...)
  • Linux/macOS: In der Datei user.cfg im FreeCAD-Ordner

Aber du musst das nicht wissen – FreeCAD verwaltet den Speicherort selbstständig.


Praktische Aufgabe

  1. Füge ein Kontrollkästchen „Am Ursprung zentrieren“ hinzu und speichere dessen Zustand zwischen den Sitzungen.
  2. Stelle sicher, dass beim ersten Start des Addons sinnvolle Standardwerte verwendet werden (bereits implementiert).
  3. Füge eine Schaltfläche „Auf Standard zurücksetzen“ hinzu, die die Felder auf Standardwerte setzt und gespeicherte Einstellungen löscht.

Hinweis zum Zurücksetzen:

def reset_settings():
    params = FreeCAD.ParamGet(PARAM_PATH)
    params.RemGroup("BoxBuilderAddon")  # Löscht die gesamte Gruppe

Tipps

  • Gib immer einen Standardwert in GetFloat(), GetString() usw. an.
  • Speichere nicht zu viel – nur das, was der Benutzer wirklich braucht.
  • Verwende einen eindeutigen Pfad (BoxBuilderAddon), um Konflikte mit anderen Addons zu vermeiden.

Was kommt als Nächstes?
In Lektion 6 werden wir:

  • Symbole zu Schaltflächen und der Arbeitsumgebung hinzufügen
  • Lernen, wie man SVG und PNG in der Benutzeroberfläche verwendet
  • Das Addon optisch ansprechend gestalten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert