{"id":3615,"date":"2025-10-03T22:29:31","date_gmt":"2025-10-03T20:29:31","guid":{"rendered":"https:\/\/ru.davidka.net\/ru\/?p=3615"},"modified":"2025-10-04T01:32:07","modified_gmt":"2025-10-03T23:32:07","slug":"lezione-3-creazione-di-oggetti-3d","status":"publish","type":"post","link":"https:\/\/it.davidka.net\/it\/lezione-3-creazione-di-oggetti-3d\/","title":{"rendered":"Lezione 3. Creazione di oggetti 3D: scatola parametrica"},"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>: imparare a creare corpi solidi (scatole, cilindri) tramite Python, comprendere la struttura del documento FreeCAD e creare un addon che costruisce un pezzo parametrico.<\/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=\"3615\" 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\">\ud83e\uddf1 Parte 1. Come \u00e8 strutturato un documento in FreeCAD?<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-2\">Come ottenere il documento corrente?<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-3\">\ud83d\udce6 Parte 2. Creazione di una scatola (Box) tramite Python<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-4\">Cosa succede qui?<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-5\">\ud83d\udee0 Parte 3. Addon: \u00abScatola parametrica\u00bb<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-6\">Passo 1. Crea una cartella<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-7\">Passo 2. File <code class=\"\" data-line=\"\">InitGui.py<\/code><\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-8\">Passo 3. File <code class=\"\" data-line=\"\">param_box_workbench.py<\/code><\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-9\">\u25b6\ufe0f Passo 4. Verifica del funzionamento<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-10\">Verifica la parametricit\u00e0!<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-11\">\ud83d\udd0d Parte 4. Altri oggetti base<\/a><ul class=\"rtoc-mokuji mokuji_ul level-2\"><li class=\"rtoc-item\"><a href=\"#rtoc-12\">Cilindro<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-13\">Sfera<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-14\">Cono<\/a><\/li><\/ul><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-15\">\ud83e\uddea Esercizio pratico<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-16\">\ud83d\udca1 Consigli per il debug<\/a><\/li><li class=\"rtoc-item\"><a href=\"#rtoc-17\">\u25b6\ufe0f Cosa c \u00e8 dopo?<\/a><\/li><\/ol><\/div><h2 id=\"rtoc-1\"  class=\"wp-block-heading\">\ud83e\uddf1 Parte 1. Come \u00e8 strutturato un documento in FreeCAD?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Prima di creare oggetti, \u00e8 importante comprendere la <strong>gerarchia dei dati<\/strong> in FreeCAD:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">Document (documento)\n\u2514\u2500\u2500 Object (oggetto)\n    \u2514\u2500\u2500 Shape (geometria)<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Document<\/strong> \u2014 \u00e8 un file aperto (<code class=\"\" data-line=\"\">.FCStd<\/code>). Tutto ci\u00f2 che crei si trova all&#8217;interno del documento.<\/li>\n\n\n\n<li><strong>Object<\/strong> \u2014 \u00e8 un oggetto parametrico: scatola, cilindro, schizzo, ecc.<\/li>\n\n\n\n<li><strong>Shape<\/strong> \u2014 \u00e8 un corpo geometrico (B-Rep) che pu\u00f2 essere visualizzato.<\/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\">\ud83d\udca1 Lavori sempre <strong>nel contesto del documento attivo<\/strong>.<\/p>\n<\/blockquote>\n\n\n\n<h3 id=\"rtoc-2\"  class=\"wp-block-heading\">Come ottenere il documento corrente?<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">doc = FreeCAD.ActiveDocument<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Se non c&#8217;\u00e8 un documento, creane uno nuovo:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">doc = FreeCAD.newDocument(&quot;MyDesign&quot;)<\/code><\/pre>\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\udce6 Parte 2. Creazione di una scatola (Box) tramite Python<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;oggetto 3D pi\u00f9 semplice in FreeCAD \u00e8 <strong>Part::Box<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esempio di codice:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">doc = FreeCAD.ActiveDocument or FreeCAD.newDocument()\nbox = doc.addObject(&quot;Part::Box&quot;, &quot;MyBox&quot;)\nbox.Length = 20.0\nbox.Width = 10.0\nbox.Height = 5.0\ndoc.recompute()<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-4\"  class=\"wp-block-heading\">Cosa succede qui?<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code class=\"\" data-line=\"\">doc.addObject(&quot;Part::Box&quot;, &quot;MyBox&quot;)<\/code><br>\u2192 crea un nuovo oggetto di tipo <strong>Box<\/strong> con il nome <code class=\"\" data-line=\"\">&quot;MyBox&quot;<\/code><\/li>\n\n\n\n<li>L&#8217;oggetto ha <strong>propriet\u00e0 parametriche<\/strong>: <code class=\"\" data-line=\"\">Length<\/code>, <code class=\"\" data-line=\"\">Width<\/code>, <code class=\"\" data-line=\"\">Height<\/code><\/li>\n\n\n\n<li><code class=\"\" data-line=\"\">doc.recompute()<\/code><br>\u2192 ricostruisce il modello (obbligatorio dopo aver modificato i parametri!)<\/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\">\ud83d\udd38 Tutte le dimensioni sono in <strong>millimetri<\/strong> (per impostazione predefinita in FreeCAD).<\/p>\n<\/blockquote>\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\udee0 Parte 3. Addon: \u00abScatola parametrica\u00bb<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ora creeremo un addon che crea una scatola con dimensioni specificate.<\/p>\n\n\n\n<h3 id=\"rtoc-6\"  class=\"wp-block-heading\">Passo 1. Crea una cartella<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">...\/Mod\/ParamBoxAddon\/<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-7\"  class=\"wp-block-heading\">Passo 2. File <code class=\"\" data-line=\"\">InitGui.py<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># InitGui.py\nimport FreeCADGui\nfrom ParamBoxAddon.param_box_workbench import ParamBoxWorkbench\n\nFreeCADGui.addWorkbench(ParamBoxWorkbench())<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-8\"  class=\"wp-block-heading\">Passo 3. File <code class=\"\" data-line=\"\">param_box_workbench.py<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># param_box_workbench.py\nimport FreeCAD, FreeCADGui\n\nclass CreateBoxCommand:\n    def GetResources(self):\n        return {\n            &quot;MenuText&quot;: &quot;Create Box&quot;,\n            &quot;ToolTip&quot;: &quot;Create a parametric box with default size&quot;\n        }\n\n    def Activated(self):\n        # Ottieni o crea un documento\n        doc = FreeCAD.ActiveDocument\n        if not doc:\n            doc = FreeCAD.newDocument(&quot;BoxDesign&quot;)\n\n        # Crea l&#039;oggetto Box\n        box = doc.addObject(&quot;Part::Box&quot;, &quot;MyParamBox&quot;)\n        box.Length = 30.0\n        box.Width = 20.0\n        box.Height = 10.0\n\n        # Ricostruisci obbligatoriamente!\n        doc.recompute()\n\n        # Opzionale: focus sull&#039;oggetto\n        FreeCADGui.Selection.clearSelection()\n        FreeCADGui.Selection.addSelection(box)\n\n    def IsActive(self):\n        return True\n\n\nclass ParamBoxWorkbench(FreeCADGui.Workbench):\n    MenuText = &quot;Parametric Box&quot;\n    ToolTip = &quot;Create a simple parametric box&quot;\n\n    def Initialize(self):\n        self.list = &#091;&quot;CreateBoxCommand&quot;]\n        self.appendToolbar(&quot;Box Tools&quot;, self.list)\n        self.appendMenu(&quot;ParamBox&quot;, self.list)\n\n    def GetClassName(self):\n        return &quot;Gui::PythonWorkbench&quot;\n\n\nFreeCADGui.addCommand(&quot;CreateBoxCommand&quot;, CreateBoxCommand())<\/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\">\u25b6\ufe0f Passo 4. Verifica del funzionamento<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Salva i file<\/li>\n\n\n\n<li>Riavvia FreeCAD<\/li>\n\n\n\n<li>Seleziona l ambiente di lavoro <strong>\u00abParametric Box\u00bb<\/strong><\/li>\n\n\n\n<li>Clicca sul pulsante <strong>\u00abCreate Box\u00bb<\/strong><\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u2705 Dovrebbe apparire un <strong>parallelepipedo grigio<\/strong> nella finestra 3D.<\/p>\n\n\n\n<h3 id=\"rtoc-10\"  class=\"wp-block-heading\">Verifica la parametricit\u00e0!<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Nell <strong>albero del progetto<\/strong> (Model) fai doppio clic su <code class=\"\" data-line=\"\">MyParamBox<\/code><\/li>\n\n\n\n<li>Nel pannello <strong>Data<\/strong> modifica, ad esempio, <code class=\"\" data-line=\"\">Length<\/code> a <code class=\"\" data-line=\"\">50<\/code><\/li>\n\n\n\n<li>Premi <strong>Invio<\/strong> \u2192 il modello <strong>si aggiorner\u00e0 automaticamente<\/strong>!<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Questo \u00e8 il <strong>modellazione parametrica<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-11\"  class=\"wp-block-heading\">\ud83d\udd0d Parte 4. Altri oggetti base<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Puoi creare non solo scatole. Ecco alcuni esempi:<\/p>\n\n\n\n<h3 id=\"rtoc-12\"  class=\"wp-block-heading\">Cilindro<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">cyl = doc.addObject(&quot;Part::Cylinder&quot;, &quot;MyCylinder&quot;)\ncyl.Radius = 10.0\ncyl.Height = 25.0<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-13\"  class=\"wp-block-heading\">Sfera<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">sphere = doc.addObject(&quot;Part::Sphere&quot;, &quot;MySphere&quot;)\nsphere.Radius = 15.0<\/code><\/pre>\n\n\n\n<h3 id=\"rtoc-14\"  class=\"wp-block-heading\">Cono<\/h3>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">cone = doc.addObject(&quot;Part::Cone&quot;, &quot;MyCone&quot;)\ncone.Radius1 = 10.0  # raggio inferiore\ncone.Radius2 = 5.0   # raggio superiore\ncone.Height = 20.0<\/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 Tutti questi oggetti si trovano nel modulo <strong>Part<\/strong>, che \u00e8 integrato in FreeCAD.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-15\"  class=\"wp-block-heading\">\ud83e\uddea Esercizio pratico<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Modifica l addon in modo che crei un <strong>cilindro<\/strong>, anzich\u00e9 una scatola.<\/li>\n\n\n\n<li>Fai in modo che, alla creazione, l oggetto riceva un <strong>nome unico<\/strong> (ad esempio, <code class=\"\" data-line=\"\">Box_1<\/code>, <code class=\"\" data-line=\"\">Box_2<\/code>\u2026), se un oggetto con lo stesso nome esiste gi\u00e0.<\/li>\n\n\n\n<li>Aggiungi un secondo comando \u2014 \u00abCreate Cylinder\u00bb \u2014 allo stesso ambiente di lavoro.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Suggerimento per il nome unico:<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">base_name = &quot;MyBox&quot;\nindex = 1\nname = base_name\nwhile name in doc.Objects:\n    name = f&quot;{base_name}_{index}&quot;\n    index += 1\nbox = doc.addObject(&quot;Part::Box&quot;, name)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-16\"  class=\"wp-block-heading\">\ud83d\udca1 Consigli per il debug<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Chiama sempre <code class=\"\" data-line=\"\">doc.recompute()<\/code> dopo aver modificato i parametri<\/li>\n\n\n\n<li>Usa <code class=\"\" data-line=\"\">FreeCAD.Console.PrintMessage(&quot;Testo\\n&quot;)<\/code> per il debug (i messaggi appariranno nella Report View)<\/li>\n\n\n\n<li>Controlla se il documento esiste prima di lavorarci<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 id=\"rtoc-17\"  class=\"wp-block-heading\">\u25b6\ufe0f Cosa c \u00e8 dopo?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nella <strong>Lezione 4<\/strong> impareremo a:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creare un <strong>interfaccia grafica (GUI)<\/strong> con campi di input<\/li>\n\n\n\n<li>Creare una finestra in cui l utente inserisce lunghezza, larghezza e altezza<\/li>\n\n\n\n<li>E al clic di un pulsante \u2014 viene costruita una scatola con questi parametri<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Questo sar\u00e0 gi\u00e0 uno <strong>strumento reale<\/strong>, non solo una dimostrazione!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udcd8 Corso di formazione: Creazione di addon per FreeCAD Obiettivo della lezione: imparare a creare corpi solidi (scatole, cilindri) tramite Python, comprendere la struttura del documento FreeCAD e creare un addon che costruisce un pezzo parametrico. In Questo Articolo \ud83e\uddf1 Parte 1. Come \u00e8 strutturato un documento in FreeCAD? Come ottenere il documento corrente? \ud83d\udce6&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-3615","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\/3615","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=3615"}],"version-history":[{"count":0,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/posts\/3615\/revisions"}],"wp:attachment":[{"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/media?parent=3615"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/categories?post=3615"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/it.davidka.net\/it\/wp-json\/wp\/v2\/tags?post=3615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}