{"id":10447,"date":"2025-10-01T14:53:41","date_gmt":"2025-10-01T14:53:41","guid":{"rendered":"https:\/\/wp-test-1.sweethome3d.eu\/plug-in-entwicklerhandbuch\/"},"modified":"2025-10-31T16:19:03","modified_gmt":"2025-10-31T16:19:03","slug":"plug-in-entwicklerhandbuch","status":"publish","type":"page","link":"https:\/\/wp-test-1.sweethome3d.eu\/de\/plug-in-entwicklerhandbuch\/","title":{"rendered":"Plug-in-Entwicklerhandbuch"},"content":{"rendered":"<ul class=\"simpletoc-list\">\n<li><a href=\"#einfuehrung\">Einf\u00fchrung<\/a>\n\n<\/li>\n<li><a href=\"#entwicklungswerkzeuge-installieren\">Entwicklungswerkzeuge installieren<\/a>\n\n\n<\/li>\n\n<li><a href=\"#ein-plugin-programmieren\">Ein Plug-in programmieren<\/a>\n\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<li><a href=\"#weiterfuehrendes\">Weiterf\u00fchrendes<\/a>\n\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<\/li>\n<\/li>\n<\/ul>\n<\/li><\/ul><h2 class=\"wp-block-heading\" id=\"einfuehrung\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Einf\u00fchrung<\/h2>\n<p>Ab Version 1.5 ist es m\u00f6glich, <a href=\"\/\">Sweet Home 3D<\/a> neue Funktionen hinzuzuf\u00fcgen, mit Plug-in-Dateien, die in deinem <a href=\"#deployingPlugin\">Plug-in-Ordner<\/a> abgelegt sind. Dies erm\u00f6glicht Java-Programmierern, neue Funktionen f\u00fcr Sweet Home 3D zu entwickeln und zu vertreiben, ohne die Quelldateien der aktuellen Version zu \u00e4ndern (was gut f\u00fcr die Aufw\u00e4rtskompatibilit\u00e4t ist), und ohne eine vollst\u00e4ndige Version des Programms auszuliefern (was gut f\u00fcr die Liefergr\u00f6\u00dfe ist).<br\/>Dieses Dokument beschreibt die <a href=\"#installingTools\" data-type=\"internal\" data-id=\"#installingTools\">Werkzeuge<\/a>, die zum Erstellen von Plug-ins erforderlich sind, zeigt dann, wie du ein <a href=\"#programmingPlugin\">Plug-in programmierst<\/a>, das das maximale Volumen der beweglichen M\u00f6bel in einem Zuhause berechnet, und gibt schlie\u00dflich einige <a href=\"#goingFurther\">zus\u00e4tzliche Informationen<\/a>, die dir helfen werden, weiterzukommen. <\/p>\n<h2 class=\"wp-block-heading\" id=\"entwicklungswerkzeuge-installieren\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Entwicklungswerkzeuge installieren<\/h2>\n<p>Auch wenn Sweet Home 3D sich an ein breites Publikum richtet, erfordert die Entwicklung von Plug-ins spezielle Kenntnisse, und du solltest wissen, wie man in <a href=\"https:\/\/java.sun.com\" target=\"_blank\" rel=\"noopener\">Java<\/a> mit einer IDE<a href=\"https:\/\/ant.apache.org\/\" target=\"_blank\" rel=\"noopener\"><\/a> programmiert, bevor du fortf\u00e4hrst. Dieses Handbuch zeigt, wie du ein Plug-in mit <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">Eclipse<\/a> erstellst, aber du kannst auch die IDE deiner Wahl oder gar keine IDE verwenden. <\/p>\n<h3 class=\"wp-block-heading\" id=\"eclipse-herunterladen-und-installieren\">Eclipse herunterladen und installieren<\/h3>\n<p>Lade Eclipse zuerst von <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.eclipse.org\/<\/a> herunter. Die Version <em>Eclipse IDE for Java Developers<\/em> reicht aus, um ein Plug-in zu entwickeln, aber du kannst jede Version f\u00fcr die Java-Entwicklung herunterladen. <br\/>Nach dem Herunterladen ist die Installation von Eclipse sehr einfach: Entpacke einfach das Archiv, das du erh\u00e4ltst, \u00f6ffne den Eclipse-Ordner und f\u00fchre je nach System die Datei namens  <code>eclipse.exe<\/code>  (unter Windows),  <code>eclipse.app<\/code>  (unter Mac OS X) oder  <code>eclipse<\/code>  (unter Linux).<br\/>Beim ersten Start fordert Eclipse dich auf, einen <em>Arbeitsbereichsordner<\/em> auszuw\u00e4hlen, in dem Plug-in-Projekte gespeichert werden.<br\/>W\u00e4hle anschlie\u00dfend <em>Datei &gt; Neu &gt; Projekt<\/em> aus dem Men\u00fc, um ein neues Projekt zu erstellen, w\u00e4hle <em>Java &gt; Java-Projekt<\/em> im angezeigten <em>Assistenten f\u00fcr neue Projekte<\/em>, gib VolumePlugin als Projektnamen ein und klicke auf die Schaltfl\u00e4che <em>Fertig stellen<\/em>. Schlie\u00dfe schlie\u00dflich den <em>Willkommen<\/em>-Tab, um deinen Arbeitsbereich wie in Abbildung 1 gezeigt zu entdecken. <\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"388\" height=\"315\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipse.png\" alt=\"Plug-in-Entwicklerhandbuch\" class=\"wp-image-5073\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipse.png 388w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipse-360x292.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipse-160x130.png 160w\" sizes=\"auto, (max-width: 388px) 100vw, 388px\" \/><figcaption class=\"wp-element-caption\"><em>Abbildung 1. Eclipse-Arbeitsbereich <\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"sweet-home-3d-bibliothek-herunterladen-und-installieren\">Sweet Home 3D Bibliothek herunterladen und installieren<\/h3>\n<p>Die Entwicklung eines Plug-ins basiert auf einigen Klassen von Sweet Home 3D, die Eclipse kennen muss, um dein Projekt erstellen zu k\u00f6nnen. Der einfachste Weg, Sweet Home 3D-Klassen zu Eclipse hinzuzuf\u00fcgen, ist das Herunterladen der ausf\u00fchrbaren JAR-Version von Sweet Home 3D, die unter <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> verf\u00fcgbar ist. Nach dem Herunterladen ziehe die Datei SweetHome3D-7.5.jar auf das Projektsymbol <em>VolumePlugin<\/em> in der <em>Package Explorer<\/em>-Ansicht von Eclipse und w\u00e4hle den Eintrag <em>Build Path &gt; Add to Build Path<\/em> im Kontextmen\u00fc der Datei SweetHome3D-7.5.jar, wie in Abbildung 2 gezeigt.  <\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"452\" height=\"157\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/addToBuildPath.png\" alt=\"\" class=\"wp-image-5075\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/addToBuildPath.png 452w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/addToBuildPath-360x125.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/addToBuildPath-374x130.png 374w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/addToBuildPath-400x139.png 400w\" sizes=\"auto, (max-width: 452px) 100vw, 452px\" \/><figcaption class=\"wp-element-caption\"><em><em>Abbildung 2. Hinzuf\u00fcgen von SweetHome3D-7.5.jar<br\/> zum Build-Pfad <\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<p><\/p>\n<h2 class=\"wp-block-heading\" id=\"ein-plugin-programmieren\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Ein Plug-in programmieren<\/h2>\n<p>Nachdem du die erforderlichen Werkzeuge installiert hast, lass uns sehen, wie du dein erstes Plug-in f\u00fcr Sweet Home 3D programmieren kannst.<\/p>\n<h3 class=\"wp-block-heading\" id=\"die-pluginklasse-erstellen\">Die Plug-in-Klasse erstellen<\/h3>\n<p>Erstelle zuerst eine neue Unterklasse von com.eteks.sweethome3d.plugin.Plugin, indem du im Eclipse-Men\u00fc <em>Datei &gt; Neu &gt; Klasse<\/em> w\u00e4hlst.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"418\" height=\"509\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newJavaClass.png\" alt=\"\" class=\"wp-image-5076\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newJavaClass.png 418w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newJavaClass-296x360.png 296w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newJavaClass-107x130.png 107w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newJavaClass-400x487.png 400w\" sizes=\"auto, (max-width: 418px) 100vw, 418px\" \/><figcaption class=\"wp-element-caption\"><em><em><em>Abbildung 3. Eine neue Klasse erstellen <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<p>Gib im Dialogfeld <em>Neue Java-Klasse<\/em> VolumePlugin als Klassennamen ein, gib ein Paket ein (hier wurde das Paket com.eteks.test gew\u00e4hlt) und w\u00e4hle com.eteks.sweethome3d.plugin.Plugin als Oberklasse von VolumePlugin. Klicke anschlie\u00dfend auf <em>Fertig stellen<\/em>. Eclipse erstellt die Datei der neuen Klasse mit folgendem Inhalt:  <\/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 Automatisch generierter Methoden-Stub<br\/> return null;<br\/> }<br\/>}<\/pre>\n\n<p>Wie du dem TODO-Kommentar entnehmen kannst, musst du nun die Implementierung der getActions-Methode \u00e4ndern, um eine Plug-in-Aktion zur\u00fcckzugeben, die das Volumen der beweglichen M\u00f6bel berechnen kann. Ersetze return null; durch die folgende Anweisung: <\/p>\n\n<pre class=\"wp-block-preformatted\">  return new <strong>PluginAction<\/strong> [] {new <strong>VolumeAction<\/strong>()};  <\/pre>\n\n<p>und w\u00e4hle <em>Bearbeiten &gt; Quick Fix<\/em> aus dem Eclipse-Men\u00fc, um die fehlende Klasse VolumeAction zu erstellen, wie in Abbildung 4 gezeigt.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"615\" height=\"117\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/quickFix.png\" alt=\"\" class=\"wp-image-5077\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/quickFix.png 615w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/quickFix-360x68.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/quickFix-400x76.png 400w\" sizes=\"auto, (max-width: 615px) 100vw, 615px\" \/><figcaption class=\"wp-element-caption\"><em>Abbildung 4. Quick Fix zum Generieren einer fehlenden Klasse verwenden <\/em><\/figcaption><\/figure>\n<\/div>\n<p>W\u00e4hle im angezeigten Dialogfeld <em>Neue Java-Klasse<\/em> das Kontrollk\u00e4stchen <em>Umschlie\u00dfender Typ<\/em>, um eine innere Klasse von VolumePlugin zu erstellen, und klicke auf <em>Fertig stellen<\/em>. Dadurch wird die Klasse VolumeAction erstellt, die von der Klasse com.eteks.sweethome3d.plugin.PluginAction erbt und eine leere execute-Methode enth\u00e4lt: <\/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 Automatisch generierter Methoden-Stub<br\/> }<br\/> }<\/pre>\n\n<p>Diese Methode wird von Sweet Home 3D aufgerufen, wenn der Benutzer die Plug-in-Aktion startet; daher ist dies der Ort, an dem du implementieren musst, wie das Volumen der M\u00f6bel berechnet und angezeigt wird:<\/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\/> \/\/ Berechne die Summe des Volumens der Bounding Box von <br\/> \/\/ jedem beweglichen M\u00f6belst\u00fcck im Zuhause<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\/> \/\/ Zeige das Ergebnis in einem Meldungsfeld an (\u00b3 steht f\u00fcr hochgestellte 3)<br\/> String message = String. <strong>format<\/strong>(<br\/> \u201eDas maximale Volumen der beweglichen M\u00f6bel im Zuhause betr\u00e4gt %.2f m\u00b3.\u201c, <br\/> volumeInCm3 \/ 1000000);<br\/> JOptionPane. <strong>showMessageDialog<\/strong>(null, message);<br\/>  }<br\/>  }<\/pre>\n\n<p>Nachdem du festgelegt hast, was das Plug-in tun soll, musst du beschreiben, wie der Benutzer diese neue Aktion starten wird. Du hast die Wahl, ob du einen neuen <strong>Men\u00fcpunkt<\/strong> zu einem Men\u00fc und\/oder einen neuen <strong>Button<\/strong> zur Werkzeugleiste hinzuf\u00fcgen m\u00f6chtest. Diese Wahl triffst du, indem du die entsprechenden Eigenschaften der Plug-in-Aktion bei ihrer Erstellung festlegst. Wenn du beispielsweise m\u00f6chtest, dass Benutzer die Volumenaktion mit dem Men\u00fcpunkt <em>Volumen berechnen<\/em> im Men\u00fc <em>Werkzeuge<\/em> starten, f\u00fcgst du den folgenden Konstruktor zur Klasse VolumeAction hinzu:   <\/p>\n\n<pre class=\"wp-block-preformatted\">  public <strong>VolumeAction<\/strong>() {<br\/>           <strong>putPropertyValue<\/strong>(Property.NAME, \u201eVolumen berechnen\u201c);<br\/>           <strong>putPropertyValue<\/strong>(Property.MENU, \u201eWerkzeuge\u201c);<br\/> \/\/ Aktiviert die Aktion standardm\u00e4\u00dfig<br\/>           <strong>setEnabled<\/strong>(true);<br\/> }<\/pre>\n\n<p>Die Plug-in-Klasse <a href=\"\/examples\/VolumePlugin\/VolumePlugin.java\">VolumePlugin<\/a> ist nun programmiert und fast bereit, als Plug-in in Sweet Home 3D zu funktionieren. Die letzten beiden Dinge, die zu tun sind, sind: <\/p>\n\n<ul class=\"wp-block-list\">\n<li>eine <tt>ApplicationPlugin.properties<\/tt>-Beschreibungsdatei erstellen,<\/li>\n\n\n\n<li>die Dateien in einer JAR-Datei zusammenfassen.<br\/><\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\" id=\"die-pluginbeschreibungsdatei-erstellen\">Die Plug-in-Beschreibungsdatei erstellen<\/h3>\n<p>Eine <tt>ApplicationPlugin.properties<\/tt>-Datei\n beschreibt den Plug-in-Namen, seine Klasse, die Sweet Home 3D- und Java-Mindestversionen, unter denen es unterst\u00fctzt wird,\n und rechtliche Hinweise. W\u00e4hle <i>Datei &gt; Neu &gt; Datei<\/i> aus dem\n Eclipse-Men\u00fc, gib den Dateinamen <tt>ApplicationPlugin.properties<\/tt> ein und klicke auf <i>Fertig stellen<\/i>, wie\n in Abbildung 5 gezeigt. <\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"264\" height=\"384\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newFile.png\" alt=\"\" class=\"wp-image-5079\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newFile.png 264w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newFile-248x360.png 248w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/newFile-89x130.png 89w\" sizes=\"auto, (max-width: 264px) 100vw, 264px\" \/><figcaption class=\"wp-element-caption\"><em>Abbildung 5. Eine neue Datei erstellen <\/em><\/figcaption><\/figure>\n<\/div>\n<p>Dann gib die <a href=\"\/examples\/VolumePlugin\/ApplicationPlugin.properties\">folgende Beschreibung<\/a> in die neue Datei ein und speichere sie:<\/p>\n\n<pre class=\"wp-block-preformatted\"><strong>name<\/strong>=Volumen der beweglichen M\u00f6bel<br\/><strong>class<\/strong>=com.eteks.test.VolumePlugin<br\/><strong>description<\/strong>=Berechnet das Volumen der beweglichen M\u00f6bel im Zuhause<br\/><strong>version<\/strong>=1.0<br\/><strong>license<\/strong>=GNU GPL<br\/><strong>provider<\/strong>=(C) Copyrights 2024 Space Mushrooms<br\/><strong>applicationMinimumVersion<\/strong>=1.5<br\/><strong>javaMinimumVersion<\/strong>=1.5<\/pre>\n<h3 class=\"wp-block-heading\" id=\"die-pluginjar-erstellen\">Die Plug-in-JAR erstellen<\/h3>\n<p>Die Plug-in-JAR enth\u00e4lt die <tt>Class<\/tt>-Dateien, die aus der Kompilierung der Datei <tt>VolumePlugin.java<\/tt>\n und der Datei <tt>ApplicationPlugin.properties<\/tt> erstellt wurden. Da Eclipse eine Java-Datei kompiliert, sobald du sie speicherst, musst du\n lediglich <i>Datei &gt; Exportieren&#8230;<\/i> aus dem Men\u00fc w\u00e4hlen und <i>Java &gt; JAR-Datei<\/i> im angezeigten <i>Export<\/i>-Dialogfeld\n ausw\u00e4hlen. W\u00e4hle im <i>JAR-Export<\/i>-Assistenten, der wie in Abbildung 6 gezeigt erscheint, das Projekt-Kontrollk\u00e4stchen\n aus und gib den Pfad einer JAR-Datei ein, die im Plug-in-Ordner von Sweet Home 3D abgelegt wird. Dieser entsprechende Ordner h\u00e4ngt\n von deinem System ab, wie folgt:   <\/p>\n\n<ul class=\"wp-block-list\">\n<li>  unter Windows Vista \/ 7 \/ 8 \/ 10 \/ 11 ist dieser Ordner <tt>C:\\Users\\<i>Benutzer<\/i>\\AppData\\Roaming\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li>  unter Windows XP und fr\u00fcheren Windows-Versionen ist dieser Ordner <tt>C:\\Dokumente und Einstellungen\\<i>Benutzer<\/i>\\Anwendungsdaten\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li>  unter macOS ist es der Unterordner <tt>Library\/Application Support\/eTeks\/Sweet Home 3D\/<\/tt><tt>plugins<\/tt> deines\n Benutzerordners,<\/li>\n\n\n\n<li>  unter Linux und anderen Unix-Systemen ist es der Unterordner <tt>.eteks\/sweethome3d\/<\/tt><tt>plugins<\/tt> deines Benutzerordners.<\/li>\n<\/ul>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"499\" height=\"440\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/jarExport.png\" alt=\"\" class=\"wp-image-5081\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/jarExport.png 499w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/jarExport-360x317.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/jarExport-147x130.png 147w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/jarExport-400x353.png 400w\" sizes=\"auto, (max-width: 499px) 100vw, 499px\" \/><figcaption class=\"wp-element-caption\"><em><em>Abbildung 6. Exportieren in eine JAR-Datei <\/em><\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"das-plugin-testen\">Das Plug-in testen<\/h3>\n<p>Das von dir entwickelte <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">Plug-in<\/a> wird in Sweet Home 3D ausgef\u00fchrt, entweder mit der <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>-Version, der <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">Installer<\/a>-Version oder der <a href=\"https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download\" target=\"_blank\" rel=\"noopener\">SweetHome3D-7.5.jar<\/a>, die du zuvor heruntergeladen hast. Da letztere eine ausf\u00fchrbare JAR ist, kannst du sie durch Doppelklicken oder mit dem folgenden Befehl ausf\u00fchren: <\/p>\n\n<p>Das von dir entwickelte <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">Plug-in<\/a> wird in Sweet Home 3D ausgef\u00fchrt, entweder mit der <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>-Version, der <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">Installer<\/a>-Version oder der <a href=\"https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download\" target=\"_blank\" rel=\"noopener\">SweetHome3D-7.5.jar<\/a>, die du zuvor heruntergeladen hast. Da letztere eine ausf\u00fchrbare JAR ist, kannst du sie durch Doppelklicken oder mit dem folgenden Befehl ausf\u00fchren: <\/p>\n\n<pre class=\"wp-block-preformatted\">java -jar \/<em>path<\/em>\/<em>to<\/em>\/SweetHome3D-7.5.jar<\/pre>\n\n<p>Solange du testest, wirst du Sweet Home 3D wahrscheinlich lieber mit diesem Befehl ausf\u00fchren, um in der Konsole den Stack-Trace der Ausnahmen lesen zu k\u00f6nnen, die w\u00e4hrend der Ausf\u00fchrung deines Plug-ins ausgel\u00f6st werden.<\/p>\n\n<p>Sobald Sweet Home 3D gestartet ist, siehst du das neue Men\u00fc und seinen Eintrag, wie in Abbildung 7 gezeigt:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"447\" height=\"53\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginMenu.png\" alt=\"\" class=\"wp-image-5082\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginMenu.png 447w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginMenu-360x43.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginMenu-400x47.png 400w\" sizes=\"auto, (max-width: 447px) 100vw, 447px\" \/><figcaption class=\"wp-element-caption\"><em>Abbildung 7. Plug-in-Men\u00fc <\/em><\/figcaption><\/figure>\n<\/div>\n<p>Wenn du den neuen Men\u00fcpunkt f\u00fcr das <a href=\"\/examples\/userGuideExample.sh3d\">Heimbeispiel<\/a> in der <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/de\/sweet-home-3d-benutzerhandbuch\/\" data-type=\"page\" data-id=\"424\">Benutzeranleitung<\/a> erstellte w\u00e4hlst, erh\u00e4ltst du folgendes Ergebnis:<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"448\" height=\"137\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginInAction.png\" alt=\"\" class=\"wp-image-5084\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginInAction.png 448w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginInAction-360x110.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginInAction-425x130.png 425w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginInAction-400x122.png 400w\" sizes=\"auto, (max-width: 448px) 100vw, 448px\" \/><figcaption class=\"wp-element-caption\"><em>Abbildung 8. Plug-in in Aktion <\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"das-plugin-debuggen\">Das Plug-in debuggen<\/h3>\n<p>Wenn du dein Plug-in von Eclipse aus debuggen musst, erstelle eine Debug-Konfiguration, indem du diese Schritte befolgst:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>W\u00e4hle <i>Ausf\u00fchren &gt; Debug-Konfigurationen&#8230;<\/i> aus dem Men\u00fc, w\u00e4hle den Eintrag <i>Java-Anwendung<\/i> in der Liste der verf\u00fcgbaren Konfigurationen des\n          Dialogfelds <i>Debug-Konfigurationen<\/i>, klicke oben links auf die Schaltfl\u00e4che <i>Neu<\/i> und gib einen Namen f\u00fcr die Konfiguration ein.<\/li>\n\n\n\n<li>Klicke auf die Schaltfl\u00e4che <i>Suchen&#8230;<\/i> rechts neben dem Textfeld <i>Hauptklasse<\/i> und doppelklicke auf die Klasse <i>SweetHome3DBootstrap<\/i> <br\/> unter den vorgeschlagenen Klassen.<\/li>\n<\/ul>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"629\" height=\"390\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/debugConfiguration.png\" alt=\"\" class=\"wp-image-5085\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/debugConfiguration.png 629w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/debugConfiguration-360x223.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/debugConfiguration-210x130.png 210w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/debugConfiguration-400x248.png 400w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><figcaption class=\"wp-element-caption\"><em>Abbildung 9. Eine Debug-Konfiguration erstellen <\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>Klicke auf den Tab <em>Classpath<\/em>, w\u00e4hle den Unterpunkt <em>VolumePlugin (Standard-Classpath)<\/em> des Eintrags <em>Benutzereintr\u00e4ge<\/em> in der Liste <em>Classpath<\/em> und klicke auf die Schaltfl\u00e4che <em>Entfernen<\/em>.<\/li>\n\n\n\n<li>Klicke auf den Eintrag <em>Benutzereintr\u00e4ge<\/em> in der Liste <em>Classpath<\/em>, klicke auf die Schaltfl\u00e4che <em>JARs hinzuf\u00fcgen&#8230;<\/em>, w\u00e4hle den Eintrag SweetHome3D-7.5.jar aus und best\u00e4tige deine Wahl.<\/li>\n<\/ul>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"618\" height=\"482\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/classpathConfiguration.png\" alt=\"\" class=\"wp-image-5086\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/classpathConfiguration.png 618w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/classpathConfiguration-360x281.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/classpathConfiguration-167x130.png 167w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/classpathConfiguration-400x312.png 400w\" sizes=\"auto, (max-width: 618px) 100vw, 618px\" \/><figcaption class=\"wp-element-caption\"><em><em>Abbildung 10. Den Classpath der Debug-Konfiguration einstellen <\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>W\u00e4hle den Tab <em>Quelle<\/em>, klicke auf die Schaltfl\u00e4che <em>Hinzuf\u00fcgen\u2026<\/em>, doppelklicke auf den Eintrag <em>Java-Projekt<\/em> im Dialogfeld <em>Quelle hinzuf\u00fcgen<\/em>, w\u00e4hle den Eintrag <em>VolumePlugin<\/em> im Popup-Fenster <em>Projektauswahl<\/em> aus und best\u00e4tige deine Wahl.<\/li>\n<\/ul>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"773\" height=\"549\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/sourcepathConfiguration.png\" alt=\"\" class=\"wp-image-5087\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/sourcepathConfiguration.png 773w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/sourcepathConfiguration-360x256.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/sourcepathConfiguration-183x130.png 183w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/sourcepathConfiguration-768x545.png 768w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/sourcepathConfiguration-400x284.png 400w\" sizes=\"auto, (max-width: 773px) 100vw, 773px\" \/><figcaption class=\"wp-element-caption\"><em><em><em>Abbildung 11. Den Quellpfad der Debug-Konfiguration einstellen <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>Klicke schlie\u00dflich auf die Schaltfl\u00e4che <i>Debuggen<\/i>, um Sweet Home 3D im Debug-Modus zu starten. Sobald das Programm l\u00e4uft, \u00f6ffne die Datei <tt>VolumePlugin.java<\/tt>,\n setze einen Haltepunkt in der Methode <i>execute<\/i> und w\u00e4hle <i>Werkzeuge &gt; Volumen berechnen<\/i> aus dem Sweet Home 3D-Men\u00fc. Eclipse h\u00e4lt am ausgew\u00e4hlten\n Haltepunkt an, damit du das Programm Schritt f\u00fcr Schritt ausf\u00fchren und Variablenwerte \u00fcberpr\u00fcfen kannst.  <\/li>\n<\/ul>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"601\" height=\"398\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipseDebug.png\" alt=\"\" class=\"wp-image-5088\" srcset=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipseDebug.png 601w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipseDebug-360x238.png 360w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipseDebug-196x130.png 196w, https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/eclipseDebug-400x265.png 400w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><figcaption class=\"wp-element-caption\"><em><em><em><em>Abbildung 12. Eclipse-Debug-Perspektive <\/em><\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\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 loading=\"lazy\" decoding=\"async\" width=\"21\" height=\"21\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/09\/warning-1.gif\" alt=\"\" class=\"wp-image-4679\" style=\"width:21px\"\/><\/figure>\n\n\n\n<p>Jedes Mal, wenn du den Quellcode deines Plug-ins \u00e4nderst, vergiss nicht, die <a href=\"#creatingPluginJAR\">Plug-in-JAR zu generieren<\/a>, bevor du die von dir erstellte Debug-Konfiguration startest. Um den JAR-Exportprozess in Eclipse zu beschleunigen, gehe zum zweiten Schritt des JAR-Export-Assistenten und w\u00e4hle die Option <em>Beschreibung dieser JAR im Arbeitsbereich speichern<\/em>. Dies f\u00fcgt dem Projekt einen neuen Eintrag mit einem kontextuellen Men\u00fcpunkt <em>JAR erstellen<\/em> hinzu.  <\/p>\n<\/div>\n<h3 class=\"wp-block-heading\" id=\"das-plugin-bereitstellen\">Das Plug-in bereitstellen<\/h3>\n<p>Sobald es fertig ist, kann dein Plug-in auf den Computern anderer Sweet Home 3D-Benutzer bereitgestellt werden, indem du es einfach in ihren <a href=\"#creatingPluginJAR\">Plug-in-Ordner<\/a> kopierst. Ab Version 1.6 kann eine Plug-in-Datei auch im Plug-in-Ordner von Sweet Home 3D installiert werden, indem man darauf doppelklickt, wenn ihre Erweiterung SH3P ist (\u00e4ndere einfach die Dateierweiterung von .zip zu .sh3p). Wenn ein Doppelklick auf eine .sh3p-Datei Sweet Home 3D nicht startet (meistens unter Linux), kannst du ein Plug-in auch mit dem folgenden Befehl in einem <em>Terminal<\/em>-Fenster installieren (wobei    <code>SweetHome3D<\/code>  der Name der ausf\u00fchrbaren Datei ist, die mit den Sweet Home 3D-Installern geliefert wird):<\/p>\n\n<pre class=\"wp-block-preformatted\"><em>\/path\/to\/<\/em>SweetHome3D <em>\/path\/to\/<\/em>plugin.sh3p<\/pre>\n\n<p>Um ein Plug-in nicht mehr zu verwenden, entferne seine Datei aus dem Plug-in-Ordner und starte Sweet Home 3D neu.<\/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 loading=\"lazy\" decoding=\"async\" width=\"21\" height=\"21\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/09\/warning-1.gif\" alt=\"\" class=\"wp-image-4679\" style=\"width:21px\"\/><\/figure>\n\n\n\n<p>Wenn du m\u00f6chtest, dass dein Plug-in mit allen auf dieser Website verf\u00fcgbaren <a href=\"http:\/\/download\">Sweet Home 3D-Installern<\/a> l\u00e4uft, achte darauf, es Java 5-kompatibel zu halten, indem du <code>1.5<\/code> im Feld <em>Compiler-Kompatibilit\u00e4tsstufe<\/em> ausw\u00e4hlst, das im Abschnitt <em>Java-Compiler<\/em> des Dialogfelds verf\u00fcgbar ist, das \u00fcber den Men\u00fcpunkt <em>Projekt &gt; Eigenschaften<\/em> von Eclipse angezeigt wird.<br\/>Wenn du eine Java-Compiler-Version verwendest, in der Java 1.5-Kompatibilit\u00e4t nicht mehr verf\u00fcgbar ist, versuche, mindestens Java 1.8 anzustreben, das immer noch in neueren Versionen von Sweet Home 3D verwendet wird, und setze <code>javaMinimumVersion<\/code> in der <code>ApplicationPlugin.properties<\/code> Datei deines Plug-ins entsprechend.<\/p>\n<\/div>\n<h2 class=\"wp-block-heading\" id=\"weiterfuehrendes\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Weiterf\u00fchrendes<\/h2>\n<p>Die Programmierung des ersten Plug-ins hat Ihnen das Gesamtbild gezeigt. Hier sind einige zus\u00e4tzliche Informationen, die Ihnen helfen werden, noch weiter zu gehen. <\/p>\n<h3 class=\"wp-block-heading\" id=\"sweet-home-3d-api-javadoc\">Sweet Home 3D API &#8211; javadoc<\/h3>\n<p>Die n\u00fctzlichste Dokumentation zur Entwicklung eines neuen Plug-ins ist die <a href=\"\/javadoc\/index.html\">Sweet Home 3D API<\/a> (Application Programming Interface), die mit dem Javadoc-Tool generiert wurde.<br\/>Verwenden Sie nur die Klassen der Pakete <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> und <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/viewcontroller\/package-summary.html\">com.eteks.sweethome3d.viewcontroller<\/a> in Ihrem Plug-in, wenn Sie m\u00f6chten, dass es mit zuk\u00fcnftigen Versionen von Sweet Home 3D aufw\u00e4rtskompatibel ist. Dies wird weitgehend ausreichen, um jedes Plug-in zu programmieren, das mit den in Sweet Home 3D verf\u00fcgbaren Hausdaten arbeitet.<br\/>Die Pakete, die den anderen Ebenen des Programms entsprechen, sind nur zu Informationszwecken in der Javadoc enthalten. Verlassen Sie sich nicht auf deren API, da sie sich in Zukunft ohne Garantie aufw\u00e4rtskompatibel \u00e4ndern kann (Sie werden ohnehin keinen Verweis auf eine Klasse der Pakete <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> oder <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/package-summary.html\">com.eteks.sweethome3d<\/a> in den oben genannten Paketen sehen).  <\/p>\n<h3 class=\"wp-block-heading\" id=\"architektur-der-modellklassen\">Architektur der Modellklassen<\/h3>\n<p>Sweet Home 3D basiert auf einer MVC-Architektur (Model View Controller), daher ist es wichtig zu verstehen, wie die Modellebene organisiert ist. Abbildung 13 (auch im <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/modelClassesDiagram.png\">PDF-Format<\/a> verf\u00fcgbar) zeigt fast alle Klassen und Schnittstellen, die in Version 1.5 des Pakets <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/package-summary.html\">com.eteks.sweethome3d.model<\/a> verf\u00fcgbar sind, das dieser Modellebene entspricht. <\/p>\n\n\n<figure class=\"aligncenter size-full uml-diagram\" id=\"uml-model-classes-diagram\">\n\t<img decoding=\"async\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/themes\/sh3d\/assets\/img\/uml\/model-classes-diagram.png\" alt=\"UML Diagram model-classes-diagram\"\n\t\tusemap=\"#model-classes-diagram\">\n\n\t<map name=\"model-classes-diagram\">\n    <area shape=\"rect\" coords=\"30,583,205,681\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomePieceOfFurniture.html\">\n    <area shape=\"rect\" coords=\"227,595,390,638\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCatalog.html\">\n    <area shape=\"rect\" coords=\"410,594,574,635\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCatalog.html\">\n    <area shape=\"rect\" coords=\"227,667,391,720\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCategory.html\">\n    <area shape=\"rect\" coords=\"410,666,574,719\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCategory.html\">\n    <area shape=\"rect\" coords=\"30,14,236,122\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Selectable.html\">\n    <area shape=\"rect\" coords=\"266,14,410,115\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/DimensionLine.html\">\n    <area shape=\"rect\" coords=\"441,15,574,76\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Label.html\">\n    <area shape=\"rect\" coords=\"441,91,574,106\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/ObserverCamera.html\">\n    <area shape=\"rect\" coords=\"30,141,205,334\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Room.html\">\n    <area shape=\"rect\" coords=\"265,142,387,192\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextStyle.html\">\n    <area shape=\"rect\" coords=\"441,120,575,206\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Camera.html\">\n    <area shape=\"rect\" coords=\"226,243,460,379\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">\n    <area shape=\"rect\" coords=\"483,331,611,381\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionListener.html\">\n    <area shape=\"rect\" coords=\"483,397,611,449\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionEvent.html\">\n    <area shape=\"rect\" coords=\"30,357,107,371\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeTexture.html\">\n    <area shape=\"rect\" coords=\"30,393,204,565\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.Property.html\">\n    <area shape=\"rect\" coords=\"226,409,429,452\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeApplication.html\">\n    <area shape=\"rect\" coords=\"483,221,611,272\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionListener.html\">\n    <area shape=\"rect\" coords=\"483,286,611,315\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionEvent.html\">\n    <area shape=\"rect\" coords=\"227,477,429,566\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/UserPreferences.html\">\n    <area shape=\"rect\" coords=\"452,476,610,578\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/LengthUnit.html\">\n    <area shape=\"rect\" coords=\"30,702,205,858\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">\n    <area shape=\"rect\" coords=\"227,750,391,793\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogPieceOfFurniture.html\">\n    <area shape=\"rect\" coords=\"410,751,574,782\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogTexture.html\">\n    <area shape=\"rect\" coords=\"227,808,391,848\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Content.html\">\n    <area shape=\"rect\" coords=\"410,808,574,881\" href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextureImage.html\">\n<\/map>\n\t\t\t<figcaption class=\"wp-element-caption\">\n\t\t\t\t\t\t\t<em>Figure 13. UML diagram of com.eteks.sweethome3d.model package<\/em><br>\n\t\t\t\t\t\t\t\t\t\t<small><em>(click on a class to view its javadoc)<\/em><\/small>\n\t\t\t\t\t<\/figcaption>\n\t<\/figure>\n\n<p>Die zentrale Klasse in der Modellebene ist die Klasse <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeApplication.html\">HomeApplication<\/a> (10), die abstrakte Superklasse der Hauptklasse der Anwendung <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/SweetHome3D.html\">SweetHome3D<\/a>. Die Instanz dieser Klasse erm\u00f6glicht den Zugriff auf die aktuell bearbeiteten <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a>-Instanzen (7) und auf das Objekt <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/UserPreferences.html\">UserPreferences<\/a> (11), das die verwendete <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/LengthUnit.html\">L\u00e4ngeneinheit<\/a> (12), den <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCatalog.html\">M\u00f6belkatalog<\/a> (14) und den <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCatalog.html\">Texturenkatalog<\/a> (15) speichert, aus denen der Benutzer <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogPieceOfFurniture.html\">M\u00f6belst\u00fccke<\/a> (17) und <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogTexture.html\">Texturen<\/a> (18) ausw\u00e4hlt.<br\/>Eine <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a>-Instanz (7) speichert alle Objekte, die der Benutzer im Hausplan erstellt hat: <\/p>\n\n<ul class=\"wp-block-list\">\n<li>die Liste der <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomePieceOfFurniture.html\">HomePieceOfFurniture<\/a>-Objekte (13), die die Schnittstelle <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">PieceOfFurniture<\/a> (16) implementieren,<\/li>\n\n\n\n<li>die Sammlung von <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Wall<\/a>-Objekten (9),<\/li>\n\n\n\n<li>die Liste der <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Room<\/a>-Objekte (5),<\/li>\n\n\n\n<li>die Sammlung von <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/DimensionLine.html\">DimensionLine<\/a>-Objekten (2),<\/li>\n\n\n\n<li>die Sammlung von <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Label.html\">Label<\/a>-Objekten (3).<\/li>\n<\/ul>\n\n<p>Diese Objekte implementieren die Schnittstelle <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Selectable.html\">Selectable<\/a> (1) sowie das Objekt <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/ObserverCamera.html\">ObserverCamera<\/a> (4), das die Position der Kamera im Modus <em>Virtueller Besucher<\/em> speichert. Alle externen Informationen, die von Modellobjekten verwaltet werden, wie das Symbol und das 3D-Modell eines <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">M\u00f6belst\u00fccks<\/a> (16) oder das Bild einer <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextureImage.html\">Textur<\/a> (20), werden \u00fcber die Schnittstelle <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Content.html\">Content<\/a> (19) abgerufen, die von der Klasse <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/URLContent.html\">URLContent<\/a> und anderen Klassen des Pakets <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/package-summary.html\">com.eteks.sweethome3d.tools<\/a> implementiert wird. <\/p>\n\n<p>Dieses UML-Diagramm soll Ihnen helfen zu verstehen, welche Klassen im Sweet Home 3D-Modell verf\u00fcgbar sind und wie Sie auf diese zugreifen k\u00f6nnen. Sie werden jedoch wahrscheinlich feststellen, dass darin keine Konstruktoren und keine Mutatoren (oder Setter, wenn Sie es vorziehen) genannt werden. Dies liegt nur am Platzmangel, aber Sie k\u00f6nnen diese problemlos in einer Plug-in-Klasse verwenden. Beachten Sie auch, dass jede \u00c4nderung eines vorhandenen Objekts des Modells an die angezeigten Komponenten entweder mit <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/beans\/PropertyChangeEvent.html\" target=\"_blank\" rel=\"noopener\">PropertyChangeEvent<\/a>s, mit <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionEvent.html\">CollectionEvent<\/a>s (8) oder mit <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionEvent.html\">SelectionEvent<\/a>s (6) gemeldet wird, wodurch alle \u00c4nderungen sofort auf dem Bildschirm widergespiegelt werden.  <\/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 loading=\"lazy\" decoding=\"async\" width=\"21\" height=\"21\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/09\/warning-1.gif\" alt=\"\" class=\"wp-image-4679\" style=\"width:21px\"\/><\/figure>\n\n\n\n<p>Das Sweet Home 3D-Modell ist aus Performancegr\u00fcnden <strong>nicht<\/strong> threadsicher. Alle <strong>\u00c4nderungen<\/strong> an einem Objekt, das zum Modell geh\u00f6rt, sollten im Event Dispatch Thread erfolgen. <\/p>\n<\/div>\n<h3 class=\"wp-block-heading\" id=\"architektur-der-pluginklassen\">Architektur der Plug-in-Klassen<\/h3>\n<p>Die Architektur der Plug-in-Klassen ist viel einfacher zu verstehen als die der Modellebene. Das Paket <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/package-summary.html\">com.eteks.sweethome3d.plugin<\/a> enth\u00e4lt nur drei Klassen, von denen Sie vermutlich nur die Klassen <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> und <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a> verwenden werden, wie in Abbildung 14 (auch im <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginClassesDiagram.png\">PDF-Format<\/a> verf\u00fcgbar) dargestellt. <\/p>\n\n\n<figure class=\"aligncenter size-full uml-diagram\" id=\"uml-plugin-classes-diagram\">\n\t<img decoding=\"async\" src=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/themes\/sh3d\/assets\/img\/uml\/plugin-classes-diagram.png\" alt=\"UML Diagram plugin-classes-diagram\"\n\t\tusemap=\"#plugin-classes-diagram\">\n\n\t<map name=\"plugin-classes-diagram\">\n    <area shape=\"rect\" coords=\"10,9,256,92\" href=\"javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginManager.html\">\n    <area shape=\"rect\" coords=\"11,131,257,288\" href=\"javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">\n    <area shape=\"rect\" coords=\"453,8,574,118\" href=\"javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.Property.html\">\n    <area shape=\"rect\" coords=\"282,133,574,289\" href=\"javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">\n<\/map>\n\t\t\t<figcaption class=\"wp-element-caption\">\n\t\t\t\t\t\t\t<em>Figure 14. UML diagram of com.eteks.sweethome3d.plugin package<\/em><br>\n\t\t\t\t\t\t\t\t\t\t<small><em>(click on a class to view its javadoc)<\/em><\/small>\n\t\t\t\t\t<\/figcaption>\n\t<\/figure>\n\n<p>Eine <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginManager.html\">PluginManager<\/a>-Instanz (1) wird beim Start der Anwendung erstellt und sucht nach den Plug-ins, die im <a href=\"#creating-the-plugin-jar\">Plug-in-Ordner<\/a> des Benutzers installiert sind. Jedes Mal, wenn ein neues Haus bearbeitet wird, instanziiert und konfiguriert dieser Manager ein <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a>-Objekt (3) f\u00fcr jedes Plug-in, das beim Start gefunden wurde. Anschlie\u00dfend ruft er die Methode <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getActions()\">getActions<\/a> auf, um alle <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">Aktionen<\/a> (4) abzurufen, die als Men\u00fcpunkte und\/oder Symbolleistenschaltfl\u00e4chen im Hausfenster hinzugef\u00fcgt werden. Jede Aktion ist eine Instanz von <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, die wie die Klasse <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/Action.html\" target=\"_blank\" rel=\"noopener\">Action<\/a> aussieht, mit ihrer Methode <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#execute()\">execute<\/a> und ihren modifizierbaren <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.Property.html\">Eigenschaften<\/a> (2).   <\/p>\n\n<p>Beachten Sie, dass die Klasse <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> Ihnen \u00fcber ihre Methode <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getUndoableEditSupport()\">getUndoableEditSupport<\/a> Zugriff auf eine <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEditSupport.html\" target=\"_blank\" rel=\"noopener\">UndoableEditSupport<\/a>-Instanz gew\u00e4hrt. Sobald Sie ein Haus oder seine Objekte (M\u00f6bel, W\u00e4nde&#8230;) in der Execute-Methode einer <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>-Instanz \u00e4ndern, sollten Sie auch ein <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEdit.html\" target=\"_blank\" rel=\"noopener\">UndoableEdit<\/a>-Objekt an die Undoable-Edit-Unterst\u00fctzung senden, die von der GetUndoableEditSupport-Methode zur\u00fcckgegeben wird, da die Benutzer sonst die von Ihnen vorgenommenen \u00c4nderungen nicht korrekt r\u00fcckg\u00e4ngig machen\/wiederherstellen k\u00f6nnen. <\/p>\n<h3 class=\"wp-block-heading\" id=\"lokalisierung\">Lokalisierung<\/h3>\n<p>Wenn Sie planen, ein Plug-in f\u00fcr die Sweet Home 3D-Benutzergemeinschaft zu entwickeln, versuchen Sie, die darin angezeigten Zeichenketten entweder in Aktionsnamen und Men\u00fcs oder in von Ihnen erstellten Dialogen zu lokalisieren (oder zumindest deren Lokalisierung vorzubereiten). Zwei <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#PluginAction(java.lang.String,%20java.lang.String,%20java.lang.ClassLoader)\">Konstruktoren der PluginAction<\/a>-Klasse helfen Ihnen, die \u00dcbersetzung von Aktionseigenschaften mit .properties-Dateien zu organisieren, und wenn Sie andere Zeichenketten in Ihrem Plug-in \u00fcbersetzen m\u00fcssen (wie die im Dialog des <a href=\"#testing-the-plugin\">getesteten Plug-ins<\/a> angezeigten), verwenden Sie diese .properties-Dateien mit der Java-Klasse <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/util\/ResourceBundle.html\" target=\"_blank\" rel=\"noopener\">ResourceBundle<\/a> wieder.<br\/>Wenn Sie die Anzahl der Properties-Dateien begrenzen m\u00f6chten, k\u00f6nnen Sie die Werte der Aktionseigenschaften und anderer Zeichenketten auch in die <a href=\"#creating-the-plugin-description-file\">Beschreibungsdatei<\/a> ApplicationPlugin.properties Ihres Plug-ins schreiben. <\/p>\n\n<p>Wenn Sie ein Beispiel f\u00fcr die Verwendung dieser Architektur w\u00fcnschen, laden Sie das Plug-in <em>Export to SH3F<\/em> herunter, das unter <a href=\"\/storage\/plugins\/ExportToSH3F-1.0.sh3p\">https:\/\/www.sweethome3d.com\/plugins\/ExportToSH3F-1.0.sh3p<\/a> verf\u00fcgbar ist, und entpacken Sie es (diese Plug-in-Datei enth\u00e4lt auch den Quellcode des Plug-ins).<br\/>Wie im <a href=\"https:\/\/sourceforge.net\/forum\/message.php?msg_id=5837358\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">Hilfeforum<\/a> beschrieben, erstellt dieses Plug-in eine SH3F-Datei, die alle M\u00f6bel enth\u00e4lt, die Sie in den M\u00f6belkatalog von Sweet Home 3D importiert haben.<\/p>\n<h3 class=\"wp-block-heading\" id=\"beitragen-von-plugins\">Beitragen von Plug-ins<\/h3>\n<p>Sie k\u00f6nnen die von Ihnen programmierten Plug-ins im <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/\" target=\"_blank\" rel=\"noopener\">Plug-ins Contributions<\/a> Tracking System ver\u00f6ffentlichen, um sie mit der Sweet Home 3D-Benutzergemeinschaft zu teilen.<br\/>Dank Plug-ins k\u00f6nnen Sweet Home 3D viele Funktionen hinzugef\u00fcgt werden, von Importeuren bis hin zu Exporteuren, aber auch Plug-ins, die in der Lage sind, die Daten eines Hauses zu ver\u00e4ndern, wie das von Michel Mbem entwickelte <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/1\/\" target=\"_blank\" rel=\"noopener\">Home Rotator Plug-in<\/a> und andere, die im <a href=\"\/storage\/pluginsUserGuide.pdf\">Tutorial for Plug-ins and Extensions<\/a> (PDF) von Hans Dirkse und auf der Seite <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/de\/plugins-und-tools\/\" data-type=\"page\" data-id=\"437\">Plug-ins and tools<\/a> aufgef\u00fchrt sind.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einf\u00fchrung Ab Version 1.5 ist es m\u00f6glich, Sweet Home 3D neue Funktionen hinzuzuf\u00fcgen, mit Plug-in-Dateien, die in deinem Plug-in-Ordner abgelegt sind. Dies erm\u00f6glicht Java-Programmierern, neue Funktionen f\u00fcr Sweet Home 3D zu entwickeln und zu vertreiben, ohne die Quelldateien der aktuellen Version zu \u00e4ndern (was gut f\u00fcr die Aufw\u00e4rtskompatibilit\u00e4t ist), und ohne eine vollst\u00e4ndige Version des [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":10416,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-10447","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/de\/wp-json\/wp\/v2\/pages\/10447","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/de\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/de\/wp-json\/wp\/v2\/comments?post=10447"}],"version-history":[{"count":2,"href":"https:\/\/wp-test-1.sweethome3d.eu\/de\/wp-json\/wp\/v2\/pages\/10447\/revisions"}],"predecessor-version":[{"id":10726,"href":"https:\/\/wp-test-1.sweethome3d.eu\/de\/wp-json\/wp\/v2\/pages\/10447\/revisions\/10726"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/de\/wp-json\/wp\/v2\/media\/10416"}],"wp:attachment":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/de\/wp-json\/wp\/v2\/media?parent=10447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}