{"id":11779,"date":"2025-11-05T16:28:15","date_gmt":"2025-11-05T16:28:15","guid":{"rendered":"https:\/\/www.sweethome3d.com\/plug-in-utvecklarguide\/"},"modified":"2025-12-19T10:19:45","modified_gmt":"2025-12-19T10:19:45","slug":"plug-in-utvecklarguide","status":"publish","type":"page","link":"https:\/\/www.sweethome3d.com\/sv\/plug-in-utvecklarguide\/","title":{"rendered":"Plug-in utvecklarguide"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduktion<\/h2>\n\n<p>Fr\u00e5n och med version 1.5 \u00e4r det m\u00f6jligt att l\u00e4gga till nya funktioner i <a href=\"\/\">Sweet Home 3D<\/a> med plug-in-filer som placeras i din <a href=\"#deployingPlugin\">plug-in-mapp<\/a>. Detta till\u00e5ter Java-programmerare att utveckla och distribuera nya funktioner f\u00f6r <a href=\"https:\/\/www.sweethome3d.com\/sv\/\">Sweet Home 3D<\/a> utan att modifiera k\u00e4llfilerna i den aktuella versionen (vilket \u00e4r bra f\u00f6r upp\u00e5triktad kompatibilitet) och utan att leverera en fullst\u00e4ndig version av programmet (vilket \u00e4r bra f\u00f6r leveransstorleken).<br\/>Det h\u00e4r dokumentet beskriver de <a href=\"#installingTools\" data-type=\"internal\" data-id=\"#installingTools\">verktyg<\/a> som kr\u00e4vs f\u00f6r att skapa plug-ins, och visar sedan hur man <a href=\"#programmingPlugin\">programmerar en plug-in<\/a> som ber\u00e4knar den maximala volymen av de flyttbara m\u00f6blerna som lagts till i ett hem, och ger slutligen lite <a href=\"#goingFurther\">ytterligare information<\/a> som hj\u00e4lper dig att g\u00e5 vidare. <\/p>\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n<h2 class=\"wp-block-heading\" id=\"installingTools\">Installera utvecklingsverktyg<\/h2>\n\n<p>Om Sweet Home 3D riktar sig till en allm\u00e4n publik kr\u00e4ver utveckling av plug-ins speciella f\u00e4rdigheter, och du b\u00f6r veta hur man programmerar i <a href=\"https:\/\/java.sun.com\" target=\"_blank\" rel=\"noopener\">Java<\/a> med en IDE<a href=\"https:\/\/ant.apache.org\/\" target=\"_blank\" rel=\"noopener\"><\/a> innan du g\u00e5r vidare. Den h\u00e4r guiden visar hur du bygger en plug-in med <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">Eclipse<\/a>, men du kan anv\u00e4nda den IDE du v\u00e4ljer, eller ingen IDE alls. <\/p>\n\n<h3 class=\"wp-block-heading\">Ladda ner och installera Eclipse<\/h3>\n\n<p>Ladda f\u00f6rst ner Eclipse fr\u00e5n <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.eclipse.org\/<\/a>. Versionen som heter <em>Eclipse IDE for Java Developers<\/em> r\u00e4cker f\u00f6r att utveckla en plug-in, men du kan ladda ner vilken version som helst f\u00f6r Java-utveckling. <br\/>N\u00e4r Eclipse har laddats ner \u00e4r installationen v\u00e4ldigt enkel: packa bara upp arkivet du f\u00e5r, \u00f6ppna eclipse-mappen och beroende p\u00e5 ditt system, k\u00f6r filen som heter  <code>eclipse.exe<\/code>  (under Windows),  <code>eclipse.app<\/code>  (under Mac OS X) eller  <code>eclipse<\/code>  (under Linux).<br\/>Vid f\u00f6rsta k\u00f6rningen kommer Eclipse att kr\u00e4va att du v\u00e4ljer en <em>arbetsyta<\/em>, d\u00e4r plug-in-projekten kommer att lagras.<br\/>N\u00e4r du \u00e4r klar, v\u00e4lj <em>File &gt; New &gt; Project<\/em> fr\u00e5n menyn f\u00f6r att skapa ett nytt projekt, v\u00e4lj <em>Java &gt; Java project<\/em> i guiden <em>New project<\/em> som visas, ange VolumePlugin som projektnamn och klicka p\u00e5 knappen <em>Finish<\/em>. St\u00e4ng slutligen fliken <em>Welcome<\/em> f\u00f6r att uppt\u00e4cka din arbetsyta som visas i figur 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\">Figur 1. Eclipse arbetsyta <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Ladda ner och installera Sweet Home 3D-biblioteket<\/h3>\n\n<p>Utvecklingen av en plug-in baseras p\u00e5 vissa klasser av Sweet Home 3D som Eclipse m\u00e5ste k\u00e4nna till f\u00f6r att kunna bygga ditt projekt. Det enklaste s\u00e4ttet att l\u00e4gga till Sweet Home 3D-klasser till Eclipse \u00e4r att ladda ner JAR-k\u00f6rbara versionen av Sweet Home 3D som finns p\u00e5 <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>. N\u00e4r du har laddat ner den, dra och sl\u00e4pp filen SweetHome3D-7.5.jar p\u00e5 projektikonen <em>VolumePlugin<\/em> i vyn <em>Package Explorer<\/em> i Eclipse, och v\u00e4lj objektet <em>Build Path &gt; Add to Build Path<\/em> i den kontextuella menyn i filen SweetHome3D-7.5.jar, som visas i figur 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\">Figur 2. L\u00e4gga till SweetHome3D-7.5.jar<br\/> till Build Path <\/figcaption><\/figure>\n<\/div>\n\n<h2 class=\"wp-block-heading programmingPlugin\">Programmera en plug-in<\/h2>\n\n<p>Nu n\u00e4r du har installerat de verktyg som kr\u00e4vs, l\u00e5t oss se hur du kan programmera din f\u00f6rsta plug-in f\u00f6r Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">Skapa plug-in-klassen<\/h3>\n\n<p>Skapa f\u00f6rst en ny underklass av com.eteks.sweethome3d.plugin.Plugin genom att v\u00e4lja menyalternativet <em>File &gt; New &gt; Class<\/em> i 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\">Figur 3. Skapa en ny klass <\/figcaption><\/figure>\n<\/div>\n\n<p>I dialogrutan <em>New Java Class<\/em> anger du VolumePlugin som klassnamn, anger ett paket (h\u00e4r var det valda paketet com.eteks.test) och v\u00e4ljer com.eteks.sweethome3d.plugin.Plugin som superklass f\u00f6r VolumePlugin. N\u00e4r du \u00e4r klar klickar du p\u00e5 <em>Finish<\/em>. Eclipse skapar filen f\u00f6r den nya klassen med f\u00f6ljande inneh\u00e5ll:  <\/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>Som du kan gissa fr\u00e5n TODO-kommentaren m\u00e5ste du nu \u00e4ndra implementeringen av getActions-metoden f\u00f6r att returnera en plug-in-\u00e5tg\u00e4rd som kan ber\u00e4kna volymen av de flyttbara m\u00f6blerna. Ers\u00e4tt return null; med f\u00f6ljande uttalande: <\/p>\n\n<pre class=\"wp-block-preformatted\">  return new <strong>PluginAction<\/strong> [] {new <strong>VolumeAction<\/strong>()};  <\/pre>\n\n<p>och v\u00e4lj <em>Edition &gt; Quick Fix<\/em> fr\u00e5n Eclipse-menyn f\u00f6r att skapa den saknade klassen VolumeAction, som visas i figur 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\">Figur 4. Anv\u00e4nda Quick fix f\u00f6r att generera en saknad klass <\/figcaption><\/figure>\n<\/div>\n\n<p>I dialogrutan <em>New Java Class<\/em> som visas markerar du kryssrutan <em>Enclosing type<\/em> f\u00f6r att skapa en inre klass av VolumePlugin och klickar p\u00e5 <em>Finish<\/em>. Detta skapar klassen VolumeAction som \u00e4rver fr\u00e5n com.eteks.sweethome3d.plugin.PluginAction-klassen och inneh\u00e5ller en tom execute-metod: <\/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>Denna metod \u00e4r den som Sweet Home 3D kommer att anropa n\u00e4r anv\u00e4ndaren startar plug-in-\u00e5tg\u00e4rden; allts\u00e5 \u00e4r detta platsen d\u00e4r du m\u00e5ste implementera hur man ber\u00e4knar m\u00f6blernas volym och visar den:<\/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>Nu n\u00e4r du har angett vad du vill att plug-in ska g\u00f6ra, m\u00e5ste du beskriva hur anv\u00e4ndaren ska starta den h\u00e4r nya \u00e5tg\u00e4rden. Du kan v\u00e4lja mellan att l\u00e4gga till ett nytt <strong>menyalternativ<\/strong> till en meny och\/eller en ny <strong>knapp<\/strong> till verktygsf\u00e4ltet. Detta val g\u00f6rs genom att st\u00e4lla in l\u00e4mpliga egenskaper f\u00f6r plug-in-\u00e5tg\u00e4rden vid dess skapande. Om du till exempel vill att anv\u00e4ndarna ska starta volym\u00e5tg\u00e4rden med menyalternativet <em>Compute volume<\/em> som finns i menyn <em>Tools<\/em>, l\u00e4gger du till f\u00f6ljande konstruktor i VolumnAction-klassen:   <\/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>Plug-in-klassen <a href=\"\/examples\/VolumePlugin\/VolumePlugin.java\">VolumePlugin<\/a> \u00e4r nu programmerad och n\u00e4stan redo att fungera som en plug-in i Sweet Home 3D. De tv\u00e5 sista sakerna att g\u00f6ra \u00e4r: <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>skapa en beskrivningsfil f\u00f6r <tt>ApplicationPlugin.properties<\/tt>,<\/li>\n\n\n\n<li>l\u00e4gga ihop filerna i en JAR-fil.<br\/><\/li>\n<\/ul>\n\n<h3 class=\"wp-block-heading\" id=\"creating-the-plugin-description-file\">Skapa plug-in-beskrivningsfilen<\/h3>\n\n<p>En <tt>ApplicationPlugin.properties<\/tt> fil\n beskriver plug-in-namnet, dess klass, de l\u00e4gsta versionerna av Sweet Home 3D och Java som den st\u00f6ds under,\n och juridiska saker. V\u00e4lj <i>File &gt; New &gt; File<\/i> fr\u00e5n\n Eclipse-menyn, ange filnamnet <tt>ApplicationPlugin.properties<\/tt> och klicka p\u00e5 <i>Finish<\/i>, som visas\n i figur 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\">Figur 5. Skapa en ny fil <\/figcaption><\/figure>\n<\/div>\n\n<p>Ange sedan <a href=\"\/examples\/VolumePlugin\/ApplicationPlugin.properties\">f\u00f6ljande beskrivning<\/a> i den nya filen och spara den:<\/p>\n\n<pre class=\"wp-block-preformatted\"><strong>name<\/strong>=Flyttbar m\u00f6belvolym<br\/><strong>class<\/strong>=com.eteks.test.VolumePlugin<br\/><strong>description<\/strong>=Ber\u00e4knar volymen av de flyttbara m\u00f6blerna i hemmet<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\">Skapa plug-in-JAR<\/h3>\n\n<p>Plug-in-JAR inneh\u00e5ller <tt>class<\/tt>-filerna som skapats fr\u00e5n kompileringen av filen <tt>VolumePlugin.java<\/tt>,\n och filen <tt>ApplicationPlugin.properties<\/tt>. Eftersom Eclipse kompilerar en Java-fil s\u00e5 fort du sparar den, beh\u00f6ver du\n bara v\u00e4lja <i>File &gt; Export&#8230;<\/i> fr\u00e5n menyn och v\u00e4lj <i>Java &gt; JAR file<\/i> i dialogrutan <i>Export<\/i>\n som visas. I guiden <i>Jar Export<\/i> som visas som visas i figur 6, markera projektets kryss\n ruta och ange s\u00f6kv\u00e4gen till en JAR-fil som placeras i Sweet Home 3D-plug-in-mappen. Den h\u00e4r l\u00e4mpliga mappen beror\n p\u00e5 ditt system enligt f\u00f6ljande:   <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>  under Windows Vista \/ 7 \/ 8 \/ 10 \/ 11 \u00e4r den h\u00e4r mappen <tt>C:\\Users\\<i>anv\u00e4ndare<\/i>\\AppData\\Roaming\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li>  under Windows XP och tidigare versioner av Windows \u00e4r den h\u00e4r mappen <tt>C:\\Documents and Settings\\<i>anv\u00e4ndare<\/i>\\Application Data\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li>  under macOS \u00e4r det undermappen <tt>Library\/Application Support\/eTeks\/Sweet Home 3D\/<\/tt><tt>plugins<\/tt> i din\n anv\u00e4ndarmapp,<\/li>\n\n\n\n<li>  under Linux och andra Unix \u00e4r det undermappen <tt>.eteks\/sweethome3d\/<\/tt><tt>plugins<\/tt> i din anv\u00e4ndarmapp.<\/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\">Figur 6. Exportera till en JAR-fil <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"testing-the-plugin\">Testa plug-in<\/h3>\n\n<p>Den <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> du utvecklat kommer att k\u00f6ras i Sweet Home 3D, antingen med <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>-versionen, <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" target=\"_blank\" rel=\"noopener\">installationsprogrammen<\/a> eller <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> som du laddade ner tidigare. Eftersom den senaste \u00e4r en k\u00f6rbar JAR kan du k\u00f6ra den genom att dubbelklicka p\u00e5 den eller med f\u00f6ljande kommando: <\/p>\n\n<p>Den <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> du utvecklat kommer att k\u00f6ras i Sweet Home 3D, antingen med <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>-versionen, <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" target=\"_blank\" rel=\"noopener\">installationsprogrammen<\/a> eller <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> som du laddade ner tidigare. Eftersom den senaste \u00e4r en k\u00f6rbar JAR kan du k\u00f6ra den genom att dubbelklicka p\u00e5 den eller med f\u00f6ljande kommando: <\/p>\n\n<pre class=\"wp-block-preformatted\">java -jar \/<em>s\u00f6kv\u00e4g<\/em>\/<em>till<\/em>\/SweetHome3D-7.5.jar<\/pre>\n\n<p>S\u00e5 l\u00e4nge du testar kommer du f\u00f6rmodligen att f\u00f6redra att k\u00f6ra Sweet Home 3D med det h\u00e4r kommandot, f\u00f6r att kunna l\u00e4sa i konsolen stacksp\u00e5rningen av de undantag som kastas under k\u00f6rningen av din plug-in.<\/p>\n\n<p>N\u00e4r Sweet Home 3D har startats ser du den nya menyn och dess objekt visas som visas i figur 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\">Figur 7. Plug-in-meny <\/figcaption><\/figure>\n<\/div>\n\n<p>Om du v\u00e4ljer det nya menyalternativet f\u00f6r <a href=\"\/examples\/userGuideExample.sh3d\">hemexemplet<\/a> som skapats i <a href=\"https:\/\/www.sweethome3d.com\/sv\/anvandarhandbok-for-sweet-home-3d\/\" data-type=\"page\" data-id=\"424\">anv\u00e4ndarhandboken<\/a> f\u00e5r du f\u00f6ljande resultat:<\/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\">Figur 8. Plug-in i aktion <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Fels\u00f6ka plug-in<\/h3>\n\n<p>Om du beh\u00f6ver fels\u00f6ka din plug-in fr\u00e5n Eclipse, skapa en fels\u00f6kningskonfiguration genom att f\u00f6lja dessa steg:<\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>V\u00e4lj <i>Run &gt; Debug Configurations&#8230;<\/i> fr\u00e5n menyn, v\u00e4lj objektet <i>Java Application<\/i> i listan \u00f6ver tillg\u00e4ngliga konfigurationer i \n          dialogrutan <i>Debug configurations<\/i>, klicka p\u00e5 knappen <i>New <\/i> l\u00e4ngst upp till v\u00e4nster och ange ett namn f\u00f6r konfigurationen.<\/li>\n\n\n\n<li>Klicka p\u00e5 knappen <i>Search&#8230;<\/i> till h\u00f6ger om textf\u00e4ltet <i>Main class<\/i> och dubbelklicka p\u00e5 klassen <i>SweetHome3DBootstrap<\/i> <br\/> bland de f\u00f6reslagna klasserna.<\/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>Figur 9. Skapa en fels\u00f6kningskonfiguration <\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Klicka p\u00e5 fliken <em>Classpath<\/em>, v\u00e4lj underobjektet <em>VolumePlugin (default classpath)<\/em> f\u00f6r objektet <em>User Entries<\/em> i listan <em>Classpath<\/em> och klicka p\u00e5 knappen <em>Remove<\/em>.<\/li>\n\n\n\n<li>Klicka p\u00e5 objektet<em> User Entries<\/em> i listan <em>Classpath<\/em>, klicka p\u00e5 knappen <em>Add JARs&#8230;<\/em>, v\u00e4lj objektet SweetHome3D-7.5.jar och bekr\u00e4fta ditt val.<\/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\">Figur 10. St\u00e4lla in klass\u00f6kv\u00e4gen f\u00f6r fels\u00f6kningskonfigurationen <\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>V\u00e4lj fliken <em>Source<\/em>, klicka p\u00e5 knappen <em>Add\u2026<\/em>, dubbelklicka p\u00e5 objektet <em>Java Project<\/em> i dialogrutan <em>Add Source<\/em>, v\u00e4lj objektet <em>VolumePlugin<\/em> i popup-f\u00f6nstret <em>Project Selection<\/em> och bekr\u00e4fta ditt val.<\/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>Figur 11. St\u00e4lla in k\u00e4lls\u00f6kv\u00e4gen f\u00f6r fels\u00f6kningskonfigurationen <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Slutligen, klicka p\u00e5 knappen <i>Debug<\/i> f\u00f6r att starta Sweet Home 3D i fels\u00f6kningsl\u00e4ge. N\u00e4r programmet k\u00f6rs, \u00f6ppna filen <tt>VolumePlugin.java<\/tt>, \n st\u00e4ll in en brytpunkt i metoden <i>execute<\/i> och v\u00e4lj <i>Tools &gt; Compute volume<\/i> fr\u00e5n Sweet Home 3D-menyn. Eclipse stannar vid den valda \n brytpunkten s\u00e5 att du kan k\u00f6ra programmet steg f\u00f6r steg och inspektera variablernas v\u00e4rde.  <\/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\">Figur 12. Eclipse fels\u00f6kningsperspektiv <\/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>Varje g\u00e5ng du \u00e4ndrar k\u00e4llkoden f\u00f6r din plug-in, gl\u00f6m inte att <a href=\"#creatingPluginJAR\">generera plug-in-JAR<\/a> innan du startar den fels\u00f6kningskonfiguration du skapade. F\u00f6r att snabba upp JAR-exportprocessen i eclipse, g\u00e5 till det andra steget i JAR-exportguiden och v\u00e4lj alternativet <em>Save the description of this JAR in the workspace<\/em>. Detta l\u00e4gger till ett nytt objekt i projektet med ett kontextuellt menyalternativ <em>Create JAR<\/em>.  <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"deployingPlugin\">Distribuera plug-in<\/h3>\n\n<p>N\u00e4r din plug-in \u00e4r klar kan den distribueras p\u00e5 andra Sweet Home 3D-anv\u00e4ndares datorer genom att helt enkelt kopiera den till deras <a href=\"#creatingPluginJAR\">plug-in-mapp<\/a>. Fr\u00e5n och med version 1.6 kan en plug-in-fil ocks\u00e5 installeras i plug-in-mappen f\u00f6r Sweet Home 3D genom att dubbelklicka p\u00e5 den, om dess filnamnstill\u00e4gg \u00e4r SH3P (\u00e4ndra helt enkelt filnamnstill\u00e4gget fr\u00e5n .zip till .sh3p). Om dubbelklick p\u00e5 en .sh3p-fil inte startar Sweet Home 3D (st\u00f6rst chans under Linux) kan du ocks\u00e5 installera en plug-in med f\u00f6ljande kommando i ett <em>Terminal<\/em>-f\u00f6nster (d\u00e4r <code>SweetHome3D<\/code> \u00e4r namnet p\u00e5 den k\u00f6rbara filen som medf\u00f6ljer Sweet Home 3D-installationsprogrammen):<\/p>\n\n<pre class=\"wp-block-preformatted\"><em>\/s\u00f6kv\u00e4g\/till\/<\/em>SweetHome3D <em>\/s\u00f6kv\u00e4g\/till\/<\/em>plugin.sh3p<\/pre>\n\n<p>F\u00f6r att sluta anv\u00e4nda en plug-in, ta bort dess fil fr\u00e5n plug-in-mappen och starta om Sweet Home 3D.<\/p>\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-64989fb1 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><img 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>Om du vill att din plug-in ska kunna k\u00f6ras med alla <a href=\"https:\/\/www.sweethome3d.com\/sv\/ladda-ner\/\">Sweet Home 3D-installationsprogram<\/a> som finns p\u00e5 den h\u00e4r webbplatsen, se till att h\u00e5lla den kompatibel med Java 5 genom att v\u00e4lja <code>1.5<\/code> i f\u00e4ltet <em>Compiler compliance level<\/em> som finns i avsnittet <em>Java Compiler<\/em> i dialogrutan som visas av menyalternativet <em>Project &gt; Properties<\/em> i Eclipse.<br\/>Om du anv\u00e4nder en Java-kompilatorversion d\u00e4r Java 1.5-kompatibilitet inte l\u00e4ngre \u00e4r tillg\u00e4nglig, f\u00f6rs\u00f6k att rikta in dig p\u00e5 minst Java 1.8 som fortfarande anv\u00e4nds i de senaste versionerna av Sweet Home 3D och st\u00e4ll in <code>javaMinimumVersion<\/code> i filen <code>ApplicationPlugin.properties<\/code> f\u00f6r din plug-in i enlighet d\u00e4rmed.<\/p>\n<\/div>\n\n<h2 class=\"wp-block-heading\" id=\"goingFurther\">G\u00e5 vidare<\/h2>\n\n<p>Programmeringen av den f\u00f6rsta plug-in visade dig helhetsbilden. H\u00e4r \u00e4r lite ytterligare information som hj\u00e4lper dig att g\u00e5 vidare. <\/p>\n\n<h3 class=\"wp-block-heading\">Sweet Home 3D API &#8211; Javadoc<\/h3>\n\n<p>Den mest anv\u00e4ndbara dokumentationen f\u00f6r att utveckla ett nytt plugin \u00e4r <a href=\"\/javadoc\/index.html\">Sweet Home 3D API<\/a> (Application Programming Interface), genererat med javadoc-verktyget.<br\/>Anv\u00e4nd endast klasserna i paketen <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> och <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/viewcontroller\/package-summary.html\">com.eteks.sweethome3d.viewcontroller<\/a> i ditt plugin om du vill att det ska vara upp\u00e5tkompatibelt med framtida versioner av Sweet Home 3D. Detta kommer att vara tillr\u00e4ckligt f\u00f6r att programmera alla plugins som fungerar med hemdata som finns tillg\u00e4ngliga i Sweet Home 3D.<br\/>Paketen som matchar de andra lagren i programmet ing\u00e5r endast i Javadoc i informationssyfte. F\u00f6rlita dig inte p\u00e5 deras API, eftersom det fortfarande kan \u00e4ndras i framtiden utan garanti f\u00f6r upp\u00e5tkompatibilitet (du kommer \u00e4nd\u00e5 inte att se n\u00e5gon referens till en klass i paketen <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> eller <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/package-summary.html\">com.eteks.sweethome3d<\/a> i de ovann\u00e4mnda paketen).  <\/p>\n\n<h3 class=\"wp-block-heading\">Modellklassers arkitektur<\/h3>\n\n<p>Sweet Home 3D \u00e4r baserat p\u00e5 en MVC-arkitektur (Model View Controller), s\u00e5 det \u00e4r viktigt att f\u00f6rst\u00e5 hur dess modelllager \u00e4r organiserat. Figur 13 (finns \u00e4ven i <a href=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/modelClassesDiagram.png\">PDF-format<\/a>) presenterar n\u00e4stan alla klasser och gr\u00e4nssnitt som \u00e4r tillg\u00e4ngliga i version 1.5 av paketet <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/package-summary.html\">com.eteks.sweethome3d.model<\/a> som matchar detta modelllager. <\/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>Den centrala klassen i modellagret \u00e4r klassen <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeApplication.html\">HomeApplication<\/a> (10), den abstrakta superklassen f\u00f6r huvudklassen f\u00f6r applikationen <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/SweetHome3D.html\">SweetHome3D<\/a>. Instansen av den h\u00e4r klassen ger \u00e5tkomst till <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a>-instanserna (7) som f\u00f6r n\u00e4rvarande redigeras, och till <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/UserPreferences.html\">UserPreferences<\/a>-objektet (11) som lagrar den <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/LengthUnit.html\">l\u00e4ngdenhet<\/a> (12) som anv\u00e4nds, <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCatalog.html\">m\u00f6belkatalogen<\/a> (14) och <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCatalog.html\">texturkatalogen<\/a> (15) fr\u00e5n vilka anv\u00e4ndaren v\u00e4ljer <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogPieceOfFurniture.html\">m\u00f6bler<\/a> (17) och <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogTexture.html\">texturer<\/a> (18).<br\/>En <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a>-instans (7) lagrar alla objekt som anv\u00e4ndaren har skapat i hemplanen: <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>listan \u00f6ver <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomePieceOfFurniture.html\">HomePieceOfFurniture<\/a>-objekt (13) som implementerar gr\u00e4nssnittet <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">PieceOfFurniture<\/a> (16),<\/li>\n\n\n\n<li>samlingen av <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Wall<\/a>-objekt (9),<\/li>\n\n\n\n<li>listan \u00f6ver <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Room<\/a>-objekt (5),<\/li>\n\n\n\n<li>samlingen av <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/DimensionLine.html\">DimensionLine<\/a>-objekt (2),<\/li>\n\n\n\n<li>samlingen av <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Label.html\">Label<\/a>-objekt (3).<\/li>\n<\/ul>\n\n<p>Dessa objekt implementerar gr\u00e4nssnittet <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Selectable.html\">Selectable<\/a> (1) samt <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/ObserverCamera.html\">ObserverCamera<\/a>-objektet (4), som lagrar kamerans plats i l\u00e4get <em>Virtuell bes\u00f6kare<\/em>. All extern information som hanteras av modellobjekt, som ikonen och 3D-modellen av en <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">m\u00f6bel<\/a> (16), eller bilden av en <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextureImage.html\">textur<\/a> (20) n\u00e5s via gr\u00e4nssnittet <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Content.html\">Content<\/a> (19), implementerat av klassen <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/URLContent.html\">URLContent<\/a> och andra klasser i paketet <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/package-summary.html\">com.eteks.sweethome3d.tools<\/a>. <\/p>\n\n<p>Detta UML-diagram b\u00f6r hj\u00e4lpa dig att f\u00f6rst\u00e5 vilka klasser som \u00e4r tillg\u00e4ngliga i Sweet Home 3D-modellen och hur du kan komma \u00e5t dem, men du kommer f\u00f6rmodligen att m\u00e4rka att inga konstruktorer och inga mutatorer (eller setters om du f\u00f6redrar) n\u00e4mns i det. Det \u00e4r bara p\u00e5 grund av platsbrist, men du kan anv\u00e4nda dem utan problem i en plugin-klass. Observera ocks\u00e5 att alla \u00e4ndringar av ett befintligt objekt i modellen kommer att meddelas till de visade komponenterna antingen med <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/beans\/PropertyChangeEvent.html\" target=\"_blank\" rel=\"noopener\">PropertyChangeEvent<\/a>s, med <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionEvent.html\">CollectionEvent<\/a>s (8) eller med <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionEvent.html\">SelectionEvent<\/a>s (6), vilket g\u00f6r att alla \u00e4ndringar \u00e5terspeglas omedelbart p\u00e5 sk\u00e4rmen.  <\/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>Sweet Home 3D-modellen \u00e4r <strong>inte<\/strong> tr\u00e5ds\u00e4ker av prestandask\u00e4l. Alla <strong>\u00e4ndringar<\/strong> av ett objekt som tillh\u00f6r modellen b\u00f6r g\u00f6ras i Event Dispatch Thread. <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Plugin-klassers arkitektur<\/h3>\n\n<p>Arkitekturen f\u00f6r plugin-klasser \u00e4r mycket enklare att f\u00f6rst\u00e5 \u00e4n modelllagrets. Paketet <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/package-summary.html\">com.eteks.sweethome3d.plugin<\/a> inneh\u00e5ller bara tre klasser bland vilka du bara ska anv\u00e4nda klasserna <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> och <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, som visas i figur 14 (finns \u00e4ven i <a href=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginClassesDiagram.png\">PDF-format<\/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>En <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginManager.html\">PluginManager<\/a>-instans (1) skapas vid applikationsstart och s\u00f6ker efter de plugins som \u00e4r installerade i anv\u00e4ndarens <a href=\"#creating-the-plugin-jar\">plugin-mapp<\/a>. Varje g\u00e5ng ett nytt hem redigeras, instansierar och konfigurerar den h\u00e4r hanteraren ett <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a>-objekt (3) f\u00f6r varje plugin som hittas vid start. Sedan anropas metoden <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getActions()\">getActions<\/a> f\u00f6r att h\u00e4mta alla <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">\u00e5tg\u00e4rder<\/a> (4) som kommer att l\u00e4ggas till som menyalternativ och\/eller verktygsf\u00e4ltsknappar i hemf\u00f6nstret. Varje \u00e5tg\u00e4rd \u00e4r en instans av <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, som ser ut som klassen <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/Action.html\" target=\"_blank\" rel=\"noopener\">Action<\/a>, med sin <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#execute()\">execute<\/a>-metod och dess modifierbara <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.Property.html\">egenskaper<\/a> (2).   <\/p>\n\n<p>Observera att klassen <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> ger dig \u00e5tkomst till en <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEditSupport.html\" target=\"_blank\" rel=\"noopener\">UndoableEditSupport<\/a>-instans via sin <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getUndoableEditSupport()\">getUndoableEditSupport<\/a>-metod. S\u00e5 snart du \u00e4ndrar ett hem eller dess objekt (m\u00f6bler, v\u00e4ggar&#8230;) i execute-metoden f\u00f6r en <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>-instans, b\u00f6r du ocks\u00e5 publicera ett <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEdit.html\" target=\"_blank\" rel=\"noopener\">UndoableEdit<\/a>-objekt till det undoable edit-st\u00f6d som returneras av getUndoableEditSupport-metoden, annars kommer anv\u00e4ndarna inte att kunna \u00e5ngra\/g\u00f6ra om de \u00e4ndringar du gjort korrekt. <\/p>\n\n<h3 class=\"wp-block-heading\">Lokalisering<\/h3>\n\n<p>Om du planerar att utveckla ett plugin f\u00f6r Sweet Home 3D-anv\u00e4ndargemenskapen, f\u00f6rs\u00f6k att lokalisera de str\u00e4ngar som det visar antingen i \u00e5tg\u00e4rdsnamn och meny eller i dialogrutor som du skapar (eller \u00e5tminstone f\u00f6rbereda dess lokalisering). Tv\u00e5 <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#PluginAction(java.lang.String,%20java.lang.String,%20java.lang.ClassLoader)\">konstruktorer f\u00f6r PluginAction<\/a>-klassen hj\u00e4lper dig att organisera \u00f6vers\u00e4ttningen av \u00e5tg\u00e4rdsegenskaper med .properties-filer, och om du beh\u00f6ver \u00f6vers\u00e4tta andra str\u00e4ngar i ditt plugin (som den i dialogrutan som visas av det <a href=\"#testing-the-plugin\">testade pluginet<\/a>) \u00e5teranv\u00e4nd dessa .properties-filer med Java-klassen <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/util\/ResourceBundle.html\" target=\"_blank\" rel=\"noopener\">ResourceBundle<\/a>.<br\/>Om du f\u00f6redrar att begr\u00e4nsa antalet egenskapsfiler kan du till och med skriva v\u00e4rdena f\u00f6r \u00e5tg\u00e4rdsegenskaperna och andra str\u00e4ngar i <a href=\"#creating-the-plugin-description-file\">beskrivningsfilen<\/a> ApplicationPlugin.properties f\u00f6r ditt plugin. <\/p>\n\n<p>Om du vill ha ett exempel som anv\u00e4nder den h\u00e4r arkitekturen, ladda ner pluginet <em>Exportera till SH3F<\/em> som finns tillg\u00e4ngligt p\u00e5 <a href=\"\/storage\/plugins\/ExportToSH3F-1.0.sh3p\">https:\/\/www.sweethome3d.com\/plugins\/ExportToSH3F-1.0.sh3p<\/a> och packa upp det (den h\u00e4r plugin-filen inneh\u00e5ller \u00e4ven k\u00e4llkoden f\u00f6r pluginet).<br\/>Som beskrivs i <a href=\"https:\/\/sourceforge.net\/forum\/message.php?msg_id=5837358\" target=\"_blank\" rel=\"noopener\">hj\u00e4lpforumet<\/a> skapar det h\u00e4r pluginet en SH3F-fil som inneh\u00e5ller alla m\u00f6bler du importerat i m\u00f6belkatalogen i Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">Bidra med plugins<\/h3>\n\n<p>Du kan publicera de plugins du har programmerat i <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/\" target=\"_blank\" rel=\"noopener\">Plug-ins Contributions<\/a> Tracking System f\u00f6r att dela dem med Sweet Home 3D-anv\u00e4ndargemenskapen.<br\/>M\u00e5nga funktioner kan l\u00e4ggas till i Sweet Home 3D tack vare plugins, fr\u00e5n import\u00f6rer till export\u00f6rer, men \u00e4ven plugins som kan \u00e4ndra data i ett hem som <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/1\/\" target=\"_blank\" rel=\"noopener\">Home Rotator Plug-in<\/a> utvecklat av Michel Mbem och andra listade i <a href=\"\/storage\/pluginsUserGuide.pdf\">Tutorial for Plug-ins and Extensions<\/a> (PDF) skriven av Hans Dirkse och p\u00e5 sidan <a href=\"https:\/\/www.sweethome3d.com\/plugins\/\" data-type=\"page\" data-id=\"437\">Plug-ins and tools<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduktion Fr\u00e5n och med version 1.5 \u00e4r det m\u00f6jligt att l\u00e4gga till nya funktioner i Sweet Home 3D med plug-in-filer som placeras i din plug-in-mapp. Detta till\u00e5ter Java-programmerare att utveckla och distribuera nya funktioner f\u00f6r Sweet Home 3D utan att modifiera k\u00e4llfilerna i den aktuella versionen (vilket \u00e4r bra f\u00f6r upp\u00e5triktad kompatibilitet) och utan att<a href=\"https:\/\/www.sweethome3d.com\/sv\/plug-in-utvecklarguide\/\">Continue reading <span class=\"sr-only\">&#8221;Plug-in utvecklarguide&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":11763,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-resources.php","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-11779","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/www.sweethome3d.com\/sv\/wp-json\/wp\/v2\/pages\/11779","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sweethome3d.com\/sv\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.sweethome3d.com\/sv\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/sv\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/sv\/wp-json\/wp\/v2\/comments?post=11779"}],"version-history":[{"count":2,"href":"https:\/\/www.sweethome3d.com\/sv\/wp-json\/wp\/v2\/pages\/11779\/revisions"}],"predecessor-version":[{"id":12449,"href":"https:\/\/www.sweethome3d.com\/sv\/wp-json\/wp\/v2\/pages\/11779\/revisions\/12449"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/sv\/wp-json\/wp\/v2\/media\/11763"}],"wp:attachment":[{"href":"https:\/\/www.sweethome3d.com\/sv\/wp-json\/wp\/v2\/media?parent=11779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}