{"id":11674,"date":"2025-11-05T16:28:15","date_gmt":"2025-11-05T16:28:15","guid":{"rendered":"https:\/\/test.sweethome3d.eu\/przewodnik-programisty-wtyczek\/"},"modified":"2025-12-19T10:19:41","modified_gmt":"2025-12-19T10:19:41","slug":"przewodnik-programisty-wtyczek","status":"publish","type":"page","link":"https:\/\/test.sweethome3d.eu\/pl\/przewodnik-programisty-wtyczek\/","title":{"rendered":"Przewodnik programisty wtyczek"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Wprowadzenie<\/h2>\n\n<p>Od wersji 1.5 mo\u017cliwe jest dodawanie nowych funkcji do <a href=\"\/\">Sweet Home 3D<\/a> za pomoc\u0105 plik\u00f3w wtyczek umieszczonych w <a href=\"#deployingPlugin\">folderze wtyczek<\/a>. Pozwala to programistom Java na tworzenie i rozpowszechnianie nowych funkcji dla Sweet Home 3D bez modyfikowania plik\u00f3w \u017ar\u00f3d\u0142owych bie\u017c\u0105cej wersji (co jest dobre dla zgodno\u015bci wstecznej) i bez dostarczania pe\u0142nej wersji programu (co jest korzystne ze wzgl\u0119du na rozmiar). <br\/>Ten dokument opisuje <a href=\"#installingTools\" data-type=\"internal\" data-id=\"#installingTools\">narz\u0119dzia<\/a> wymagane do tworzenia wtyczek, nast\u0119pnie pokazuje jak <a href=\"#programmingPlugin\">zaprogramowa\u0107 wtyczk\u0119<\/a>, kt\u00f3ra oblicza maksymaln\u0105 obj\u0119to\u015b\u0107 ruchomych mebli dodanych do domu, a na ko\u0144cu podaje <a href=\"#goingFurther\">dodatkowe informacje<\/a>, kt\u00f3re pomog\u0105 Ci p\u00f3j\u015b\u0107 dalej. <\/p>\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n<h2 class=\"wp-block-heading\" id=\"installingTools\">Instalacja narz\u0119dzi programistycznych<\/h2>\n\n<p>Chocia\u017c Sweet Home 3D jest przeznaczony dla og\u00f3lnego odbiorcy, tworzenie wtyczek wymaga specjalnych umiej\u0119tno\u015bci i powiniene\u015b wiedzie\u0107, jak programowa\u0107 w <a href=\"https:\/\/java.sun.com\" target=\"_blank\" rel=\"noopener\">Java<\/a> u\u017cywaj\u0105c IDE<a href=\"https:\/\/ant.apache.org\/\" target=\"_blank\" rel=\"noopener\"><\/a>, zanim p\u00f3jdziesz dalej. Ten przewodnik pokazuje, jak zbudowa\u0107 wtyczk\u0119 w <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">Eclipse<\/a>, ale mo\u017cesz u\u017cy\u0107 dowolnego IDE wed\u0142ug w\u0142asnego wyboru lub nie u\u017cywa\u0107 IDE wcale. <\/p>\n\n<h3 class=\"wp-block-heading\">Pobierz i zainstaluj Eclipse<\/h3>\n\n<p>Najpierw pobierz Eclipse z <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.eclipse.org\/<\/a>. Wersja nazwana <em>Eclipse IDE for Java Developers<\/em> jest wystarczaj\u0105ca do tworzenia wtyczek, ale mo\u017cesz pobra\u0107 dowoln\u0105 wersj\u0119 do programowania w Java. <br\/>Po pobraniu, instalacja Eclipse jest bardzo prosta: wystarczy rozpakowa\u0107 archiwum, otworzy\u0107 folder eclipse i w zale\u017cno\u015bci od systemu uruchomi\u0107 plik o nazwie  <code>eclipse.exe<\/code>  (w Windows),  <code>eclipse.app<\/code>  (w Mac OS X) lub  <code>eclipse<\/code>  (w Linux).<br\/>Przy pierwszym uruchomieniu Eclipse poprosi Ci\u0119 o wybranie folderu <em>workspace<\/em>, w kt\u00f3rym b\u0119d\u0105 przechowywane projekty wtyczek.<br\/>Po zako\u0144czeniu wybierz <em>File &gt; New &gt; Project<\/em> z menu, aby utworzy\u0107 nowy projekt, wybierz <em>Java &gt; Java project<\/em> w kreatorze <em>New project<\/em>, kt\u00f3ry zostanie wy\u015bwietlony, wpisz VolumePlugin jako nazw\u0119 projektu i kliknij przycisk <em>Finish<\/em>. Na koniec zamknij zak\u0142adk\u0119 <em>Welcome<\/em>, aby zobaczy\u0107 sw\u00f3j workspace jak pokazano na rysunku 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\">Rysunek 1. Workspace Eclipse <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Pobierz i zainstaluj bibliotek\u0119 Sweet Home 3D<\/h3>\n\n<p>Tworzenie wtyczki opiera si\u0119 na niekt\u00f3rych klasach Sweet Home 3D, kt\u00f3re Eclipse musi zna\u0107, aby m\u00f3c zbudowa\u0107 Tw\u00f3j projekt. Naj\u0142atwiejszym sposobem dodania klas Sweet Home 3D do Eclipse jest pobranie wersji JAR Sweet Home 3D dost\u0119pnej pod adresem <g id=\"gid_0\">https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download<\/g>. Po pobraniu, przeci\u0105gnij i upu\u015b\u0107 plik SweetHome3D-7.5.jar na ikon\u0119 projektu <em>VolumePlugin<\/em> w widoku <em>Package Explorer<\/em> w Eclipse, i wybierz pozycj\u0119 <em>Build Path &gt; Add to Build Path<\/em> z menu kontekstowego pliku SweetHome3D-7.5.jar, jak pokazano na rysunku 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\">Rysunek 2. Dodawanie SweetHome3D-7.5.jar<br\/> do Build Path <\/figcaption><\/figure>\n<\/div>\n\n<h2 class=\"wp-block-heading programmingPlugin\">Programowanie wtyczki<\/h2>\n\n<p>Teraz, gdy zainstalowa\u0142e\u015b wymagane narz\u0119dzia, zobaczmy jak mo\u017cesz zaprogramowa\u0107 swoj\u0105 pierwsz\u0105 wtyczk\u0119 dla Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">Tworzenie klasy wtyczki<\/h3>\n\n<p>Najpierw utw\u00f3rz now\u0105 podklas\u0119 com.eteks.sweethome3d.plugin.Plugin wybieraj\u0105c z menu Eclipse pozycj\u0119 <em>File &gt; New &gt; Class<\/em>.<\/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\">Rysunek 3. Tworzenie nowej klasy <\/figcaption><\/figure>\n<\/div>\n\n<p>W oknie dialogowym <em>New Java Class<\/em> wpisz VolumePlugin jako nazw\u0119 klasy, wprowad\u017a pakiet (tutaj wybrany pakiet to com.eteks.test) i wybierz com.eteks.sweethome3d.plugin.Plugin jako klas\u0119 nadrz\u0119dn\u0105 dla VolumePlugin. Po zako\u0144czeniu kliknij <em>Finish<\/em>. Eclipse utworzy plik nowej klasy z nast\u0119puj\u0105c\u0105 zawarto\u015bci\u0105:  <\/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>Jak mo\u017cesz si\u0119 domy\u015bli\u0107 z komentarza TODO, musisz teraz zmieni\u0107 implementacj\u0119 metody getActions, aby zwraca\u0142a akcj\u0119 wtyczki zdoln\u0105 do obliczenia obj\u0119to\u015bci ruchomych mebli. Zast\u0105p return null; nast\u0119puj\u0105c\u0105 instrukcj\u0105: <\/p>\n\n<pre class=\"wp-block-preformatted\">  return new <strong>PluginAction<\/strong> [] {new <strong>VolumeAction<\/strong>()};  <\/pre>\n\n<p>i wybierz <em>Edition &gt; Quick Fix<\/em> z menu Eclipse, aby utworzy\u0107 brakuj\u0105c\u0105 klas\u0119 VolumeAction, jak pokazano na rysunku 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\">Rysunek 4. U\u017cywanie Quick fix do wygenerowania brakuj\u0105cej klasy <\/figcaption><\/figure>\n<\/div>\n\n<p>W oknie dialogowym <em>New Java Class<\/em>, kt\u00f3re si\u0119 pojawi, zaznacz pole wyboru <em>Enclosing type<\/em>, aby utworzy\u0107 klas\u0119 wewn\u0119trzn\u0105 VolumePlugin i kliknij <em>Finish<\/em>. Spowoduje to utworzenie klasy VolumeAction, kt\u00f3ra dziedziczy po klasie com.eteks.sweethome3d.plugin.PluginAction i zawiera pust\u0105 metod\u0119 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 Auto-generated method stub<br\/> }<br\/> }<\/pre>\n\n<p>Ta metoda zostanie wywo\u0142ana przez Sweet Home 3D, gdy u\u017cytkownik uruchomi akcj\u0119 wtyczki; to w\u0142a\u015bnie tutaj musisz zaimplementowa\u0107 spos\u00f3b obliczania obj\u0119to\u015bci mebli i wy\u015bwietlania jej:<\/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\/> \/\/ Oblicz sum\u0119 obj\u0119to\u015bci prostopad\u0142o\u015bcianu ograniczaj\u0105cego <br\/> \/\/ ka\u017cdy ruchomy mebel w 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\/> \/\/ Wy\u015bwietl wynik w oknie komunikatu (\u00b3 to 3 w indeksie g\u00f3rnym)<br\/> String message = String. <strong>format<\/strong>(<br\/> \"Maksymalna obj\u0119to\u015b\u0107 ruchomych mebli w domu wynosi %.2f m\u00b3.\", <br\/> volumeInCm3 \/ 1000000);<br\/> JOptionPane. <strong>showMessageDialog<\/strong>(null, message);<br\/>  }<br\/>  }<\/pre>\n\n<p>Teraz, gdy okre\u015bli\u0142e\u015b, co ma robi\u0107 wtyczka, musisz opisa\u0107, jak u\u017cytkownik b\u0119dzie uruchamia\u0142 t\u0119 now\u0105 akcj\u0119. Masz do wyboru dodanie nowej <strong>pozycji menu<\/strong> do menu i\/lub nowego <strong>przycisku<\/strong> do paska narz\u0119dzi. Wyboru dokonuje si\u0119 ustawiaj\u0105c odpowiednie w\u0142a\u015bciwo\u015bci akcji wtyczki przy jej tworzeniu. Na przyk\u0142ad, je\u015bli chcesz, aby u\u017cytkownicy uruchamiali akcj\u0119 obliczania obj\u0119to\u015bci za pomoc\u0105 pozycji menu <em>Oblicz obj\u0119to\u015b\u0107<\/em> znajduj\u0105cej si\u0119 w menu <em>Narz\u0119dzia<\/em>, dodasz nast\u0119puj\u0105cy konstruktor do klasy VolumeAction:   <\/p>\n\n<pre class=\"wp-block-preformatted\">  public <strong>VolumeAction<\/strong>() {<br\/>           <strong>putPropertyValue<\/strong>(Property.NAME, \"Oblicz obj\u0119to\u015b\u0107\");<br\/>           <strong>putPropertyValue<\/strong>(Property.MENU, \"Narz\u0119dzia\");<br\/> \/\/ Domy\u015blnie w\u0142\u0105cza akcj\u0119<br\/>           <strong>setEnabled<\/strong>(true);<br\/> }<\/pre>\n\n<p>Klasa wtyczki <a href=\"\/examples\/VolumePlugin\/VolumePlugin.java\">VolumePlugin<\/a> jest teraz zaprogramowana i prawie gotowa do dzia\u0142ania jako wtyczka w Sweet Home 3D. Pozosta\u0142y dwie ostatnie rzeczy do zrobienia: <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>utworzenie pliku opisu <tt>ApplicationPlugin.properties<\/tt><\/li>\n\n\n\n<li>umieszczenie plik\u00f3w razem w pliku JAR.<br\/><\/li>\n<\/ul>\n\n<h3 class=\"wp-block-heading\" id=\"creating-the-plugin-description-file\">Tworzenie pliku opisu wtyczki<\/h3>\n\n<p>Plik <tt>ApplicationPlugin.properties<\/tt>\n opisuje nazw\u0119 wtyczki, jej klas\u0119, minimalne wersje Sweet Home 3D i Java, pod kt\u00f3rymi jest obs\u0142ugiwana,\n oraz kwestie prawne. Wybierz <i>File &gt; New &gt; File<\/i> z\n menu Eclipse, wprowad\u017a nazw\u0119 pliku <tt>ApplicationPlugin.properties<\/tt> i kliknij <i>Finish<\/i>, jak pokazano\n na rysunku 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\">Rysunek 5. Tworzenie nowego pliku <\/figcaption><\/figure>\n<\/div>\n\n<p>Nast\u0119pnie wprowad\u017a <a href=\"\/examples\/VolumePlugin\/ApplicationPlugin.properties\">nast\u0119puj\u0105cy opis<\/a> w nowym pliku i zapisz go:<\/p>\n\n<pre class=\"wp-block-preformatted\"><strong>name<\/strong>=Obj\u0119to\u015b\u0107 ruchomych mebli<br\/><strong>class<\/strong>=com.eteks.test.VolumePlugin<br\/><strong>description<\/strong>=Oblicza obj\u0119to\u015b\u0107 ruchomych mebli w domu<br\/><strong>version<\/strong>=1.0<br\/><strong>license<\/strong>=GNU GPL<br\/><strong>provider<\/strong>=(C) Prawa autorskie 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\">Tworzenie pliku JAR wtyczki<\/h3>\n\n<p>Plik JAR wtyczki zawiera pliki <tt>class<\/tt> utworzone z kompilacji pliku <tt>VolumePlugin.java<\/tt>,\n oraz plik <tt>ApplicationPlugin.properties<\/tt>. Poniewa\u017c Eclipse kompiluje plik Java zaraz po jego zapisaniu,\n wystarczy wybra\u0107 <i>File &gt; Export&#8230;<\/i> z menu i wybra\u0107 <i>Java &gt; JAR file<\/i> w oknie dialogowym <i>Export<\/i>,\n kt\u00f3re zostanie wy\u015bwietlone. W kreatorze <i>Jar Export<\/i>, kt\u00f3ry pojawi si\u0119 jak pokazano na rysunku 6, zaznacz pole wyboru projektu\n i wprowad\u017a \u015bcie\u017ck\u0119 do pliku JAR umieszczonego w folderze wtyczek Sweet Home 3D. Odpowiedni folder zale\u017cy\n od Twojego systemu w nast\u0119puj\u0105cy spos\u00f3b:   <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>  w Windows Vista \/ 7 \/ 8 \/ 10 \/ 11, ten folder to <tt>C:Users<i>u\u017cytkownik<\/i>AppDataRoamingeTeksSweet\n Home 3Dplugins<\/tt>,<\/li>\n\n\n\n<li>  w Windows XP i poprzednich wersjach Windows, ten folder to <tt>C:Documents and Settings<i>u\u017cytkownik<\/i>Application DataeTeksSweet\n Home 3Dplugins<\/tt>,<\/li>\n\n\n\n<li>  w macOS, to podfolder <tt>Library\/Application Support\/eTeks\/Sweet Home 3D\/<\/tt><tt>plugins<\/tt> w Twoim\n folderze u\u017cytkownika,<\/li>\n\n\n\n<li>  w Linux i innych systemach Unix, to podfolder <tt>.eteks\/sweethome3d\/<\/tt><tt>plugins<\/tt> w Twoim folderze u\u017cytkownika.<\/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\">Rysunek 6. Eksportowanie do pliku JAR <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"testing-the-plugin\">Testowanie wtyczki<\/h3>\n\n<p><a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">Wtyczka<\/a>, kt\u00f3r\u0105 stworzy\u0142e\u015b, b\u0119dzie dzia\u0142a\u0107 w Sweet Home 3D, zar\u00f3wno w wersji <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, wersji <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" target=\"_blank\" rel=\"noopener\">instalacyjnej<\/a>, jak i w <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>, kt\u00f3ry pobra\u0142e\u015b wcze\u015bniej. Poniewa\u017c ten ostatni jest wykonywalnym plikiem JAR, mo\u017cesz go uruchomi\u0107 przez podw\u00f3jne klikni\u0119cie lub za pomoc\u0105 nast\u0119puj\u0105cego polecenia: <\/p>\n\n<p><a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">Wtyczka<\/a>, kt\u00f3r\u0105 stworzy\u0142e\u015b, b\u0119dzie dzia\u0142a\u0107 w Sweet Home 3D, zar\u00f3wno w wersji <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, wersji <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" target=\"_blank\" rel=\"noopener\">instalacyjnej<\/a>, jak i w <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>, kt\u00f3ry pobra\u0142e\u015b wcze\u015bniej. Poniewa\u017c ten ostatni jest wykonywalnym plikiem JAR, mo\u017cesz go uruchomi\u0107 przez podw\u00f3jne klikni\u0119cie lub za pomoc\u0105 nast\u0119puj\u0105cego polecenia: <\/p>\n\n<pre class=\"wp-block-preformatted\">java -jar \/<em>\u015bcie\u017cka<\/em>\/<em>do<\/em>\/SweetHome3D-7.5.jar<\/pre>\n\n<p>Dop\u00f3ki testujesz, prawdopodobnie b\u0119dziesz wola\u0142 uruchamia\u0107 Sweet Home 3D za pomoc\u0105 tego polecenia, aby m\u00f3c odczyta\u0107 w konsoli \u015blad stosu wyj\u0105tk\u00f3w rzucanych podczas wykonywania Twojej wtyczki.<\/p>\n\n<p>Po uruchomieniu Sweet Home 3D zobaczysz nowe menu i jego pozycj\u0119, jak pokazano na rysunku 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\">Rysunek 7. Menu wtyczki <\/figcaption><\/figure>\n<\/div>\n\n<p>Je\u015bli wybierzesz now\u0105 pozycj\u0119 menu dla <a href=\"\/examples\/userGuideExample.sh3d\">przyk\u0142adowego domu<\/a> utworzonego w <a href=\"https:\/\/test.sweethome3d.eu\/pl\/przewodnik-uzytkownika-sweet-home-3d\/\" data-type=\"page\" data-id=\"424\">przewodniku u\u017cytkownika<\/a>, otrzymasz nast\u0119puj\u0105cy wynik:<\/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\">Rysunek 8. Wtyczka w dzia\u0142aniu <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Debugowanie wtyczki<\/h3>\n\n<p>Je\u015bli potrzebujesz debugowa\u0107 swoj\u0105 wtyczk\u0119 z Eclipse, utw\u00f3rz konfiguracj\u0119 debugowania wykonuj\u0105c nast\u0119puj\u0105ce kroki:<\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Wybierz <i>Run &gt; Debug Configurations&#8230;<\/i> z menu, wybierz pozycj\u0119 <i>Java Application<\/i> z listy dost\u0119pnych konfiguracji w oknie dialogowym \n          <i>Debug configurations<\/i>, kliknij przycisk <i>New <\/i>w lewym g\u00f3rnym rogu i wprowad\u017a nazw\u0119 dla konfiguracji.<\/li>\n\n\n\n<li>Kliknij przycisk <i>Search&#8230;<\/i> po prawej stronie pola tekstowego <i>Main class<\/i> i kliknij dwukrotnie klas\u0119 <i>SweetHome3DBootstrap<\/i> <br\/> spo\u015br\u00f3d proponowanych klas.<\/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>Rysunek 9. Tworzenie konfiguracji debugowania <\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Kliknij na zak\u0142adk\u0119 <em>Classpath<\/em>, wybierz podelement <em>VolumePlugin (domy\u015blna \u015bcie\u017cka klas)<\/em> elementu <em>User Entries<\/em> na li\u015bcie <em>Classpath<\/em> i kliknij przycisk <em>Usu\u0144<\/em>.<\/li>\n\n\n\n<li>Kliknij na element <em>User Entries<\/em> na li\u015bcie <em>Classpath<\/em>, kliknij przycisk <em>Dodaj pliki JAR&#8230;<\/em>, wybierz element SweetHome3D-7.5.jar i potwierd\u017a sw\u00f3j wyb\u00f3r.<\/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\">Rysunek 10. Ustawianie \u015bcie\u017cki klas konfiguracji debugowania <\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Wybierz zak\u0142adk\u0119 <em>\u0179r\u00f3d\u0142o<\/em>, kliknij przycisk <em>Dodaj\u2026<\/em>, kliknij dwukrotnie na element <em>Projekt Java<\/em> w oknie dialogowym <em>Dodaj \u017ar\u00f3d\u0142o<\/em>, wybierz element <em>VolumePlugin<\/em> w wyskakuj\u0105cym okienku <em>Wyb\u00f3r projektu<\/em> i potwierd\u017a sw\u00f3j wyb\u00f3r.<\/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>Rysunek 11. Ustawianie \u015bcie\u017cki \u017ar\u00f3d\u0142owej konfiguracji debugowania <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Na koniec kliknij przycisk <i>Debuguj<\/i>, aby uruchomi\u0107 Sweet Home 3D w trybie debugowania. Gdy program zostanie uruchomiony, otw\u00f3rz plik <tt>VolumePlugin.java<\/tt>, \n ustaw punkt przerwania w metodzie <i>execute<\/i> i wybierz <i>Narz\u0119dzia &gt; Oblicz obj\u0119to\u015b\u0107<\/i> z menu Sweet Home 3D. Eclipse zatrzyma si\u0119 na wybranym \n punkcie przerwania, umo\u017cliwiaj\u0105c wykonanie programu krok po kroku i sprawdzenie warto\u015bci zmiennych.  <\/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\">Rysunek 12. Perspektywa debugowania 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>Za ka\u017cdym razem, gdy modyfikujesz kod \u017ar\u00f3d\u0142owy swojej wtyczki, nie zapomnij <a href=\"#creatingPluginJAR\">wygenerowa\u0107 pliku JAR wtyczki<\/a> przed uruchomieniem utworzonej konfiguracji debugowania. Aby przyspieszy\u0107 proces eksportu JAR w Eclipse, przejd\u017a do drugiego kroku kreatora eksportu JAR i wybierz opcj\u0119 <em>Zapisz opis tego pliku JAR w przestrzeni roboczej<\/em>. Spowoduje to dodanie nowego elementu w projekcie z kontekstowym elementem menu <em>Utw\u00f3rz JAR<\/em>.  <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"deployingPlugin\">Wdra\u017canie wtyczki<\/h3>\n\n<p>Po przygotowaniu, twoja wtyczka mo\u017ce by\u0107 wdro\u017cona na komputerach innych u\u017cytkownik\u00f3w Sweet Home 3D poprzez proste skopiowanie jej do ich <a href=\"#creatingPluginJAR\">folderu wtyczek<\/a>. Od wersji 1.6, plik wtyczki mo\u017ce by\u0107 r\u00f3wnie\u017c zainstalowany w folderze wtyczek Sweet Home 3D poprzez dwukrotne klikni\u0119cie na nim, je\u015bli jego rozszerzenie to SH3P (wystarczy zmieni\u0107 rozszerzenie pliku z .zip na .sh3p). Je\u015bli dwukrotne klikni\u0119cie na pliku .sh3p nie uruchamia Sweet Home 3D (co jest najbardziej prawdopodobne w systemie Linux), mo\u017cesz r\u00f3wnie\u017c zainstalowa\u0107 wtyczk\u0119 za pomoc\u0105 nast\u0119puj\u0105cego polecenia w oknie <em>Terminala<\/em> (gdzie <code>SweetHome3D<\/code> to nazwa pliku wykonywalnego dostarczonego z instalatorami Sweet Home 3D):<\/p>\n\n<pre class=\"wp-block-preformatted\"><em>\/\u015bcie\u017cka\/do\/<\/em>SweetHome3D <em>\/\u015bcie\u017cka\/do\/<\/em>wtyczka.sh3p<\/pre>\n\n<p>Aby przesta\u0107 u\u017cywa\u0107 wtyczki, usu\u0144 jej plik z folderu wtyczek i uruchom ponownie 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>Je\u015bli chcesz, aby twoja wtyczka mog\u0142a dzia\u0142a\u0107 ze wszystkimi <a href=\"https:\/\/test.sweethome3d.eu\/pl\/pobierz\/\">instalatorami Sweet Home 3D<\/a> dost\u0119pnymi na tej stronie internetowej, zadbaj o to, aby by\u0142a zgodna z Java 5, wybieraj\u0105c <code>1.5<\/code> w polu <em>Poziom zgodno\u015bci kompilatora<\/em> dost\u0119pnym w sekcji <em>Kompilator Java<\/em> okna dialogowego wy\u015bwietlanego po wybraniu opcji menu <em>Projekt &gt; W\u0142a\u015bciwo\u015bci<\/em> w Eclipse.<br\/>Je\u015bli u\u017cywasz wersji kompilatora Java, w kt\u00f3rej zgodno\u015b\u0107 z Java 1.5 nie jest ju\u017c dost\u0119pna, spr\u00f3buj celowa\u0107 co najmniej w Java 1.8, kt\u00f3ra jest nadal u\u017cywana w najnowszych wersjach Sweet Home 3D i ustaw <code>javaMinimumVersion<\/code> w pliku <code>ApplicationPlugin.properties<\/code> twojej wtyczki odpowiednio.<\/p>\n<\/div>\n\n<h2 class=\"wp-block-heading\" id=\"goingFurther\">Id\u0105c dalej<\/h2>\n\n<p>Programowanie pierwszej wtyczki pokaza\u0142o ci og\u00f3lny obraz. Oto dodatkowe informacje, kt\u00f3re pomog\u0105 ci p\u00f3j\u015b\u0107 dalej. <\/p>\n\n<h3 class=\"wp-block-heading\">API Sweet Home 3D &#8211; Javadoc<\/h3>\n\n<p>Najbardziej przydatn\u0105 dokumentacj\u0105 do tworzenia nowej wtyczki jest <a href=\"\/javadoc\/index.html\">API Sweet Home 3D<\/a> (Application Programming Interface), wygenerowane za pomoc\u0105 narz\u0119dzia javadoc.<br\/>U\u017cywaj w swojej wtyczce tylko klas z pakiet\u00f3w <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> i <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/viewcontroller\/package-summary.html\">com.eteks.sweethome3d.viewcontroller<\/a>, je\u015bli chcesz, aby by\u0142a zgodna z przysz\u0142ymi wersjami Sweet Home 3D. To b\u0119dzie w zupe\u0142no\u015bci wystarczaj\u0105ce do zaprogramowania dowolnej wtyczki, kt\u00f3ra dzia\u0142a na danych domu dost\u0119pnych w Sweet Home 3D.<br\/>Pakiety odpowiadaj\u0105ce innym warstwom programu s\u0105 zawarte w Javadoc tylko w celach informacyjnych. Nie polegaj na ich API, poniewa\u017c mo\u017ce ono ulec zmianie w przysz\u0142o\u015bci bez gwarancji zgodno\u015bci wstecznej (w ka\u017cdym razie nie zobaczysz \u017cadnego odniesienia do klasy z pakiet\u00f3w <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> lub <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/package-summary.html\">com.eteks.sweethome3d<\/a> w wy\u017cej wymienionych pakietach).  <\/p>\n\n<h3 class=\"wp-block-heading\">Architektura klas modelu<\/h3>\n\n<p>Sweet Home 3D opiera si\u0119 na architekturze MVC (Model-Widok-Kontroler), wi\u0119c zrozumienie, jak zorganizowana jest jej warstwa Modelu, jest kluczowe. Rysunek 13 (dost\u0119pny r\u00f3wnie\u017c w <a href=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/modelClassesDiagram.png\">formacie PDF<\/a>) przedstawia prawie wszystkie klasy i interfejsy dost\u0119pne w wersji 1.5 pakietu <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/package-summary.html\">com.eteks.sweethome3d.model<\/a>, kt\u00f3ry odpowiada tej warstwie Modelu. <\/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>Centraln\u0105 klas\u0105 w warstwie Modelu jest klasa <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeApplication.html\">HomeApplication<\/a> (10), abstrakcyjna nadklasa g\u0142\u00f3wnej klasy aplikacji <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/SweetHome3D.html\">SweetHome3D<\/a>. Instancja tej klasy daje dost\u0119p do aktualnie edytowanych instancji <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) oraz do obiektu <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/UserPreferences.html\">UserPreferences<\/a> (11), kt\u00f3ry przechowuje u\u017cywan\u0105 <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/LengthUnit.html\">jednostk\u0119 d\u0142ugo\u015bci<\/a> (12), <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCatalog.html\">katalog mebli<\/a> (14) i <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCatalog.html\">katalog tekstur<\/a> (15), z kt\u00f3rych u\u017cytkownik wybiera <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogPieceOfFurniture.html\">meble<\/a> (17) i <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogTexture.html\">tekstury<\/a> (18).<br\/>Instancja <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) przechowuje wszystkie obiekty, kt\u00f3re u\u017cytkownik utworzy\u0142 w planie domu: <\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>list\u0119 obiekt\u00f3w <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomePieceOfFurniture.html\">HomePieceOfFurniture<\/a> (13), kt\u00f3re implementuj\u0105 interfejs <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">PieceOfFurniture<\/a> (16),<\/li>\n\n\n\n<li>kolekcj\u0119 obiekt\u00f3w <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Wall<\/a> (9),<\/li>\n\n\n\n<li>list\u0119 obiekt\u00f3w <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Room<\/a> (5),<\/li>\n\n\n\n<li>kolekcj\u0119 obiekt\u00f3w <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/DimensionLine.html\">DimensionLine<\/a> (2),<\/li>\n\n\n\n<li>kolekcj\u0119 obiekt\u00f3w <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Label.html\">Label<\/a> (3).<\/li>\n<\/ul>\n\n<p>Te obiekty implementuj\u0105 interfejs <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Selectable.html\">Selectable<\/a> (1), podobnie jak obiekt <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/ObserverCamera.html\">ObserverCamera<\/a> (4), kt\u00f3ry przechowuje lokalizacj\u0119 kamery w trybie <em>Wirtualnego zwiedzaj\u0105cego<\/em>. Wszystkie zewn\u0119trzne informacje zarz\u0105dzane przez obiekty Modelu, takie jak ikona i model 3D <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">mebla<\/a> (16) lub obraz <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextureImage.html\">tekstury<\/a> (20), s\u0105 dost\u0119pne przez interfejs <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Content.html\">Content<\/a> (19), implementowany przez klas\u0119 <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/URLContent.html\">URLContent<\/a> i inne klasy pakietu <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/package-summary.html\">com.eteks.sweethome3d.tools<\/a>. <\/p>\n\n<p>Ten diagram UML powinien pom\u00f3c ci zrozumie\u0107, jakie klasy s\u0105 dost\u0119pne w modelu Sweet Home 3D i jak mo\u017cesz uzyska\u0107 do nich dost\u0119p, ale prawdopodobnie zauwa\u017cysz, \u017ce nie s\u0105 w nim wymienione \u017cadne konstruktory ani mutatory (lub settery, je\u015bli wolisz). To tylko z braku miejsca, ale mo\u017cesz ich bez problemu u\u017cywa\u0107 w klasie wtyczki. Zauwa\u017c te\u017c, \u017ce ka\u017cda modyfikacja istniej\u0105cego obiektu modelu b\u0119dzie zg\u0142aszana do wy\u015bwietlanych komponent\u00f3w albo za pomoc\u0105 <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/beans\/PropertyChangeEvent.html\" target=\"_blank\" rel=\"noopener\">PropertyChangeEvent<\/a>\u00f3w, <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionEvent.html\">CollectionEvent<\/a>\u00f3w (8) lub <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionEvent.html\">SelectionEvent<\/a>\u00f3w (6), co pozwala na natychmiastowe odzwierciedlenie wszystkich zmian na ekranie.  <\/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>nie jest<\/strong> bezpieczny dla w\u0105tk\u00f3w ze wzgl\u0119d\u00f3w wydajno\u015bciowych. Wszystkie <strong>modyfikacje<\/strong> obiektu nale\u017c\u0105cego do modelu powinny by\u0107 wykonywane w w\u0105tku Event Dispatch Thread. <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Architektura klas wtyczek<\/h3>\n\n<p>Architektura klas wtyczek jest znacznie prostsza do zrozumienia ni\u017c architektura warstwy Modelu. Pakiet <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/package-summary.html\">com.eteks.sweethome3d.plugin<\/a> zawiera tylko trzy klasy, z kt\u00f3rych powiniene\u015b u\u017cywa\u0107 tylko klas <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> i <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, jak pokazano na rysunku 14 (dost\u0119pnym r\u00f3wnie\u017c w <a href=\"https:\/\/test.sweethome3d.eu\/wp-content\/uploads\/2025\/12\/pluginClassesDiagram.png\">formacie 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>Instancja <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginManager.html\">PluginManager<\/a> (1) jest tworzona przy uruchomieniu aplikacji i wyszukuje wtyczki zainstalowane w <a href=\"#creating-the-plugin-jar\">folderze wtyczek<\/a> u\u017cytkownika. Za ka\u017cdym razem, gdy edytowany jest nowy dom, ten mened\u017cer tworzy instancj\u0119 i konfiguruje obiekt <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> (3) dla ka\u017cdej wtyczki znalezionej w momencie uruchomienia. Nast\u0119pnie wywo\u0142uje metod\u0119 <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getActions()\">getActions<\/a>, aby pobra\u0107 wszystkie <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">akcje<\/a> (4), kt\u00f3re zostan\u0105 dodane jako elementy menu i\/lub przyciski paska narz\u0119dzi w oknie domu. Ka\u017cda akcja jest instancj\u0105 <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, kt\u00f3ra przypomina klas\u0119 <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/Action.html\" target=\"_blank\" rel=\"noopener\">Action<\/a>, z jej metod\u0105 <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#execute()\">execute<\/a> i modyfikowalnymi <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.Property.html\">w\u0142a\u015bciwo\u015bciami<\/a> (2).   <\/p>\n\n<p>Zauwa\u017c, \u017ce klasa <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> daje ci dost\u0119p do instancji <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEditSupport.html\" target=\"_blank\" rel=\"noopener\">UndoableEditSupport<\/a> poprzez jej metod\u0119 <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getUndoableEditSupport()\">getUndoableEditSupport<\/a>. Gdy tylko zmodyfikujesz dom lub jego obiekty (meble, \u015bciany&#8230;) w metodzie execute instancji <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, powiniene\u015b r\u00f3wnie\u017c wys\u0142a\u0107 obiekt <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEdit.html\" target=\"_blank\" rel=\"noopener\">UndoableEdit<\/a> do obs\u0142ugi edycji cofania zwr\u00f3conej przez metod\u0119 getUndoableEditSupport, w przeciwnym razie u\u017cytkownicy nie b\u0119d\u0105 mogli prawid\u0142owo cofa\u0107\/ponawia\u0107 wprowadzonych przez ciebie zmian. <\/p>\n\n<h3 class=\"wp-block-heading\">Lokalizacja<\/h3>\n\n<p>Je\u015bli planujesz opracowa\u0107 wtyczk\u0119 dla spo\u0142eczno\u015bci u\u017cytkownik\u00f3w Sweet Home 3D, postaraj si\u0119 zlokalizowa\u0107 wy\u015bwietlane przez ni\u0105 ci\u0105gi znak\u00f3w, zar\u00f3wno w nazwach akcji i menu, jak i w tworzonych dialogach (lub przynajmniej przygotuj jej lokalizacj\u0119). Dwa <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#PluginAction(java.lang.String,%20java.lang.String,%20java.lang.ClassLoader)\">konstruktory klasy PluginAction<\/a> pomog\u0105 Ci zorganizowa\u0107 t\u0142umaczenie w\u0142a\u015bciwo\u015bci akcji za pomoc\u0105 plik\u00f3w .properties, a je\u015bli potrzebujesz przet\u0142umaczy\u0107 inne ci\u0105gi znak\u00f3w w swojej wtyczce (jak te w oknie dialogowym pokazanym przez <a href=\"#testing-the-plugin\">testowan\u0105 wtyczk\u0119<\/a>), wykorzystaj ponownie te pliki .properties z klas\u0105 Java <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/util\/ResourceBundle.html\" target=\"_blank\" rel=\"noopener\">ResourceBundle<\/a>.<br\/>Je\u015bli wolisz ograniczy\u0107 liczb\u0119 plik\u00f3w w\u0142a\u015bciwo\u015bci, mo\u017cesz nawet zapisa\u0107 warto\u015bci w\u0142a\u015bciwo\u015bci akcji i inne ci\u0105gi znak\u00f3w w <a href=\"#creating-the-plugin-description-file\">pliku opisu<\/a> ApplicationPlugin.properties swojej wtyczki. <\/p>\n\n<p>Je\u015bli chcesz zobaczy\u0107 przyk\u0142ad wykorzystuj\u0105cy t\u0119 architektur\u0119, pobierz wtyczk\u0119 <em>Export to SH3F<\/em> dost\u0119pn\u0105 pod adresem <a href=\"\/storage\/plugins\/ExportToSH3F-1.0.sh3p\">https:\/\/test.sweethome3d.eu\/plugins\/ExportToSH3F-1.0.sh3p<\/a> i rozpakuj j\u0105 (ten plik wtyczki zawiera r\u00f3wnie\u017c kod \u017ar\u00f3d\u0142owy wtyczki).<br\/>Jak opisano na <a href=\"https:\/\/sourceforge.net\/forum\/message.php?msg_id=5837358\" target=\"_blank\" rel=\"noopener\">forum pomocy<\/a>, ta wtyczka tworzy plik SH3F, kt\u00f3ry zawiera wszystkie meble zaimportowane do katalogu mebli Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">Udost\u0119pnianie wtyczek<\/h3>\n\n<p>Mo\u017cesz opublikowa\u0107 zaprogramowane przez siebie wtyczki w systemie \u015bledzenia <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/\" target=\"_blank\" rel=\"noopener\">Plug-ins Contributions<\/a>, aby podzieli\u0107 si\u0119 nimi ze spo\u0142eczno\u015bci\u0105 u\u017cytkownik\u00f3w Sweet Home 3D.<br\/>Wiele funkcji mo\u017cna doda\u0107 do Sweet Home 3D dzi\u0119ki wtyczkom, od importer\u00f3w po eksportery, ale tak\u017ce wtyczki zdolne do modyfikowania danych domu, jak <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/1\/\" target=\"_blank\" rel=\"noopener\">Home Rotator Plug-in<\/a> opracowany przez Michela Mbema i inne wymienione w <a href=\"\/storage\/pluginsUserGuide.pdf\">Poradniku dla wtyczek i rozszerze\u0144<\/a> (PDF) napisanym przez Hansa Dirkse oraz na stronie <a href=\"https:\/\/test.sweethome3d.eu\/plugins\/\" data-type=\"page\" data-id=\"437\">Wtyczki i narz\u0119dzia<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wprowadzenie Od wersji 1.5 mo\u017cliwe jest dodawanie nowych funkcji do Sweet Home 3D za pomoc\u0105 plik\u00f3w wtyczek umieszczonych w folderze wtyczek. Pozwala to programistom Java na tworzenie i rozpowszechnianie nowych funkcji dla Sweet Home 3D bez modyfikowania plik\u00f3w \u017ar\u00f3d\u0142owych bie\u017c\u0105cej wersji (co jest dobre dla zgodno\u015bci wstecznej) i bez dostarczania pe\u0142nej wersji programu (co jest<a href=\"https:\/\/test.sweethome3d.eu\/pl\/przewodnik-programisty-wtyczek\/\">Continue reading <span class=\"sr-only\">&#8222;Przewodnik programisty wtyczek&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":11658,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-resources.php","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-11674","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/test.sweethome3d.eu\/pl\/wp-json\/wp\/v2\/pages\/11674","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.sweethome3d.eu\/pl\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/test.sweethome3d.eu\/pl\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/test.sweethome3d.eu\/pl\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/test.sweethome3d.eu\/pl\/wp-json\/wp\/v2\/comments?post=11674"}],"version-history":[{"count":2,"href":"https:\/\/test.sweethome3d.eu\/pl\/wp-json\/wp\/v2\/pages\/11674\/revisions"}],"predecessor-version":[{"id":12444,"href":"https:\/\/test.sweethome3d.eu\/pl\/wp-json\/wp\/v2\/pages\/11674\/revisions\/12444"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/test.sweethome3d.eu\/pl\/wp-json\/wp\/v2\/media\/11658"}],"wp:attachment":[{"href":"https:\/\/test.sweethome3d.eu\/pl\/wp-json\/wp\/v2\/media?parent=11674"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}