{"id":10413,"date":"2025-10-01T14:53:41","date_gmt":"2025-10-01T14:53:41","guid":{"rendered":"https:\/\/wp-test-1.sweethome3d.eu\/plug-in-developers-guide\/"},"modified":"2025-10-31T16:17:21","modified_gmt":"2025-10-31T16:17:21","slug":"plug-in-developers-guide","status":"publish","type":"page","link":"https:\/\/wp-test-1.sweethome3d.eu\/fr\/plug-in-developers-guide\/","title":{"rendered":"Plug-in developer&rsquo;s guide"},"content":{"rendered":"<ul class=\"simpletoc-list\">\n<li><a href=\"#introduction\">Introduction<\/a>\n\n<\/li>\n<li><a href=\"#installation-des-outils-de-developpement\">Installation des outils de d\u00e9veloppement<\/a>\n\n\n<\/li>\n\n<li><a href=\"#programmer-un-plugin\">Programmer 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=\"#aller-plus-loin\">Aller plus loin<\/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=\"introduction\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Introduction<\/h2>\n<p>Depuis la version 1.5, il est possible d&rsquo;ajouter de nouvelles fonctionnalit\u00e9s \u00e0 <a href=\"\/\">Sweet Home 3D<\/a> avec des fichiers plug-ins plac\u00e9s dans ton <a href=\"#deployingPlugin\">dossier de plug-ins<\/a>. Cela permet aux programmeurs Java de d\u00e9velopper et distribuer de nouvelles fonctionnalit\u00e9s pour Sweet Home 3D sans modifier les fichiers sources de la version actuelle (ce qui est bon pour la compatibilit\u00e9 ascendante), et sans livrer une version compl\u00e8te du programme (ce qui est bon pour la taille de livraison).<br\/>Ce document d\u00e9crit les <a href=\"#installingTools\" data-type=\"internal\" data-id=\"#installingTools\">outils<\/a> n\u00e9cessaires pour cr\u00e9er des plug-ins, puis montre comment <a href=\"#programmingPlugin\">programmer un plug-in<\/a> qui calcule le volume maximum des meubles d\u00e9pla\u00e7ables ajout\u00e9s \u00e0 une maison, et donne enfin quelques <a href=\"#goingFurther\">informations suppl\u00e9mentaires<\/a> qui t&rsquo;aideront \u00e0 aller plus loin. <\/p>\n<h2 class=\"wp-block-heading\" id=\"installation-des-outils-de-developpement\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Installation des outils de d\u00e9veloppement<\/h2>\n<p>Si Sweet Home 3D cible un public g\u00e9n\u00e9ral, le d\u00e9veloppement de plug-ins n\u00e9cessite des comp\u00e9tences particuli\u00e8res, et tu dois savoir programmer en <a href=\"https:\/\/java.sun.com\" target=\"_blank\" rel=\"noopener\">Java<\/a> avec un IDE<a href=\"https:\/\/ant.apache.org\/\" target=\"_blank\" rel=\"noopener\"><\/a>, avant d&rsquo;aller plus loin. Ce guide montre comment construire un plug-in avec <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">Eclipse<\/a>, mais tu peux utiliser l&rsquo;IDE de ton choix, ou ne pas utiliser d&rsquo;IDE du tout. <\/p>\n<h3 class=\"wp-block-heading\" id=\"telecharger-et-installer-eclipse\">T\u00e9l\u00e9charger et installer Eclipse<\/h3>\n<p>Tout d&rsquo;abord, t\u00e9l\u00e9charge Eclipse depuis <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.eclipse.org\/<\/a>. La version nomm\u00e9e <em>Eclipse IDE for Java Developers<\/em> est suffisante pour d\u00e9velopper un plug-in, mais tu peux t\u00e9l\u00e9charger n&rsquo;importe quelle version pour le d\u00e9veloppement Java. <br\/>Une fois t\u00e9l\u00e9charg\u00e9, l&rsquo;installation d&rsquo;Eclipse est tr\u00e8s simple : d\u00e9compresse simplement l&rsquo;archive que tu obtiens, ouvre le dossier eclipse et selon ton syst\u00e8me, ex\u00e9cute le fichier nomm\u00e9  <code>eclipse.exe<\/code>  (sous Windows),  <code>eclipse.app<\/code>  (sous Mac OS X) ou  <code>eclipse<\/code>  (sous Linux).<br\/>Au premier lancement, Eclipse te demandera de choisir un dossier <em>workspace<\/em>, o\u00f9 seront stock\u00e9s les projets de plug-ins.<br\/>Une fois fait, choisis <em>File &gt; New &gt; Project<\/em> dans le menu pour cr\u00e9er un nouveau projet, s\u00e9lectionne <em>Java &gt; Java project<\/em> dans l&rsquo;assistant <em>New project<\/em> qui s&rsquo;affichera, entre VolumePlugin comme nom de projet et clique sur le bouton <em>Finish<\/em>. Enfin, ferme l&rsquo;onglet <em>Welcome<\/em> pour d\u00e9couvrir ton workspace comme montr\u00e9 dans la figure 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=\"Guide du d&#xE9;veloppeur de plug-ins\" 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>Figure 1. Espace de travail Eclipse <\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"telecharger-et-installer-la-bibliotheque-sweet-home-3d\">T\u00e9l\u00e9charger et installer la biblioth\u00e8que Sweet Home 3D<\/h3>\n<p>Le d\u00e9veloppement d&rsquo;un plug-in est bas\u00e9 sur certaines classes de Sweet Home 3D qu&rsquo;Eclipse doit conna\u00eetre pour pouvoir construire ton projet. La fa\u00e7on la plus simple d&rsquo;ajouter les classes de Sweet Home 3D \u00e0 Eclipse est de t\u00e9l\u00e9charger la version JAR ex\u00e9cutable de Sweet Home 3D disponible sur <g id=\"gid_0\">https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download<\/g>. Une fois t\u00e9l\u00e9charg\u00e9, fais glisser et d\u00e9pose le fichier SweetHome3D-7.5.jar sur l&rsquo;ic\u00f4ne du projet <em>VolumePlugin<\/em> dans la vue <em>Package Explorer<\/em> d&rsquo;Eclipse, et choisis l&rsquo;\u00e9l\u00e9ment <em>Build Path &gt; Add to Build Path<\/em> dans le menu contextuel du fichier SweetHome3D-7.5.jar, comme montr\u00e9 dans la figure 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>Figure 2. Ajout de SweetHome3D-7.5.jar<br\/> au Build Path <\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<p><\/p>\n<h2 class=\"wp-block-heading\" id=\"programmer-un-plugin\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Programmer un plug-in<\/h2>\n<p>Maintenant que tu as install\u00e9 les outils n\u00e9cessaires, voyons comment tu peux programmer ton premier plug-in pour Sweet Home 3D.<\/p>\n<h3 class=\"wp-block-heading\" id=\"creer-la-classe-du-plugin\">Cr\u00e9er la classe du plug-in<\/h3>\n<p>D&rsquo;abord, cr\u00e9e une nouvelle sous-classe de com.eteks.sweethome3d.plugin.Plugin en choisissant l&rsquo;\u00e9l\u00e9ment de menu <em>File &gt; New &gt; Class<\/em> dans 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>Figure 3. Cr\u00e9ation d&rsquo;une nouvelle classe <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<p>Dans la bo\u00eete de dialogue <em>New Java Class<\/em>, entre VolumePlugin comme nom de classe, entre un package (ici le package choisi \u00e9tait com.eteks.test), et choisis com.eteks.sweethome3d.plugin.Plugin comme super classe de VolumePlugin. Une fois fait, clique sur <em>Finish<\/em>. Eclipse cr\u00e9era le fichier de la nouvelle classe avec le contenu suivant :  <\/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>Comme tu peux le deviner \u00e0 partir du commentaire TODO, tu dois maintenant modifier l&rsquo;impl\u00e9mentation de la m\u00e9thode getActions pour retourner une action de plug-in capable de calculer le volume des meubles d\u00e9pla\u00e7ables. Remplace return null; par l&rsquo;instruction suivante : <\/p>\n\n<pre class=\"wp-block-preformatted\">  return new <strong>PluginAction<\/strong> [] {new <strong>VolumeAction<\/strong>()};  <\/pre>\n\n<p>et choisis <em>Edition &gt; Quick Fix<\/em> dans le menu d&rsquo;Eclipse pour cr\u00e9er la classe manquante VolumeAction, comme montr\u00e9 dans la figure 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>Figure 4. Utilisation de Quick fix pour g\u00e9n\u00e9rer une classe manquante <\/em><\/figcaption><\/figure>\n<\/div>\n<p>Dans la bo\u00eete de dialogue <em>New Java Class<\/em> qui appara\u00eet, coche la case <em>Enclosing type<\/em> pour cr\u00e9er une classe interne de VolumePlugin et clique sur <em>Finish<\/em>. Cela cr\u00e9era la classe VolumeAction qui h\u00e9rite de la classe com.eteks.sweethome3d.plugin.PluginAction et contient une m\u00e9thode execute vide : <\/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>Cette m\u00e9thode est celle que Sweet Home 3D appellera quand l&rsquo;utilisateur lancera l&rsquo;action du plug-in ; c&rsquo;est donc ici que tu dois impl\u00e9menter comment calculer le volume des meubles et l&rsquo;afficher :<\/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\/> \/\/ Calcule la somme du volume de la bo\u00eete englobante de <br\/> \/\/ chaque meuble d\u00e9pla\u00e7able dans la maison<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\/> \/\/ Affiche le r\u00e9sultat dans une bo\u00eete de message (\u00b3 est pour 3 en exposant)<br\/> String message = String. <g id=\"gid_0\">format<\/g>(<br\/> \"Le volume maximum des meubles d\u00e9pla\u00e7ables dans la maison est de %.2f m\u00b3.\", <br\/> volumeInCm3 \/ 1000000);<br\/> JOptionPane. <strong>showMessageDialog<\/strong>(null, message);<br\/>  }<br\/>  }<\/pre>\n\n<p>Maintenant que tu as sp\u00e9cifi\u00e9 ce que tu veux que le plug-in fasse, tu dois d\u00e9crire comment l&rsquo;utilisateur lancera cette nouvelle action. Tu as le choix entre ajouter un nouvel <strong>\u00e9l\u00e9ment de menu<\/strong> \u00e0 un menu, et\/ou un nouveau <strong>bouton<\/strong> \u00e0 la barre d&rsquo;outils. Ce choix se fait en d\u00e9finissant les propri\u00e9t\u00e9s appropri\u00e9es de l&rsquo;action du plug-in \u00e0 sa cr\u00e9ation. Par exemple, si tu veux que les utilisateurs lancent l&rsquo;action de volume avec l&rsquo;\u00e9l\u00e9ment de menu <em>Calculer le volume<\/em> trouv\u00e9 dans le menu <em>Outils<\/em>, tu ajouteras le constructeur suivant \u00e0 la classe VolumeAction :   <\/p>\n\n<pre class=\"wp-block-preformatted\">  public <strong>VolumeAction<\/strong>() {<br\/>           <strong>putPropertyValue<\/strong>(Property.NAME, \"Calculer le volume\");<br\/>           <strong>putPropertyValue<\/strong>(Property.MENU, \"Outils\");<br\/> \/\/ Active l'action par d\u00e9faut<br\/>           <strong>setEnabled<\/strong>(true);<br\/> }<\/pre>\n\n<p>La classe plug-in <a href=\"\/examples\/VolumePlugin\/VolumePlugin.java\">VolumePlugin<\/a> est maintenant programm\u00e9e, et presque pr\u00eate \u00e0 fonctionner comme un plug-in dans Sweet Home 3D. Les deux derni\u00e8res choses \u00e0 faire sont : <\/p>\n\n<ul class=\"wp-block-list\">\n<li>cr\u00e9er un fichier de description <tt>ApplicationPlugin.properties<\/tt>,<\/li>\n\n\n\n<li>rassembler les fichiers dans un fichier JAR.<br\/><\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\" id=\"creer-le-fichier-de-description-du-plugin\">Cr\u00e9er le fichier de description du plug-in<\/h3>\n<p>Un fichier <tt>ApplicationPlugin.properties<\/tt>\n d\u00e9crit le nom du plug-in, sa classe, les versions minimales de Sweet Home 3D et Java sous lesquelles il est support\u00e9,\n et les aspects l\u00e9gaux. Choisis <i>File &gt; New &gt; File<\/i> dans\n le menu d&rsquo;Eclipse, entre le nom de fichier <tt>ApplicationPlugin.properties<\/tt> et clique sur <i>Finish<\/i>, comme montr\u00e9\n dans la figure 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>Figure 5. Cr\u00e9ation d&rsquo;un nouveau fichier <\/em><\/figcaption><\/figure>\n<\/div>\n<p>Puis entre la <a href=\"\/examples\/VolumePlugin\/ApplicationPlugin.properties\">description suivante<\/a> dans le nouveau fichier et sauvegarde-le :<\/p>\n\n<pre class=\"wp-block-preformatted\"><strong>name<\/strong>=Volume des meubles d\u00e9pla\u00e7ables<br\/><strong>class<\/strong>=com.eteks.test.VolumePlugin<br\/><strong>description<\/strong>=Calcule le volume des meubles d\u00e9pla\u00e7ables dans la maison<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=\"creer-le-jar-du-plugin\">Cr\u00e9er le JAR du plug-in<\/h3>\n<p>Le JAR du plug-in contient les fichiers <tt>class<\/tt> cr\u00e9\u00e9s \u00e0 partir de la compilation du fichier <tt>VolumePlugin.java<\/tt>,\n et le fichier <tt>ApplicationPlugin.properties<\/tt>. Comme Eclipse compile un fichier Java d\u00e8s que tu le sauvegardes, tu\n dois simplement choisir <i>File &gt; Export&#8230;<\/i> dans le menu et s\u00e9lectionner <i>Java &gt; JAR file<\/i> dans la bo\u00eete de dialogue <i>Export<\/i>\n qui s&rsquo;affichera. Dans l&rsquo;assistant <i>Jar Export<\/i> qui appara\u00eet comme montr\u00e9 dans la figure 6, coche la case du projet\n et entre le chemin d&rsquo;un fichier JAR plac\u00e9 dans le dossier des plug-ins de Sweet Home 3D. Ce dossier appropri\u00e9 d\u00e9pend\n de ton syst\u00e8me comme suit :   <\/p>\n\n<ul class=\"wp-block-list\">\n<li>  sous Windows Vista \/ 7 \/ 8 \/ 10 \/ 11, ce dossier est <tt>C:Users<i>utilisateur<\/i>AppDataRoamingeTeksSweet\n Home 3Dplugins<\/tt>,<\/li>\n\n\n\n<li>  sous Windows XP et les versions pr\u00e9c\u00e9dentes de Windows, ce dossier est <tt>C:Documents and Settings<i>utilisateur<\/i>Application DataeTeksSweet\n Home 3Dplugins<\/tt>,<\/li>\n\n\n\n<li>  sous macOS, c&rsquo;est le sous-dossier <tt>Library\/Application Support\/eTeks\/Sweet Home 3D\/<\/tt><tt>plugins<\/tt> de ton\n dossier utilisateur,<\/li>\n\n\n\n<li>  sous Linux et autres Unix, c&rsquo;est le sous-dossier <tt>.eteks\/sweethome3d\/<\/tt><tt>plugins<\/tt> de ton dossier utilisateur.<\/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>Figure 6. Exportation vers un fichier JAR <\/em><\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"tester-le-plugin\">Tester le plug-in<\/h3>\n<p>Le <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> que tu as d\u00e9velopp\u00e9 fonctionnera dans Sweet Home 3D, soit avec la version <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, la version des <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">installeurs<\/a>, ou le <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> que tu as t\u00e9l\u00e9charg\u00e9 pr\u00e9c\u00e9demment. Comme ce dernier est un JAR ex\u00e9cutable, tu peux l&rsquo;ex\u00e9cuter en double-cliquant dessus ou avec la commande suivante : <\/p>\n\n<p>Le <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> que tu as d\u00e9velopp\u00e9 fonctionnera dans Sweet Home 3D, soit avec la version <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, la version des <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">installeurs<\/a>, ou le <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> que tu as t\u00e9l\u00e9charg\u00e9 pr\u00e9c\u00e9demment. Comme ce dernier est un JAR ex\u00e9cutable, tu peux l&rsquo;ex\u00e9cuter en double-cliquant dessus ou avec la commande suivante : <\/p>\n\n<pre class=\"wp-block-preformatted\">java -jar \/<em>chemin<\/em>\/<em>vers<\/em>\/SweetHome3D-7.5.jar<\/pre>\n\n<p>Tant que tu testes, tu pr\u00e9f\u00e9reras probablement ex\u00e9cuter Sweet Home 3D avec cette commande, pour pouvoir lire dans la console la trace des exceptions lanc\u00e9es pendant l&rsquo;ex\u00e9cution de ton plug-in.<\/p>\n\n<p>Une fois Sweet Home 3D lanc\u00e9, tu verras le nouveau menu et son \u00e9l\u00e9ment appara\u00eetre comme montr\u00e9 dans la figure 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>Figure 7. Menu du plug-in <\/em><\/figcaption><\/figure>\n<\/div>\n<p>Si tu choisis le nouvel \u00e9l\u00e9ment de menu pour <a href=\"\/examples\/userGuideExample.sh3d\">l&rsquo;exemple de maison<\/a> cr\u00e9\u00e9 dans le <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/fr\/guide-dutilisation-de-sweet-home-3d\/\" data-type=\"page\" data-id=\"424\">guide de l&rsquo;utilisateur<\/a>, tu obtiendras le r\u00e9sultat suivant :<\/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>Figure 8. Plug-in en action <\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"deboguer-le-plugin\">D\u00e9boguer le plug-in<\/h3>\n<p>Si tu dois d\u00e9boguer ton plug-in depuis Eclipse, cr\u00e9e une configuration de d\u00e9bogage en suivant ces \u00e9tapes :<\/p>\n\n<ul class=\"wp-block-list\">\n<li>Choisis <i>Run &gt; Debug Configurations&#8230;<\/i> dans le menu, s\u00e9lectionne l&rsquo;\u00e9l\u00e9ment <i>Java Application<\/i> dans la liste des configurations disponibles de la bo\u00eete de dialogue \n          <i>Debug configurations<\/i>, clique sur le bouton <i>New <\/i>en haut \u00e0 gauche et entre un nom pour la configuration.<\/li>\n\n\n\n<li>Clique sur le bouton <i>Search&#8230;<\/i> \u00e0 droite du champ de texte <i>Main class<\/i> et double-clique sur la classe <i>SweetHome3DBootstrap<\/i> <br\/> parmi les classes propos\u00e9es.<\/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>Figure 9. Cr\u00e9ation d&rsquo;une configuration de d\u00e9bogage <\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>Clique sur l&rsquo;onglet <em>Classpath<\/em>, s\u00e9lectionne le sous-\u00e9l\u00e9ment <em>VolumePlugin (default classpath)<\/em> de l&rsquo;\u00e9l\u00e9ment <em>User Entries<\/em> dans la liste <em>Classpath<\/em> et clique sur le bouton <em>Remove<\/em>.<\/li>\n\n\n\n<li>Clique sur l&rsquo;\u00e9l\u00e9ment<em> User Entries<\/em> dans la liste <em>Classpath<\/em>, clique sur le bouton <em>Add JARs&#8230;<\/em>, s\u00e9lectionne l&rsquo;\u00e9l\u00e9ment SweetHome3D-7.5.jar et confirme ton choix.<\/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>Figure 10. Configuration du classpath de la configuration de d\u00e9bogage <\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>S\u00e9lectionne l&rsquo;onglet <em>Source<\/em>, clique sur le bouton <em>Add\u2026<\/em>, double-clique sur l&rsquo;\u00e9l\u00e9ment <em>Java Project<\/em> dans la bo\u00eete de dialogue <em>Add Source<\/em>, s\u00e9lectionne l&rsquo;\u00e9l\u00e9ment <em>VolumePlugin<\/em> dans la popup <em>Project Selection<\/em> et confirme ton choix.<\/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>Figure 11. Configuration du chemin source de la configuration de d\u00e9bogage <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>Enfin, clique sur le bouton <i>Debug<\/i> pour lancer Sweet Home 3D en mode d\u00e9bogage. Une fois le programme en cours d&rsquo;ex\u00e9cution, ouvre le fichier <tt>VolumePlugin.java<\/tt>, \n place un point d&rsquo;arr\u00eat dans la m\u00e9thode <i>execute<\/i> et choisis <i>Outils &gt; Calculer le volume<\/i> dans le menu de Sweet Home 3D. Eclipse s&rsquo;arr\u00eatera sur le point d&rsquo;arr\u00eat\n s\u00e9lectionn\u00e9 pour te permettre d&rsquo;ex\u00e9cuter le programme pas \u00e0 pas et d&rsquo;inspecter la valeur des variables.  <\/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>Figure 12. Perspective de d\u00e9bogage 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>Chaque fois que tu modifies le code source de ton plug-in, n&rsquo;oublie pas de <a href=\"#creatingPluginJAR\">g\u00e9n\u00e9rer le JAR du plug-in<\/a> avant de lancer la configuration de d\u00e9bogage que tu as cr\u00e9\u00e9e. Pour acc\u00e9l\u00e9rer le processus d&rsquo;exportation JAR dans Eclipse, va \u00e0 la deuxi\u00e8me \u00e9tape de l&rsquo;assistant d&rsquo;exportation JAR et s\u00e9lectionne l&rsquo;option <em>Save the description of this JAR in the workspace<\/em>. Cela ajoutera un nouvel \u00e9l\u00e9ment dans le projet avec un \u00e9l\u00e9ment de menu contextuel <em>Create JAR<\/em>.  <\/p>\n<\/div>\n<h3 class=\"wp-block-heading\" id=\"deployer-le-plugin\">D\u00e9ployer le plug-in<\/h3>\n<p>Une fois pr\u00eat, ton plug-in peut \u00eatre d\u00e9ploy\u00e9 sur l&rsquo;ordinateur d&rsquo;autres utilisateurs de Sweet Home 3D en le copiant simplement dans leur <a href=\"#creatingPluginJAR\">dossier de plug-ins<\/a>. \u00c0 partir de la version 1.6, un fichier plug-in peut aussi \u00eatre install\u00e9 dans le dossier de plug-ins de Sweet Home 3D en double-cliquant dessus, si son extension est SH3P (change simplement l&rsquo;extension du fichier de .zip \u00e0 .sh3p). Si double-cliquer sur un fichier .sh3p ne lance pas Sweet Home 3D (plus de chances sous Linux), tu peux aussi installer un plug-in avec la commande suivante dans une fen\u00eatre <em>Terminal<\/em> (o\u00f9    <code>SweetHome3D<\/code>  est le nom du fichier ex\u00e9cutable fourni avec les installeurs Sweet Home 3D) :<\/p>\n\n<pre class=\"wp-block-preformatted\"><em>\/chemin\/vers\/<\/em>SweetHome3D <em>\/chemin\/vers\/<\/em>plugin.sh3p<\/pre>\n\n<p>Pour arr\u00eater d&rsquo;utiliser un plug-in, retire son fichier du dossier de plug-ins et relance 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>Si tu veux que ton plug-in puisse fonctionner avec tous les <a href=\"http:\/\/download\">installeurs Sweet Home 3D<\/a> disponibles sur ce site web, prends soin de le garder compatible avec Java 5, en s\u00e9lectionnant <code>1.5<\/code> dans le champ <em>Compiler compliance level<\/em> disponible dans la section <em>Java Compiler<\/em> de la bo\u00eete de dialogue affich\u00e9e par l&rsquo;\u00e9l\u00e9ment de menu <em>Project &gt; Properties<\/em> d&rsquo;Eclipse.<br\/>Si tu utilises une version du compilateur Java o\u00f9 la compatibilit\u00e9 Java 1.5 n&rsquo;est plus disponible, essaie de cibler au moins Java 1.8 toujours utilis\u00e9 dans les versions r\u00e9centes de Sweet Home 3D et d\u00e9finis <code>javaMinimumVersion<\/code> dans le fichier <code>ApplicationPlugin.properties<\/code> de ton plug-in en cons\u00e9quence.<\/p>\n<\/div>\n<h2 class=\"wp-block-heading\" id=\"aller-plus-loin\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Aller plus loin<\/h2>\n<p>La programmation du premier plug-in t&rsquo;a donn\u00e9 une vue d&rsquo;ensemble. Voici des informations suppl\u00e9mentaires qui t&rsquo;aideront \u00e0 aller plus loin. <\/p>\n<h3 class=\"wp-block-heading\" id=\"api-sweet-home-3d-javadoc\">API Sweet Home 3D &#8211; javadoc<\/h3>\n<p>La documentation la plus utile pour d\u00e9velopper un nouveau plug-in est l&rsquo;<a href=\"\/javadoc\/index.html\">API Sweet Home 3D<\/a> (Interface de Programmation d&rsquo;Application), g\u00e9n\u00e9r\u00e9e avec l&rsquo;outil javadoc.<br\/>Utilise uniquement les classes des packages <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> et <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/viewcontroller\/package-summary.html\">com.eteks.sweethome3d.viewcontroller<\/a> dans ton plug-in si tu veux qu&rsquo;il soit compatible avec les futures versions de Sweet Home 3D. Ce sera largement suffisant pour programmer n&rsquo;importe quel plug-in qui travaille sur les donn\u00e9es du logement disponibles dans Sweet Home 3D.<br\/>Les packages correspondant aux autres couches du programme sont inclus dans la Javadoc \u00e0 titre informatif uniquement. Ne te fie pas \u00e0 leur API, car elle pourrait encore changer \u00e0 l&rsquo;avenir sans garantie de compatibilit\u00e9 ascendante (de toute fa\u00e7on, tu ne verras aucune r\u00e9f\u00e9rence \u00e0 une classe des packages <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> ou <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/package-summary.html\">com.eteks.sweethome3d<\/a> dans les packages mentionn\u00e9s pr\u00e9c\u00e9demment).  <\/p>\n<h3 class=\"wp-block-heading\" id=\"architecture-des-classes-du-modele\">Architecture des classes du mod\u00e8le<\/h3>\n<p>Sweet Home 3D est bas\u00e9 sur une architecture MVC (Mod\u00e8le Vue Contr\u00f4leur), donc comprendre comment est organis\u00e9e sa couche Mod\u00e8le est essentiel. La figure 13 (\u00e9galement disponible au <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/modelClassesDiagram.png\">format PDF<\/a>) pr\u00e9sente presque toutes les classes et interfaces disponibles dans la version 1.5 du package <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/package-summary.html\">com.eteks.sweethome3d.model<\/a> qui correspond \u00e0 cette couche Mod\u00e8le. <\/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 de la couche Mod\u00e8le est la classe <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeApplication.html\">HomeApplication<\/a> (10), la super classe abstraite de la classe principale de l&rsquo;application <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/SweetHome3D.html\">SweetHome3D<\/a>. L&rsquo;instance de cette classe donne acc\u00e8s aux instances de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) actuellement \u00e9dit\u00e9es, et \u00e0 l&rsquo;objet <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/UserPreferences.html\">UserPreferences<\/a> (11) qui stocke l&rsquo;<a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/LengthUnit.html\">unit\u00e9 de longueur<\/a> utilis\u00e9e (12), le <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCatalog.html\">catalogue de meubles<\/a> (14) et le <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCatalog.html\">catalogue de textures<\/a> (15) \u00e0 partir desquels l&rsquo;utilisateur choisit les <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogPieceOfFurniture.html\">meubles<\/a> (17) et les <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogTexture.html\">textures<\/a> (18).<br\/>Une instance de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) stocke tous les objets que l&rsquo;utilisateur a cr\u00e9\u00e9s dans le plan de la maison : <\/p>\n\n<ul class=\"wp-block-list\">\n<li>la liste des objets <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomePieceOfFurniture.html\">HomePieceOfFurniture<\/a> (13) qui impl\u00e9mentent l&rsquo;interface <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">PieceOfFurniture<\/a> (16),<\/li>\n\n\n\n<li>la collection d&rsquo;objets <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Wall<\/a> (9),<\/li>\n\n\n\n<li>la liste d&rsquo;objets <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Room<\/a> (5),<\/li>\n\n\n\n<li>la collection d&rsquo;objets <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/DimensionLine.html\">DimensionLine<\/a> (2),<\/li>\n\n\n\n<li>la collection d&rsquo;objets <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Label.html\">Label<\/a> (3).<\/li>\n<\/ul>\n\n<p>Ces objets impl\u00e9mentent l&rsquo;interface <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Selectable.html\">Selectable<\/a> (1) ainsi que l&rsquo;objet <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/ObserverCamera.html\">ObserverCamera<\/a> (4), qui stocke l&#8217;emplacement de la cam\u00e9ra en mode <em>Visiteur virtuel<\/em>. Toutes les informations externes g\u00e9r\u00e9es par les objets du Mod\u00e8le, comme l&rsquo;ic\u00f4ne et le mod\u00e8le 3D d&rsquo;un <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">meuble<\/a> (16), ou l&rsquo;image d&rsquo;une <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextureImage.html\">texture<\/a> (20) sont accessibles via l&rsquo;interface <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Content.html\">Content<\/a> (19), impl\u00e9ment\u00e9e par la classe <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/URLContent.html\">URLContent<\/a> et d&rsquo;autres classes du package <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/package-summary.html\">com.eteks.sweethome3d.tools<\/a>. <\/p>\n\n<p>Ce diagramme UML devrait t&rsquo;aider \u00e0 comprendre quelles classes sont disponibles dans le mod\u00e8le Sweet Home 3D et comment tu peux y acc\u00e9der, mais tu remarqueras probablement qu&rsquo;aucun constructeur ni mutateur (ou setter si tu pr\u00e9f\u00e8res) n&rsquo;y est cit\u00e9. C&rsquo;est juste par manque de place mais tu peux les utiliser sans probl\u00e8me dans une classe de plug-in. Note aussi que toute modification d&rsquo;un objet existant du mod\u00e8le sera notifi\u00e9e aux composants affich\u00e9s soit avec des <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/beans\/PropertyChangeEvent.html\" target=\"_blank\" rel=\"noopener\">PropertyChangeEvent<\/a>s, des <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionEvent.html\">CollectionEvent<\/a>s (8) ou des <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionEvent.html\">SelectionEvent<\/a>s (6), permettant ainsi que tous les changements soient imm\u00e9diatement refl\u00e9t\u00e9s \u00e0 l&rsquo;\u00e9cran.  <\/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>Le mod\u00e8le Sweet Home 3D <strong>n&rsquo;est pas<\/strong> thread-safe pour des raisons de performance. Toutes les <strong>modifications<\/strong> d&rsquo;un objet appartenant au mod\u00e8le doivent \u00eatre effectu\u00e9es dans l&rsquo;Event Dispatch Thread. <\/p>\n<\/div>\n<h3 class=\"wp-block-heading\" id=\"architecture-des-classes-de-plugin\">Architecture des classes de plug-in<\/h3>\n<p>L&rsquo;architecture des classes de plug-in est beaucoup plus simple \u00e0 comprendre que celle de la couche Mod\u00e8le. Le package <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/package-summary.html\">com.eteks.sweethome3d.plugin<\/a> contient seulement trois classes parmi lesquelles tu es suppos\u00e9 utiliser uniquement les classes <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> et <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, comme montr\u00e9 dans la figure 14 (\u00e9galement disponible au <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginClassesDiagram.png\">format 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>Une instance de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginManager.html\">PluginManager<\/a> (1) est cr\u00e9\u00e9e au lancement de l&rsquo;application et recherche les plug-ins install\u00e9s dans le <a href=\"#creating-the-plugin-jar\">dossier des plug-ins<\/a> de l&rsquo;utilisateur. Chaque fois qu&rsquo;un nouveau logement est \u00e9dit\u00e9, ce gestionnaire instancie et configure un objet <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> (3) pour chaque plug-in trouv\u00e9 au moment du lancement. Ensuite, il appelle la m\u00e9thode <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getActions()\">getActions<\/a> pour r\u00e9cup\u00e9rer toutes les <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">actions<\/a> (4) qui seront ajout\u00e9es comme \u00e9l\u00e9ments de menu et\/ou boutons de barre d&rsquo;outils dans la fen\u00eatre du logement. Chaque action est une instance de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, qui ressemble \u00e0 la classe <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/Action.html\" target=\"_blank\" rel=\"noopener\">Action<\/a>, avec sa m\u00e9thode <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#execute()\">execute<\/a> et ses <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.Property.html\">propri\u00e9t\u00e9s<\/a> modifiables (2).   <\/p>\n\n<p>Note que la classe <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> te donne acc\u00e8s \u00e0 une instance d&rsquo;<a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEditSupport.html\" target=\"_blank\" rel=\"noopener\">UndoableEditSupport<\/a> via sa m\u00e9thode <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getUndoableEditSupport()\">getUndoableEditSupport<\/a>. D\u00e8s que tu modifies un logement ou ses objets (meubles, murs&#8230;) dans la m\u00e9thode execute d&rsquo;une instance de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, tu dois aussi poster un objet <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEdit.html\" target=\"_blank\" rel=\"noopener\">UndoableEdit<\/a> au support d&rsquo;\u00e9dition annulable retourn\u00e9 par la m\u00e9thode getUndoableEditSupport, sinon les utilisateurs ne pourront pas annuler\/r\u00e9tablir correctement les changements que tu as effectu\u00e9s. <\/p>\n<h3 class=\"wp-block-heading\" id=\"localisation\">Localisation<\/h3>\n<p>Si tu pr\u00e9vois de d\u00e9velopper un plug-in pour la communaut\u00e9 d&rsquo;utilisateurs de Sweet Home 3D, essaie de localiser les cha\u00eenes qu&rsquo;il affiche, que ce soit dans le nom des actions et menus ou dans les bo\u00eetes de dialogue que tu cr\u00e9eras (ou au moins pr\u00e9pare sa localisation). Deux <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#PluginAction(java.lang.String,%20java.lang.String,%20java.lang.ClassLoader)\">constructeurs de la classe PluginAction<\/a> t&rsquo;aideront \u00e0 organiser la traduction des propri\u00e9t\u00e9s des actions avec des fichiers .properties, et si tu as besoin de traduire d&rsquo;autres cha\u00eenes dans ton plug-in (comme celle dans la bo\u00eete de dialogue affich\u00e9e par le <a href=\"#testing-the-plugin\">plug-in test\u00e9<\/a>) r\u00e9utilise ces fichiers .properties avec 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\/>Si tu pr\u00e9f\u00e8res limiter le nombre de fichiers properties, tu peux m\u00eame \u00e9crire les valeurs des propri\u00e9t\u00e9s d&rsquo;action et d&rsquo;autres cha\u00eenes dans le <a href=\"#creating-the-plugin-description-file\">fichier de description<\/a> ApplicationPlugin.properties de ton plug-in. <\/p>\n\n<p>Si tu veux un exemple qui utilise cette architecture, t\u00e9l\u00e9charge le plug-in <em>Export to SH3F<\/em> disponible sur <a href=\"\/storage\/plugins\/ExportToSH3F-1.0.sh3p\">https:\/\/www.sweethome3d.com\/plugins\/ExportToSH3F-1.0.sh3p<\/a>, et d\u00e9compresse-le (ce fichier de plug-in contient aussi le code source du plug-in).<br\/>Comme d\u00e9crit dans le <a href=\"https:\/\/sourceforge.net\/forum\/message.php?msg_id=5837358\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">forum d&rsquo;aide<\/a>, ce plug-in cr\u00e9e un fichier SH3F qui contient tous les meubles que tu as import\u00e9s dans le catalogue de meubles de Sweet Home 3D.<\/p>\n<h3 class=\"wp-block-heading\" id=\"contribution-de-plugins\">Contribution de plug-ins<\/h3>\n<p>Tu peux poster les plug-ins que tu as programm\u00e9s dans le syst\u00e8me de suivi des <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/\" target=\"_blank\" rel=\"noopener\">Contributions de Plug-ins<\/a> pour les partager avec la communaut\u00e9 d&rsquo;utilisateurs de Sweet Home 3D.<br\/>De nombreuses fonctionnalit\u00e9s peuvent \u00eatre ajout\u00e9es \u00e0 Sweet Home 3D gr\u00e2ce aux plug-ins, des importateurs aux exportateurs, mais aussi des plug-ins capables de modifier les donn\u00e9es d&rsquo;un logement comme le <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/1\/\" target=\"_blank\" rel=\"noopener\">Plug-in Home Rotator<\/a> d\u00e9velopp\u00e9 par Michel Mbem et d&rsquo;autres list\u00e9s dans le <a href=\"\/storage\/pluginsUserGuide.pdf\">Tutoriel pour les Plug-ins et Extensions<\/a> (PDF) \u00e9crit par Hans Dirkse et dans la page <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/fr\/plugins-et-outils\/\" data-type=\"page\" data-id=\"437\">Plug-ins et outils<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Depuis la version 1.5, il est possible d&rsquo;ajouter de nouvelles fonctionnalit\u00e9s \u00e0 Sweet Home 3D avec des fichiers plug-ins plac\u00e9s dans ton dossier de plug-ins. Cela permet aux programmeurs Java de d\u00e9velopper et distribuer de nouvelles fonctionnalit\u00e9s pour Sweet Home 3D sans modifier les fichiers sources de la version actuelle (ce qui est bon [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":10399,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-10413","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/fr\/wp-json\/wp\/v2\/pages\/10413","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/fr\/wp-json\/wp\/v2\/comments?post=10413"}],"version-history":[{"count":2,"href":"https:\/\/wp-test-1.sweethome3d.eu\/fr\/wp-json\/wp\/v2\/pages\/10413\/revisions"}],"predecessor-version":[{"id":10720,"href":"https:\/\/wp-test-1.sweethome3d.eu\/fr\/wp-json\/wp\/v2\/pages\/10413\/revisions\/10720"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/fr\/wp-json\/wp\/v2\/media\/10399"}],"wp:attachment":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/fr\/wp-json\/wp\/v2\/media?parent=10413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}