{"id":11559,"date":"2025-11-05T16:28:15","date_gmt":"2025-11-05T16:28:15","guid":{"rendered":"https:\/\/www.sweethome3d.com\/guide-du-developpeur-de-plug-in\/"},"modified":"2025-12-19T10:19:35","modified_gmt":"2025-12-19T10:19:35","slug":"guide-du-developpeur-de-plug-in","status":"publish","type":"page","link":"https:\/\/www.sweethome3d.com\/fr\/guide-du-developpeur-de-plug-in\/","title":{"rendered":"Guide du d\u00e9veloppeur de plug-in"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n<p>\u00c0 partir de la version 1.5, il est possible d&rsquo;ajouter de nouvelles fonctionnalit\u00e9s \u00e0 <a href=\"\/\">Sweet Home 3D<\/a> avec des fichiers de plug-in plac\u00e9s dans votre <a href=\"#deployingPlugin\">dossier de plug-ins<\/a>. Cela permet aux programmeurs Java de d\u00e9velopper et de distribuer de nouvelles fonctionnalit\u00e9s pour <a href=\"https:\/\/www.sweethome3d.com\/fr\/\">Sweet Home 3D<\/a> sans modifier les fichiers source de la version actuelle (ce qui est bon pour la compatibilit\u00e9 ascendante), et sans fournir une version compl\u00e8te du programme (ce qui est bon pour la taille de la distribution).<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 maximal des meubles mobiles ajout\u00e9s \u00e0 une maison, et enfin donne quelques <a href=\"#goingFurther\">informations suppl\u00e9mentaires<\/a> qui vous aideront \u00e0 aller plus loin. <\/p>\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n<h2 class=\"wp-block-heading\" id=\"installingTools\">Installation des outils de d\u00e9veloppement<\/h2>\n\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 vous devriez savoir comment 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 vous pouvez utiliser l&rsquo;IDE de votre choix, ou pas d&rsquo;IDE du tout. <\/p>\n\n<h3 class=\"wp-block-heading\">T\u00e9l\u00e9charger et installer Eclipse<\/h3>\n\n<p>T\u00e9l\u00e9chargez d&rsquo;abord 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 vous pouvez 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\u00a0: d\u00e9compressez simplement l&rsquo;archive que vous obtiendrez, ouvrez le dossier eclipse et, selon votre syst\u00e8me, ex\u00e9cutez 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\/>Lors de la premi\u00e8re ex\u00e9cution, Eclipse vous demandera de choisir un dossier <em>workspace<\/em>, o\u00f9 seront stock\u00e9s les projets de plug-in.<br\/>Une fois cela fait, choisissez <em>Fichier &gt; Nouveau &gt; Projet<\/em> dans le menu pour cr\u00e9er un nouveau projet, s\u00e9lectionnez <em>Java &gt; Projet Java<\/em> dans l&rsquo;assistant <em>Nouveau projet<\/em> qui s&rsquo;affichera, entrez VolumePlugin comme nom de projet et cliquez sur le bouton <em>Terminer<\/em>. Enfin, fermez l&rsquo;onglet <em>Bienvenue<\/em> pour d\u00e9couvrir votre espace de travail comme indiqu\u00e9 sur la figure\u00a01. <\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"388\" height=\"315\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipse.png\" alt=\"\" class=\"wp-image-5845 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipse.png 388w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipse-300x244.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipse-111x90.png 111w\" data-sizes=\"(max-width: 388px) 100vw, 388px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 388px; --smush-placeholder-aspect-ratio: 388\/315;\" \/><figcaption class=\"wp-element-caption\">Figure\u00a01. Espace de travail Eclipse <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">T\u00e9l\u00e9charger et installer la biblioth\u00e8que Sweet Home 3D<\/h3>\n\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 votre projet. La fa\u00e7on la plus simple d&rsquo;ajouter des classes 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, faites glisser et d\u00e9posez le fichier SweetHome3D-7.5.jar sur l&rsquo;ic\u00f4ne du projet <em>VolumePlugin<\/em> dans la vue <em>Explorateur de packages<\/em> d&rsquo;Eclipse, et choisissez l&rsquo;\u00e9l\u00e9ment <em>Chemin de construction &gt; Ajouter au chemin de construction<\/em> dans le menu contextuel du fichier SweetHome3D-7.5.jar, comme indiqu\u00e9 sur la figure\u00a02.  <\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"452\" height=\"157\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/addToBuildPath.png\" alt=\"\" class=\"wp-image-5846 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/addToBuildPath.png 452w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/addToBuildPath-300x104.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/addToBuildPath-259x90.png 259w\" data-sizes=\"(max-width: 452px) 100vw, 452px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 452px; --smush-placeholder-aspect-ratio: 452\/157;\" \/><figcaption class=\"wp-element-caption\">Figure\u00a02. Ajout de SweetHome3D-7.5.jar<br\/> au chemin de construction <\/figcaption><\/figure>\n<\/div>\n\n<h2 class=\"wp-block-heading programmingPlugin\">Programmation d&rsquo;un plug-in<\/h2>\n\n<p>Maintenant que vous avez install\u00e9 les outils requis, voyons comment vous pouvez programmer votre premier plug-in pour Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">Cr\u00e9ation de la classe de plug-in<\/h3>\n\n<p>Tout d&rsquo;abord, cr\u00e9ez une nouvelle sous-classe de com.eteks.sweethome3d.plugin.Plugin en choisissant l&rsquo;\u00e9l\u00e9ment de menu <em>Fichier &gt; Nouveau &gt; Classe<\/em> dans Eclipse.<\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"418\" height=\"509\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newJavaClass.png\" alt=\"\" class=\"wp-image-5847 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newJavaClass.png 418w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newJavaClass-246x300.png 246w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newJavaClass-74x90.png 74w\" data-sizes=\"(max-width: 418px) 100vw, 418px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 418px; --smush-placeholder-aspect-ratio: 418\/509;\" \/><figcaption class=\"wp-element-caption\">Figure\u00a03. Cr\u00e9ation d&rsquo;une nouvelle classe <\/figcaption><\/figure>\n<\/div>\n\n<p>Dans la bo\u00eete de dialogue <em>Nouvelle classe Java<\/em>, entrez VolumePlugin comme nom de classe, entrez un package (ici le package choisi \u00e9tait com.eteks.test), et choisissez com.eteks.sweethome3d.plugin.Plugin comme super classe de VolumePlugin. Une fois cela fait, cliquez sur <g id=\"gid_1\">Terminer<\/g>. Eclipse cr\u00e9era le fichier de la nouvelle classe avec le contenu suivant\u00a0:  <\/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 vous pouvez le deviner d&rsquo;apr\u00e8s le commentaire TODO, vous devez maintenant modifier l&rsquo;impl\u00e9mentation de la m\u00e9thode getActions pour renvoyer une action de plug-in capable de calculer le volume des meubles mobiles. Remplacez return null\u00a0; par l&rsquo;instruction suivante\u00a0: <\/p>\n\n<pre class=\"wp-block-preformatted\">  return new <strong>PluginAction<\/strong> [] {new <strong>VolumeAction<\/strong>()};  <\/pre>\n\n<p>et choisissez <em>\u00c9dition &gt; Correction rapide<\/em> dans le menu Eclipse pour cr\u00e9er la classe manquante VolumeAction, comme indiqu\u00e9 sur la figure\u00a04.<\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"615\" height=\"117\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/quickFix.png\" alt=\"\" class=\"wp-image-5848 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/quickFix.png 615w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/quickFix-300x57.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/quickFix-473x90.png 473w\" data-sizes=\"(max-width: 615px) 100vw, 615px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 615px; --smush-placeholder-aspect-ratio: 615\/117;\" \/><figcaption class=\"wp-element-caption\">Figure\u00a04. Utilisation de la correction rapide pour g\u00e9n\u00e9rer une classe manquante <\/figcaption><\/figure>\n<\/div>\n\n<p>Dans la bo\u00eete de dialogue <em>Nouvelle classe Java<\/em> qui appara\u00eet, cochez la case <em>Type englobant<\/em> pour cr\u00e9er une classe interne de VolumePlugin et cliquez sur <em>Terminer<\/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\u00a0: <\/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 lorsque l&rsquo;utilisateur lancera l&rsquo;action du plug-in\u00a0; c&rsquo;est donc l&rsquo;endroit o\u00f9 vous devez impl\u00e9menter comment calculer le volume des meubles et l&rsquo;afficher\u00a0:<\/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\/> \/\/ Compute the sum of the volume of the bounding box of <br\/> \/\/ each movable piece of furniture in home<br\/> for (PieceOfFurniture piece : <strong>getHome<\/strong>(). <strong>getFurniture<\/strong>()) {<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\/> \/\/ Display the result in a message box (\u00b3 is for 3 in supercript)<br\/> String message = String. <strong>format<\/strong>(<br\/> \"The maximum volume of the movable furniture in home is %.2f m\u00b3.\", <br\/> volumeInCm3 \/ 1000000);<br\/> JOptionPane. <strong>showMessageDialog<\/strong>(null, message);<br\/>  }<br\/>  }<\/pre>\n\n<p>Maintenant que vous avez sp\u00e9cifi\u00e9 ce que vous voulez que le plug-in fasse, vous devez d\u00e9crire comment l&rsquo;utilisateur lancera cette nouvelle action. Vous avez 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 lors de sa cr\u00e9ation. Par exemple, si vous voulez 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>, vous ajouterez le constructeur suivant \u00e0 la classe VolumnAction\u00a0:   <\/p>\n\n<pre class=\"wp-block-preformatted\">  public <strong>VolumeAction<\/strong>() {<br\/>           <strong>putPropertyValue<\/strong>(Property.NAME, \"Compute volume\");<br\/>           <strong>putPropertyValue<\/strong>(Property.MENU, \"Tools\");<br\/> \/\/ Enables the action by default<br\/>           <strong>setEnabled<\/strong>(true);<br\/> }<\/pre>\n\n<p>La classe de 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\u00a0: <\/p>\n\n<ul class=\"wp-block-list pl-14\">\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\n<h3 class=\"wp-block-heading\" id=\"creating-the-plugin-description-file\">Cr\u00e9ation du fichier de description du plug-in<\/h3>\n\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 pris en charge,\n et les aspects juridiques. Choisissez <i>Fichier &gt; Nouveau &gt; Fichier<\/i> dans\n le menu Eclipse, entrez le nom de fichier <tt>ApplicationPlugin.properties<\/tt> et cliquez sur <i>Terminer<\/i>, comme indiqu\u00e9\n sur la figure\u00a05. <\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img decoding=\"async\" width=\"264\" height=\"384\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newFile.png\" alt=\"\" class=\"wp-image-5849 lazyload\" style=\"--smush-placeholder-width: 264px; --smush-placeholder-aspect-ratio: 264\/384;width:264px;height:auto\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newFile.png 264w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newFile-206x300.png 206w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newFile-62x90.png 62w\" data-sizes=\"(max-width: 264px) 100vw, 264px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><figcaption class=\"wp-element-caption\">Figure\u00a05. Cr\u00e9ation d&rsquo;un nouveau fichier <\/figcaption><\/figure>\n<\/div>\n\n<p>Entrez ensuite la <a href=\"\/examples\/VolumePlugin\/ApplicationPlugin.properties\">description suivante<\/a> dans le nouveau fichier et enregistrez-le\u00a0:<\/p>\n\n<pre class=\"wp-block-preformatted\"><strong>name<\/strong>=Volume des meubles mobiles<br\/><strong>class<\/strong>=com.eteks.test.VolumePlugin<br\/><strong>description<\/strong>=Calcule le volume des meubles mobiles 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\n<h3 class=\"wp-block-heading\" id=\"creatingPluginJAR\">Cr\u00e9ation du JAR du plug-in<\/h3>\n\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 vous l&rsquo;enregistrez, vous\n n&rsquo;avez qu&rsquo;\u00e0 choisir <i>Fichier &gt; Exporter&#8230;<\/i> dans le menu et s\u00e9lectionnez <i>Java &gt; Fichier JAR<\/i> dans la bo\u00eete de dialogue <i>Exporter<\/i>\n qui s&rsquo;affichera. Dans l&rsquo;assistant <g id=\"gid_11\">Exportation JAR<\/g> qui appara\u00eet comme indiqu\u00e9 sur la figure\u00a06, cochez la case du projet<x id=\"gid_12\"><\/x> et entrez 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 votre syst\u00e8me comme suit\u00a0:   <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>  sous Windows Vista \/ 7 \/ 8 \/ 10 \/ 11, ce dossier est <tt>C:\\Users\\<i>utilisateur<\/i>\\AppData\\Roaming\\eTeks\\Sweet\n Home 3D\\plugins<\/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 Data\\eTeks\\Sweet\n Home 3D\\plugins<\/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 votre\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 votre dossier utilisateur.<\/li>\n<\/ul>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"499\" height=\"440\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/jarExport.png\" alt=\"\" class=\"wp-image-5850 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/jarExport.png 499w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/jarExport-300x265.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/jarExport-102x90.png 102w\" data-sizes=\"(max-width: 499px) 100vw, 499px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 499px; --smush-placeholder-aspect-ratio: 499\/440;\" \/><figcaption class=\"wp-element-caption\">Figure\u00a06. Exportation vers un fichier JAR <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"testing-the-plugin\">Test du plug-in<\/h3>\n\n<p>Le <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> que vous avez d\u00e9velopp\u00e9 s&rsquo;ex\u00e9cutera dans Sweet Home 3D, soit avec la version <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, la version <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" target=\"_blank\" rel=\"noopener\">installateurs<\/a>, ou le fichier <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 vous avez t\u00e9l\u00e9charg\u00e9 pr\u00e9c\u00e9demment. Comme ce dernier est un JAR ex\u00e9cutable, vous pouvez l&rsquo;ex\u00e9cuter en double-cliquant dessus ou avec la commande suivante\u00a0: <\/p>\n\n<p>Le <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> que vous avez d\u00e9velopp\u00e9 s&rsquo;ex\u00e9cutera dans Sweet Home 3D, soit avec la version <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, la version <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" target=\"_blank\" rel=\"noopener\">installateurs<\/a>, ou le fichier <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 vous avez t\u00e9l\u00e9charg\u00e9 pr\u00e9c\u00e9demment. Comme ce dernier est un JAR ex\u00e9cutable, vous pouvez l&rsquo;ex\u00e9cuter en double-cliquant dessus ou avec la commande suivante\u00a0: <\/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 vous testez, vous pr\u00e9f\u00e9rerez probablement ex\u00e9cuter Sweet Home 3D avec cette commande, pour pouvoir lire dans la console la trace de pile des exceptions lev\u00e9es lors de l&rsquo;ex\u00e9cution de votre plug-in.<\/p>\n\n<p>Une fois Sweet Home 3D lanc\u00e9, vous verrez le nouveau menu et son \u00e9l\u00e9ment appara\u00eetre comme indiqu\u00e9 sur la figure\u00a07\u00a0:<\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"447\" height=\"53\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginMenu.png\" alt=\"\" class=\"wp-image-5851 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginMenu.png 447w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginMenu-300x36.png 300w\" data-sizes=\"(max-width: 447px) 100vw, 447px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 447px; --smush-placeholder-aspect-ratio: 447\/53;\" \/><figcaption class=\"wp-element-caption\">Figure\u00a07. Menu du plug-in <\/figcaption><\/figure>\n<\/div>\n\n<p>Si vous choisissez le nouvel \u00e9l\u00e9ment de menu pour l&rsquo;<a href=\"\/examples\/userGuideExample.sh3d\">exemple de maison<\/a> cr\u00e9\u00e9 dans le <a href=\"https:\/\/www.sweethome3d.com\/fr\/guide-de-lutilisateur-de-sweet-home-3d\/\" data-type=\"page\" data-id=\"424\">guide de l&rsquo;utilisateur<\/a>, vous obtiendrez le r\u00e9sultat suivant\u00a0:<\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"448\" height=\"137\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginInAction.png\" alt=\"\" class=\"wp-image-5853 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginInAction.png 448w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginInAction-300x92.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginInAction-294x90.png 294w\" data-sizes=\"(max-width: 448px) 100vw, 448px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 448px; --smush-placeholder-aspect-ratio: 448\/137;\" \/><figcaption class=\"wp-element-caption\">Figure\u00a08. Plug-in en action <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">D\u00e9bogage du plug-in<\/h3>\n\n<p>Si vous avez besoin de d\u00e9boguer votre plug-in depuis Eclipse, cr\u00e9ez une configuration de d\u00e9bogage en suivant ces \u00e9tapes\u00a0:<\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Choisissez <i>Ex\u00e9cuter &gt; Configurations de d\u00e9bogage&#8230;<\/i> dans le menu, s\u00e9lectionnez l&rsquo;\u00e9l\u00e9ment <i>Application Java<\/i> dans la liste des configurations disponibles de la bo\u00eete de dialogue \n          <i>Configurations de d\u00e9bogage<\/i>, cliquez sur le bouton <i>Nouveau<\/i> en haut \u00e0 gauche et entrez un nom pour la configuration.<\/li>\n\n\n\n<li>Cliquez sur le bouton <i>Rechercher&#8230;<\/i> \u00e0 droite du champ de texte <i>Classe principale<\/i> et double-cliquez sur la classe <i>SweetHome3DBootstrap<\/i><br\/> parmi les classes propos\u00e9es.<\/li>\n<\/ul>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"629\" height=\"390\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/debugConfiguration.png\" alt=\"\" class=\"wp-image-5854 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/debugConfiguration.png 629w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/debugConfiguration-300x186.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/debugConfiguration-145x90.png 145w\" data-sizes=\"(max-width: 629px) 100vw, 629px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 629px; --smush-placeholder-aspect-ratio: 629\/390;\" \/><figcaption class=\"wp-element-caption\"><em>Figure\u00a09. Cr\u00e9ation d&rsquo;une configuration de d\u00e9bogage <\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Cliquez sur l&rsquo;onglet <em>Chemin de classe<\/em>, s\u00e9lectionnez le sous-\u00e9l\u00e9ment <em>VolumePlugin (chemin de classe par d\u00e9faut)<\/em> de l&rsquo;\u00e9l\u00e9ment <em>Entr\u00e9es utilisateur<\/em> dans la liste <em>Chemin de classe<\/em> et cliquez sur le bouton <em>Supprimer<\/em>.<\/li>\n\n\n\n<li>Cliquez sur l&rsquo;\u00e9l\u00e9ment<em> Entr\u00e9es utilisateur<\/em> dans la liste <em>Chemin de classe<\/em>, cliquez sur le bouton <em>Ajouter des JAR&#8230;<\/em>, s\u00e9lectionnez l&rsquo;\u00e9l\u00e9ment SweetHome3D-7.5.jar et confirmez votre choix.<\/li>\n<\/ul>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"618\" height=\"482\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/classpathConfiguration.png\" alt=\"\" class=\"wp-image-5855 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/classpathConfiguration.png 618w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/classpathConfiguration-300x234.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/classpathConfiguration-115x90.png 115w\" data-sizes=\"(max-width: 618px) 100vw, 618px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 618px; --smush-placeholder-aspect-ratio: 618\/482;\" \/><figcaption class=\"wp-element-caption\">Figure\u00a010. D\u00e9finition du chemin de classe de la configuration de d\u00e9bogage <\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>S\u00e9lectionnez l&rsquo;onglet <em>Source<\/em>, cliquez sur le bouton <em>Ajouter\u2026<\/em>, double-cliquez sur l&rsquo;\u00e9l\u00e9ment <em>Projet Java<\/em> dans la bo\u00eete de dialogue <em>Ajouter une source<\/em>, s\u00e9lectionnez l&rsquo;\u00e9l\u00e9ment <em>VolumePlugin<\/em> dans la fen\u00eatre contextuelle <em>S\u00e9lection du projet<\/em> et confirmez votre choix.<\/li>\n<\/ul>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"773\" height=\"549\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration.png\" alt=\"\" class=\"wp-image-5856 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration.png 773w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration-300x213.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration-127x90.png 127w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration-768x545.png 768w\" data-sizes=\"(max-width: 773px) 100vw, 773px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 773px; --smush-placeholder-aspect-ratio: 773\/549;\" \/><figcaption class=\"wp-element-caption\"><em><em><em>Figure\u00a011. D\u00e9finition du chemin source de la configuration de d\u00e9bogage <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Enfin, cliquez sur le bouton <i>D\u00e9boguer<\/i> pour lancer Sweet Home 3D en mode d\u00e9bogage. Une fois le programme en cours d&rsquo;ex\u00e9cution, ouvrez le fichier <tt>VolumePlugin.java<\/tt>, \n d\u00e9finissez un point d&rsquo;arr\u00eat dans la m\u00e9thode <i>execute<\/i> et choisissez <i>Outils &gt; Calculer le volume<\/i> dans le menu Sweet Home 3D. Eclipse s&rsquo;arr\u00eatera sur le point d&rsquo;arr\u00eat s\u00e9lectionn\u00e9\n pour vous permettre d&rsquo;ex\u00e9cuter le programme \u00e9tape par \u00e9tape et d&rsquo;inspecter la valeur des variables.  <\/li>\n<\/ul>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"601\" height=\"398\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipseDebug.png\" alt=\"\" class=\"wp-image-5857 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipseDebug.png 601w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipseDebug-300x199.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipseDebug-136x90.png 136w\" data-sizes=\"(max-width: 601px) 100vw, 601px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 601px; --smush-placeholder-aspect-ratio: 601\/398;\" \/><figcaption class=\"wp-element-caption\">Figure\u00a012. Perspective de d\u00e9bogage Eclipse <\/figcaption><\/figure>\n<\/div>\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 decoding=\"async\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/09\/warning-1.gif\" alt=\"\" class=\"wp-image-4679 lazyload\" style=\"--smush-placeholder-width: 21px; --smush-placeholder-aspect-ratio: 21\/21;width:21px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n\n\n\n<p>Chaque fois que vous modifiez le code source de votre plug-in, n&rsquo;oubliez pas de <a href=\"#creatingPluginJAR\">g\u00e9n\u00e9rer le JAR du plug-in<\/a> avant de lancer la configuration de d\u00e9bogage que vous avez cr\u00e9\u00e9e. Pour acc\u00e9l\u00e9rer le processus d&rsquo;exportation JAR dans Eclipse, passez \u00e0 la deuxi\u00e8me \u00e9tape de l&rsquo;assistant d&rsquo;exportation JAR et s\u00e9lectionnez l&rsquo;option <em>Enregistrer la description de ce JAR dans l&rsquo;espace de travail<\/em>. Cela ajoutera un nouvel \u00e9l\u00e9ment dans le projet avec un \u00e9l\u00e9ment de menu contextuel <em>Cr\u00e9er un JAR<\/em>.  <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"deployingPlugin\">D\u00e9ploiement du plug-in<\/h3>\n\n<p>Une fois pr\u00eat, votre 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\u00a01.6, un fichier de plug-in peut \u00e9galement \u00eatre install\u00e9 dans le dossier des plug-ins de Sweet Home\u00a03D en double-cliquant dessus, si son extension est SH3P (modifiez simplement l&rsquo;extension du fichier de .zip \u00e0 .sh3p). Si le fait de double-cliquer sur un fichier .sh3p ne lance pas Sweet Home\u00a03D (le plus probable sous Linux), vous pouvez \u00e9galement 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 installateurs de Sweet Home\u00a03D)\u00a0:<\/p>\n\n<pre class=\"wp-block-preformatted\"><em>\/chemin\/vers\/<\/em>SweetHome3D <em>\/chemin\/vers\/<\/em>plugin.sh3p<\/pre>\n\n<p>Pour cesser d&rsquo;utiliser un plug-in, supprimez son fichier du dossier des plug-ins et relancez Sweet Home\u00a03D.<\/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 decoding=\"async\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/09\/warning-1.gif\" alt=\"\" class=\"wp-image-4679 lazyload\" style=\"--smush-placeholder-width: 21px; --smush-placeholder-aspect-ratio: 21\/21;width:21px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n\n\n\n<p>Si vous voulez que votre plug-in puisse fonctionner avec tous les <a href=\"https:\/\/www.sweethome3d.com\/fr\/telecharger\/\">installateurs de Sweet Home\u00a03D<\/a> disponibles sur ce site Web, veillez \u00e0 ce qu&rsquo;il reste conforme \u00e0 Java\u00a05, en s\u00e9lectionnant <code>1.5<\/code> dans le champ <em>Niveau de conformit\u00e9 du compilateur<\/em> disponible dans la section <em>Compilateur Java<\/em> de la bo\u00eete de dialogue affich\u00e9e par l&rsquo;\u00e9l\u00e9ment de menu <em>Projet &gt; Propri\u00e9t\u00e9s<\/em> d&rsquo;Eclipse.<br\/>Si vous utilisez une version du compilateur Java o\u00f9 la compatibilit\u00e9 avec Java\u00a01.5 n&rsquo;est plus disponible, essayez de cibler au moins Java\u00a01.8 toujours utilis\u00e9 dans les versions r\u00e9centes de Sweet Home\u00a03D et d\u00e9finissez <code>javaMinimumVersion<\/code> dans le fichier <code>ApplicationPlugin.properties<\/code> de votre plug-in en cons\u00e9quence.<\/p>\n<\/div>\n\n<h2 class=\"wp-block-heading\" id=\"goingFurther\">Aller plus loin<\/h2>\n\n<p>La programmation du premier plug-in vous a montr\u00e9 la vue d&rsquo;ensemble. Voici quelques informations suppl\u00e9mentaires qui vous aideront \u00e0 aller plus loin. <\/p>\n\n<h3 class=\"wp-block-heading\">API Sweet Home 3D &#8211; Javadoc<\/h3>\n\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 applicative), g\u00e9n\u00e9r\u00e9e avec l&rsquo;outil javadoc.<br\/>Utilisez 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 votre plug-in si vous voulez qu&rsquo;il soit compatible avec les versions futures de Sweet Home 3D. Cela sera largement suffisant pour programmer n&rsquo;importe quel plug-in qui fonctionne sur les donn\u00e9es de la maison disponibles dans Sweet Home 3D.<br\/>Les packages correspondant aux autres couches du programme sont inclus dans le Javadoc \u00e0 titre d&rsquo;information uniquement. Ne vous fiez pas \u00e0 leur API, car elle pourrait encore changer \u00e0 l&rsquo;avenir sans garantie de compatibilit\u00e9 ascendante (de toute fa\u00e7on, vous ne verrez 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 susmentionn\u00e9s).  <\/p>\n\n<h3 class=\"wp-block-heading\">Architecture des classes de mod\u00e8le<\/h3>\n\n<p>Sweet Home 3D est bas\u00e9 sur une architecture MVC (Model View Controller), il est donc essentiel de comprendre comment sa couche Mod\u00e8le est organis\u00e9e. La figure 13 (\u00e9galement disponible au <a href=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/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<p>[uml_diagram slug=\u00a0\u00bbmodel-classes-diagram\u00a0\u00bb map_name=\u00a0\u00bbmodel-classes-diagram\u00a0\u00bb caption=\u00a0\u00bbFigure 13. UML diagram of com.eteks.sweethome3d.model package\u00a0\u00bb caption_small=\u00a0\u00bb(click on a class to view its javadoc)\u00a0\u00bb]<\/p>\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 superclasse 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 <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 des <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogPieceOfFurniture.html\">meubles<\/a> (17) et des <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogTexture.html\">textures<\/a> (18).<br\/>Une instance <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 pl-14\">\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 des 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 dans le mode <em>Visiteur virtuel<\/em>. Toutes les informations externes g\u00e9r\u00e9es par les objets 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 vous aider \u00e0 comprendre quelles classes sont disponibles dans le mod\u00e8le Sweet Home 3D et comment vous pouvez y acc\u00e9der, mais vous remarquerez probablement qu&rsquo;aucun constructeur et aucun mutateur (ou setter si vous pr\u00e9f\u00e9rez) n&rsquo;y sont cit\u00e9s. C&rsquo;est juste par manque de place, mais vous pouvez les utiliser sans probl\u00e8me dans une classe de plug-in. Notez \u00e9galement 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, avec des <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionEvent.html\">CollectionEvent<\/a>s (8) ou avec des <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionEvent.html\">SelectionEvent<\/a>s (6), permettant ainsi \u00e0 tous les changements d&rsquo;\u00eatre refl\u00e9t\u00e9s imm\u00e9diatement \u00e0 l&rsquo;\u00e9cran.  <\/p>\n\n<div class=\"wp-block-group warning-banner is-nowrap is-layout-flex wp-container-core-group-is-layout-9123dee2 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" width=\"190\" height=\"190\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/11\/Frame-281.png\" alt=\"\" class=\"wp-image-786 lazyload\" style=\"--smush-placeholder-width: 190px; --smush-placeholder-aspect-ratio: 190\/190;width:130px\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/11\/Frame-281.png 190w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/11\/Frame-281-90x90.png 90w\" data-sizes=\"(max-width: 190px) 100vw, 190px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer !h-auto wp-container-content-16d1eb73\"><\/div>\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\n<h3 class=\"wp-block-heading\">Architecture des classes de plug-in<\/h3>\n\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> ne contient que trois classes parmi lesquelles vous \u00eates cens\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 le montre la figure 14 (\u00e9galement disponible au <a href=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginClassesDiagram.png\">format PDF<\/a>). <\/p>\n\n<p>[uml_diagram slug=\u00a0\u00bbplugin-classes-diagram\u00a0\u00bb map_name=\u00a0\u00bbplugin-classes-diagram\u00a0\u00bb caption=\u00a0\u00bbFigure 14. UML diagram of com.eteks.sweethome3d.plugin package\u00a0\u00bb caption_small=\u00a0\u00bb(click on a class to view its javadoc)\u00a0\u00bb]<\/p>\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;une nouvelle maison est \u00e9dit\u00e9e, 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 en tant qu&rsquo;\u00e9l\u00e9ments de menu et\/ou boutons de la barre d&rsquo;outils dans la fen\u00eatre de la maison. 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>Notez que la classe <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> vous donne acc\u00e8s \u00e0 une instance <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 vous modifiez une maison ou ses objets (meubles, murs&#8230;) dans la m\u00e9thode execute d&rsquo;une instance <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, vous devez \u00e9galement 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 modifications que vous avez apport\u00e9es. <\/p>\n\n<h3 class=\"wp-block-heading\">Localisation<\/h3>\n\n<p>Si vous pr\u00e9voyez de d\u00e9velopper un plug-in pour la communaut\u00e9 des utilisateurs de Sweet Home 3D, essayez de localiser les cha\u00eenes qu&rsquo;il affiche, que ce soit dans le nom des actions et le menu ou dans les bo\u00eetes de dialogue que vous cr\u00e9erez (ou au moins pr\u00e9parez 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> vous aideront \u00e0 organiser la traduction des propri\u00e9t\u00e9s des actions avec des fichiers .properties, et si vous avez besoin de traduire d&rsquo;autres cha\u00eenes dans votre plug-in (comme celles de la bo\u00eete de dialogue affich\u00e9e par le <a href=\"#testing-the-plugin\">plug-in test\u00e9<\/a>), r\u00e9utilisez 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 vous pr\u00e9f\u00e9rez limiter le nombre de fichiers de propri\u00e9t\u00e9s, vous pouvez m\u00eame \u00e9crire les valeurs des propri\u00e9t\u00e9s des actions et d&rsquo;autres cha\u00eenes dans le <a href=\"#creating-the-plugin-description-file\">fichier de description<\/a> ApplicationPlugin.properties de votre plug-in. <\/p>\n\n<p>Si vous voulez un exemple qui utilise cette architecture, t\u00e9l\u00e9chargez 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\u00e9zippez-le (ce fichier de plug-in contient \u00e9galement le code source du plug-in).<br\/>Comme d\u00e9crit dans le <a href=\"https:\/\/sourceforge.net\/forum\/message.php?msg_id=5837358\" target=\"_blank\" rel=\"noopener\">forum d&rsquo;aide<\/a>, ce plug-in cr\u00e9e un fichier SH3F qui contient tous les meubles que vous avez import\u00e9s dans le catalogue de meubles de Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">Contribution de plug-ins<\/h3>\n\n<p>Vous pouvez publier les plug-ins que vous avez 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 des 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;une maison 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 les extensions<\/a> (PDF) \u00e9crit par Hans Dirkse et dans la page <a href=\"https:\/\/www.sweethome3d.com\/plugins\/\" data-type=\"page\" data-id=\"437\">Plug-ins et outils<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction \u00c0 partir de la version 1.5, il est possible d&rsquo;ajouter de nouvelles fonctionnalit\u00e9s \u00e0 Sweet Home 3D avec des fichiers de plug-in plac\u00e9s dans votre dossier de plug-ins. Cela permet aux programmeurs Java de d\u00e9velopper et de distribuer de nouvelles fonctionnalit\u00e9s pour Sweet Home 3D sans modifier les fichiers source de la version actuelle<a href=\"https:\/\/www.sweethome3d.com\/fr\/guide-du-developpeur-de-plug-in\/\">Continue reading <span class=\"sr-only\">\u00ab\u00a0Guide du d\u00e9veloppeur de plug-in\u00a0\u00bb<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":11534,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-resources.php","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-11559","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/www.sweethome3d.com\/fr\/wp-json\/wp\/v2\/pages\/11559","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sweethome3d.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.sweethome3d.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/fr\/wp-json\/wp\/v2\/comments?post=11559"}],"version-history":[{"count":2,"href":"https:\/\/www.sweethome3d.com\/fr\/wp-json\/wp\/v2\/pages\/11559\/revisions"}],"predecessor-version":[{"id":12438,"href":"https:\/\/www.sweethome3d.com\/fr\/wp-json\/wp\/v2\/pages\/11559\/revisions\/12438"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/fr\/wp-json\/wp\/v2\/media\/11534"}],"wp:attachment":[{"href":"https:\/\/www.sweethome3d.com\/fr\/wp-json\/wp\/v2\/media?parent=11559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}