{"id":10502,"date":"2025-10-01T14:53:41","date_gmt":"2025-10-01T14:53:41","guid":{"rendered":"https:\/\/wp-test-1.sweethome3d.eu\/guida-per-sviluppatori-di-plug-in\/"},"modified":"2025-10-31T17:06:54","modified_gmt":"2025-10-31T17:06:54","slug":"guida-per-sviluppatori-di-plug-in","status":"publish","type":"page","link":"https:\/\/wp-test-1.sweethome3d.eu\/it\/guida-per-sviluppatori-di-plug-in\/","title":{"rendered":"Guida per sviluppatori di plug-in"},"content":{"rendered":"<ul class=\"simpletoc-list\">\n<li><a href=\"#introduzione\">Introduzione<\/a>\n\n<\/li>\n<li><a href=\"#installazione-degli-strumenti-di-sviluppo\">Installazione degli strumenti di sviluppo<\/a>\n\n\n<\/li>\n\n<li><a href=\"#programmazione-di-un-plugin\">Programmazione di un plug-in<\/a>\n\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<li><a href=\"#andare-oltre\">Andare oltre<\/a>\n\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<\/li>\n<\/li>\n<\/ul>\n<\/li><\/ul><h2 class=\"wp-block-heading\" id=\"introduzione\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Introduzione<\/h2>\n<p>Dalla versione 1.5, \u00e8 possibile aggiungere nuove funzionalit\u00e0 a <a href=\"\/\">Sweet Home 3D<\/a> con file plug-in posizionati nella tua <a href=\"#deployingPlugin\">cartella dei plug-in<\/a>. Ci\u00f2 consente ai programmatori Java di sviluppare e distribuire nuove funzionalit\u00e0 per Sweet Home 3D senza modificare i file sorgente della versione corrente (il che \u00e8 positivo per la compatibilit\u00e0 verso l&#8217;alto) e senza fornire una versione completa del programma (il che \u00e8 positivo per le dimensioni della distribuzione).<br\/>Questo documento descrive gli <a href=\"#installingTools\" data-type=\"internal\" data-id=\"#installingTools\">strumenti<\/a> necessari per creare plug-in, quindi mostra come <a href=\"#programmingPlugin\">programmare un plug-in<\/a> che calcola il volume massimo dei mobili mobili aggiunti a una casa e, infine, fornisce alcune <a href=\"#goingFurther\">informazioni aggiuntive<\/a> che ti aiuteranno ad andare oltre. <\/p>\n<h2 class=\"wp-block-heading\" id=\"installazione-degli-strumenti-di-sviluppo\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Installazione degli strumenti di sviluppo<\/h2>\n<p>Se Sweet Home 3D si rivolge a un pubblico generico, lo sviluppo di plug-in richiede competenze speciali e dovresti sapere come programmare in <a href=\"https:\/\/java.sun.com\" target=\"_blank\" rel=\"noopener\">Java<\/a> con un IDE<a href=\"https:\/\/ant.apache.org\/\" target=\"_blank\" rel=\"noopener\"><\/a>, prima di andare oltre. Questa guida mostra come creare un plug-in con <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">Eclipse<\/a>, ma puoi usare l&#8217;IDE che preferisci o nessun IDE. <\/p>\n<h3 class=\"wp-block-heading\" id=\"scarica-e-installa-eclipse\">Scarica e installa Eclipse<\/h3>\n<p>Innanzitutto, scarica Eclipse da <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.eclipse.org\/<\/a>. La versione denominata <em>Eclipse IDE for Java Developers<\/em> \u00e8 sufficiente per sviluppare un plug-in, ma puoi scaricare qualsiasi versione per lo sviluppo Java. <br\/>Una volta scaricato, installare Eclipse \u00e8 molto semplice: basta decomprimere l&#8217;archivio che otterrai, aprire la cartella eclipse e, a seconda del sistema, eseguire il file denominato  <code>eclipse.exe<\/code>  (in Windows),  <code>eclipse.app<\/code>  (in Mac OS X) o  <code>eclipse<\/code>  (in Linux).<br\/>Al primo avvio, Eclipse ti chieder\u00e0 di scegliere una cartella <em>workspace<\/em>, dove verranno archiviati i progetti dei plug-in.<br\/>Una volta fatto, scegli <em>File &gt; Nuovo &gt; Progetto<\/em> dal menu per creare un nuovo progetto, seleziona <em>Java &gt; Progetto Java<\/em> nella procedura guidata <em>Nuovo progetto<\/em> che verr\u00e0 visualizzata, inserisci VolumePlugin come nome del progetto e fai clic sul pulsante <em>Fine<\/em>. Infine, chiudi la scheda <em>Benvenuto<\/em> per scoprire il tuo workspace come mostrato nella figura 1. <\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"388\" height=\"315\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipse.png\" alt=\"Guida per sviluppatori di plug-in\" class=\"wp-image-5073\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipse.png 388w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipse-360x292.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipse-160x130.png 160w\" sizes=\"auto, (max-width: 388px) 100vw, 388px\" \/><figcaption class=\"wp-element-caption\"><em>Figura 1. Workspace di Eclipse <\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"scarica-e-installa-la-libreria-sweet-home-3d\">Scarica e installa la libreria Sweet Home 3D<\/h3>\n<p>Lo sviluppo di un plug-in si basa su alcune classi di Sweet Home 3D che Eclipse deve conoscere per poter creare il tuo progetto. Il modo pi\u00f9 semplice per aggiungere le classi di Sweet Home 3D a Eclipse \u00e8 scaricare la versione eseguibile JAR di Sweet Home 3D disponibile all&#8217;indirizzo <a href=\"https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download\" target=\"_blank\" rel=\"noopener\">https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download<\/a>. Una volta scaricato, trascina il file SweetHome3D-7.5.jar sull&#8217;icona del progetto <em>VolumePlugin<\/em> nella vista <em>Esplora pacchetti<\/em> di Eclipse e scegli la voce <em>Percorso di build &gt; Aggiungi al percorso di build<\/em> nel menu contestuale del file SweetHome3D-7.5.jar, come mostrato nella figura 2.  <\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"452\" height=\"157\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/addToBuildPath.png\" alt=\"\" class=\"wp-image-5075\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/addToBuildPath.png 452w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/addToBuildPath-360x125.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/addToBuildPath-374x130.png 374w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/addToBuildPath-400x139.png 400w\" sizes=\"auto, (max-width: 452px) 100vw, 452px\" \/><figcaption class=\"wp-element-caption\"><em><em>Figura 2. Aggiunta di SweetHome3D-7.5.jar<br\/> al percorso di build <\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<p><\/p>\n<h2 class=\"wp-block-heading\" id=\"programmazione-di-un-plugin\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Programmazione di un plug-in<\/h2>\n<p>Ora che hai installato gli strumenti necessari, vediamo come puoi programmare il tuo primo plug-in per Sweet Home 3D.<\/p>\n<h3 class=\"wp-block-heading\" id=\"creazione-della-classe-plugin\">Creazione della classe plug-in<\/h3>\n<p>Innanzitutto, crea una nuova sottoclasse di com.eteks.sweethome3d.plugin.Plugin scegliendo la voce di menu <em>File &gt; Nuovo &gt; Classe<\/em> in Eclipse.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"418\" height=\"509\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newJavaClass.png\" alt=\"\" class=\"wp-image-5076\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newJavaClass.png 418w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newJavaClass-296x360.png 296w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newJavaClass-107x130.png 107w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newJavaClass-400x487.png 400w\" sizes=\"auto, (max-width: 418px) 100vw, 418px\" \/><figcaption class=\"wp-element-caption\"><em><em><em>Figura 3. Creazione di una nuova classe <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<p>Nella finestra di dialogo <em>Nuova classe Java<\/em>, inserisci VolumePlugin come nome della classe, inserisci un pacchetto (qui il pacchetto scelto \u00e8 stato com.eteks.test) e scegli com.eteks.sweethome3d.plugin.Plugin come superclasse di VolumePlugin. Una volta fatto, fai clic su <em>Fine<\/em>. Eclipse creer\u00e0 il file della nuova classe con il seguente contenuto:  <\/p>\n\n<pre class=\"wp-block-preformatted\">package com.eteks.test;<br\/>import com.eteks.sweethome3d.plugin.Plugin;<br\/>import com.eteks.sweethome3d.plugin.PluginAction;<br\/>public class <strong>VolumePlugin<\/strong> extends <strong>Plugin<\/strong> {<br\/> @Override<br\/> public PluginAction[] <strong>getActions<\/strong>() {<br\/> \/\/ TODO Auto-generated method stub<br\/> return null;<br\/> }<br\/>}<\/pre>\n\n<p>Come puoi intuire dal commento TODO, ora devi modificare l&#8217;implementazione del metodo getActions per restituire un&#8217;azione plug-in in grado di calcolare il volume dei mobili mobili. Sostituisci return null; con la seguente istruzione: <\/p>\n\n<pre class=\"wp-block-preformatted\">  return new <strong>PluginAction<\/strong> [] {new <strong>VolumeAction<\/strong>()};  <\/pre>\n\n<p>e scegli <em>Modifica &gt; Correzione rapida<\/em> dal menu di Eclipse per creare la classe mancante VolumeAction, come mostrato nella figura 4.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"615\" height=\"117\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/quickFix.png\" alt=\"\" class=\"wp-image-5077\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/quickFix.png 615w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/quickFix-360x68.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/quickFix-400x76.png 400w\" sizes=\"auto, (max-width: 615px) 100vw, 615px\" \/><figcaption class=\"wp-element-caption\"><em>Figura 4. Utilizzo della correzione rapida per generare una classe mancante <\/em><\/figcaption><\/figure>\n<\/div>\n<p>Nella finestra di dialogo <em>Nuova classe Java<\/em> che appare, seleziona la casella di controllo <em>Tipo contenitore<\/em> per creare una classe interna di VolumePlugin e fai clic su <em>Fine<\/em>. Questo creer\u00e0 la classe VolumeAction che eredita dalla classe com.eteks.sweethome3d.plugin.PluginAction e contiene un metodo execute vuoto: <\/p>\n\n<pre class=\"wp-block-preformatted\">  public class <strong>VolumeAction<\/strong> extends <strong>PluginAction<\/strong> {<br\/> @Override<br\/> public void <strong>execute<\/strong>() {<br\/> \/\/ TODO Auto-generated method stub<br\/> }<br\/> }<\/pre>\n\n<p>Questo metodo \u00e8 quello che Sweet Home 3D chiamer\u00e0 quando l&#8217;utente avvier\u00e0 l&#8217;azione del plug-in; quindi questo \u00e8 il punto in cui devi implementare come calcolare il volume dei mobili e visualizzarlo:<\/p>\n\n<pre class=\"wp-block-preformatted\">  public class <strong>VolumeAction<\/strong> extends <strong>PluginAction<\/strong> {  <br\/>  @Override<br\/>  public void <strong>execute<\/strong>() { <br\/>  float volumeInCm3 = 0;<br\/> \/\/ Calcola la somma del volume del bounding box di <br\/> \/\/ ogni mobile mobile in casa<br\/> for (PieceOfFurniture piece : <strong>getHome<\/strong>(). <g id=\"gid_1\">getFurniture<\/g>()) {<br\/> if (piece. <strong>isMovable<\/strong>()) {<br\/> volumeInCm3 += piece. <strong>getWidth<\/strong>() <br\/> * piece. <strong>getDepth<\/strong>() <br\/> * piece. <strong>getHeight<\/strong>();<br\/>  }<br\/> }<br\/>            <br\/> \/\/ Visualizza il risultato in una finestra di messaggio (\u00b3 \u00e8 per 3 in apice)<br\/> String message = String. <strong>format<\/strong>(<br\/> \"Il volume massimo dei mobili mobili in casa \u00e8 %.2f m\u00b3.\", <br\/> volumeInCm3 \/ 1000000);<br\/> JOptionPane. <strong>showMessageDialog<\/strong>(null, message);<br\/>  }<br\/>  }<\/pre>\n\n<p>Ora che hai specificato cosa vuoi che faccia il plug-in, devi descrivere come l&#8217;utente avvier\u00e0 questa nuova azione. Hai la possibilit\u00e0 di aggiungere una nuova <strong>voce di menu<\/strong> a un menu e\/o un nuovo <strong>pulsante<\/strong> alla barra degli strumenti. Questa scelta viene fatta impostando le propriet\u00e0 appropriate dell&#8217;azione del plug-in al momento della sua creazione. Ad esempio, se vuoi che gli utenti avviino l&#8217;azione del volume con la voce di menu <em>Calcola volume<\/em> che si trova nel menu <em>Strumenti<\/em>, aggiungerai il seguente costruttore alla classe VolumnAction:   <\/p>\n\n<pre class=\"wp-block-preformatted\">  public <strong>VolumeAction<\/strong>() {<br\/>           <strong>putPropertyValue<\/strong>(Property.NAME, \"Calcola volume\");<br\/>           <strong>putPropertyValue<\/strong>(Property.MENU, \"Strumenti\");<br\/> \/\/ Abilita l'azione per impostazione predefinita<br\/>           <strong>setEnabled<\/strong>(true);<br\/> }<\/pre>\n\n<p>La classe plug-in <a href=\"\/examples\/VolumePlugin\/VolumePlugin.java\">VolumePlugin<\/a> \u00e8 ora programmata e quasi pronta per funzionare come plug-in in Sweet Home 3D. Le ultime due cose da fare sono: <\/p>\n\n<ul class=\"wp-block-list\">\n<li>creare un file di descrizione <tt>ApplicationPlugin.properties<\/tt>,<\/li>\n\n\n\n<li>mettere insieme i file in un file JAR.<br\/><\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\" id=\"creazione-del-file-di-descrizione-del-plugin\">Creazione del file di descrizione del plug-in<\/h3>\n<p>Un file <tt>ApplicationPlugin.properties<\/tt>\n descrive il nome del plug-in, la sua classe, le versioni minime di Sweet Home 3D e Java sotto le quali \u00e8 supportato,\n e le questioni legali. Scegli <i>File &gt; Nuovo &gt; File<\/i> dal\n menu di Eclipse, inserisci il nome del file <tt>ApplicationPlugin.properties<\/tt> e fai clic su <i>Fine<\/i>, come mostrato\n nella figura 5. <\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"264\" height=\"384\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newFile.png\" alt=\"\" class=\"wp-image-5079\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newFile.png 264w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newFile-248x360.png 248w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newFile-89x130.png 89w\" sizes=\"auto, (max-width: 264px) 100vw, 264px\" \/><figcaption class=\"wp-element-caption\"><em>Figura 5. Creazione di un nuovo file <\/em><\/figcaption><\/figure>\n<\/div>\n<p>Quindi inserisci la <a href=\"\/examples\/VolumePlugin\/ApplicationPlugin.properties\">seguente descrizione<\/a> nel nuovo file e salvalo:<\/p>\n\n<pre class=\"wp-block-preformatted\"><strong>name<\/strong>=Volume dei mobili mobili<br\/><strong>class<\/strong>=com.eteks.test.VolumePlugin<br\/><strong>description<\/strong>=Calcola il volume dei mobili mobili in casa<br\/><strong>version<\/strong>=1.0<br\/><strong>license<\/strong>=GNU GPL<br\/><strong>provider<\/strong>=(C) Copyrights 2024 Space Mushrooms<br\/><strong>applicationMinimumVersion<\/strong>=1.5<br\/><strong>javaMinimumVersion<\/strong>=1.5<\/pre>\n<h3 class=\"wp-block-heading\" id=\"creazione-del-jar-del-plugin\">Creazione del JAR del plug-in<\/h3>\n<p>Il JAR del plug-in contiene i file <tt>class<\/tt> creati dalla compilazione del file <tt>VolumePlugin.java<\/tt>,\n e il file <tt>ApplicationPlugin.properties<\/tt>. Poich\u00e9 Eclipse compila un file Java non appena lo salvi, devi\n solo scegliere <i>File &gt; Esporta&#8230;<\/i> dal menu e selezionare <i>Java &gt; File JAR<\/i> nella finestra di dialogo <i>Esporta<\/i>\n che verr\u00e0 visualizzata. Nella procedura guidata <i>Esportazione JAR<\/i> che appare come mostrato nella figura 6, seleziona la casella di controllo del progetto\n e inserisci il percorso di un file JAR posizionato nella cartella dei plug-in di Sweet Home 3D. Questa cartella appropriata dipende\n dal tuo sistema come segue:   <\/p>\n\n<ul class=\"wp-block-list\">\n<li>  in Windows Vista \/ 7 \/ 8 \/ 10 \/ 11, questa cartella \u00e8 <tt>C:\\Users\\<i>utente<\/i>\\AppData\\Roaming\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li>  in Windows XP e versioni precedenti di Windows, questa cartella \u00e8 <tt>C:\\Documents and Settings\\<i>utente<\/i>\\Application Data\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li>  in macOS, \u00e8 la sottocartella <tt>Library\/Application Support\/eTeks\/Sweet Home 3D\/<\/tt><tt>plugins<\/tt> della tua\n cartella utente,<\/li>\n\n\n\n<li>  in Linux e altri Unix, \u00e8 la sottocartella <tt>.eteks\/sweethome3d\/<\/tt><tt>plugins<\/tt> della tua cartella utente.<\/li>\n<\/ul>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"499\" height=\"440\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/jarExport.png\" alt=\"\" class=\"wp-image-5081\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/jarExport.png 499w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/jarExport-360x317.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/jarExport-147x130.png 147w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/jarExport-400x353.png 400w\" sizes=\"auto, (max-width: 499px) 100vw, 499px\" \/><figcaption class=\"wp-element-caption\"><em><em>Figura 6. Esportazione in un file JAR <\/em><\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"test-del-plugin\">Test del plug-in<\/h3>\n<p>Il <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> che hai sviluppato verr\u00e0 eseguito in Sweet Home 3D, sia con la versione <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, la versione <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">programmi di installazione<\/a> o il file <a href=\"https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download\" target=\"_blank\" rel=\"noopener\">SweetHome3D-7.5.jar<\/a> che hai scaricato in precedenza. Poich\u00e9 quest&#8217;ultimo \u00e8 un JAR eseguibile, puoi eseguirlo facendo doppio clic su di esso o con il seguente comando: <\/p>\n\n<p>Il <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> che hai sviluppato verr\u00e0 eseguito in Sweet Home 3D, sia con la versione <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, la versione <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">programmi di installazione<\/a> o il file <a href=\"https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download\" target=\"_blank\" rel=\"noopener\">SweetHome3D-7.5.jar<\/a> che hai scaricato in precedenza. Poich\u00e9 quest&#8217;ultimo \u00e8 un JAR eseguibile, puoi eseguirlo facendo doppio clic su di esso o con il seguente comando: <\/p>\n\n<pre class=\"wp-block-preformatted\">java -jar \/<em>percorso<\/em>\/<em>a<\/em>\/SweetHome3D-7.5.jar<\/pre>\n\n<p>Finch\u00e9 stai testando, probabilmente preferirai eseguire Sweet Home 3D con questo comando, per poter leggere nella console la traccia dello stack delle eccezioni generate durante l&#8217;esecuzione del tuo plug-in.<\/p>\n\n<p>Una volta avviato Sweet Home 3D, vedrai apparire il nuovo menu e la sua voce come mostrato nella figura 7:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"447\" height=\"53\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginMenu.png\" alt=\"\" class=\"wp-image-5082\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginMenu.png 447w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginMenu-360x43.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginMenu-400x47.png 400w\" sizes=\"auto, (max-width: 447px) 100vw, 447px\" \/><figcaption class=\"wp-element-caption\"><em>Figura 7. Menu del plug-in <\/em><\/figcaption><\/figure>\n<\/div>\n<p>Se scegli la nuova voce di menu per l&#8217;<a href=\"\/examples\/userGuideExample.sh3d\">esempio di casa<\/a> creato nella <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/it\/guida-per-lutente-di-sweet-home-3d\/\" data-type=\"page\" data-id=\"424\">guida per l&#8217;utente<\/a>, otterrai il seguente risultato:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"448\" height=\"137\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginInAction.png\" alt=\"\" class=\"wp-image-5084\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginInAction.png 448w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginInAction-360x110.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginInAction-425x130.png 425w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginInAction-400x122.png 400w\" sizes=\"auto, (max-width: 448px) 100vw, 448px\" \/><figcaption class=\"wp-element-caption\"><em>Figura 8. Plug-in in azione <\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"debug-del-plugin\">Debug del plug-in<\/h3>\n<p>Se hai bisogno di eseguire il debug del tuo plug-in da Eclipse, crea una configurazione di debug seguendo questi passaggi:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>Scegli <i>Esegui &gt; Configurazioni di debug&#8230;<\/i> dal menu, seleziona la voce <i>Applicazione Java<\/i> nell&#8217;elenco delle configurazioni disponibili della\n <i>finestra di dialogo Configurazioni di debug<\/i>, fai clic sul pulsante <i>Nuovo<\/i> in alto a sinistra e inserisci un nome per la configurazione.<\/li>\n\n\n\n<li>Fai clic sul pulsante <i>Cerca&#8230;<\/i> a destra del campo di testo <i>Classe principale<\/i> e fai doppio clic sulla classe <i>SweetHome3DBootstrap<\/i><br\/> tra le classi proposte.<\/li>\n<\/ul>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"629\" height=\"390\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/debugConfiguration.png\" alt=\"\" class=\"wp-image-5085\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/debugConfiguration.png 629w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/debugConfiguration-360x223.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/debugConfiguration-210x130.png 210w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/debugConfiguration-400x248.png 400w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><figcaption class=\"wp-element-caption\"><em>Figura 9. Creazione di una configurazione di debug <\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>Fai clic sulla scheda <em>Classpath<\/em>, seleziona la sottovoce <em>VolumePlugin (classpath predefinito)<\/em> della voce <em>Voci utente<\/em> nell&#8217;elenco <em>Classpath<\/em> e fai clic sul pulsante <em>Rimuovi<\/em>.<\/li>\n\n\n\n<li>Fai clic sulla voce<em> Voci utente<\/em> nell&#8217;elenco <em>Classpath<\/em>, fai clic sul pulsante <em>Aggiungi JAR&#8230;<\/em>, seleziona la voce SweetHome3D-7.5.jar e conferma la tua scelta.<\/li>\n<\/ul>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"618\" height=\"482\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/classpathConfiguration.png\" alt=\"\" class=\"wp-image-5086\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/classpathConfiguration.png 618w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/classpathConfiguration-360x281.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/classpathConfiguration-167x130.png 167w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/classpathConfiguration-400x312.png 400w\" sizes=\"auto, (max-width: 618px) 100vw, 618px\" \/><figcaption class=\"wp-element-caption\"><em><em>Figura 10. Impostazione del classpath della configurazione di debug <\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>Seleziona la scheda <em>Origine<\/em>, fai clic sul pulsante <em>Aggiungi\u2026<\/em>, fai doppio clic sulla voce <em>Progetto Java<\/em> nella finestra di dialogo <em>Aggiungi origine<\/em>, seleziona la voce <em>VolumePlugin<\/em> nel popup <em>Selezione progetto<\/em> e conferma la tua scelta.<\/li>\n<\/ul>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"773\" height=\"549\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/sourcepathConfiguration.png\" alt=\"\" class=\"wp-image-5087\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/sourcepathConfiguration.png 773w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/sourcepathConfiguration-360x256.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/sourcepathConfiguration-183x130.png 183w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/sourcepathConfiguration-768x545.png 768w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/sourcepathConfiguration-400x284.png 400w\" sizes=\"auto, (max-width: 773px) 100vw, 773px\" \/><figcaption class=\"wp-element-caption\"><em><em><em>Figura 11. Impostazione del percorso di origine della configurazione di debug <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>Infine, fai clic sul pulsante <i>Debug<\/i> per avviare Sweet Home 3D in modalit\u00e0 di debug. Una volta che il programma \u00e8 in esecuzione, apri il file <tt>VolumePlugin.java<\/tt>,\n imposta un punto di interruzione nel metodo <i>execute<\/i> e scegli <i>Strumenti &gt; Calcola volume<\/i> dal menu di Sweet Home 3D. Eclipse si fermer\u00e0 sul punto di interruzione\n selezionato per consentirti di eseguire il programma passo dopo passo e ispezionare il valore delle variabili.  <\/li>\n<\/ul>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"601\" height=\"398\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipseDebug.png\" alt=\"\" class=\"wp-image-5088\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipseDebug.png 601w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipseDebug-360x238.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipseDebug-196x130.png 196w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipseDebug-400x265.png 400w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><figcaption class=\"wp-element-caption\"><em><em><em><em>Figura 12. Prospettiva di debug di Eclipse <\/em><\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-64989fb1 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"21\" height=\"21\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/09\/warning-1.gif\" alt=\"\" class=\"wp-image-4679\" style=\"width:21px\"\/><\/figure>\n\n\n\n<p>Ogni volta che modifichi il codice sorgente del tuo plug-in, non dimenticare di <a href=\"#creatingPluginJAR\">generare il JAR del plug-in<\/a> prima di avviare la configurazione di debug che hai creato. Per velocizzare il processo di esportazione JAR in Eclipse, vai al secondo passaggio della procedura guidata di esportazione JAR e seleziona l&#8217;opzione <em>Salva la descrizione di questo JAR nel workspace<\/em>. Questo aggiunger\u00e0 una nuova voce nel progetto con una voce di menu contestuale <em>Crea JAR<\/em>.  <\/p>\n<\/div>\n<h3 class=\"wp-block-heading\" id=\"distribuzione-del-plugin\">Distribuzione del plug-in<\/h3>\n<p>Una volta pronto, il tuo plug-in pu\u00f2 essere distribuito sul computer di altri utenti di Sweet Home 3D semplicemente copiandolo nella loro <a href=\"#creatingPluginJAR\">cartella dei plug-in<\/a>. Dalla versione 1.6, un file plug-in pu\u00f2 anche essere installato nella cartella dei plug-in di Sweet Home 3D facendo doppio clic su di esso, se la sua estensione \u00e8 SH3P (basta cambiare l&#8217;estensione del file da .zip a .sh3p). Se fare doppio clic su un file .sh3p non avvia Sweet Home 3D (molto probabilmente sotto Linux), puoi anche installare un plug-in con il seguente comando in una finestra di <em>Terminale<\/em> (dove    <code>SweetHome3D<\/code>  \u00e8 il nome del file eseguibile fornito con i programmi di installazione di Sweet Home 3D):<\/p>\n\n<pre class=\"wp-block-preformatted\"><em>\/percorso\/a\/<\/em>SweetHome3D <em>\/percorso\/a\/<\/em>plugin.sh3p<\/pre>\n\n<p>Per smettere di usare un plug-in, rimuovi il suo file dalla cartella dei plug-in e riavvia Sweet Home 3D.<\/p>\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-64989fb1 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"21\" height=\"21\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/09\/warning-1.gif\" alt=\"\" class=\"wp-image-4679\" style=\"width:21px\"\/><\/figure>\n\n\n\n<p>Se vuoi che il tuo plug-in sia in grado di funzionare con tutti i <a href=\"http:\/\/download\">programmi di installazione di Sweet Home 3D<\/a> disponibili su questo sito web, fai attenzione a mantenerlo conforme a Java 5, selezionando <code>1.5<\/code> nel campo <em>Livello di conformit\u00e0 del compilatore<\/em> disponibile nella sezione <em>Compilatore Java<\/em> della finestra di dialogo mostrata dalla voce di menu <em>Progetto &gt; Propriet\u00e0<\/em> di Eclipse.<br\/>Se usi una versione del compilatore Java in cui la compatibilit\u00e0 con Java 1.5 non \u00e8 pi\u00f9 disponibile, prova a puntare almeno a Java 1.8 ancora utilizzato nelle versioni recenti di Sweet Home 3D e imposta <code>javaMinimumVersion<\/code> nel file <code>ApplicationPlugin.properties<\/code> del tuo plug-in di conseguenza.<\/p>\n<\/div>\n<h2 class=\"wp-block-heading\" id=\"andare-oltre\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Andare oltre<\/h2>\n<p>La programmazione del primo plug-in ti ha mostrato il quadro generale. Ecco alcune informazioni aggiuntive che ti aiuteranno ad andare oltre. <\/p>\n<h3 class=\"wp-block-heading\" id=\"api-di-sweet-home-3d-javadoc\">API di Sweet Home 3D &#8211; javadoc<\/h3>\n<p>La documentazione pi\u00f9 utile per sviluppare un nuovo plug-in \u00e8 l&#8217;<a href=\"\/javadoc\/index.html\">API di Sweet Home 3D<\/a> (Application Programming Interface), generata con lo strumento javadoc.<br\/>Utilizza solo le classi dei pacchetti <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/package-summary.html\">com.eteks.sweethome3d.plugin<\/a>, <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/package-summary.html\">com.eteks.sweethome3d.model<\/a>, <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/package-summary.html\">com.eteks.sweethome3d.tools<\/a> e <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/viewcontroller\/package-summary.html\">com.eteks.sweethome3d.viewcontroller<\/a> nel tuo plug-in se vuoi che sia compatibile con le versioni future di Sweet Home 3D. Questo sar\u00e0 ampiamente sufficiente per programmare qualsiasi plug-in che funzioni sui dati della casa disponibili in Sweet Home 3D.<br\/>I pacchetti corrispondenti agli altri livelli del programma sono inclusi nella Javadoc a scopo puramente informativo. Non fare affidamento sulle loro API, poich\u00e9 potrebbero ancora cambiare in futuro senza alcuna garanzia di compatibilit\u00e0 con le versioni future (in ogni caso non vedrai alcun riferimento a una classe dei pacchetti <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/swing\/package-summary.html\">com.eteks.sweethome3d.swing<\/a>, <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/j3d\/package-summary.html\">com.eteks.sweethome3d.j3d<\/a>, <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/io\/package-summary.html\">com.eteks.sweethome3d.io<\/a> o <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/package-summary.html\">com.eteks.sweethome3d<\/a> nei pacchetti summenzionati).  <\/p>\n<h3 class=\"wp-block-heading\" id=\"architettura-delle-classi-del-modello\">Architettura delle classi del modello<\/h3>\n<p>Sweet Home 3D si basa su un&#8217;architettura MVC (Model View Controller), quindi \u00e8 essenziale capire come \u00e8 organizzato il suo livello Model. La figura 13 (disponibile anche in <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/modelClassesDiagram.png\">formato PDF<\/a>) presenta quasi tutte le classi e le interfacce disponibili nella versione 1.5 del pacchetto <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/package-summary.html\">com.eteks.sweethome3d.model<\/a> che corrisponde a questo livello Model. <\/p>\n\n\n<figure class=\"aligncenter size-full uml-diagram\" id=\"uml-model-classes-diagram\">\n\t<img decoding=\"async\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/themes\/sh3d\/assets\/img\/uml\/model-classes-diagram.png\" alt=\"UML Diagram model-classes-diagram\"\n\t\tusemap=\"#model-classes-diagram\">\n\n\t<map name=\"model-classes-diagram\">\n    <area shape=\"rect\" coords=\"30,583,205,681\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomePieceOfFurniture.html\">\n    <area shape=\"rect\" coords=\"227,595,390,638\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCatalog.html\">\n    <area shape=\"rect\" coords=\"410,594,574,635\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCatalog.html\">\n    <area shape=\"rect\" coords=\"227,667,391,720\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCategory.html\">\n    <area shape=\"rect\" coords=\"410,666,574,719\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCategory.html\">\n    <area shape=\"rect\" coords=\"30,14,236,122\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Selectable.html\">\n    <area shape=\"rect\" coords=\"266,14,410,115\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/DimensionLine.html\">\n    <area shape=\"rect\" coords=\"441,15,574,76\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Label.html\">\n    <area shape=\"rect\" coords=\"441,91,574,106\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/ObserverCamera.html\">\n    <area shape=\"rect\" coords=\"30,141,205,334\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Room.html\">\n    <area shape=\"rect\" coords=\"265,142,387,192\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextStyle.html\">\n    <area shape=\"rect\" coords=\"441,120,575,206\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Camera.html\">\n    <area shape=\"rect\" coords=\"226,243,460,379\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">\n    <area shape=\"rect\" coords=\"483,331,611,381\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionListener.html\">\n    <area shape=\"rect\" coords=\"483,397,611,449\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionEvent.html\">\n    <area shape=\"rect\" coords=\"30,357,107,371\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeTexture.html\">\n    <area shape=\"rect\" coords=\"30,393,204,565\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.Property.html\">\n    <area shape=\"rect\" coords=\"226,409,429,452\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeApplication.html\">\n    <area shape=\"rect\" coords=\"483,221,611,272\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionListener.html\">\n    <area shape=\"rect\" coords=\"483,286,611,315\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionEvent.html\">\n    <area shape=\"rect\" coords=\"227,477,429,566\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/UserPreferences.html\">\n    <area shape=\"rect\" coords=\"452,476,610,578\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/LengthUnit.html\">\n    <area shape=\"rect\" coords=\"30,702,205,858\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">\n    <area shape=\"rect\" coords=\"227,750,391,793\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogPieceOfFurniture.html\">\n    <area shape=\"rect\" coords=\"410,751,574,782\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogTexture.html\">\n    <area shape=\"rect\" coords=\"227,808,391,848\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Content.html\">\n    <area shape=\"rect\" coords=\"410,808,574,881\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextureImage.html\">\n<\/map>\n\t\t\t<figcaption class=\"wp-element-caption\">\n\t\t\t\t\t\t\t<em>Figure 13. UML diagram of com.eteks.sweethome3d.model package<\/em><br>\n\t\t\t\t\t\t\t\t\t\t<small><em>(click on a class to view its javadoc)<\/em><\/small>\n\t\t\t\t\t<\/figcaption>\n\t<\/figure>\n\n<p>La classe centrale nel livello Model \u00e8 la classe <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeApplication.html\">HomeApplication<\/a> (10), la superclasse astratta della classe principale dell&#8217;applicazione <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/SweetHome3D.html\">SweetHome3D<\/a>. L&#8217;istanza di questa classe d\u00e0 accesso alle istanze <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) attualmente modificate e all&#8217;oggetto <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/UserPreferences.html\">UserPreferences<\/a> (11) che memorizza l&#8217;<a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/LengthUnit.html\">unit\u00e0 di lunghezza<\/a> in uso (12), il <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCatalog.html\">catalogo di mobili<\/a> (14) e il <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCatalog.html\">catalogo di texture<\/a> (15) da cui l&#8217;utente sceglie <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogPieceOfFurniture.html\">pezzi di arredamento<\/a> (17) e <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogTexture.html\">texture<\/a> (18).<br\/>Un&#8217;istanza <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) memorizza tutti gli oggetti creati dall&#8217;utente nella planimetria della casa: <\/p>\n\n<ul class=\"wp-block-list\">\n<li>l&#8217;elenco degli oggetti <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomePieceOfFurniture.html\">HomePieceOfFurniture<\/a> (13) che implementano l&#8217;interfaccia <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">PieceOfFurniture<\/a> (16),<\/li>\n\n\n\n<li>la collezione di oggetti <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Wall<\/a> (9),<\/li>\n\n\n\n<li>l&#8217;elenco degli oggetti <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Room<\/a> (5),<\/li>\n\n\n\n<li>la collezione di oggetti <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/DimensionLine.html\">DimensionLine<\/a> (2),<\/li>\n\n\n\n<li>la collezione di oggetti <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Label.html\">Label<\/a> (3).<\/li>\n<\/ul>\n\n<p>Questi oggetti implementano l&#8217;interfaccia <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Selectable.html\">Selectable<\/a> (1) cos\u00ec come l&#8217;oggetto <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/ObserverCamera.html\">ObserverCamera<\/a> (4), che memorizza la posizione della telecamera nella modalit\u00e0 <em>Visitatore virtuale<\/em>. Tutte le informazioni esterne gestite dagli oggetti Model, come l&#8217;icona e il modello 3D di un <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">pezzo di arredamento<\/a> (16), o l&#8217;immagine di una <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextureImage.html\">texture<\/a> (20) sono accessibili tramite l&#8217;interfaccia <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Content.html\">Content<\/a> (19), implementata dalla classe <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/URLContent.html\">URLContent<\/a> e da altre classi del pacchetto <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/package-summary.html\">com.eteks.sweethome3d.tools<\/a>. <\/p>\n\n<p>Questo diagramma UML dovrebbe aiutarti a capire quali classi sono disponibili nel modello di Sweet Home 3D e come puoi accedervi, ma probabilmente noterai che non sono citati costruttori e mutatori (o setter, se preferisci). \u00c8 solo per mancanza di spazio, ma puoi usarli senza problemi in una classe plug-in. Nota anche che qualsiasi modifica di un oggetto esistente del modello verr\u00e0 notificata ai componenti visualizzati tramite <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/beans\/PropertyChangeEvent.html\" target=\"_blank\" rel=\"noopener\">PropertyChangeEvent<\/a>, <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionEvent.html\">CollectionEvent<\/a> (8) o <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionEvent.html\">SelectionEvent<\/a> (6), consentendo cos\u00ec che tutte le modifiche vengano riflesse immediatamente sullo schermo.  <\/p>\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-64989fb1 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"21\" height=\"21\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/09\/warning-1.gif\" alt=\"\" class=\"wp-image-4679\" style=\"width:21px\"\/><\/figure>\n\n\n\n<p>Il modello di Sweet Home 3D <strong>non \u00e8<\/strong> thread-safe per motivi di prestazioni. Tutte le <strong>modifiche<\/strong> di un oggetto appartenente al modello dovrebbero essere eseguite nel Thread di Dispatch degli Eventi. <\/p>\n<\/div>\n<h3 class=\"wp-block-heading\" id=\"architettura-delle-classi-dei-plugin\">Architettura delle classi dei plug-in<\/h3>\n<p>L&#8217;architettura delle classi dei plug-in \u00e8 molto pi\u00f9 semplice da capire rispetto a quella del livello Model. Il pacchetto <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/package-summary.html\">com.eteks.sweethome3d.plugin<\/a> contiene solo tre classi, tra le quali si suppone che tu debba usare solo le classi <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> e <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, come mostrato nella figura 14 (disponibile anche in <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginClassesDiagram.png\">formato PDF<\/a>). <\/p>\n\n\n<figure class=\"aligncenter size-full uml-diagram\" id=\"uml-plugin-classes-diagram\">\n\t<img decoding=\"async\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/themes\/sh3d\/assets\/img\/uml\/plugin-classes-diagram.png\" alt=\"UML Diagram plugin-classes-diagram\"\n\t\tusemap=\"#plugin-classes-diagram\">\n\n\t<map name=\"plugin-classes-diagram\">\n    <area shape=\"rect\" coords=\"10,9,256,92\" href=\"javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginManager.html\">\n    <area shape=\"rect\" coords=\"11,131,257,288\" href=\"javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">\n    <area shape=\"rect\" coords=\"453,8,574,118\" href=\"javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.Property.html\">\n    <area shape=\"rect\" coords=\"282,133,574,289\" href=\"javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">\n<\/map>\n\t\t\t<figcaption class=\"wp-element-caption\">\n\t\t\t\t\t\t\t<em>Figure 14. UML diagram of com.eteks.sweethome3d.plugin package<\/em><br>\n\t\t\t\t\t\t\t\t\t\t<small><em>(click on a class to view its javadoc)<\/em><\/small>\n\t\t\t\t\t<\/figcaption>\n\t<\/figure>\n\n<p>Un&#8217;istanza <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginManager.html\">PluginManager<\/a> (1) viene creata all&#8217;avvio dell&#8217;applicazione e cerca i plug-in installati nella <a href=\"#creating-the-plugin-jar\">cartella dei plug-in<\/a> dell&#8217;utente. Ogni volta che viene modificata una nuova casa, questo gestore istanzia e configura un oggetto <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> (3) per ogni plug-in trovato all&#8217;avvio. Quindi, chiama il metodo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getActions()\">getActions<\/a> per recuperare tutte le <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">azioni<\/a> (4) che verranno aggiunte come voci di menu e\/o pulsanti della barra degli strumenti nella finestra della casa. Ogni azione \u00e8 un&#8217;istanza di <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, che assomiglia alla classe <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/Action.html\" target=\"_blank\" rel=\"noopener\">Action<\/a>, con il suo metodo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#execute()\">execute<\/a> e le sue <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.Property.html\">propriet\u00e0<\/a> (2) modificabili.   <\/p>\n\n<p>Nota che la classe <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> ti d\u00e0 accesso a un&#8217;istanza <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEditSupport.html\" target=\"_blank\" rel=\"noopener\">UndoableEditSupport<\/a> tramite il suo metodo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getUndoableEditSupport()\">getUndoableEditSupport<\/a>. Non appena modifichi una casa o i suoi oggetti (mobili, pareti&#8230;) nel metodo execute di un&#8217;istanza <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, dovresti anche pubblicare un oggetto <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEdit.html\" target=\"_blank\" rel=\"noopener\">UndoableEdit<\/a> al supporto di modifica annullabile restituito dal metodo getUndoableEditSupport, altrimenti gli utenti non saranno in grado di annullare\/ripetere correttamente le modifiche che hai apportato. <\/p>\n<h3 class=\"wp-block-heading\" id=\"localizzazione\">Localizzazione<\/h3>\n<p>Se intendi sviluppare un plug-in per la community di utenti di Sweet Home 3D, prova a localizzare le stringhe che visualizza sia nel nome e nel menu delle azioni che nelle finestre di dialogo che creerai (o almeno preparane la localizzazione). Due <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#PluginAction(java.lang.String,%20java.lang.String,%20java.lang.ClassLoader)\">costruttori della classe PluginAction<\/a> ti aiuteranno a organizzare la traduzione delle propriet\u00e0 delle azioni con file .properties, e se hai bisogno di tradurre altre stringhe nel tuo plug-in (come quella nella finestra di dialogo mostrata dal <a href=\"#testing-the-plugin\">plug-in testato<\/a>) riutilizza questi file .properties con la classe Java <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/util\/ResourceBundle.html\" target=\"_blank\" rel=\"noopener\">ResourceBundle<\/a>.<br\/>Se preferisci limitare il numero di file di propriet\u00e0, potresti persino scrivere i valori delle propriet\u00e0 dell&#8217;azione e altre stringhe nel <a href=\"#creating-the-plugin-description-file\">file di descrizione<\/a> ApplicationPlugin.properties del tuo plug-in. <\/p>\n\n<p>Se vuoi un esempio che utilizzi questa architettura, scarica il plug-in <em>Esporta in SH3F<\/em> disponibile su <a href=\"\/storage\/plugins\/ExportToSH3F-1.0.sh3p\">https:\/\/www.sweethome3d.com\/plugins\/ExportToSH3F-1.0.sh3p<\/a>, e decomprimilo (questo file plug-in contiene anche il codice sorgente del plug-in).<br\/>Come descritto nel <a href=\"https:\/\/sourceforge.net\/forum\/message.php?msg_id=5837358\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">forum di aiuto<\/a>, questo plug-in crea un file SH3F che contiene tutti i mobili che hai importato nel catalogo di mobili di Sweet Home 3D.<\/p>\n<h3 class=\"wp-block-heading\" id=\"contribuire-con-i-plugin\">Contribuire con i plug-in<\/h3>\n<p>Puoi pubblicare i plug-in che hai programmato nel sistema di tracciamento <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/\" target=\"_blank\" rel=\"noopener\">Contributi Plug-in<\/a> per condividerli con la community di utenti di Sweet Home 3D.<br\/>Molte funzionalit\u00e0 possono essere aggiunte a Sweet Home 3D grazie ai plug-in, dagli importatori agli esportatori, ma anche plug-in in grado di modificare i dati di una casa come il <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/1\/\" target=\"_blank\" rel=\"noopener\">Plug-in Rotatore Casa<\/a> sviluppato da Michel Mbem e altri elencati nel <a href=\"\/storage\/pluginsUserGuide.pdf\">Tutorial per Plug-in ed Estensioni<\/a> (PDF) scritto da Hans Dirkse e nella pagina <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/it\/plugin-e-strumenti\/\" data-type=\"page\" data-id=\"437\">Plug-in e strumenti<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduzione Dalla versione 1.5, \u00e8 possibile aggiungere nuove funzionalit\u00e0 a Sweet Home 3D con file plug-in posizionati nella tua cartella dei plug-in. Ci\u00f2 consente ai programmatori Java di sviluppare e distribuire nuove funzionalit\u00e0 per Sweet Home 3D senza modificare i file sorgente della versione corrente (il che \u00e8 positivo per la compatibilit\u00e0 verso l&#8217;alto) e [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":10474,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-10502","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/it\/wp-json\/wp\/v2\/pages\/10502","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/it\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/it\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/it\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/it\/wp-json\/wp\/v2\/comments?post=10502"}],"version-history":[{"count":2,"href":"https:\/\/wp-test-1.sweethome3d.eu\/it\/wp-json\/wp\/v2\/pages\/10502\/revisions"}],"predecessor-version":[{"id":10748,"href":"https:\/\/wp-test-1.sweethome3d.eu\/it\/wp-json\/wp\/v2\/pages\/10502\/revisions\/10748"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/it\/wp-json\/wp\/v2\/media\/10474"}],"wp:attachment":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/it\/wp-json\/wp\/v2\/media?parent=10502"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}