{"id":11521,"date":"2025-11-05T16:28:15","date_gmt":"2025-11-05T16:28:15","guid":{"rendered":"https:\/\/www.sweethome3d.com\/handleiding-voor-plug-in-ontwikkelaars\/"},"modified":"2025-12-19T10:19:34","modified_gmt":"2025-12-19T10:19:34","slug":"handleiding-voor-plug-in-ontwikkelaars","status":"publish","type":"page","link":"https:\/\/www.sweethome3d.com\/nl\/handleiding-voor-plug-in-ontwikkelaars\/","title":{"rendered":"Handleiding voor plug-in ontwikkelaars"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Inleiding<\/h2>\n\n<p>Vanaf versie 1.5 is het mogelijk om nieuwe functies aan <a href=\"\/\">Sweet Home 3D<\/a> toe te voegen met plug-in bestanden die in je <a href=\"#deployingPlugin\">plug-ins map<\/a> worden geplaatst. Dit stelt Java-programmeurs in staat om nieuwe functies voor <a href=\"https:\/\/www.sweethome3d.com\/nl\/\">Sweet Home 3D<\/a> te ontwikkelen en te distribueren zonder de bronbestanden van de huidige versie te wijzigen (wat goed is voor opwaartse compatibiliteit), en zonder een volledige versie van het programma te leveren (wat goed is voor de omvang van de levering).<br\/>Dit document beschrijft de <a href=\"#installingTools\" data-type=\"internal\" data-id=\"#installingTools\">tools<\/a> die nodig zijn om plug-ins te maken, laat vervolgens zien hoe je een <a href=\"#programmingPlugin\">plug-in kunt programmeren<\/a> die het maximale volume van het verplaatsbare meubilair berekent dat aan een huis is toegevoegd, en geeft ten slotte wat <a href=\"#goingFurther\">aanvullende informatie<\/a> die je helpt om verder te gaan. <\/p>\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n<h2 class=\"wp-block-heading\" id=\"installingTools\">Ontwikkeltools installeren<\/h2>\n\n<p>Hoewel Sweet Home 3D zich richt op een algemeen publiek, vereist het ontwikkelen van plug-ins speciale vaardigheden, en je moet weten hoe je in <a href=\"https:\/\/java.sun.com\" target=\"_blank\" rel=\"noopener\">Java<\/a> moet programmeren met een IDE<a href=\"https:\/\/ant.apache.org\/\" target=\"_blank\" rel=\"noopener\"><\/a>, voordat je verder gaat. Deze handleiding laat zien hoe je een plug-in kunt bouwen met <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">Eclipse<\/a>, maar je kunt de IDE van je keuze gebruiken, of helemaal geen IDE. <\/p>\n\n<h3 class=\"wp-block-heading\">Download en installeer Eclipse<\/h3>\n\n<p><a href=\"https:\/\/www.sweethome3d.com\/nl\/download\/\">Download<\/a> eerst Eclipse van <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.eclipse.org\/<\/a>. De versie genaamd <em>Eclipse IDE for Java Developers<\/em> is voldoende om een plug-in te ontwikkelen, maar je kunt elke versie voor Java-ontwikkeling downloaden. <br\/>Eenmaal gedownload, is het installeren van Eclipse zeer eenvoudig: pak gewoon het archief dat je krijgt uit, open de eclipse map en voer, afhankelijk van je systeem, het bestand uit met de naam  <code>eclipse.exe<\/code>  (onder Windows),  <code>eclipse.app<\/code>  (onder Mac OS X) of  <code>eclipse<\/code>  (onder Linux).<br\/>Bij de eerste keer opstarten zal Eclipse je vragen om een <em>workspace<\/em> map te kiezen, waar plug-in projecten zullen worden opgeslagen.<br\/>Kies vervolgens <em>File &gt; New &gt; Project<\/em> uit het menu om een nieuw project te maken, selecteer <em>Java &gt; Java project<\/em> in de <em>New project<\/em> wizard die wordt weergegeven, voer VolumePlugin in als projectnaam en klik op de knop <em>Finish<\/em>. Sluit ten slotte het tabblad <em>Welcome<\/em> om je workspace te ontdekken zoals weergegeven in figuur 1. <\/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\">Figuur 1. Eclipse workspace <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Download en installeer Sweet Home 3D bibliotheek<\/h3>\n\n<p>De ontwikkeling van een plug-in is gebaseerd op enkele klassen van Sweet Home 3D die Eclipse moet kennen om je project te kunnen bouwen. De eenvoudigste manier om Sweet Home 3D klassen aan Eclipse toe te voegen is door de JAR uitvoerbare versie van Sweet Home 3D te downloaden die beschikbaar is op <a href=\"https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download\" target=\"_blank\" rel=\"noopener\">https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download<\/a>. Eenmaal gedownload, sleep en zet het bestand SweetHome3D-7.5.jar neer op het pictogram van het <em>VolumePlugin<\/em> project in de <em>Package Explorer<\/em> weergave van Eclipse, en kies het item <em>Build Path &gt; Add to Build Path<\/em> in het contextmenu van het SweetHome3D-7.5.jar bestand, zoals weergegeven in figuur 2.  <\/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\">Figuur 2. SweetHome3D-7.5.jar<br\/> toevoegen aan Build Path <\/figcaption><\/figure>\n<\/div>\n\n<h2 class=\"wp-block-heading programmingPlugin\">Een plug-in programmeren<\/h2>\n\n<p>Nu je de vereiste tools hebt ge\u00efnstalleerd, laten we eens kijken hoe je je eerste plug-in voor Sweet Home 3D kunt programmeren.<\/p>\n\n<h3 class=\"wp-block-heading\">De plug-in klasse maken<\/h3>\n\n<p>Maak eerst een nieuwe subklasse van com.eteks.sweethome3d.plugin.Plugin door <em>File &gt; New &gt; Class<\/em> menu-item te kiezen in 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\">Figuur 3. Een nieuwe klasse maken <\/figcaption><\/figure>\n<\/div>\n\n<p>Voer in het dialoogvenster <em>New Java Class<\/em> VolumePlugin in als de klassenaam, voer een pakket in (hier is het gekozen pakket com.eteks.test), en kies com.eteks.sweethome3d.plugin.Plugin als de superklasse van VolumePlugin. Klik vervolgens op <em>Finish<\/em>. Eclipse zal het bestand van de nieuwe klasse maken met de volgende inhoud:  <\/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>Zoals je kunt raden uit de TODO-opmerking, moet je nu de implementatie van de getActions methode wijzigen om een plug-in actie te retourneren die het volume van het verplaatsbare meubilair kan berekenen. Vervang return null; door de volgende verklaring: <\/p>\n\n<pre class=\"wp-block-preformatted\">  return new <strong>PluginAction<\/strong> [] {new <strong>VolumeAction<\/strong>()};  <\/pre>\n\n<p>en kies <em>Edition &gt; Quick Fix<\/em> uit het Eclipse-menu om de ontbrekende klasse VolumeAction te maken, zoals weergegeven in figuur 4.<\/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\">Figuur 4. Quick fix gebruiken om een ontbrekende klasse te genereren <\/figcaption><\/figure>\n<\/div>\n\n<p>Selecteer in het dialoogvenster <em>New Java Class<\/em> dat verschijnt het selectievakje <em>Enclosing type<\/em> om een inner class van VolumePlugin te maken en klik op <em>Finish<\/em>. Dit zal de klasse VolumeAction maken die overerft van de klasse com.eteks.sweethome3d.plugin.PluginAction en een lege execute methode bevat: <\/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>Dit is de methode die Sweet Home 3D zal aanroepen wanneer de gebruiker de plug-in actie start; dit is dus de plek waar je moet implementeren hoe het volume van het meubilair moet worden berekend en weergegeven:<\/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\/> \/\/ Bereken de som van het volume van de bounding box van <br\/> \/\/ elk verplaatsbaar meubelstuk in het huis<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\/> \/\/ Toon het resultaat in een berichtvenster (\u00b3 is voor 3 in superscript)<br\/> String message = String. <strong>format<\/strong>(<br\/> \"Het maximale volume van het verplaatsbare meubilair in het huis is %.2f m\u00b3.\", <br\/> volumeInCm3 \/ 1000000);<br\/> JOptionPane. <strong>showMessageDialog<\/strong>(null, message);<br\/>  }<br\/>  }<\/pre>\n\n<p>Nu je hebt gespecificeerd wat je wilt dat de plug-in doet, moet je beschrijven hoe de gebruiker deze nieuwe actie zal starten. Je hebt de keuze tussen het toevoegen van een nieuw <strong>menu-item<\/strong> aan een menu, en\/of een nieuwe <strong>knop<\/strong> aan de werkbalk. Deze keuze wordt gemaakt door de juiste eigenschappen van de plug-in actie in te stellen bij de creatie ervan. Als je bijvoorbeeld wilt dat gebruikers de volume-actie starten met het menu-item <em>Volume berekenen<\/em> in het menu <em>Tools<\/em>, voeg je de volgende constructor toe aan de VolumnAction klasse:   <\/p>\n\n<pre class=\"wp-block-preformatted\">  public <strong>VolumeAction<\/strong>() {<br\/>           <strong>putPropertyValue<\/strong>(Property.NAME, \"Volume berekenen\");<br\/>           <strong>putPropertyValue<\/strong>(Property.MENU, \"Tools\");<br\/> \/\/ Schakelt de actie standaard in<br\/>           <strong>setEnabled<\/strong>(true);<br\/> }<\/pre>\n\n<p>De <a href=\"\/examples\/VolumePlugin\/VolumePlugin.java\">VolumePlugin<\/a> plug-in klasse is nu geprogrammeerd en bijna klaar om als plug-in in Sweet Home 3D te werken. De twee laatste dingen die je moet doen zijn: <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>een <tt>ApplicationPlugin.properties<\/tt> beschrijvingsbestand maken,<\/li>\n\n\n\n<li>de bestanden samenvoegen in een JAR-bestand.<br\/><\/li>\n<\/ul>\n\n<h3 class=\"wp-block-heading\" id=\"creating-the-plugin-description-file\">Het plug-in beschrijvingsbestand maken<\/h3>\n\n<p>Een <tt>ApplicationPlugin.properties<\/tt> bestand\n beschrijft de plug-in naam, zijn klasse, de minimale versies van Sweet Home 3D en Java waaronder het wordt ondersteund,\n en juridische zaken. Kies <i>File &gt; New &gt; File<\/i> uit\n het Eclipse-menu, voer de bestandsnaam <tt>ApplicationPlugin.properties<\/tt> in en klik op <i>Finish<\/i>, zoals weergegeven\n in figuur 5. <\/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\">Figuur 5. Een nieuw bestand maken <\/figcaption><\/figure>\n<\/div>\n\n<p>Voer vervolgens de <a href=\"\/examples\/VolumePlugin\/ApplicationPlugin.properties\">volgende beschrijving<\/a> in het nieuwe bestand in en sla het op:<\/p>\n\n<pre class=\"wp-block-preformatted\"><strong>name<\/strong>=Volume verplaatsbaar meubilair<br\/><strong>class<\/strong>=com.eteks.test.VolumePlugin<br\/><strong>description<\/strong>=Berekent het volume van het verplaatsbare meubilair in het huis<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\">De plug-in JAR maken<\/h3>\n\n<p>De plug-in JAR bevat de <tt>class<\/tt> bestanden die zijn gemaakt bij het compileren van het <tt>VolumePlugin.java<\/tt> bestand,\n en het <tt>ApplicationPlugin.properties<\/tt> bestand. Aangezien Eclipse een Java-bestand compileert zodra je het opslaat, hoef je\n alleen maar <i>File &gt; Export&#8230;<\/i> uit het menu te kiezen en <i>Java &gt; JAR file<\/i> te selecteren in het <i>Export<\/i> dialoogvenster\n dat wordt weergegeven. Selecteer in de <i>Jar Export<\/i> wizard die verschijnt, zoals weergegeven in figuur 6, het project selectievakje\n en voer het pad in van een JAR-bestand dat in de <a href=\"https:\/\/www.sweethome3d.com\/nl\/plug-ins-en-tools\/\">Sweet Home 3D plug-ins<\/a> map is geplaatst. Deze juiste map is afhankelijk\n van je systeem als volgt:   <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li> onder Windows Vista \/ 7 \/ 8 \/ 10 \/ 11 is deze map <tt>C:\\Users\\<i>gebruiker<\/i>\\AppData\\Roaming\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li> onder Windows XP en eerdere versies van Windows is deze map <tt>C:\\Documents and Settings\\<i>gebruiker<\/i>\\Application Data\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li> onder macOS is het de submap <tt>Library\/Application Support\/eTeks\/Sweet Home 3D\/<\/tt><tt>plugins<\/tt> van je\n gebruikersmap,<\/li>\n\n\n\n<li> onder Linux en andere Unix-systemen is het de submap <tt>.eteks\/sweethome3d\/<\/tt><tt>plugins<\/tt> van je gebruikersmap.<\/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\">Figuur 6. Exporteren naar een JAR-bestand <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"testing-the-plugin\">De plug-in testen<\/h3>\n\n<p>De <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> die je hebt ontwikkeld zal draaien in Sweet Home 3D, ofwel met de <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a> versie, de <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" target=\"_blank\" rel=\"noopener\">installers<\/a> versie, of de <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> die je eerder hebt gedownload. Aangezien de laatste een uitvoerbare JAR is, kun je deze uitvoeren door er dubbel op te klikken of met het volgende commando: <\/p>\n\n<p>De <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> die je hebt ontwikkeld zal draaien in Sweet Home 3D, ofwel met de <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a> versie, de <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" target=\"_blank\" rel=\"noopener\">installers<\/a> versie, of de <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> die je eerder hebt gedownload. Aangezien de laatste een uitvoerbare JAR is, kun je deze uitvoeren door er dubbel op te klikken of met het volgende commando: <\/p>\n\n<pre class=\"wp-block-preformatted\">java -jar \/<em>pad<\/em>\/<em>naar<\/em>\/SweetHome3D-7.5.jar<\/pre>\n\n<p>Zolang je aan het testen bent, zul je waarschijnlijk de voorkeur geven aan het uitvoeren van Sweet Home 3D met dit commando, om in de console de stack trace van de uitzonderingen te kunnen lezen die tijdens de uitvoering van je plug-in worden gegooid.<\/p>\n\n<p>Zodra Sweet Home 3D is gestart, zie je het nieuwe menu en het bijbehorende item verschijnen zoals weergegeven in figuur 7:<\/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\">Figuur 7. Plug-in menu <\/figcaption><\/figure>\n<\/div>\n\n<p>Als je het nieuwe menu-item kiest voor het <a href=\"\/examples\/userGuideExample.sh3d\">voorbeeld huis<\/a> gemaakt in de <a href=\"https:\/\/www.sweethome3d.com\/nl\/sweet-home-3d-gebruikershandleiding\/\" data-type=\"page\" data-id=\"424\">gebruikershandleiding<\/a>, krijg je het volgende resultaat:<\/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\">Figuur 8. Plug-in in actie <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">De plug-in debuggen<\/h3>\n\n<p>Als je je plug-in vanuit Eclipse moet debuggen, maak dan een debug-configuratie door deze stappen te volgen:<\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Kies <i>Run &gt; Debug Configurations&#8230;<\/i> uit het menu, selecteer het item <i>Java Application<\/i> in de lijst met beschikbare configuraties van het \n <i>Debug configurations<\/i> dialoogvenster, klik op de <i>New <\/i>knop linksboven en voer een naam in voor de configuratie.<\/li>\n\n\n\n<li>Klik op de <i>Search&#8230;<\/i> knop rechts van het <i>Main class<\/i> tekstveld en dubbelklik op de <i>SweetHome3DBootstrap<\/i> klasse <br\/> tussen de voorgestelde klassen.<\/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>Figuur 9. Een debug-configuratie aanmaken <\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Klik op het tabblad <em>Classpath<\/em>, selecteer het sub-item <em>VolumePlugin (default classpath)<\/em> van het item <em>User Entries<\/em> in de <em>Classpath<\/em> lijst en klik op de <em>Remove<\/em> knop.<\/li>\n\n\n\n<li>Klik op het item<em> User Entries<\/em> in de <em>Classpath<\/em> lijst, klik op de <em>Add JARs&#8230;<\/em> knop, selecteer het SweetHome3D-7.5.jar item en bevestig je keuze.<\/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\">Figuur 10. De classpath van de debug-configuratie instellen <\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Selecteer het tabblad <em>Source<\/em>, klik op de <em>Add\u2026<\/em> knop, dubbelklik op het <em>Java Project<\/em> item in het <em>Add Source<\/em> dialoogvenster, selecteer het <em>VolumePlugin<\/em> item in de <em>Project Selection<\/em> popup en bevestig je keuze.<\/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>Figuur 11. Het bronpad van de debug-configuratie instellen <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Klik ten slotte op de <i>Debug<\/i> knop om Sweet Home 3D in debug-modus te starten. Zodra het programma draait, open je het <g id=\"gid_1\">VolumePlugin.java<\/g> bestand, <x id=\"gid_2\"><\/x> zet een breakpoint in de <g id=\"gid_3\">execute<\/g> methode en kies <g id=\"gid_4\">Tools <x id=\"gid_5\"><\/x> Compute volume<\/g> uit het Sweet Home 3D menu. Eclipse zal stoppen op het geselecteerde \n breakpoint om je het programma stap voor stap te laten uitvoeren en variabelen te inspecteren.  <\/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\">Figuur 12. Eclipse debug perspectief <\/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>Elke keer dat je de broncode van je plug-in wijzigt, vergeet dan niet om <a href=\"#creatingPluginJAR\">de plug-in JAR te genereren<\/a> voordat je de debug-configuratie start die je hebt gemaakt. Om het JAR-exportproces in Eclipse te versnellen, ga je naar de tweede stap van de JAR-exportwizard en selecteer je de optie <em>Save the description of this JAR in the workspace<\/em>. Dit voegt een nieuw item toe aan het project met een contextueel <em>Create JAR<\/em> menu-item.  <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"deployingPlugin\">De plug-in implementeren<\/h3>\n\n<p>Eenmaal klaar kan je plug-in worden ge\u00efmplementeerd op de computer van andere Sweet Home 3D-gebruikers door deze simpelweg te kopi\u00ebren naar hun <a href=\"#creatingPluginJAR\">plug-ins map<\/a>. Vanaf versie 1.6 kan een plug-in bestand ook worden ge\u00efnstalleerd in de plug-ins map van Sweet Home 3D door er dubbel op te klikken, als de extensie SH3P is (verander simpelweg de bestandsextensie van .zip naar .sh3p). Als dubbelklikken op een .sh3p bestand Sweet Home 3D niet start (grote kans onder Linux), kun je ook een plug-in installeren met het volgende commando in een <em>Terminal<\/em> venster (waarbij <code>SweetHome3D<\/code> de naam is van het uitvoerbare bestand dat bij Sweet Home 3D installatieprogramma&#8217;s wordt geleverd):<\/p>\n\n<pre class=\"wp-block-preformatted\"><em>\/pad\/naar\/<\/em>SweetHome3D <em>\/pad\/naar\/<\/em>plugin.sh3p<\/pre>\n\n<p>Om een plug-in niet meer te gebruiken, verwijder je het bestand uit de plug-ins map en start je Sweet Home 3D opnieuw.<\/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>Als je wilt dat je plug-in kan draaien met alle <a href=\"https:\/\/www.sweethome3d.com\/nl\/download\/\">Sweet Home 3D installatieprogramma&#8217;s<\/a> die beschikbaar zijn op deze website, zorg er dan voor dat deze compatibel blijft met Java 5, door <code>1.5<\/code> te selecteren in het veld <em>Compiler compliance level<\/em> beschikbaar in de <em>Java Compiler<\/em> sectie van het dialoogvenster dat wordt getoond door het <em>Project &gt; Properties<\/em> menu-item van Eclipse.<br\/>Als je een Java compiler versie gebruikt waar Java 1.5 compatibiliteit niet meer beschikbaar is, probeer dan ten minste Java 1.8 te targeten die nog steeds wordt gebruikt in recente versies van Sweet Home 3D en stel <code>javaMinimumVersion<\/code> in het <code>ApplicationPlugin.properties<\/code> bestand van je plug-in dienovereenkomstig in.<\/p>\n<\/div>\n\n<h2 class=\"wp-block-heading\" id=\"goingFurther\">Verder gaan<\/h2>\n\n<p>Het programmeren van de eerste plug-in gaf je een overzicht. Hier is wat aanvullende informatie die je zal helpen om verder te gaan. <\/p>\n\n<h3 class=\"wp-block-heading\">Sweet Home 3D API &#8211; Javadoc<\/h3>\n\n<p>De meest nuttige documentatie voor het ontwikkelen van een nieuwe plug-in is de <a href=\"\/javadoc\/index.html\">Sweet Home 3D API<\/a> (Application Programming Interface), gegenereerd met het javadoc-tool.<br\/>Gebruik in je plug-in alleen de klassen van <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> en <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/viewcontroller\/package-summary.html\">com.eteks.sweethome3d.viewcontroller<\/a> pakketten als je wilt dat deze compatibel blijft met toekomstige versies van Sweet Home 3D. Dit is ruim voldoende om elke plug-in te programmeren die werkt met de beschikbare huisgegevens in Sweet Home 3D.<br\/>De pakketten die overeenkomen met de andere lagen van het programma zijn alleen ter informatie opgenomen in de Javadoc. Vertrouw niet op hun API, aangezien deze in de toekomst nog kan veranderen zonder garantie op opwaartse compatibiliteit (je zult trouwens geen verwijzing zien naar een klasse van <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> of <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/package-summary.html\">com.eteks.sweethome3d<\/a> pakketten in de eerder genoemde pakketten).  <\/p>\n\n<h3 class=\"wp-block-heading\">Architectuur van modelklassen<\/h3>\n\n<p>Sweet Home 3D is gebaseerd op een MVC (Model View Controller) architectuur, dus het begrijpen van hoe de Model-laag is georganiseerd is essentieel. Figuur 13 (ook beschikbaar in <a href=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/modelClassesDiagram.png\">PDF-formaat<\/a>) toont bijna alle klassen en interfaces die beschikbaar zijn in versie 1.5 van het <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/package-summary.html\">com.eteks.sweethome3d.model<\/a> pakket dat overeenkomt met deze Model-laag. <\/p>\n\n<p>[uml_diagram slug=&#8221;model-classes-diagram&#8221; map_name=&#8221;model-classes-diagram&#8221; caption=&#8221;Figure 13. UML diagram of com.eteks.sweethome3d.model package&#8221; caption_small=&#8221;(click on a class to view its javadoc)&#8221;]<\/p>\n\n<p>De centrale klasse in de Model-laag is de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeApplication.html\">HomeApplication<\/a> klasse (10), de abstracte superklasse van de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/SweetHome3D.html\">SweetHome3D<\/a> applicatie hoofdklasse. De instantie van deze klasse geeft toegang tot de momenteel bewerkte <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> instanties (7), en tot het <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/UserPreferences.html\">UserPreferences<\/a> object (11) dat de gebruikte <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/LengthUnit.html\">lengte-eenheid<\/a> (12), de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCatalog.html\">meubel catalogus<\/a> (14) en de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCatalog.html\">texturencatalogus<\/a> (15) opslaat waaruit de gebruiker <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogPieceOfFurniture.html\">meubelstukken<\/a> (17) en <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogTexture.html\">texturen<\/a> (18) kiest.<br\/>Een <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> instantie (7) slaat alle objecten op die de gebruiker in het huisplan heeft gemaakt: <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>de lijst van <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomePieceOfFurniture.html\">HomePieceOfFurniture<\/a> objecten (13) die de interface <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">PieceOfFurniture<\/a> (16) implementeren,<\/li>\n\n\n\n<li>de verzameling van <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Wall<\/a> objecten (9),<\/li>\n\n\n\n<li>de lijst van <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Room<\/a> objecten (5),<\/li>\n\n\n\n<li>de verzameling van <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/DimensionLine.html\">DimensionLine<\/a> objecten (2),<\/li>\n\n\n\n<li>de verzameling van <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Label.html\">Label<\/a> objecten (3).<\/li>\n<\/ul>\n\n<p>Deze objecten implementeren de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Selectable.html\">Selectable<\/a> interface (1) evenals het <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/ObserverCamera.html\">ObserverCamera<\/a> object (4), dat de locatie van de camera in de <em>Virtuele bezoeker<\/em> modus opslaat. Alle externe informatie die wordt beheerd door Model objecten, zoals het pictogram en het 3D-model van een <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">meubelstuk<\/a> (16), of de afbeelding van een <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextureImage.html\">textuur<\/a> (20) wordt benaderd via de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Content.html\">Content<\/a> interface (19), ge\u00efmplementeerd door de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/URLContent.html\">URLContent<\/a> klasse en andere klassen van het <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/package-summary.html\">com.eteks.sweethome3d.tools<\/a> pakket. <\/p>\n\n<p>Dit UML-diagram zou je moeten helpen begrijpen welke klassen beschikbaar zijn in het Sweet Home 3D model en hoe je ze kunt benaderen, maar je zult waarschijnlijk opmerken dat er geen constructors en geen mutators (of setters als je dat liever hebt) worden genoemd. Dit komt alleen door ruimtegebrek, maar je kunt ze zonder problemen gebruiken in een plug-in klasse. Merk ook op dat elke wijziging van een bestaand object van het model wordt gemeld aan de weergegeven componenten via <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/beans\/PropertyChangeEvent.html\" target=\"_blank\" rel=\"noopener\">PropertyChangeEvent<\/a>s, <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionEvent.html\">CollectionEvent<\/a>s (8) of <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionEvent.html\">SelectionEvent<\/a>s (6), waardoor alle wijzigingen direct op het scherm worden weergegeven.  <\/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>Het Sweet Home 3D model <strong>is niet<\/strong> thread-safe om prestatieredenen. Alle <strong>wijzigingen<\/strong> van een object dat tot het model behoort, moeten worden uitgevoerd in de Event Dispatch Thread. <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Architectuur van plug-in klassen<\/h3>\n\n<p>De architectuur van plug-in klassen is veel eenvoudiger te begrijpen dan die van de Model-laag. Het <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/package-summary.html\">com.eteks.sweethome3d.plugin<\/a> pakket bevat slechts drie klassen waarvan je alleen de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> en <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a> klassen wordt geacht te gebruiken, zoals getoond in figuur 14 (ook beschikbaar in <a href=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginClassesDiagram.png\">PDF-formaat<\/a>). <\/p>\n\n<p>[uml_diagram slug=&#8221;plugin-classes-diagram&#8221; map_name=&#8221;plugin-classes-diagram&#8221; caption=&#8221;Figure 14. UML diagram of com.eteks.sweethome3d.plugin package&#8221; caption_small=&#8221;(click on a class to view its javadoc)&#8221;]<\/p>\n\n<p>Een <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginManager.html\">PluginManager<\/a> instantie (1) wordt bij het opstarten van de applicatie gemaakt en zoekt naar de plug-ins die zijn ge\u00efnstalleerd in de <a href=\"#creating-the-plugin-jar\">plug-ins map<\/a> van de gebruiker. Elke keer dat een nieuw huis wordt bewerkt, instantieert deze manager een <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> object (3) voor elke plug-in die bij het opstarten is gevonden en configureert deze. Vervolgens roept het de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getActions()\">getActions<\/a> methode aan om alle <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">acties<\/a> (4) op te halen die als menu-items en\/of werkbalk knoppen aan het huisvenster worden toegevoegd. Elke actie is een instantie van <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, die lijkt op de <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/Action.html\" target=\"_blank\" rel=\"noopener\">Action<\/a> klasse, met zijn <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#execute()\">execute<\/a> methode en zijn aanpasbare <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.Property.html\">eigenschappen<\/a> (2).   <\/p>\n\n<p>Merk op dat de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> klasse je toegang geeft tot een <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEditSupport.html\" target=\"_blank\" rel=\"noopener\">UndoableEditSupport<\/a> instantie via de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getUndoableEditSupport()\">getUndoableEditSupport<\/a> methode. Zodra je een huis of zijn objecten (meubels, muren&#8230;) wijzigt in de execute methode van een <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a> instantie, moet je ook een <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEdit.html\" target=\"_blank\" rel=\"noopener\">UndoableEdit<\/a> object posten naar de undoable edit support die wordt teruggegeven door de getUndoableEditSupport methode, anders kunnen gebruikers de aangebrachte wijzigingen niet correct ongedaan maken\/opnieuw uitvoeren. <\/p>\n\n<h3 class=\"wp-block-heading\">Lokalisatie<\/h3>\n\n<p>Als je van plan bent een plug-in te ontwikkelen voor de Sweet Home 3D gebruikersgemeenschap, probeer dan de strings die het weergeeft te lokaliseren, zowel in actienamen en menu&#8217;s als in dialoogvensters die je maakt (of bereid op zijn minst de lokalisatie voor). Twee <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#PluginAction(java.lang.String,%20java.lang.String,%20java.lang.ClassLoader)\">constructors van de PluginAction<\/a> klasse helpen je om de vertaling van actie-eigenschappen te organiseren met .properties bestanden, en als je andere strings in je plug-in moet vertalen (zoals die in het dialoogvenster dat wordt getoond door de <a href=\"#testing-the-plugin\">geteste plug-in<\/a>) hergebruik dan deze .properties bestanden met de Java <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/util\/ResourceBundle.html\" target=\"_blank\" rel=\"noopener\">ResourceBundle<\/a> klasse.<br\/>Als je het aantal property bestanden wilt beperken, kun je de waarden van de actie-eigenschappen en andere strings zelfs schrijven in het ApplicationPlugin.properties <a href=\"#creating-the-plugin-description-file\">beschrijvingsbestand<\/a> van je plug-in. <\/p>\n\n<p>Als je een voorbeeld wilt dat deze architectuur gebruikt, download dan de <em>Export to SH3F<\/em> plug-in beschikbaar op <a href=\"\/storage\/plugins\/ExportToSH3F-1.0.sh3p\">https:\/\/www.sweethome3d.com\/plugins\/ExportToSH3F-1.0.sh3p<\/a>, en pak het uit (dit plug-in bestand bevat ook de broncode van de plug-in).<br\/>Zoals beschreven in het <a href=\"https:\/\/sourceforge.net\/forum\/message.php?msg_id=5837358\" target=\"_blank\" rel=\"noopener\">Help forum<\/a>, maakt deze plug-in een SH3F-bestand dat alle meubels bevat die je hebt ge\u00efmporteerd in de meubelcatalogus van Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">Plug-ins bijdragen<\/h3>\n\n<p>Je kunt de plug-ins die je hebt geprogrammeerd plaatsen in het <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/\" target=\"_blank\" rel=\"noopener\">Plug-ins Contributions<\/a> Tracking System om ze te delen met de Sweet Home 3D gebruikersgemeenschap.<br\/>Veel functies kunnen aan Sweet Home 3D worden toegevoegd via plug-ins, van importeurs tot exporteurs, maar ook plug-ins die de gegevens van een huis kunnen wijzigen zoals de <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/1\/\" target=\"_blank\" rel=\"noopener\">Home Rotator Plug-in<\/a> ontwikkeld door Michel Mbem en anderen die zijn vermeld in de <a href=\"\/storage\/pluginsUserGuide.pdf\">Tutorial voor Plug-ins en Extensies<\/a> (PDF) geschreven door Hans Dirkse en op de <a href=\"https:\/\/www.sweethome3d.com\/plugins\/\" data-type=\"page\" data-id=\"437\">Plug-ins en tools<\/a> pagina.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Inleiding Vanaf versie 1.5 is het mogelijk om nieuwe functies aan Sweet Home 3D toe te voegen met plug-in bestanden die in je plug-ins map worden geplaatst. Dit stelt Java-programmeurs in staat om nieuwe functies voor Sweet Home 3D te ontwikkelen en te distribueren zonder de bronbestanden van de huidige versie te wijzigen (wat goed<a href=\"https:\/\/www.sweethome3d.com\/nl\/handleiding-voor-plug-in-ontwikkelaars\/\">Continue reading <span class=\"sr-only\">&#8220;Handleiding voor plug-in ontwikkelaars&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":11518,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-resources.php","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-11521","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/www.sweethome3d.com\/nl\/wp-json\/wp\/v2\/pages\/11521","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sweethome3d.com\/nl\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.sweethome3d.com\/nl\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/nl\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/nl\/wp-json\/wp\/v2\/comments?post=11521"}],"version-history":[{"count":2,"href":"https:\/\/www.sweethome3d.com\/nl\/wp-json\/wp\/v2\/pages\/11521\/revisions"}],"predecessor-version":[{"id":12437,"href":"https:\/\/www.sweethome3d.com\/nl\/wp-json\/wp\/v2\/pages\/11521\/revisions\/12437"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/nl\/wp-json\/wp\/v2\/media\/11518"}],"wp:attachment":[{"href":"https:\/\/www.sweethome3d.com\/nl\/wp-json\/wp\/v2\/media?parent=11521"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}