{"id":3620,"date":"2025-10-03T22:31:45","date_gmt":"2025-10-03T20:31:45","guid":{"rendered":"https:\/\/ru.davidka.net\/ru\/?p=3620"},"modified":"2025-10-04T01:33:32","modified_gmt":"2025-10-03T23:33:32","slug":"lezione-5-salvataggio-e-caricamento-delle-impostazioni","status":"publish","type":"post","link":"https:\/\/it.davidka.net\/it\/lezione-5-salvataggio-e-caricamento-delle-impostazioni\/","title":{"rendered":"Lezione 5. Salvataggio e caricamento delle impostazioni"},"content":{"rendered":"\n<p class=\"has-medium-font-size wp-block-paragraph\"><em>\ud83d\udcd8 Corso di formazione: Creazione di addon per FreeCAD<\/em><\/p>\n\n\n\n<div id=\"rtoc-mokuji-wrapper\" class=\"rtoc-mokuji-content frame2 preset1 animation-fade rtoc_open default\" data-id=\"3620\" data-theme=\"Neve - Davidka\">\n\t\t\t<div id=\"rtoc-mokuji-title\" class=\"rtoc_btn_none rtoc_left\">\n\t\t\t\n\t\t\t<span>In Questo Articolo<\/span>\n\t\t\t<\/div><ol class=\"rtoc-mokuji decimal_ol level-1\"><li class=\"rtoc-item\"><a href=\"#rtoc-1\"><\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-2\">\ud83d\udcbe Parte 1. Come FreeCAD memorizza le impostazioni?<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-2\">Metodi principali:<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-3\">\ud83d\udee0 Parte 2. Addon aggiornato: \u00abBox Builder con memoria\u00bb<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-4\">File <code class=\"\" data-line=\"\">box_builder_workbench.py<\/code> (versione aggiornata)<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-5\">\ud83d\udd0d Cosa \u00e8 cambiato?<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-6\">\u25b6\ufe0f Verifica del funzionamento<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-7\">\ud83d\udcc2 Dove sono memorizzate queste impostazioni?<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-8\">\ud83e\uddea Esercizio pratico<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-9\">\ud83d\udca1 Consigli<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-10\">\u25b6\ufe0f Cosa c&#8217;\u00e8 dopo?<\/a><\/li><\/ol><\/div><h2 id=\"rtoc-1\"  class=\"wp-block-heading\"><\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Obiettivo della lezione<\/strong>: fare in modo che l&#8217;addon \u00abBox Builder\u00bb memorizzi le ultime dimensioni inserite e le ripristini al successivo avvio.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcbe Parte 1. Come FreeCAD memorizza le impostazioni?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">FreeCAD fornisce un meccanismo integrato per la memorizzazione dei parametri utente \u2014 tramite il <strong>Parameter Manager<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Funziona con una <strong>base di parametri gerarchica<\/strong>, simile al Registro di Windows.<\/p>\n\n\n\n<h3 id=\"rtoc-2\"  class=\"wp-block-heading\">Metodi principali:<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Ottieni un gruppo di parametri\nparams = FreeCAD.ParamGet(&quot;User parameter:BaseApp\/Preferences\/MyAddon&quot;)\n\n# Salva un valore\nparams.SetFloat(&quot;LastLength&quot;, 30.0)\nparams.SetString(&quot;LastName&quot;, &quot;MyBox&quot;)\n\n# Carica un valore (con un valore predefinito)\nlength = params.GetFloat(&quot;LastLength&quot;, 10.0)  # 10.0 \u2014 se il parametro non esiste\nname = params.GetString(&quot;LastName&quot;, &quot;DefaultBox&quot;)<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udca1 Il percorso <code class=\"\" data-line=\"\">&quot;User parameter:BaseApp\/Preferences\/...&quot;<\/code> \u2014 \u00e8 il luogo standard per le impostazioni utente.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-3\"  class=\"wp-block-heading\">\ud83d\udee0 Parte 2. Addon aggiornato: \u00abBox Builder con memoria\u00bb<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Modificheremo l&#8217;addon precedente, aggiungendo il salvataggio e il caricamento degli ultimi valori.<\/p>\n\n\n\n<h3 id=\"rtoc-4\"  class=\"wp-block-heading\">File <code class=\"\" data-line=\"\">box_builder_workbench.py<\/code> (versione aggiornata)<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># box_builder_workbench.py\nimport FreeCAD, FreeCADGui\nfrom PySide import QtGui, QtCore\n\n# === PERCORSO DELLE IMPOSTAZIONI ===\nPARAM_PATH = &quot;User parameter:BaseApp\/Preferences\/BoxBuilderAddon&quot;\n\ndef get_saved_settings():\n    &quot;&quot;&quot;Carica le impostazioni salvate o restituisce i valori predefiniti&quot;&quot;&quot;\n    params = FreeCAD.ParamGet(PARAM_PATH)\n    return {\n        &quot;length&quot;: params.GetFloat(&quot;LastLength&quot;, 30.0),\n        &quot;width&quot;: params.GetFloat(&quot;LastWidth&quot;, 20.0),\n        &quot;height&quot;: params.GetFloat(&quot;LastHeight&quot;, 10.0),\n        &quot;name&quot;: params.GetString(&quot;LastName&quot;, &quot;CustomBox&quot;)\n    }\n\ndef save_settings(length, width, height, name):\n    &quot;&quot;&quot;Salva le impostazioni attuali&quot;&quot;&quot;\n    params = FreeCAD.ParamGet(PARAM_PATH)\n    params.SetFloat(&quot;LastLength&quot;, length)\n    params.SetFloat(&quot;LastWidth&quot;, width)\n    params.SetFloat(&quot;LastHeight&quot;, height)\n    params.SetString(&quot;LastName&quot;, name)\n\n\n# === FUNZIONE DI CREAZIONE SCATOLA ===\ndef create_box(length, width, height, name=&quot;CustomBox&quot;):\n    doc = FreeCAD.ActiveDocument\n    if not doc:\n        doc = FreeCAD.newDocument(&quot;BoxBuilder&quot;)\n\n    # Nome unico\n    base_name = name\n    index = 1\n    obj_name = base_name\n    while obj_name in &#091;obj.Name for obj in doc.Objects]:\n        obj_name = f&quot;{base_name}_{index}&quot;\n        index += 1\n\n    box = doc.addObject(&quot;Part::Box&quot;, obj_name)\n    box.Length = length\n    box.Width = width\n    box.Height = height\n    doc.recompute()\n    return box\n\n\n# === FINESTRA DI DIALOGO ===\nclass BoxBuilderDialog(QtGui.QDialog):\n    def __init__(self):\n        super(BoxBuilderDialog, self).__init__()\n        self.setWindowTitle(&quot;Box Builder&quot;)\n        self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)\n        self.resize(300, 180)\n\n        # Carica le impostazioni salvate\n        settings = get_saved_settings()\n\n        # Campi di input\n        self.length_input = QtGui.QLineEdit(str(settings&#091;&quot;length&quot;]))\n        self.width_input = QtGui.QLineEdit(str(settings&#091;&quot;width&quot;]))\n        self.height_input = QtGui.QLineEdit(str(settings&#091;&quot;height&quot;]))\n        self.name_input = QtGui.QLineEdit(settings&#091;&quot;name&quot;])\n\n        # Pulsanti\n        self.create_button = QtGui.QPushButton(&quot;Create Box&quot;)\n        self.cancel_button = QtGui.QPushButton(&quot;Cancel&quot;)\n\n        # Connessione\n        self.create_button.clicked.connect(self.on_create)\n        self.cancel_button.clicked.connect(self.reject)\n\n        # Layout\n        layout = QtGui.QFormLayout()\n        layout.addRow(&quot;Name:&quot;, self.name_input)\n        layout.addRow(&quot;Length (mm):&quot;, self.length_input)\n        layout.addRow(&quot;Width (mm):&quot;, self.width_input)\n        layout.addRow(&quot;Height (mm):&quot;, self.height_input)\n\n        button_layout = QtGui.QHBoxLayout()\n        button_layout.addWidget(self.create_button)\n        button_layout.addWidget(self.cancel_button)\n\n        main_layout = QtGui.QVBoxLayout()\n        main_layout.addLayout(layout)\n        main_layout.addLayout(button_layout)\n        self.setLayout(main_layout)\n\n    def on_create(self):\n        try:\n            name = self.name_input.text().strip()\n            if not name:\n                name = &quot;CustomBox&quot;\n\n            length = float(self.length_input.text())\n            width = float(self.width_input.text())\n            height = float(self.height_input.text())\n\n            if length &lt;= 0 or width &lt;= 0 or height &lt;= 0:\n                raise ValueError(&quot;All dimensions must be positive&quot;)\n\n            # Crea l&#039;oggetto\n            create_box(length, width, height, name)\n\n            # Salva le impostazioni\n            save_settings(length, width, height, name)\n\n            self.accept()\n\n        except ValueError as e:\n            QtGui.QMessageBox.warning(self, &quot;Input Error&quot;, f&quot;Invalid input:\\n{str(e)}&quot;)\n\n\n# === COMANDO E AMBIENTE DI LAVORO (senza modifiche) ===\nclass BoxBuilderCommand:\n    def GetResources(self):\n        return {&quot;MenuText&quot;: &quot;Box Builder&quot;, &quot;ToolTip&quot;: &quot;Create a box with custom dimensions&quot;}\n    def Activated(self):\n        dialog = BoxBuilderDialog()\n        dialog.exec_()\n    def IsActive(self):\n        return True\n\nclass BoxBuilderWorkbench(FreeCADGui.Workbench):\n    MenuText = &quot;Box Builder&quot;\n    ToolTip = &quot;Create custom boxes with GUI&quot;\n    def Initialize(self):\n        self.list = &#091;&quot;BoxBuilderCommand&quot;]\n        self.appendToolbar(&quot;Box Tools&quot;, self.list)\n        self.appendMenu(&quot;Box Builder&quot;, self.list)\n    def GetClassName(self):\n        return &quot;Gui::PythonWorkbench&quot;\n\nFreeCADGui.addCommand(&quot;BoxBuilderCommand&quot;, BoxBuilderCommand())<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-5\"  class=\"wp-block-heading\">\ud83d\udd0d Cosa \u00e8 cambiato?<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Funzioni aggiunte<\/strong>:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">get_saved_settings()<\/code> \u2014 carica gli ultimi valori<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">save_settings()<\/code> \u2014 salva i valori attuali<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Percorso dei parametri<\/strong>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">   PARAM_PATH = &quot;User parameter:BaseApp\/Preferences\/BoxBuilderAddon&quot;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u2192 Tutte le impostazioni sono memorizzate in un gruppo separato, senza interferire con altri addon.<\/p>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Campo per il nome<\/strong> aggiunto all&#8217;interfaccia.<\/li>\n\n\n\n<li><strong>All&#8217;avvio della finestra<\/strong> \u2014 i campi vengono popolati con i <strong>valori salvati<\/strong>.<\/li>\n\n\n\n<li><strong>Dopo la creazione<\/strong> \u2014 i valori attuali vengono <strong>salvati automaticamente<\/strong>.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-6\"  class=\"wp-block-heading\">\u25b6\ufe0f Verifica del funzionamento<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Avvia FreeCAD<\/li>\n\n\n\n<li>Apri <strong>Box Builder<\/strong><\/li>\n\n\n\n<li>Inserisci, ad esempio:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Name: <code class=\"\" data-line=\"\">MyTestBox<\/code><\/li>\n\n\n\n<li>Length: <code class=\"\" data-line=\"\">50<\/code><\/li>\n\n\n\n<li>Width: <code class=\"\" data-line=\"\">30<\/code><\/li>\n\n\n\n<li>Height: <code class=\"\" data-line=\"\">20<\/code><\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Clicca su <strong>Create Box<\/strong><\/li>\n\n\n\n<li><strong>Chiudi FreeCAD<\/strong><\/li>\n\n\n\n<li><strong>Avvia di nuovo<\/strong><\/li>\n\n\n\n<li>Apri <strong>Box Builder<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 I campi dovrebbero essere popolati con gli stessi valori!<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-7\"  class=\"wp-block-heading\">\ud83d\udcc2 Dove sono memorizzate queste impostazioni?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Windows<\/strong>: nel registro (<code class=\"\" data-line=\"\">HKEY_CURRENT_USER\\SOFTWARE\\FreeCAD\\...<\/code>)<\/li>\n\n\n\n<li><strong>Linux\/macOS<\/strong>: nel file <code class=\"\" data-line=\"\">user.cfg<\/code> all&#8217;interno della cartella FreeCAD<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ma <strong>non \u00e8 necessario saperlo<\/strong> \u2014 FreeCAD gestisce autonomamente la memorizzazione.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-8\"  class=\"wp-block-heading\">\ud83e\uddea Esercizio pratico<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Aggiungi la <strong>casella di controllo<\/strong> \u00abCenter on origin\u00bb e salva il suo stato tra gli avvii.<\/li>\n\n\n\n<li>Fai in modo che al primo avvio dell&#8217;addon vengano utilizzati <strong>valori predefiniti ragionevoli<\/strong> (gi\u00e0 implementato).<\/li>\n\n\n\n<li>Aggiungi un pulsante <strong>\u00abReset to defaults\u00bb<\/strong>, che ripristina i campi ai valori predefiniti e cancella le impostazioni salvate.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Suggerimento per il ripristino:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">def reset_settings():\n    params = FreeCAD.ParamGet(PARAM_PATH)\n    params.RemGroup(&quot;BoxBuilderAddon&quot;)  # Rimuove l&#039;intero gruppo<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-9\"  class=\"wp-block-heading\">\ud83d\udca1 Consigli<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Specifica sempre un <strong>valore predefinito<\/strong> in <code class=\"\" data-line=\"\">GetFloat()<\/code>, <code class=\"\" data-line=\"\">GetString()<\/code> ecc.<\/li>\n\n\n\n<li>Non salvare troppo \u2014 solo ci\u00f2 che \u00e8 realmente necessario all&#8217;utente<\/li>\n\n\n\n<li>Usa un <strong>percorso unico<\/strong> (<code class=\"\" data-line=\"\">BoxBuilderAddon<\/code>) per non entrare in conflitto con altri addon<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-10\"  class=\"wp-block-heading\">\u25b6\ufe0f Cosa c&#8217;\u00e8 dopo?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nella <strong>Lezione 6<\/strong> impareremo a:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aggiungere <strong>icone<\/strong> ai pulsanti e all&#8217;ambiente di lavoro<\/li>\n\n\n\n<li>Utilizzare <strong>SVG e PNG<\/strong> nell&#8217;interfaccia<\/li>\n\n\n\n<li>Rendere l&#8217;addon visivamente accattivante<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udcd8 Corso di formazione: Creazione di addon per FreeCAD In Questo Articolo \ud83d\udcbe Parte 1. Come FreeCAD memorizza le impostazioni? Metodi principali: \ud83d\udee0 Parte 2. Addon aggiornato: \u00abBox Builder con memoria\u00bb File box_builder_workbench.py (versione aggiornata) \ud83d\udd0d Cosa \u00e8 cambiato? \u25b6\ufe0f Verifica del funzionamento \ud83d\udcc2 Dove sono memorizzate queste impostazioni? \ud83e\uddea Esercizio pratico \ud83d\udca1 Consigli \u25b6\ufe0f&hellip;&nbsp;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[948],"tags":[],"class_list":["post-3620","post","type-post","status-publish","format-standard","hentry","category-creazione-di-addon-per-freecad"],"acf":[],"_links":{"self":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/3620","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/comments?post=3620"}],"version-history":[{"count":0,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/3620\/revisions"}],"wp:attachment":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/media?parent=3620"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/categories?post=3620"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/tags?post=3620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}