{"id":3640,"date":"2025-10-04T01:30:56","date_gmt":"2025-10-03T23:30:56","guid":{"rendered":"https:\/\/it.davidka.net\/it\/?p=3640"},"modified":"2025-10-07T09:26:44","modified_gmt":"2025-10-07T07:26:44","slug":"lezione-2-il-tuo-primo-addon-hello-world","status":"publish","type":"post","link":"https:\/\/it.davidka.net\/it\/lezione-2-il-tuo-primo-addon-hello-world\/","title":{"rendered":"Lezione 2. Il tuo primo addon: \u00abHello World\u00bb"},"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<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>: creare un semplice addon che aggiunge un nuovo ambiente di lavoro con un pulsante, e al clic mostra un messaggio.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div id=\"rtoc-mokuji-wrapper\" class=\"rtoc-mokuji-content frame2 preset1 animation-fade rtoc_open default\" data-id=\"3640\" 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\">\ud83d\udcc1 Passo 1. Preparazione della cartella dell&#8217;addon<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-2\">\ud83d\udcc4 Passo 2. File <code class=\"\" data-line=\"\">InitGui.py<\/code> \u2014 punto di ingresso<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-3\">\ud83d\udd0d Cosa fa questo codice?<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-4\">\ud83d\udcc4 Passo 3. File <code class=\"\" data-line=\"\">hello_workbench.py<\/code> \u2014 logica dell&#8217;addon<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-5\">\ud83d\udd0d Analisi del codice per parti:<\/a><ul class=\"rtoc-mokuji mokuji_none level-3\"><li class=\"rtoc-item\"><a href=\"#rtoc-6\">1. Comando (<code class=\"\" data-line=\"\">HelloWorldCommand<\/code>)<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-7\">2. Ambiente di lavoro (<code class=\"\" data-line=\"\">HelloWorldWorkbench<\/code>)<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-8\">3. Registrazione<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ol><\/div><h2 id=\"rtoc-1\"  class=\"wp-block-heading\">\ud83d\udcc1 Passo 1. Preparazione della cartella dell&#8217;addon<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Assicurati di avere la cartella:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">...\/FreeCAD\/Mod\/HelloWorldAddon\/<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Se non c&#8217;\u00e8, creala.<\/p>\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 nome della cartella \u00e8 <strong>importante<\/strong>: deve corrispondere al nome del modulo nel codice.<br>Useremo <code class=\"\" data-line=\"\">HelloWorldAddon<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">All&#8217;interno di questa cartella crea <strong>due file<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">InitGui.py<\/code><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">hello_workbench.py<\/code><\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u2757 Non usare spazi o caratteri cirillici nei nomi di file e cartelle!<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-2\"  class=\"wp-block-heading\">\ud83d\udcc4 Passo 2. File <code class=\"\" data-line=\"\">InitGui.py<\/code> \u2014 punto di ingresso<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Questo file viene <strong>avviato automaticamente<\/strong> da FreeCAD all&#8217;avvio, se si trova nella cartella dell&#8217;addon.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aprilo nell&#8217;editor e incolla il seguente codice:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># InitGui.py\nimport FreeCADGui\nfrom HelloWorldAddon.hello_workbench import HelloWorldWorkbench\n\nFreeCADGui.addWorkbench(HelloWorldWorkbench())<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-3\"  class=\"wp-block-heading\">\ud83d\udd0d Cosa fa questo codice?<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Importa<\/strong> il nostro ambiente di lavoro dal file <code class=\"\" data-line=\"\">hello_workbench.py<\/code><\/li>\n\n\n\n<li><strong>Registra<\/strong> l&#8217;ambiente di lavoro nell&#8217;interfaccia di FreeCAD tramite <code class=\"\" data-line=\"\">FreeCADGui.addWorkbench()<\/code><\/li>\n<\/ol>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f Attenzione:<br><code class=\"\" data-line=\"\">from HelloWorldAddon.hello_workbench<\/code> \u2014 qui <code class=\"\" data-line=\"\">HelloWorldAddon<\/code> \u00e8 il <strong>nome della cartella<\/strong>, e <code class=\"\" data-line=\"\">hello_workbench<\/code> \u00e8 il nome del file <strong>senza estensione <code class=\"\" data-line=\"\">.py<\/code><\/strong>.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-4\"  class=\"wp-block-heading\">\ud83d\udcc4 Passo 3. File <code class=\"\" data-line=\"\">hello_workbench.py<\/code> \u2014 logica dell&#8217;addon<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ora creiamo l&#8217;ambiente di lavoro stesso.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Incolla in <code class=\"\" data-line=\"\">hello_workbench.py<\/code> il seguente codice:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># hello_workbench.py\nimport FreeCAD, FreeCADGui\nfrom PySide import QtGui\n\n# === COMANDO: ci\u00f2 che accade quando si preme il pulsante ===\nclass HelloWorldCommand:\n    def GetResources(self):\n        &quot;&quot;&quot;Restituisce i dati per la visualizzazione del comando&quot;&quot;&quot;\n        return {\n            &quot;MenuText&quot;: &quot;Say Hello&quot;,      # Testo nel menu\n            &quot;ToolTip&quot;: &quot;Show a greeting&quot;, # Suggerimento\n            &quot;Pixmap&quot;: &quot;&quot;                  # Percorso dell&#039;icona (attualmente vuoto)\n        }\n\n    def Activated(self):\n        &quot;&quot;&quot;Chiamato quando si preme il pulsante&quot;&quot;&quot;\n        QtGui.QMessageBox.information(\n            None,\n            &quot;FreeCAD Addon&quot;,\n            &quot;Ciao mondo!\\nHai appena avviato il tuo primo addon!&quot;\n        )\n\n    def IsActive(self):\n        &quot;&quot;&quot;Quando il comando \u00e8 disponibile? (sempre \u2014 True)&quot;&quot;&quot;\n        return True\n\n\n# === AMBIENTE DI LAVORO: raggruppa i comandi ===\nclass HelloWorldWorkbench(FreeCADGui.Workbench):\n    # Nome che verr\u00e0 visualizzato nell&#039;elenco\n    MenuText = &quot;Hello World&quot;\n    ToolTip = &quot;Il mio primo ambiente di lavoro&quot;\n\n    def Initialize(self):\n        &quot;&quot;&quot;Chiamato all&#039;attivazione dell&#039;ambiente di lavoro&quot;&quot;&quot;\n        # Elenco dei nomi dei comandi\n        self.list = &#091;&quot;HelloWorldCommand&quot;]\n\n        # Aggiungiamo la barra degli strumenti\n        self.appendToolbar(&quot;Hello Tools&quot;, self.list)\n\n        # Aggiungiamo una voce al menu\n        self.appendMenu(&quot;Hello World&quot;, self.list)\n\n    def GetClassName(self):\n        &quot;&quot;&quot;Metodo obbligatorio per gli ambienti di lavoro Python&quot;&quot;&quot;\n        return &quot;Gui::PythonWorkbench&quot;\n\n\n# === REGISTRAZIONE DEL COMANDO ===\nFreeCADGui.addCommand(&quot;HelloWorldCommand&quot;, HelloWorldCommand())<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-5\"  class=\"wp-block-heading\">\ud83d\udd0d Analisi del codice per parti:<\/h3>\n\n\n\n<h4 id=\"rtoc-6\"  class=\"wp-block-heading\">1. <strong>Comando (<code class=\"\" data-line=\"\">HelloWorldCommand<\/code>)<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">GetResources()<\/code> \u2014 descrive come appare il comando nell&#8217;interfaccia<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">Activated()<\/code> \u2014 cosa succede quando si preme<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">IsActive()<\/code> \u2014 quando il pulsante \u00e8 attivo (ad esempio, solo se c&#8217;\u00e8 un documento)<\/li>\n<\/ul>\n\n\n\n<h4 id=\"rtoc-7\"  class=\"wp-block-heading\">2. <strong>Ambiente di lavoro (<code class=\"\" data-line=\"\">HelloWorldWorkbench<\/code>)<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eredita da <code class=\"\" data-line=\"\">FreeCADGui.Workbench<\/code><\/li>\n\n\n\n<li>Il metodo <code class=\"\" data-line=\"\">Initialize()<\/code> aggiunge i comandi alla barra e al menu<\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">GetClassName()<\/code> dice a FreeCAD: \u00abquesto \u00e8 un ambiente di lavoro Python\u00bb<\/li>\n<\/ul>\n\n\n\n<h4 id=\"rtoc-8\"  class=\"wp-block-heading\">3. <strong>Registrazione<\/strong><\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">FreeCADGui.addCommand()<\/code> associa il nome `<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udcd8 Corso di formazione: Creazione di addon per FreeCAD Obiettivo della lezione: creare un semplice addon che aggiunge un nuovo ambiente di lavoro con un pulsante, e al clic mostra un messaggio. In Questo Articolo \ud83d\udcc1 Passo 1. Preparazione della cartella dell&#8217;addon \ud83d\udcc4 Passo 2. File InitGui.py \u2014 punto di ingresso \ud83d\udd0d Cosa fa questo&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-3640","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\/3640","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=3640"}],"version-history":[{"count":0,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/3640\/revisions"}],"wp:attachment":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/media?parent=3640"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/categories?post=3640"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/tags?post=3640"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}