Lernziel: Das „Box Builder“-Addon soll sich die zuletzt eingegebenen Abmessungen merken und beim nächsten Start wiederherstellen.
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?
- Funktionen hinzugefügt:
get_saved_settings()– lädt die letzten Wertesave_settings()– speichert die aktuellen Werte
- Pfad zu den Parametern:
→ Alle Einstellungen werden in einer separaten Gruppe gespeichert, ohne andere Addons zu beeinträchtigen. - Namensfeld zur Benutzeroberfläche hinzugefügt.
- Beim Start des Fensters werden die Felder mit gespeicherten Werten ausgefüllt.
- Nach der Erstellung werden die aktuellen Werte automatisch gespeichert.
Funktionsprüfung
- FreeCAD starten
- Box Builder öffnen
- Beispielwerte eingeben:
- Name:
MyTestBox - Länge:
50 - Breite:
30 - Höhe:
20
- Auf „Box erstellen“ klicken
- FreeCAD schließen
- Erneut starten
- 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.cfgim FreeCAD-Ordner
Aber du musst das nicht wissen – FreeCAD verwaltet den Speicherort selbstständig.
Praktische Aufgabe
- Füge ein Kontrollkästchen „Am Ursprung zentrieren“ hinzu und speichere dessen Zustand zwischen den Sitzungen.
- Stelle sicher, dass beim ersten Start des Addons sinnvolle Standardwerte verwendet werden (bereits implementiert).
- 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