Saltar al contenido
> 💻 🧠 Código 1001 > 📖 Guías > FreeCAD (software) > Cómo crear addons para FreeCAD > Lección 5. Guardar y cargar configuraciones

Lección 5. Guardar y cargar configuraciones

  • por

📘 Curso: Creación de complementos para FreeCAD

Objetivo de la lección: hacer que el complemento «Box Builder» recuerde las últimas dimensiones introducidas y las restaure en el siguiente inicio.


💾 Parte 1. ¿Cómo guarda FreeCAD las configuraciones?

FreeCAD proporciona un mecanismo integrado para almacenar parámetros de usuario — a través del Administrador de Parámetros.

Funciona con una base de datos de parámetros jerárquica, similar al Registro de Windows.

Métodos principales:

# Obtener un grupo de parámetros
params = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/MyAddon")

# Guardar valor
params.SetFloat("LastLength", 30.0)
params.SetString("LastName", "MyBox")

# Cargar valor (con valor predeterminado)
length = params.GetFloat("LastLength", 10.0)  # 10.0 — si no existe tal parámetro
name = params.GetString("LastName", "DefaultBox")

💡 La ruta "User parameter:BaseApp/Preferences/..." — es el lugar estándar para las configuraciones de usuario.


🛠 Parte 2. Complemento actualizado: «Box Builder con memoria»

Modificaremos el complemento anterior, añadiendo el guardado y la carga de los últimos valores.

Archivo box_builder_workbench.py (versión actualizada)

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

# === RUTA A LAS CONFIGURACIONES ===
PARAM_PATH = "User parameter:BaseApp/Preferences/BoxBuilderAddon"

def get_saved_settings():
    """Carga las configuraciones guardadas o devuelve los valores predeterminados"""
    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):
    """Guarda las configuraciones actuales"""
    params = FreeCAD.ParamGet(PARAM_PATH)
    params.SetFloat("LastLength", length)
    params.SetFloat("LastWidth", width)
    params.SetFloat("LastHeight", height)
    params.SetString("LastName", name)


# === FUNCIÓN DE CREACIÓN DE CAJA ===
def create_box(length, width, height, name="CustomBox"):
    doc = FreeCAD.ActiveDocument
    if not doc:
        doc = FreeCAD.newDocument("BoxBuilder")

    # Nombre único
    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


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

        # Cargar configuraciones guardadas
        settings = get_saved_settings()

        # Campos de entrada
        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"])

        # Botones
        self.create_button = QtGui.QPushButton("Create Box")
        self.cancel_button = QtGui.QPushButton("Cancel")

        # Conexión
        self.create_button.clicked.connect(self.on_create)
        self.cancel_button.clicked.connect(self.reject)

        # Diseño
        layout = QtGui.QFormLayout()
        layout.addRow("Name:", self.name_input)
        layout.addRow("Length (mm):", self.length_input)
        layout.addRow("Width (mm):", self.width_input)
        layout.addRow("Height (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("All dimensions must be positive")

            # Crear objeto
            create_box(length, width, height, name)

            # Guardar configuraciones
            save_settings(length, width, height, name)

            self.accept()

        except ValueError as e:
            QtGui.QMessageBox.warning(self, "Input Error", f"Invalid input:\n{str(e)}")


# === COMANDO Y ENTORNO DE TRABAJO (sin cambios) ===
class BoxBuilderCommand:
    def GetResources(self):
        return {"MenuText": "Box Builder", "ToolTip": "Create a box with custom dimensions"}
    def Activated(self):
        dialog = BoxBuilderDialog()
        dialog.exec_()
    def IsActive(self):
        return True

class BoxBuilderWorkbench(FreeCADGui.Workbench):
    MenuText = "Box Builder"
    ToolTip = "Create custom boxes with GUI"
    def Initialize(self):
        self.list = ["BoxBuilderCommand"]
        self.appendToolbar("Box Tools", self.list)
        self.appendMenu("Box Builder", self.list)
    def GetClassName(self):
        return "Gui::PythonWorkbench"

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

🔍 ¿Qué ha cambiado?

  1. Funciones añadidas:
  • get_saved_settings() — carga los últimos valores
  • save_settings() — guarda los valores actuales
  1. Ruta a los parámetros:
   PARAM_PATH = "User parameter:BaseApp/Preferences/BoxBuilderAddon"

→ Todas las configuraciones se almacenan en un grupo separado, sin interferir con otros complementos.

  1. Campo para el nombre añadido a la interfaz.
  2. Al iniciar la ventana — los campos se rellenan con los valores guardados.
  3. Después de la creación — los valores actuales se guardan automáticamente.

▶️ Comprobación del funcionamiento

  1. Inicia FreeCAD
  2. Abre Box Builder
  3. Introduce, por ejemplo:
  • Nombre: MyTestBox
  • Longitud: 50
  • Anchura: 30
  • Altura: 20
  1. Haz clic en Create Box
  2. Cierra FreeCAD
  3. Inicia de nuevo
  4. Abre Box Builder

✅ ¡Los campos deberían estar rellenos con los mismos valores!


📂 ¿Dónde se guardan estas configuraciones?

  • Windows: en el registro (HKEY_CURRENT_USER\SOFTWARE\FreeCAD\...)
  • Linux/macOS: en el archivo user.cfg dentro de la carpeta de FreeCAD

Pero no necesitas saber esto — FreeCAD gestiona el almacenamiento por sí mismo.


🧪 Tarea práctica

  1. Añade una casilla de verificación «Center on origin» y guarda su estado entre inicios.
  2. Haz que en el primer inicio del complemento se utilicen valores predeterminados razonables (ya implementado).
  3. Añade un botón «Reset to defaults», que restablece los campos a los valores predeterminados y borra las configuraciones guardadas.

Sugerencia para restablecer:

def reset_settings():
    params = FreeCAD.ParamGet(PARAM_PATH)
    params.RemGroup("BoxBuilderAddon")  # Elimina todo el grupo

💡 Consejos

  • Siempre especifica un valor predeterminado en GetFloat(), GetString() etc.
  • No guardes demasiado — solo lo que el usuario realmente necesita
  • Utiliza una ruta única (BoxBuilderAddon) para no entrar en conflicto con otros complementos

▶️ ¿Qué sigue?

En la Lección 6 aprenderemos a:

  • Añadir iconos a los botones y al entorno de trabajo
  • Aprender a usar SVG y PNG en la interfaz
  • Hacer que el complemento sea visualmente atractivo

«`

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *