{"id":11726,"date":"2025-11-05T16:28:15","date_gmt":"2025-11-05T16:28:15","guid":{"rendered":"https:\/\/test.sweethome3d.eu\/vodnik-za-razvijalce-vticnikov\/"},"modified":"2025-12-19T10:19:44","modified_gmt":"2025-12-19T10:19:44","slug":"vodnik-za-razvijalce-vticnikov","status":"publish","type":"page","link":"https:\/\/test.sweethome3d.eu\/sl\/vodnik-za-razvijalce-vticnikov\/","title":{"rendered":"Vodnik za razvijalce vti\u010dnikov"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Uvod<\/h2>\n\n<p>Od razli\u010dice 1.5 naprej je mogo\u010de dodati nove funkcije v <a href=\"\/\">Sweet Home 3D<\/a> z datotekami vti\u010dnikov, ki so shranjene v tvoji <a href=\"#deployingPlugin\">mapi z vti\u010dniki<\/a>. To omogo\u010da programerjem Jave, da razvijajo in distribuirajo nove funkcije za Sweet Home 3D, ne da bi spreminjali izvorne datoteke trenutne razli\u010dice (kar je dobro za zdru\u017eljivost navzgor) in ne da bi dostavili celotno razli\u010dico programa (kar je dobro za velikost dostave).<br\/>Ta dokument opisuje <a href=\"#installingTools\" data-type=\"internal\" data-id=\"#installingTools\">orodja<\/a>, potrebna za ustvarjanje vti\u010dnikov, nato poka\u017ee, kako <a href=\"#programmingPlugin\">programirati vti\u010dnik<\/a>, ki izra\u010duna najve\u010djo prostornino premi\u010dnega pohi\u0161tva, dodanega v dom, in kon\u010dno ponuja nekaj <a href=\"#goingFurther\">dodatnih informacij<\/a>, ki ti bodo pomagale pri nadaljnjem delu. <\/p>\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n<h2 class=\"wp-block-heading\" id=\"installingTools\">Namestitev razvojnih orodij<\/h2>\n\n<p>\u010ce je Sweet Home 3D namenjen splo\u0161ni javnosti, razvoj vti\u010dnikov zahteva posebne ve\u0161\u010dine in mora\u0161 znati programirati v <a href=\"https:\/\/java.sun.com\" target=\"_blank\" rel=\"noopener\">Javi<\/a> z IDE<a href=\"https:\/\/ant.apache.org\/\" target=\"_blank\" rel=\"noopener\"><\/a>, preden nadaljuje\u0161. Ta vodnik prikazuje, kako zgraditi vti\u010dnik z <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">Eclipse<\/a>, lahko pa uporabi\u0161 IDE po svoji izbiri ali pa sploh nobenega IDE-ja. <\/p>\n\n<h3 class=\"wp-block-heading\">Prenesi in namesti Eclipse<\/h3>\n\n<p>Najprej prenesi Eclipse z <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.eclipse.org\/<\/a>. Razli\u010dica z imenom <em>Eclipse IDE for Java Developers<\/em> je dovolj za razvoj vti\u010dnika, lahko pa prenese\u0161 katero koli razli\u010dico za razvoj v Javi. <br\/>Ko je prenesen, je namestitev Eclipse zelo preprosta: samo razpakiraj arhiv, ki ga bo\u0161 dobil, odpri mapo eclipse in odvisno od tvojega sistema, za\u017eeni datoteko z imenom  <code>eclipse.exe<\/code>  (v sistemu Windows),  <code>eclipse.app<\/code>  (v sistemu Mac OS X) ali  <code>eclipse<\/code>  (v sistemu Linux).<br\/>Ob prvem zagonu bo Eclipse zahteval, da izbere\u0161 mapo <em>delovnega prostora<\/em>, kjer bodo shranjeni projekti vti\u010dnikov.<br\/>Ko je to storjeno, izberi <em>Datoteka &gt; Novo &gt; Projekt<\/em> iz menija, da ustvari\u0161 nov projekt, izberi <em>Java &gt; Java projekt<\/em> v \u010darovniku <em>Nov projekt<\/em>, ki se bo prikazal, vnesi VolumePlugin kot ime projekta in klikni na gumb <em>Dokon\u010daj<\/em>. Na koncu zapri zavihek <em>Dobrodo\u0161li<\/em>, da odkrije\u0161 svoj delovni prostor, kot je prikazano na sliki 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:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/eclipse.png\" alt=\"\" class=\"wp-image-5845 lazyload\" data-srcset=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/eclipse.png 388w, https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/eclipse-300x244.png 300w, https:\/\/test.sweethome3d.eu\/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\">Slika 1. Delovni prostor Eclipse <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Prenesi in namesti knji\u017enico Sweet Home 3D<\/h3>\n\n<p>Razvoj vti\u010dnika temelji na nekaterih razredih Sweet Home 3D, ki jih mora Eclipse poznati, da lahko zgradi tvoj projekt. Najla\u017eji na\u010din za dodajanje razredov Sweet Home 3D v Eclipse je, da prenese\u0161 izvedljivo razli\u010dico JAR Sweet Home 3D, ki je na voljo na <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>. Ko je prenesen, povleci in spusti datoteko SweetHome3D-7.5.jar na ikono projekta <em>VolumePlugin<\/em> v pogledu <em>Package Explorer<\/em> v Eclipse in izberi element <em>Build Path &gt; Add to Build Path<\/em> v kontekstnem meniju datoteke SweetHome3D-7.5.jar, kot je prikazano na sliki 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:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/addToBuildPath.png\" alt=\"\" class=\"wp-image-5846 lazyload\" data-srcset=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/addToBuildPath.png 452w, https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/addToBuildPath-300x104.png 300w, https:\/\/test.sweethome3d.eu\/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\">Slika 2. Dodajanje SweetHome3D-7.5.jar<br\/> v Build Path <\/figcaption><\/figure>\n<\/div>\n\n<h2 class=\"wp-block-heading programmingPlugin\">Programiranje vti\u010dnika<\/h2>\n\n<p>Zdaj, ko si namestil potrebna orodja, poglejmo, kako lahko programira\u0161 svoj prvi vti\u010dnik za Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">Ustvarjanje razreda vti\u010dnika<\/h3>\n\n<p>Najprej ustvari nov podrazred com.eteks.sweethome3d.plugin.Plugin tako, da izbere\u0161 element menija <em>Datoteka &gt; Novo &gt; Razred<\/em> v 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:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/newJavaClass.png\" alt=\"\" class=\"wp-image-5847 lazyload\" data-srcset=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/newJavaClass.png 418w, https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/newJavaClass-246x300.png 246w, https:\/\/test.sweethome3d.eu\/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\">Slika 3. Ustvarjanje novega razreda <\/figcaption><\/figure>\n<\/div>\n\n<p>V pogovornem oknu <em>Nov razred Java<\/em> vnesi VolumePlugin kot ime razreda, vnesi paket (tukaj je bil izbran paket com.eteks.test) in izberi com.eteks.sweethome3d.plugin.Plugin kot nadrazred VolumePlugin. Ko je to storjeno, klikni na <em>Dokon\u010daj<\/em>. Eclipse bo ustvaril datoteko novega razreda z naslednjo vsebino:  <\/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 Samodejno generirana metoda<br\/> return null;<br\/> }<br\/>}<\/pre>\n\n<p>Kot lahko ugane\u0161 iz komentarja TODO, mora\u0161 zdaj spremeniti implementacijo metode getActions, da vrne dejanje vti\u010dnika, ki lahko izra\u010duna prostornino premi\u010dnega pohi\u0161tva. Zamenjaj return null; z naslednjo izjavo: <\/p>\n\n<pre class=\"wp-block-preformatted\">  return new <strong>PluginAction<\/strong> [] {new <strong>VolumeAction<\/strong>()};  <\/pre>\n\n<p>in izberi <em>Urejanje &gt; Hitri popravek<\/em> iz menija Eclipse, da ustvari\u0161 manjkajo\u010di razred VolumeAction, kot je prikazano na sliki 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:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/quickFix.png\" alt=\"\" class=\"wp-image-5848 lazyload\" data-srcset=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/quickFix.png 615w, https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/quickFix-300x57.png 300w, https:\/\/test.sweethome3d.eu\/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\">Slika 4. Uporaba hitrega popravka za generiranje manjkajo\u010dega razreda <\/figcaption><\/figure>\n<\/div>\n\n<p>V pogovornem oknu <em>Nov razred Java<\/em>, ki se prika\u017ee, izberi potrditveno polje <em>Vklju\u010dujo\u010di tip<\/em>, da ustvari\u0161 notranji razred VolumePlugin, in klikni na <em>Dokon\u010daj<\/em>. To bo ustvarilo razred VolumeAction, ki podeduje od razreda com.eteks.sweethome3d.plugin.PluginAction in vsebuje prazno metodo execute: <\/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 Samodejno generirana metoda<br\/> }<br\/> }<\/pre>\n\n<p>To metodo bo Sweet Home 3D poklical, ko bo uporabnik zagnal dejanje vti\u010dnika; zato je to mesto, kjer mora\u0161 implementirati, kako izra\u010dunati prostornino pohi\u0161tva in jo prikazati:<\/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\/> \/\/ Izra\u010dunaj vsoto prostornine omejevalnega polja <br\/> \/\/ vsakega premi\u010dnega kosa pohi\u0161tva v domu<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\/> \/\/ Prika\u017ei rezultat v sporo\u010dilnem oknu (\u00b3 je za 3 v nadpisu)<br\/> String message = String. <strong>format<\/strong>(<br\/> \u201eNajve\u010dja prostornina premi\u010dnega pohi\u0161tva v domu je %.2f m\u00b3.\u201c, <br\/> volumeInCm3 \/ 1000000);<br\/> JOptionPane. <strong>showMessageDialog<\/strong>(null, message);<br\/>  }<br\/>  }<\/pre>\n\n<p>Zdaj, ko si dolo\u010dil, kaj \u017eeli\u0161, da vti\u010dnik naredi, mora\u0161 opisati, kako bo uporabnik zagnal to novo dejanje. Izbira\u0161 lahko med dodajanjem novega <strong>elementa menija<\/strong> v meni in\/ali novega <strong>gumba<\/strong> v orodno vrstico. Ta izbira se izvede z nastavitvijo ustreznih lastnosti dejanja vti\u010dnika ob njegovi ustvaritvi. Na primer, \u010de \u017eeli\u0161, da uporabniki za\u017eenejo dejanje prostornine z elementom menija <em>Izra\u010dunaj prostornino<\/em>, ki se nahaja v meniju <em>Orodja<\/em>, bo\u0161 dodal naslednji konstruktor razredu VolumnAction:   <\/p>\n\n<pre class=\"wp-block-preformatted\">  public <strong>VolumeAction<\/strong>() {<br\/>           <strong>putPropertyValue<\/strong>(Property.NAME, \u201eIzra\u010dunaj prostornino\u201c);<br\/>           <strong>putPropertyValue<\/strong>(Property.MENU, \u201eOrodja\u201c);<br\/> \/\/ Privzeto omogo\u010di dejanje<br\/>           <strong>setEnabled<\/strong>(true);<br\/> }<\/pre>\n\n<p>Razred vti\u010dnika <a href=\"\/examples\/VolumePlugin\/VolumePlugin.java\">VolumePlugin<\/a> je zdaj programiran in skoraj pripravljen za delovanje kot vti\u010dnik v Sweet Home 3D. Zadnji dve stvari, ki ju je treba narediti, sta: <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>ustvarjanje opisne datoteke <tt>ApplicationPlugin.properties<\/tt>,<\/li>\n\n\n\n<li>zdru\u017eevanje datotek v datoteko JAR.<br\/><\/li>\n<\/ul>\n\n<h3 class=\"wp-block-heading\" id=\"creating-the-plugin-description-file\">Ustvarjanje opisne datoteke vti\u010dnika<\/h3>\n\n<p>Datoteka <tt>ApplicationPlugin.properties<\/tt>\n opisuje ime vti\u010dnika, njegov razred, minimalne razli\u010dice Sweet Home 3D in Jave, pod katerimi je podprt,\n in pravne zadeve. Izberi <i>Datoteka &gt; Novo &gt; Datoteka<\/i> iz\n menija Eclipse, vnesi ime datoteke <tt>ApplicationPlugin.properties<\/tt> in klikni na <i>Dokon\u010daj<\/i>, kot je prikazano\n na sliki 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:\/\/test.sweethome3d.eu\/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:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/newFile.png 264w, https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/newFile-206x300.png 206w, https:\/\/test.sweethome3d.eu\/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\">Slika 5. Ustvarjanje nove datoteke <\/figcaption><\/figure>\n<\/div>\n\n<p>Nato v novo datoteko vnesi <a href=\"\/examples\/VolumePlugin\/ApplicationPlugin.properties\">naslednji opis<\/a> in jo shrani:<\/p>\n\n<pre class=\"wp-block-preformatted\"><strong>name<\/strong>=Prostornina premi\u010dnega pohi\u0161tva<br\/><strong>class<\/strong>=com.eteks.test.VolumePlugin<br\/><strong>description<\/strong>=Izra\u010duna prostornino premi\u010dnega pohi\u0161tva v domu<br\/><strong>version<\/strong>=1.0<br\/><strong>license<\/strong>=GNU GPL<br\/><strong>provider<\/strong>=(C) Avtorske pravice 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\">Ustvarjanje datoteke JAR vti\u010dnika<\/h3>\n\n<p>Datoteka JAR vti\u010dnika vsebuje datoteke <tt>razreda<\/tt>, ustvarjene s prevajanjem datoteke <tt>VolumePlugin.java<\/tt>,\n in datoteko <tt>ApplicationPlugin.properties<\/tt>. Ker Eclipse prevede datoteko Java takoj, ko jo shrani\u0161, mora\u0161\n samo izbrati <i>Datoteka &gt; Izvozi&#8230;<\/i> iz menija in izbrati <i>Java &gt; datoteka JAR<\/i> v pogovornem oknu <i>Izvozi<\/i>,\n ki se bo prikazalo. V \u010darovniku <i>Izvoz JAR<\/i>, ki se prika\u017ee, kot je prikazano na sliki 6, izberi potrditveno\n polje projekta in vnesi pot do datoteke JAR, shranjene v mapi z vti\u010dniki Sweet Home 3D. Ta ustrezna mapa je odvisna\n od tvojega sistema, kot sledi:   <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>  v sistemu Windows Vista \/ 7 \/ 8 \/ 10 \/ 11, je ta mapa <tt>C:\\Users\\<i>uporabnik<\/i>\\AppData\\Roaming\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li>  v sistemu Windows XP in prej\u0161njih razli\u010dicah sistema Windows, je ta mapa <tt>C:\\Documents and Settings\\<i>uporabnik<\/i>\\Application Data\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li>  v sistemu macOS, je to podmapa <tt>Library\/Application Support\/eTeks\/Sweet Home 3D\/<\/tt><tt>plugins<\/tt> tvoje\n uporabni\u0161ke mape,<\/li>\n\n\n\n<li>  v sistemu Linux in drugih sistemih Unix, je to podmapa <tt>.eteks\/sweethome3d\/<\/tt><tt>plugins<\/tt> tvoje uporabni\u0161ke mape.<\/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:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/jarExport.png\" alt=\"\" class=\"wp-image-5850 lazyload\" data-srcset=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/jarExport.png 499w, https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/jarExport-300x265.png 300w, https:\/\/test.sweethome3d.eu\/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\">Slika 6. Izvoz v datoteko JAR <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"testing-the-plugin\">Testiranje vti\u010dnika<\/h3>\n\n<p><a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">Vti\u010dnik<\/a>, ki si ga razvil, bo deloval v Sweet Home 3D, bodisi z razli\u010dico <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, razli\u010dico <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" target=\"_blank\" rel=\"noopener\">namestitvenih programov<\/a> ali z datoteko <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>, ki si jo prenesel prej. Ker je zadnja izvedljiva datoteka JAR, jo lahko za\u017eene\u0161 z dvojnim klikom nanjo ali z naslednjim ukazom: <\/p>\n\n<p><a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">Vti\u010dnik<\/a>, ki si ga razvil, bo deloval v Sweet Home 3D, bodisi z razli\u010dico <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, razli\u010dico <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" target=\"_blank\" rel=\"noopener\">namestitvenih programov<\/a> ali z datoteko <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>, ki si jo prenesel prej. Ker je zadnja izvedljiva datoteka JAR, jo lahko za\u017eene\u0161 z dvojnim klikom nanjo ali z naslednjim ukazom: <\/p>\n\n<pre class=\"wp-block-preformatted\">java -jar \/<em>path<\/em>\/<em>to<\/em>\/SweetHome3D-7.5.jar<\/pre>\n\n<p>Dokler testira\u0161, bo\u0161 verjetno raje zagnal Sweet Home 3D s tem ukazom, da bo\u0161 lahko v konzoli prebral sled izjem, ki so se pojavile med izvajanjem tvojega vti\u010dnika.<\/p>\n\n<p>Ko je Sweet Home 3D zagnan, bo\u0161 videl, da se prika\u017ee nov meni in njegov element, kot je prikazano na sliki 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:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/pluginMenu.png\" alt=\"\" class=\"wp-image-5851 lazyload\" data-srcset=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/pluginMenu.png 447w, https:\/\/test.sweethome3d.eu\/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\">Slika 7. Meni vti\u010dnika <\/figcaption><\/figure>\n<\/div>\n\n<p>\u010ce izbere\u0161 nov element menija za <a href=\"\/examples\/userGuideExample.sh3d\">primer doma<\/a>, ustvarjen v <a href=\"https:\/\/test.sweethome3d.eu\/sl\/uporabniski-vodnik-za-sweet-home-3d\/\" data-type=\"page\" data-id=\"424\">uporabni\u0161kem priro\u010dniku<\/a>, bo\u0161 dobil naslednji rezultat:<\/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:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/pluginInAction.png\" alt=\"\" class=\"wp-image-5853 lazyload\" data-srcset=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/pluginInAction.png 448w, https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/pluginInAction-300x92.png 300w, https:\/\/test.sweethome3d.eu\/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\">Slika 8. Vti\u010dnik v akciji <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Odpravljanje napak v vti\u010dniku<\/h3>\n\n<p>\u010ce mora\u0161 odpraviti napake v svojem vti\u010dniku iz Eclipse, ustvari konfiguracijo za odpravljanje napak tako, da sledi\u0161 tem korakom:<\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Izberi <i>Zagon &gt; Konfiguracije za odpravljanje napak&#8230;<\/i> iz menija, izberi element <i>Java Application<\/i> na seznamu razpolo\u017eljivih konfiguracij v pogovornem oknu \n          <i>Konfiguracije za odpravljanje napak<\/i>, klikni na gumb <i>Novo <\/i>zgoraj levo in vnesi ime za konfiguracijo.<\/li>\n\n\n\n<li>Klikni na gumb <i>I\u0161\u010di&#8230;<\/i> desno od besedilnega polja <i>Glavni razred<\/i> in dvoklikni na razred <i>SweetHome3DBootstrap<\/i> <br\/> med predlaganimi razredi.<\/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:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/debugConfiguration.png\" alt=\"\" class=\"wp-image-5854 lazyload\" data-srcset=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/debugConfiguration.png 629w, https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/debugConfiguration-300x186.png 300w, https:\/\/test.sweethome3d.eu\/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>Slika 9. Ustvarjanje konfiguracije za odpravljanje napak <\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Klikni na zavihek <em>Classpath<\/em>, izberi podpostavko <em>VolumePlugin (privzeti classpath)<\/em> elementa <em>Uporabni\u0161ki vnosi<\/em> na seznamu <em>Classpath<\/em> in klikni na gumb <em>Odstrani<\/em>.<\/li>\n\n\n\n<li>Klikni na element <em>Uporabni\u0161ki vnosi<\/em> na seznamu <em>Classpath<\/em>, klikni na gumb <em>Dodaj JAR-e&#8230;<\/em>, izberi element SweetHome3D-7.5.jar in potrdi svojo izbiro.<\/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:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/classpathConfiguration.png\" alt=\"\" class=\"wp-image-5855 lazyload\" data-srcset=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/classpathConfiguration.png 618w, https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/classpathConfiguration-300x234.png 300w, https:\/\/test.sweethome3d.eu\/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\">Slika 10. Nastavitev classpatha konfiguracije za odpravljanje napak <\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Izberi zavihek <em>Vir<\/em>, klikni na gumb <em>Dodaj&#8230;<\/em>, dvoklikni na element <em>Java Project<\/em> v pogovornem oknu <em>Dodaj vir<\/em>, izberi element <em>VolumePlugin<\/em> v pojavnem oknu <em>Izbira projekta<\/em> in potrdi svojo izbiro.<\/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:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration.png\" alt=\"\" class=\"wp-image-5856 lazyload\" data-srcset=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration.png 773w, https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration-300x213.png 300w, https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration-127x90.png 127w, https:\/\/test.sweethome3d.eu\/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>Slika 11. Nastavitev izvorne poti konfiguracije za odpravljanje napak <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Na koncu klikni na gumb <i>Odpravljanje napak<\/i>, da za\u017eene\u0161 Sweet Home 3D v na\u010dinu za odpravljanje napak. Ko se program izvaja, odpri datoteko <tt>VolumePlugin.java<\/tt>,\n nastavi prelomno to\u010dko v metodi <i>execute<\/i> in izberi <i>Orodja &gt; Izra\u010dunaj prostornino<\/i> iz menija Sweet Home 3D. Eclipse se bo ustavil na izbrani \n prelomni to\u010dki, da ti omogo\u010di izvajanje programa korak za korakom in pregledovanje vrednosti spremenljivk.  <\/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:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/eclipseDebug.png\" alt=\"\" class=\"wp-image-5857 lazyload\" data-srcset=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/eclipseDebug.png 601w, https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/eclipseDebug-300x199.png 300w, https:\/\/test.sweethome3d.eu\/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\">Slika 12. Perspektiva odpravljanja napak v Eclipse <\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-64989fb1 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" data-src=\"https:\/\/test.sweethome3d.eu\/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>Vsaki\u010d, ko spremeni\u0161 izvorno kodo svojega vti\u010dnika, ne pozabi <a href=\"#creatingPluginJAR\">generirati datoteke JAR vti\u010dnika<\/a>, preden za\u017eene\u0161 konfiguracijo za odpravljanje napak, ki si jo ustvaril. Za pospe\u0161itev postopka izvoza JAR v Eclipse, pojdi na drugi korak \u010darovnika za izvoz JAR in izberi mo\u017enost <em>Shrani opis te datoteke JAR v delovni prostor<\/em>. To bo dodalo nov element v projekt s kontekstnim elementom menija <em>Ustvari JAR<\/em>.  <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"deployingPlugin\">Uvedba vti\u010dnika<\/h3>\n\n<p>Ko je pripravljen, lahko tvoj vti\u010dnik namesti\u0161 na ra\u010dunalnike drugih uporabnikov Sweet Home 3D tako, da ga preprosto kopira\u0161 v njihovo <a href=\"#creatingPluginJAR\">mapo z vti\u010dniki<\/a>. Od razli\u010dice 1.6 naprej se datoteka vti\u010dnika lahko namesti tudi v mapo z vti\u010dniki Sweet Home 3D z dvojnim klikom nanjo, \u010de je njena raz\u0161iritev SH3P (preprosto spremeni raz\u0161iritev datoteke iz .zip v .sh3p). \u010ce dvojni klik na datoteko .sh3p ne za\u017eene Sweet Home 3D (najverjetneje v sistemu Linux), lahko vti\u010dnik namesti\u0161 tudi z naslednjim ukazom v oknu <em>Terminala<\/em> (kjer <code>SweetHome3D<\/code> je ime izvedljive datoteke, ki je prilo\u017eena namestitvenim programom Sweet Home 3D):<\/p>\n\n<pre class=\"wp-block-preformatted\"><em>\/path\/to\/<\/em>SweetHome3D <em>\/path\/to\/<\/em>plugin.sh3p<\/pre>\n\n<p>\u010ce \u017eeli\u0161 prenehati uporabljati vti\u010dnik, odstrani njegovo datoteko iz mape z vti\u010dniki in ponovno za\u017eeni 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:\/\/test.sweethome3d.eu\/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>\u010ce \u017eeli\u0161, da tvoj vti\u010dnik deluje z vsemi <a href=\"https:\/\/test.sweethome3d.eu\/sl\/prenos\/\">namestitvenimi programi Sweet Home 3D<\/a>, ki so na voljo na tej spletni strani, poskrbi, da bo skladen z Javo 5, tako da izbere\u0161 <code>1.5<\/code> v polju <em>Raven skladnosti prevajalnika<\/em>, ki je na voljo v razdelku <em>Java Compiler<\/em> pogovornega okna, prikazanega z elementom menija <em>Projekt &gt; Lastnosti<\/em> v Eclipse.<br\/>\u010ce uporablja\u0161 razli\u010dico prevajalnika Java, kjer zdru\u017eljivost z Javo 1.5 ni ve\u010d na voljo, poskusi ciljati vsaj na Javo 1.8, ki se \u0161e vedno uporablja v novej\u0161ih razli\u010dicah Sweet Home 3D, in ustrezno nastavi <code>javaMinimumVersion<\/code> v <code>ApplicationPlugin.properties<\/code> datoteki svojega vti\u010dnika.<\/p>\n<\/div>\n\n<h2 class=\"wp-block-heading\" id=\"goingFurther\">Nadaljevanje<\/h2>\n\n<p>Programiranje prvega vti\u010dnika ti je pokazalo \u0161ir\u0161o sliko. Tukaj je nekaj dodatnih informacij, ki ti bodo pomagale pri nadaljnjem delu. <\/p>\n\n<h3 class=\"wp-block-heading\">Sweet Home 3D API &#8211; Javadoc<\/h3>\n\n<p>Najbolj uporabna dokumentacija za razvoj novega vti\u010dnika je <a href=\"\/javadoc\/index.html\">API Sweet Home 3D<\/a> (Application Programming Interface), ustvarjen z orodjem javadoc.<br\/>V svojem vti\u010dniku uporabljaj samo razrede paketov <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> in <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/viewcontroller\/package-summary.html\">com.eteks.sweethome3d.viewcontroller<\/a>, \u010de \u017eeli\u0161, da bo zdru\u017eljiv z bodo\u010dimi razli\u010dicami Sweet Home 3D. To bo v veliki meri dovolj za programiranje katerega koli vti\u010dnika, ki deluje na podatkih o domu, ki so na voljo v Sweet Home 3D.<br\/>Paketi, ki ustrezajo drugim plastem programa, so vklju\u010deni v Javadoc samo za informativne namene. Ne zana\u0161aj se na njihov API, saj se lahko v prihodnosti \u0161e spremeni brez garancije za zdru\u017eljivost navzgor (kakorkoli, v prej omenjenih paketih ne bo\u0161 videl reference na razred paketov <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> ali <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/package-summary.html\">com.eteks.sweethome3d<\/a>).  <\/p>\n\n<h3 class=\"wp-block-heading\">Arhitektura razredov modela<\/h3>\n\n<p>Sweet Home 3D temelji na arhitekturi MVC (Model View Controller), zato je razumevanje organizacije njegove plasti modela bistveno. Slika 13 (na voljo tudi v <a href=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/modelClassesDiagram.png\">formatu PDF<\/a>) prikazuje skoraj vse razrede in vmesnike, ki so na voljo v razli\u010dici 1.5 paketa <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/package-summary.html\">com.eteks.sweethome3d.model<\/a>, ki ustreza tej plasti modela. <\/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>Osrednji razred v plasti modela je razred <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeApplication.html\">HomeApplication<\/a> (10), abstraktni nadrazred glavnega razreda aplikacije <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/SweetHome3D.html\">SweetHome3D<\/a>. Instanca tega razreda omogo\u010da dostop do trenutno urejenih instanc <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) in do objekta <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/UserPreferences.html\">UserPreferences<\/a> (11), ki shranjuje uporabljeno <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/LengthUnit.html\">mersko enoto<\/a> (12), <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCatalog.html\">katalog pohi\u0161tva<\/a> (14) in <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCatalog.html\">katalog tekstur<\/a> (15), iz katerih uporabnik izbira <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogPieceOfFurniture.html\">kose pohi\u0161tva<\/a> (17) in <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogTexture.html\">teksture<\/a> (18).<br\/>Instanca <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) shranjuje vse objekte, ki jih je uporabnik ustvaril v na\u010drtu doma: <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>seznam objektov <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomePieceOfFurniture.html\">HomePieceOfFurniture<\/a> (13), ki implementirajo vmesnik <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">PieceOfFurniture<\/a> (16),<\/li>\n\n\n\n<li>zbirka objektov <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Wall<\/a> (9),<\/li>\n\n\n\n<li>seznam objektov <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Room<\/a> (5),<\/li>\n\n\n\n<li>zbirka objektov <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/DimensionLine.html\">DimensionLine<\/a> (2),<\/li>\n\n\n\n<li>zbirka objektov <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Label.html\">Label<\/a> (3).<\/li>\n<\/ul>\n\n<p>Ti objekti implementirajo vmesnik <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Selectable.html\">Selectable<\/a> (1) ter objekt <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/ObserverCamera.html\">ObserverCamera<\/a> (4), ki shranjuje lokacijo kamere v na\u010dinu <em>Virtualni obiskovalec<\/em>. Vse zunanje informacije, ki jih upravljajo objekti modela, kot so ikona in 3D model <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">kosa pohi\u0161tva<\/a> (16) ali slika <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextureImage.html\">teksture<\/a> (20), so dostopne preko vmesnika <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Content.html\">Content<\/a> (19), ki ga implementirajo razred <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/URLContent.html\">URLContent<\/a> in drugi razredi paketa <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/package-summary.html\">com.eteks.sweethome3d.tools<\/a>. <\/p>\n\n<p>Ta UML diagram ti naj pomaga razumeti, kateri razredi so na voljo v modelu Sweet Home 3D in kako lahko do njih dostopa\u0161, vendar bo\u0161 verjetno opazil, da v njem niso navedeni nobeni konstruktorji in mutatorji (ali setterji, \u010de ti je ljub\u0161e). To je zgolj zaradi pomanjkanja prostora, vendar jih lahko brez te\u017eav uporablja\u0161 v razredu vti\u010dnika. Upo\u0161tevaj tudi, da bo vsaka sprememba obstoje\u010dega objekta modela sporo\u010dena prikazanim komponentam bodisi z <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/beans\/PropertyChangeEvent.html\" target=\"_blank\" rel=\"noopener\">PropertyChangeEvent<\/a>i, z <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionEvent.html\">CollectionEvent<\/a>i (8) ali z <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionEvent.html\">SelectionEvent<\/a>i (6), kar omogo\u010da, da se vse spremembe takoj odrazijo na zaslonu.  <\/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:\/\/test.sweethome3d.eu\/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:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/11\/Frame-281.png 190w, https:\/\/test.sweethome3d.eu\/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>Model Sweet Home 3D <strong>ni<\/strong> varen za niti (thread safe) zaradi razlogov zmogljivosti. Vse <strong>spremembe<\/strong> objekta, ki pripada modelu, je treba izvesti v niti za po\u0161iljanje dogodkov (Event Dispatch Thread). <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Arhitektura razredov vti\u010dnikov<\/h3>\n\n<p>Arhitektura razredov vti\u010dnikov je veliko enostavnej\u0161a za razumevanje kot arhitektura plasti modela. Paket <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/package-summary.html\">com.eteks.sweethome3d.plugin<\/a> vsebuje samo tri razrede, med katerimi naj bi uporabljal le razreda <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> in <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, kot je prikazano na sliki 14 (na voljo tudi v <a href=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/pluginClassesDiagram.png\">formatu PDF<\/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>Instanca <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginManager.html\">PluginManager<\/a> (1) se ustvari ob zagonu aplikacije in poi\u0161\u010de vti\u010dnike, name\u0161\u010dene v uporabnikovi <a href=\"#creating-the-plugin-jar\">mapi vti\u010dnikov<\/a>. Vsaki\u010d, ko se ureja nov dom, ta upravitelj instancira in konfigurira objekt <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> (3) za vsak vti\u010dnik, najden ob zagonu. Nato pokli\u010de metodo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getActions()\">getActions<\/a> za pridobitev vseh <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">dejanj<\/a> (4), ki bodo dodana kot menijski elementi in\/ali gumbi orodne vrstice v oknu doma. Vsako dejanje je instanca <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, ki je podobna razredu <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/Action.html\" target=\"_blank\" rel=\"noopener\">Action<\/a>, s svojo metodo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#execute()\">execute<\/a> in svojimi spremenljivimi <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.Property.html\">lastnostmi<\/a> (2).   <\/p>\n\n<p>Upo\u0161tevaj, da ti razred <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> omogo\u010da dostop do instance <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEditSupport.html\" target=\"_blank\" rel=\"noopener\">UndoableEditSupport<\/a> preko svoje metode <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getUndoableEditSupport()\">getUndoableEditSupport<\/a>. Takoj ko spremeni\u0161 dom ali njegove objekte (pohi\u0161tvo, stene &#8230;) v metodi execute instance <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, mora\u0161 tudi objaviti objekt <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEdit.html\" target=\"_blank\" rel=\"noopener\">UndoableEdit<\/a> podpori za razveljavitev urejanja, ki jo vrne metoda getUndoableEditSupport, sicer uporabniki ne bodo mogli pravilno razveljaviti\/ponoviti sprememb, ki si jih naredil. <\/p>\n\n<h3 class=\"wp-block-heading\">Lokalizacija<\/h3>\n\n<p>\u010ce namerava\u0161 razviti vti\u010dnik za skupnost uporabnikov Sweet Home 3D, poskusi lokalizirati nize, ki jih prikazuje, bodisi v imenu dejanj in meniju ali v pogovornih oknih, ki jih bo\u0161 ustvaril (ali vsaj pripravi njegovo lokalizacijo). Dva <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#PluginAction(java.lang.String,%20java.lang.String,%20java.lang.ClassLoader)\">konstruktorja razreda PluginAction<\/a> ti bosta pomagala organizirati prevajanje lastnosti dejanj z datotekami .properties, in \u010de mora\u0161 prevesti druge nize v svojem vti\u010dniku (kot je tisti v pogovornem oknu, ki ga prikazuje <a href=\"#testing-the-plugin\">testirani vti\u010dnik<\/a>), ponovno uporabi te datoteke .properties z razredom Java <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/util\/ResourceBundle.html\" target=\"_blank\" rel=\"noopener\">ResourceBundle<\/a>.<br\/>\u010ce raje omeji\u0161 \u0161tevilo datotek z lastnostmi, lahko celo zapi\u0161e\u0161 vrednosti lastnosti dejanj in drugih nizov v <a href=\"#creating-the-plugin-description-file\">opisno datoteko<\/a> ApplicationPlugin.properties svojega vti\u010dnika. <\/p>\n\n<p>\u010ce \u017eeli\u0161 primer, ki uporablja to arhitekturo, prenesi vti\u010dnik <em>Export to SH3F<\/em>, ki je na voljo na <a href=\"\/storage\/plugins\/ExportToSH3F-1.0.sh3p\">https:\/\/test.sweethome3d.eu\/plugins\/ExportToSH3F-1.0.sh3p<\/a>, in ga razpakiraj (ta datoteka vti\u010dnika vsebuje tudi izvorno kodo vti\u010dnika).<br\/>Kot je opisano v <a href=\"https:\/\/sourceforge.net\/forum\/message.php?msg_id=5837358\" target=\"_blank\" rel=\"noopener\">forumu za pomo\u010d<\/a>, ta vti\u010dnik ustvari datoteko SH3F, ki vsebuje vse pohi\u0161tvo, ki si ga uvozil v katalog pohi\u0161tva Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">Prispevanje vti\u010dnikov<\/h3>\n\n<p>Vti\u010dnike, ki si jih programiral, lahko objavi\u0161 v sistemu za sledenje <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/\" target=\"_blank\" rel=\"noopener\">Plug-ins Contributions<\/a>, da jih deli\u0161 s skupnostjo uporabnikov Sweet Home 3D.<br\/>V Sweet Home 3D je mogo\u010de dodati \u0161tevilne funkcije zahvaljujo\u010d vti\u010dnikom, od uvoznikov do izvoznikov, pa tudi vti\u010dnike, ki lahko spreminjajo podatke o domu, kot je <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/1\/\" target=\"_blank\" rel=\"noopener\">vti\u010dnik Home Rotator<\/a>, ki ga je razvil Michel Mbem, in drugi, navedeni v <a href=\"\/storage\/pluginsUserGuide.pdf\">vadnici za vti\u010dnike in raz\u0161iritve<\/a> (PDF), ki jo je napisal Hans Dirkse, in na strani <a href=\"https:\/\/test.sweethome3d.eu\/plugins\/\" data-type=\"page\" data-id=\"437\">Vti\u010dniki in orodja<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uvod Od razli\u010dice 1.5 naprej je mogo\u010de dodati nove funkcije v Sweet Home 3D z datotekami vti\u010dnikov, ki so shranjene v tvoji mapi z vti\u010dniki. To omogo\u010da programerjem Jave, da razvijajo in distribuirajo nove funkcije za Sweet Home 3D, ne da bi spreminjali izvorne datoteke trenutne razli\u010dice (kar je dobro za zdru\u017eljivost navzgor) in ne<a href=\"https:\/\/test.sweethome3d.eu\/sl\/vodnik-za-razvijalce-vticnikov\/\">Continue reading <span class=\"sr-only\">&#8220;Vodnik za razvijalce vti\u010dnikov&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":11715,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-resources.php","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-11726","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/test.sweethome3d.eu\/sl\/wp-json\/wp\/v2\/pages\/11726","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.sweethome3d.eu\/sl\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/test.sweethome3d.eu\/sl\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/test.sweethome3d.eu\/sl\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/test.sweethome3d.eu\/sl\/wp-json\/wp\/v2\/comments?post=11726"}],"version-history":[{"count":2,"href":"https:\/\/test.sweethome3d.eu\/sl\/wp-json\/wp\/v2\/pages\/11726\/revisions"}],"predecessor-version":[{"id":12447,"href":"https:\/\/test.sweethome3d.eu\/sl\/wp-json\/wp\/v2\/pages\/11726\/revisions\/12447"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/test.sweethome3d.eu\/sl\/wp-json\/wp\/v2\/media\/11715"}],"wp:attachment":[{"href":"https:\/\/test.sweethome3d.eu\/sl\/wp-json\/wp\/v2\/media?parent=11726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}