{"id":10620,"date":"2025-10-01T14:53:41","date_gmt":"2025-10-01T14:53:41","guid":{"rendered":"https:\/\/wp-test-1.sweethome3d.eu\/guia-para-desarrolladores-de-plug-ins\/"},"modified":"2025-11-03T18:00:52","modified_gmt":"2025-11-03T18:00:52","slug":"guia-para-desarrolladores-de-plug-ins","status":"publish","type":"page","link":"https:\/\/wp-test-1.sweethome3d.eu\/es\/guia-para-desarrolladores-de-plug-ins\/","title":{"rendered":"Gu\u00eda para desarrolladores de plug-ins"},"content":{"rendered":"<ul class=\"simpletoc-list\">\n<li><a href=\"#introduccion\">Introducci\u00f3n<\/a>\n\n<\/li>\n<li><a href=\"#instalacion-de-herramientas-de-desarrollo\">Instalaci\u00f3n de herramientas de desarrollo<\/a>\n\n\n<\/li>\n\n<li><a href=\"#programacion-de-un-plugin\">Programaci\u00f3n de un plug-in<\/a>\n\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<li><a href=\"#yendo-mas-alla\">Yendo m\u00e1s all\u00e1<\/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=\"introduccion\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Introducci\u00f3n<\/h2>\n<p>A partir de la versi\u00f3n 1.5, es posible a\u00f1adir nuevas funciones a <a href=\"\/\">Sweet Home 3D<\/a> con archivos de plug-in colocados en su <a href=\"#deployingPlugin\">carpeta de plug-ins<\/a>. Esto permite a los programadores de Java desarrollar y distribuir nuevas funciones para Sweet Home 3D sin modificar los archivos de c\u00f3digo fuente de la versi\u00f3n actual (lo cual es bueno para la compatibilidad ascendente) y sin entregar una versi\u00f3n completa del programa (lo cual es bueno para el tama\u00f1o de la entrega).<br \/>Este documento describe las <a href=\"#installingTools\" data-type=\"internal\" data-id=\"#installingTools\">herramientas<\/a> necesarias para crear plug-ins, luego muestra c\u00f3mo <a href=\"#programmingPlugin\">programar un plug-in<\/a> que calcula el volumen m\u00e1ximo de los muebles m\u00f3viles a\u00f1adidos a una casa, y finalmente ofrece <a href=\"#goingFurther\">informaci\u00f3n adicional<\/a> que le ayudar\u00e1 a ir m\u00e1s all\u00e1. <\/p>\n<h2 class=\"wp-block-heading\" id=\"instalacion-de-herramientas-de-desarrollo\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Instalaci\u00f3n de herramientas de desarrollo<\/h2>\n<p>Si bien Sweet Home 3D est\u00e1 dirigido a un p\u00fablico general, el desarrollo de plug-ins requiere habilidades especiales, y debe saber programar en <a href=\"https:\/\/java.sun.com\" target=\"_blank\" rel=\"noopener\">Java<\/a> con un IDE<a href=\"https:\/\/ant.apache.org\/\" target=\"_blank\" rel=\"noopener\"><\/a> antes de seguir adelante. Esta gu\u00eda muestra c\u00f3mo construir un plug-in con <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">Eclipse<\/a>, pero puede utilizar el IDE de su elecci\u00f3n, o ninguno. <\/p>\n<h3 class=\"wp-block-heading\" id=\"descargar-e-instalar-eclipse\">Descargar e instalar Eclipse<\/h3>\n<p>Primero, descargue Eclipse desde <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.eclipse.org\/<\/a>. La versi\u00f3n llamada <em>Eclipse IDE for Java Developers<\/em> es suficiente para desarrollar un plug-in, pero puede descargar cualquier versi\u00f3n para el desarrollo de Java. <br \/>Una vez descargado, instalar Eclipse es muy sencillo: simplemente descomprima el archivo que obtendr\u00e1, abra la carpeta eclipse y, dependiendo de su sistema, ejecute el archivo llamado  <code>eclipse.exe<\/code>  (en Windows),  <code>eclipse.app<\/code>  (en Mac OS X) o  <code>eclipse<\/code>  (en Linux).<br \/>En la primera ejecuci\u00f3n, Eclipse le pedir\u00e1 que elija una carpeta de <em>workspace<\/em>, donde se almacenar\u00e1n los proyectos de plug-ins.<br \/>Una vez hecho esto, elija <em>File &gt; New &gt; Project<\/em> en el men\u00fa para crear un nuevo proyecto, seleccione <em>Java &gt; Java project<\/em> en el asistente <em>New project<\/em> que se mostrar\u00e1, introduzca VolumePlugin como nombre del proyecto y haga clic en el bot\u00f3n <em>Finish<\/em>. Finalmente, cierre la pesta\u00f1a <em>Welcome<\/em> para descubrir su espacio de trabajo como se muestra en la figura 1. <\/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=\"Gu&#xED;a para desarrolladores de plug-ins\" 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>Figura 1. Espacio de trabajo de Eclipse <\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"descargar-e-instalar-la-biblioteca-de-sweet-home-3d\">Descargar e instalar la biblioteca de Sweet Home 3D<\/h3>\n<p>El desarrollo de un plug-in se basa en algunas clases de Sweet Home 3D que Eclipse debe conocer para poder construir su proyecto. La forma m\u00e1s f\u00e1cil de a\u00f1adir clases de Sweet Home 3D a Eclipse es descargar la versi\u00f3n ejecutable JAR de Sweet Home 3D disponible en https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download. Una vez descargado, arrastre y suelte el archivo SweetHome3D-7.5.jar en el icono del proyecto <em>VolumePlugin<\/em> en la vista <em>Package Explorer<\/em> de Eclipse, y elija el elemento <em>Build Path &gt; Add to Build Path<\/em> en el men\u00fa contextual del archivo SweetHome3D-7.5.jar, como se muestra en la figura 2.  <\/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>Figura 2. A\u00f1adir SweetHome3D-7.5.jar<br \/> a Build Path <\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<p><\/p>\n<h2 class=\"wp-block-heading\" id=\"programacion-de-un-plugin\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Programaci\u00f3n de un plug-in<\/h2>\n<p>Ahora que ha instalado las herramientas necesarias, veamos c\u00f3mo puede programar su primer plug-in para Sweet Home 3D.<\/p>\n<h3 class=\"wp-block-heading\" id=\"creacion-de-la-clase-de-plugin\">Creaci\u00f3n de la clase de plug-in<\/h3>\n<p>Primero, cree una nueva subclase de com.eteks.sweethome3d.plugin.Plugin eligiendo el elemento de men\u00fa <em>File &gt; New &gt; Class<\/em> en Eclipse.<\/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>Figura 3. Creaci\u00f3n de una nueva clase <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<p>En el di\u00e1logo <em>New Java Class<\/em>, introduzca VolumePlugin como nombre de la clase, introduzca un paquete (aqu\u00ed el paquete elegido fue com.eteks.test), y elija com.eteks.sweethome3d.plugin.Plugin como la superclase de VolumePlugin. Una vez hecho esto, haga clic en <em>Finish<\/em>. Eclipse crear\u00e1 el archivo de la nueva clase con el siguiente contenido:  <\/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>Como puede adivinar por el comentario TODO, ahora debe cambiar la implementaci\u00f3n del m\u00e9todo getActions para devolver una acci\u00f3n de plug-in capaz de calcular el volumen de los muebles m\u00f3viles. Reemplace return null; por la siguiente declaraci\u00f3n: <\/p>\n\n<pre class=\"wp-block-preformatted\">  return new <strong>PluginAction<\/strong> [] {new <strong>VolumeAction<\/strong>()};  <\/pre>\n\n<p>y elija <em>Edition &gt; Quick Fix<\/em> en el men\u00fa de Eclipse para crear la clase VolumeAction que falta, como se muestra en la figura 4.<\/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>Figura 4. Usar Quick fix para generar una clase que falta <\/em><\/figcaption><\/figure>\n<\/div>\n<p>En el di\u00e1logo <em>New Java Class<\/em> que aparece, seleccione la casilla de verificaci\u00f3n <em>Enclosing type<\/em> para crear una clase interna de VolumePlugin y haga clic en <em>Finish<\/em>. Esto crear\u00e1 la clase VolumeAction que hereda de la clase com.eteks.sweethome3d.plugin.PluginAction y contiene un m\u00e9todo execute vac\u00edo: <\/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>Este m\u00e9todo es el que Sweet Home 3D llamar\u00e1 cuando el usuario lance la acci\u00f3n del plug-in; por lo tanto, este es el lugar donde debe implementar c\u00f3mo calcular el volumen de los muebles y mostrarlo:<\/p>\n\n<pre class=\"wp-block-preformatted\">  public class <strong>VolumeAction<\/strong> extends <strong>PluginAction<\/strong> {  <br \/>  @Override<br \/>  public void <strong>execute<\/strong>() { <br \/>  float volumeInCm3 = 0;<br \/> \/\/ Compute the sum of the volume of the bounding box of <br \/> \/\/ each movable piece of furniture in home<br \/> for (PieceOfFurniture piece : <strong>getHome<\/strong>(). <strong>getFurniture<\/strong>()) {<br \/> if (piece. isMovable()) {<br \/> volumeInCm3 += piece. getWidth() <br \/> * piece. <strong>getDepth<\/strong>() <br \/> * piece. <strong>getHeight<\/strong>();<br \/>  }<br \/> }<br \/>            <br \/> \/\/ Display the result in a message box (\u00b3 is for 3 in supercript)<br \/> String message = String. <strong>format<\/strong>(<br \/> \"The maximum volume of the movable furniture in home is %.2f m\u00b3.\", <br \/> volumeInCm3 \/ 1000000);<br \/> JOptionPane. <strong>showMessageDialog<\/strong>(null, message);<br \/>  }<br \/>  }<\/pre>\n\n<p>Ahora que ha especificado lo que quiere que haga el plug-in, debe describir c\u00f3mo el usuario lanzar\u00e1 esta nueva acci\u00f3n. Tiene la opci\u00f3n de a\u00f1adir un nuevo <strong>elemento de men\u00fa<\/strong> a un men\u00fa, y\/o un nuevo <strong>bot\u00f3n<\/strong> a la barra de herramientas. Esta elecci\u00f3n se realiza estableciendo las propiedades apropiadas de la acci\u00f3n del plug-in en su creaci\u00f3n. Por ejemplo, si quiere que los usuarios lancen la acci\u00f3n de volumen con el elemento de men\u00fa <em>Compute volume<\/em> que se encuentra en el men\u00fa <em>Tools<\/em>, a\u00f1adir\u00e1 el siguiente constructor a la clase VolumnAction:   <\/p>\n\n<pre class=\"wp-block-preformatted\">  public <strong>VolumeAction<\/strong>() {<br \/>           <strong>putPropertyValue<\/strong>(Property.NAME, \"Compute volume\");<br \/>           <strong>putPropertyValue<\/strong>(Property.MENU, \"Tools\");<br \/> \/\/ Enables the action by default<br \/>           <strong>setEnabled<\/strong>(true);<br \/> }<\/pre>\n\n<p>La clase de plug-in <a href=\"\/examples\/VolumePlugin\/VolumePlugin.java\">VolumePlugin<\/a> ya est\u00e1 programada, y casi lista para funcionar como un plug-in en Sweet Home 3D. Las dos \u00faltimas cosas que hay que hacer son: <\/p>\n\n<ul class=\"wp-block-list\">\n<li>crear un archivo de descripci\u00f3n <tt>ApplicationPlugin.properties<\/tt>,<\/li>\n\n\n\n<li>poner los archivos juntos en un archivo JAR.<br \/><\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\" id=\"creacion-del-archivo-de-descripcion-del-plugin\">Creaci\u00f3n del archivo de descripci\u00f3n del plug-in<\/h3>\n<p>Un archivo <tt>ApplicationPlugin.properties<\/tt>\n describe el nombre del plug-in, su clase, las versiones m\u00ednimas de Sweet Home 3D y Java bajo las cuales es compatible,\n y aspectos legales. Elija <i>File &gt; New &gt; File<\/i> del\n men\u00fa de Eclipse, introduzca el nombre de archivo <tt>ApplicationPlugin.properties<\/tt> y haga clic en <i>Finish<\/i>, como se muestra\n en la figura 5. <\/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>Figura 5. Creaci\u00f3n de un nuevo archivo <\/em><\/figcaption><\/figure>\n<\/div>\n<p>Luego introduzca la <a href=\"\/examples\/VolumePlugin\/ApplicationPlugin.properties\">siguiente descripci\u00f3n<\/a> en el nuevo archivo y gu\u00e1rdelo:<\/p>\n\n<pre class=\"wp-block-preformatted\"><strong>name<\/strong>=Volumen de muebles m\u00f3viles<br \/><strong>class<\/strong>=com.eteks.test.VolumePlugin<br \/><strong>description<\/strong>=Calcula el volumen de los muebles m\u00f3viles en la casa<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=\"creacion-del-jar-del-plugin\">Creaci\u00f3n del JAR del plug-in<\/h3>\n<p>El JAR del plug-in contiene los archivos <tt>class<\/tt> creados a partir de la compilaci\u00f3n del archivo <tt>VolumePlugin.java<\/tt>,\n y el archivo <tt>ApplicationPlugin.properties<\/tt>. Como Eclipse compila un archivo Java tan pronto como lo guarda, solo tiene que elegir <i>File &gt; Export&#8230;<\/i> del men\u00fa y seleccionar <i>Java &gt; JAR file<\/i> en el di\u00e1logo <i>Export<\/i>\n que se mostrar\u00e1. En el asistente <i>Jar Export<\/i> que aparece como se muestra en la figura 6, seleccione la casilla de verificaci\u00f3n del proyecto\n e introduzca la ruta de un archivo JAR colocado en la carpeta de plug-ins de Sweet Home 3D. Esta carpeta apropiada depende\n de su sistema de la siguiente manera:   <\/p>\n\n<ul class=\"wp-block-list\">\n<li>  en Windows Vista \/ 7 \/ 8 \/ 10 \/ 11, esta carpeta es <tt>C:\\Users\\<i>user<\/i>\\AppData\\Roaming\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li>  en Windows XP y versiones anteriores de Windows, esta carpeta es <tt>C:\\Documents and Settings\\<i>user<\/i>\\Application Data\\eTeks\\Sweet\n Home 3D\\plugins<\/tt>,<\/li>\n\n\n\n<li>  en macOS, es la subcarpeta <tt>Library\/Application Support\/eTeks\/Sweet Home 3D\/<\/tt><tt>plugins<\/tt> de su\n carpeta de usuario,<\/li>\n\n\n\n<li>  en Linux y otros Unix, es la subcarpeta <tt>.eteks\/sweethome3d\/<\/tt><tt>plugins<\/tt> de su carpeta de usuario.<\/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>Figura 6. Exportar a un archivo JAR <\/em><\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"prueba-del-plugin\">Prueba del plug-in<\/h3>\n<p>El <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> que ha desarrollado se ejecutar\u00e1 en Sweet Home 3D, ya sea con la versi\u00f3n de <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, la versi\u00f3n de <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">instaladores<\/a> o el <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> que descarg\u00f3 anteriormente. Como el \u00faltimo es un JAR ejecutable, puede ejecutarlo haciendo doble clic en \u00e9l o con el siguiente comando: <\/p>\n\n<p>El <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> que ha desarrollado se ejecutar\u00e1 en Sweet Home 3D, ya sea con la versi\u00f3n de <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, la versi\u00f3n de <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">instaladores<\/a> o el <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> que descarg\u00f3 anteriormente. Como el \u00faltimo es un JAR ejecutable, puede ejecutarlo haciendo doble clic en \u00e9l o con el siguiente comando: <\/p>\n\n<pre class=\"wp-block-preformatted\">java -jar \/<em>ruta<\/em>\/<em>a<\/em>\/SweetHome3D-7.5.jar<\/pre>\n\n<p>Mientras est\u00e9 probando, probablemente preferir\u00e1 ejecutar Sweet Home 3D con este comando, para poder leer en la consola el stack trace de las excepciones lanzadas durante la ejecuci\u00f3n de su plug-in.<\/p>\n\n<p>Una vez que se inicie Sweet Home 3D, ver\u00e1 el nuevo men\u00fa y su elemento aparecer como se muestra en la figura 7:<\/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>Figura 7. Men\u00fa del plug-in <\/em><\/figcaption><\/figure>\n<\/div>\n<p>Si elige el nuevo elemento de men\u00fa para el <a href=\"\/examples\/userGuideExample.sh3d\">ejemplo de casa<\/a> creado en la <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/es\/guia-del-usuario-de-sweet-home-3d\/\" data-type=\"page\" data-id=\"424\">gu\u00eda del usuario<\/a>, obtendr\u00e1 el siguiente resultado:<\/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>Figura 8. Plug-in en acci\u00f3n <\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"depuracion-del-plugin\">Depuraci\u00f3n del plug-in<\/h3>\n<p>Si necesita depurar su plug-in desde Eclipse, cree una configuraci\u00f3n de depuraci\u00f3n siguiendo estos pasos:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>Elija <i>Run &gt; Debug Configurations&#8230;<\/i> del men\u00fa, seleccione el elemento <i>Java Application<\/i> en la lista de configuraciones disponibles del \n          cuadro de di\u00e1logo <i>Debug configurations<\/i>, haga clic en el bot\u00f3n <i>New <\/i>en la parte superior izquierda e introduzca un nombre para la configuraci\u00f3n.<\/li>\n\n\n\n<li>Haga clic en el bot\u00f3n <i>Search&#8230;<\/i> a la derecha del campo de texto <i>Main class<\/i> y haga doble clic en la clase <i>SweetHome3DBootstrap<\/i> <br \/> entre las clases propuestas.<\/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>Figura 9. Creaci\u00f3n de una configuraci\u00f3n de depuraci\u00f3n <\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>Haga clic en la pesta\u00f1a <em>Classpath<\/em>, seleccione el subelemento <em>VolumePlugin (default classpath)<\/em> del elemento <em>User Entries<\/em> en la lista <em>Classpath<\/em> y haga clic en el bot\u00f3n <em>Remove<\/em>.<\/li>\n\n\n\n<li>Haga clic en el elemento<em> User Entries<\/em> en la lista <em>Classpath<\/em>, haga clic en el bot\u00f3n <em>Add JARs&#8230;<\/em>, seleccione el elemento SweetHome3D-7.5.jar y confirme su elecci\u00f3n.<\/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>Figura 10. Configuraci\u00f3n del classpath de la configuraci\u00f3n de depuraci\u00f3n <\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>Seleccione la pesta\u00f1a <em>Source<\/em>, haga clic en el bot\u00f3n <em>Add\u2026<\/em>, haga doble clic en el elemento <em>Java Project<\/em> en el cuadro de di\u00e1logo <em>Add Source<\/em>, seleccione el elemento <em>VolumePlugin<\/em> en la ventana emergente <em>Project Selection<\/em> y confirme su elecci\u00f3n.<\/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>Figura 11. Configuraci\u00f3n de la ruta de origen de la configuraci\u00f3n de depuraci\u00f3n <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>Finalmente, haga clic en el bot\u00f3n <i>Debug<\/i> para iniciar Sweet Home 3D en modo de depuraci\u00f3n. Una vez que el programa se est\u00e1 ejecutando, abra el archivo <tt>VolumePlugin.java<\/tt>, \n establezca un punto de interrupci\u00f3n en el m\u00e9todo <i>execute<\/i> y elija <i>Tools &gt; Compute volume<\/i> del men\u00fa de Sweet Home 3D. Eclipse se detendr\u00e1 en el punto de interrupci\u00f3n seleccionado\n para permitirle ejecutar el programa paso a paso e inspeccionar el valor de las variables.  <\/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>Figura 12. Perspectiva de depuraci\u00f3n de Eclipse <\/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>Cada vez que modifique el c\u00f3digo fuente de su plug-in, no olvide <a href=\"#creatingPluginJAR\">generar el JAR del plug-in<\/a> antes de iniciar la configuraci\u00f3n de depuraci\u00f3n que cre\u00f3. Para acelerar el proceso de exportaci\u00f3n de JAR en Eclipse, vaya al segundo paso del asistente de exportaci\u00f3n de JAR y seleccione la opci\u00f3n <em>Save the description of this JAR in the workspace<\/em>. Esto a\u00f1adir\u00e1 un nuevo elemento en el proyecto con un elemento de men\u00fa contextual <em>Create JAR<\/em>.  <\/p>\n<\/div>\n<h3 class=\"wp-block-heading\" id=\"implementacion-del-plugin\">Implementaci\u00f3n del plug-in<\/h3>\n<p>Una vez listo, su plug-in puede ser implementado en el ordenador de otros usuarios de Sweet Home 3D simplemente copi\u00e1ndolo en su <a href=\"#creatingPluginJAR\">carpeta de plug-ins<\/a>. A partir de la versi\u00f3n 1.6, un archivo de plug-in tambi\u00e9n puede instalarse en la carpeta de plug-ins de Sweet Home 3D haciendo doble clic en \u00e9l, si su extensi\u00f3n es SH3P (simplemente cambie la extensi\u00f3n del archivo de .zip a .sh3p). Si hacer doble clic en un archivo .sh3p no inicia Sweet Home 3D (lo m\u00e1s probable es que ocurra en Linux), tambi\u00e9n puede instalar un plug-in con el siguiente comando en una ventana de <em>Terminal<\/em> (donde    <code>SweetHome3D<\/code>  es el nombre del archivo ejecutable proporcionado con los instaladores de Sweet Home 3D):<\/p>\n\n<pre class=\"wp-block-preformatted\"><em>\/ruta\/a\/<\/em>SweetHome3D <em>\/ruta\/a\/<\/em>plugin.sh3p<\/pre>\n\n<p>Para dejar de usar un plug-in, elimine su archivo de la carpeta de plug-ins y reinicie 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 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>Si quiere que su plug-in pueda ejecutarse con todos los <a href=\"http:\/\/download\">instaladores de Sweet Home 3D<\/a> disponibles en este sitio web, tenga cuidado de mantenerlo compatible con Java 5, seleccionando <code>1.5<\/code> en el campo <em>Compiler compliance level<\/em> disponible en la secci\u00f3n <em>Java Compiler<\/em> del cuadro de di\u00e1logo que muestra el elemento de men\u00fa <em>Project &gt; Properties<\/em> de Eclipse.<br \/>Si utiliza una versi\u00f3n del compilador de Java donde la compatibilidad con Java 1.5 ya no est\u00e1 disponible, intente dirigirse al menos a Java 1.8 que todav\u00eda se utiliza en las versiones recientes de Sweet Home 3D y establezca <code>javaMinimumVersion<\/code> en el archivo <code>ApplicationPlugin.properties<\/code> de su plug-in en consecuencia.<\/p>\n<\/div>\n<h2 class=\"wp-block-heading\" id=\"yendo-mas-alla\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Yendo m\u00e1s all\u00e1<\/h2>\n<p>La programaci\u00f3n del primer *plug-in* te mostr\u00f3 la idea general. Aqu\u00ed tienes informaci\u00f3n adicional que te ayudar\u00e1 a ir m\u00e1s all\u00e1. <\/p>\n<h3 class=\"wp-block-heading\" id=\"api-de-sweet-home-3d-javadoc\">API de Sweet Home 3D &#8211; javadoc<\/h3>\n<p>La documentaci\u00f3n m\u00e1s \u00fatil para desarrollar un nuevo *plug-in* es la <a href=\"\/javadoc\/index.html\">API de Sweet Home 3D<\/a> (Interfaz de Programaci\u00f3n de Aplicaciones), generada con la herramienta javadoc.<br \/>Utiliza solo las clases de los paquetes <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> y <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/viewcontroller\/package-summary.html\">com.eteks.sweethome3d.viewcontroller<\/a> en tu *plug-in* si quieres que sea compatible con versiones futuras de Sweet Home 3D. Esto ser\u00e1 suficiente para programar cualquier *plug-in* que funcione con los datos de la casa disponibles en Sweet Home 3D.<br \/>Los paquetes que coinciden con las otras capas del programa se incluyen en el Javadoc solo con fines informativos. No conf\u00edes en su API, ya que a\u00fan puede cambiar en el futuro sin garant\u00eda de compatibilidad (de todos modos, no ver\u00e1s ninguna referencia a una clase de los paquetes <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> o <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/package-summary.html\">com.eteks.sweethome3d<\/a> en los paquetes mencionados).  <\/p>\n<h3 class=\"wp-block-heading\" id=\"arquitectura-de-las-clases-del-modelo\">Arquitectura de las clases del modelo<\/h3>\n<p>Sweet Home 3D se basa en una arquitectura MVC (Modelo Vista Controlador), por lo que es esencial comprender c\u00f3mo est\u00e1 organizada su capa de Modelo. La figura 13 (tambi\u00e9n disponible en <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/modelClassesDiagram.png\">formato PDF<\/a>) presenta casi todas las clases e interfaces disponibles en la versi\u00f3n 1.5 del paquete <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/package-summary.html\">com.eteks.sweethome3d.model<\/a> que coincide con esta capa de Modelo. <\/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>La clase central en la capa de Modelo es la clase <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeApplication.html\">HomeApplication<\/a> (10), la superclase abstracta de la clase principal de la aplicaci\u00f3n <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/SweetHome3D.html\">SweetHome3D<\/a>. La instancia de esta clase da acceso a las instancias de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) que se est\u00e1n editando actualmente, y al objeto <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/UserPreferences.html\">UserPreferences<\/a> (11) que almacena la <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/LengthUnit.html\">unidad de longitud<\/a> en uso (12), el <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCatalog.html\">cat\u00e1logo de muebles<\/a> (14) y el <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCatalog.html\">cat\u00e1logo de texturas<\/a> (15) desde el cual el usuario elige <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogPieceOfFurniture.html\">muebles<\/a> (17) y <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogTexture.html\">texturas<\/a> (18).<br \/>Una instancia de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) almacena todos los objetos que el usuario cre\u00f3 en el plano de la casa: <\/p>\n\n<ul class=\"wp-block-list\">\n<li>la lista de objetos <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomePieceOfFurniture.html\">HomePieceOfFurniture<\/a> (13) que implementan la interfaz <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">PieceOfFurniture<\/a> (16),<\/li>\n\n\n\n<li>la colecci\u00f3n de objetos <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Wall<\/a> (9),<\/li>\n\n\n\n<li>la lista de objetos <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Room<\/a> (5),<\/li>\n\n\n\n<li>la colecci\u00f3n de objetos <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/DimensionLine.html\">DimensionLine<\/a> (2),<\/li>\n\n\n\n<li>la colecci\u00f3n de objetos <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Label.html\">Label<\/a> (3).<\/li>\n<\/ul>\n\n<p>Estos objetos implementan la interfaz <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Selectable.html\">Selectable<\/a> (1) as\u00ed como el objeto <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/ObserverCamera.html\">ObserverCamera<\/a> (4), que almacena la ubicaci\u00f3n de la c\u00e1mara en el modo <em>Visitante virtual<\/em>. Se accede a toda la informaci\u00f3n externa gestionada por los objetos del Modelo, como el icono y el modelo 3D de un <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">mueble<\/a> (16), o la imagen de una <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextureImage.html\">textura<\/a> (20) a trav\u00e9s de la interfaz <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Content.html\">Content<\/a> (19), implementada por la clase <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/URLContent.html\">URLContent<\/a> y otras clases del paquete <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/package-summary.html\">com.eteks.sweethome3d.tools<\/a>. <\/p>\n\n<p>Este diagrama UML deber\u00eda ayudarte a comprender qu\u00e9 clases est\u00e1n disponibles en el modelo de Sweet Home 3D y c\u00f3mo puedes acceder a ellas, pero probablemente notar\u00e1s que no se citan constructores ni mutadores (o *setters* si lo prefieres). Es solo por falta de espacio, pero puedes usarlos sin problema en una clase de *plug-in*. Ten en cuenta tambi\u00e9n que cualquier modificaci\u00f3n de un objeto existente del modelo se notificar\u00e1 a los componentes mostrados ya sea con <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/beans\/PropertyChangeEvent.html\" target=\"_blank\" rel=\"noopener\">PropertyChangeEvent<\/a>s, con <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionEvent.html\">CollectionEvent<\/a>s (8) o con <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionEvent.html\">SelectionEvent<\/a>s (6), lo que permitir\u00e1 que todos los cambios se reflejen inmediatamente en la pantalla.  <\/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>El modelo de Sweet Home 3D <strong>no<\/strong> es seguro para subprocesos por razones de rendimiento. Todas las <strong>modificaciones<\/strong> de un objeto que pertenece al modelo deben realizarse en el hilo de despacho de eventos. <\/p>\n<\/div>\n<h3 class=\"wp-block-heading\" id=\"arquitectura-de-las-clases-de-plugin\">Arquitectura de las clases de *plug-in*<\/h3>\n<p>La arquitectura de las clases de *plug-in* es mucho m\u00e1s sencilla de entender que la de la capa de Modelo. El paquete <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/package-summary.html\">com.eteks.sweethome3d.plugin<\/a> contiene solo tres clases entre las cuales se supone que debes usar solo las clases <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> y <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, como se muestra en la figura 14 (tambi\u00e9n disponible en <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/pluginClassesDiagram.png\">formato PDF<\/a>). <\/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>Se crea una instancia de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginManager.html\">PluginManager<\/a> (1) al iniciar la aplicaci\u00f3n y busca los *plug-ins* instalados en la <a href=\"#creating-the-plugin-jar\">carpeta de *plug-ins*<\/a> del usuario. Cada vez que se edita una nueva casa, este administrador crea instancias y configura un objeto <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> (3) para cada *plug-in* encontrado en el momento del inicio. Luego, llama al m\u00e9todo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getActions()\">getActions<\/a> para recuperar todas las <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">acciones<\/a> (4) que se agregar\u00e1n como elementos de men\u00fa y\/o botones de la barra de herramientas en la ventana de la casa. Cada acci\u00f3n es una instancia de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, que se parece a la clase <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/Action.html\" target=\"_blank\" rel=\"noopener\">Action<\/a>, con su m\u00e9todo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#execute()\">execute<\/a> y sus <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.Property.html\">propiedades<\/a> modificables (2).   <\/p>\n\n<p>Ten en cuenta que la clase <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> te da acceso a una instancia de <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEditSupport.html\" target=\"_blank\" rel=\"noopener\">UndoableEditSupport<\/a> a trav\u00e9s de su m\u00e9todo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getUndoableEditSupport()\">getUndoableEditSupport<\/a>. Tan pronto como modifiques una casa o sus objetos (muebles, paredes&#8230;) en el m\u00e9todo *execute* de una instancia de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, tambi\u00e9n debes publicar un objeto <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEdit.html\" target=\"_blank\" rel=\"noopener\">UndoableEdit<\/a> en el soporte de edici\u00f3n deshacible devuelto por el m\u00e9todo *getUndoableEditSupport*, de lo contrario, los usuarios no podr\u00e1n deshacer\/rehacer correctamente los cambios que hayas realizado. <\/p>\n<h3 class=\"wp-block-heading\" id=\"localizacion\">Localizaci\u00f3n<\/h3>\n<p>Si planeas desarrollar un *plug-in* para la comunidad de usuarios de Sweet Home 3D, intenta localizar las cadenas que muestra, ya sea en el nombre de las acciones y el men\u00fa o en los di\u00e1logos que crear\u00e1s (o al menos prepara su localizaci\u00f3n). Dos <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#PluginAction(java.lang.String,%20java.lang.String,%20java.lang.ClassLoader)\">constructores de la clase PluginAction<\/a> te ayudar\u00e1n a organizar la traducci\u00f3n de las propiedades de las acciones con archivos .properties, y si necesitas traducir otras cadenas en tu *plug-in* (como la del di\u00e1logo que muestra el <a href=\"#testing-the-plugin\">*plug-in* probado<\/a>) reutiliza estos archivos .properties con la clase Java <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/util\/ResourceBundle.html\" target=\"_blank\" rel=\"noopener\">ResourceBundle<\/a>.<br \/>Si prefieres limitar el n\u00famero de archivos de propiedades, incluso podr\u00edas escribir los valores de las propiedades de la acci\u00f3n y otras cadenas en el <a href=\"#creating-the-plugin-description-file\">archivo de descripci\u00f3n<\/a> ApplicationPlugin.properties de tu *plug-in*. <\/p>\n\n<p>Si quieres un ejemplo que utilice esta arquitectura, descarga el *plug-in* <em>Export to SH3F<\/em> disponible en <a href=\"\/storage\/plugins\/ExportToSH3F-1.0.sh3p\">https:\/\/www.sweethome3d.com\/plugins\/ExportToSH3F-1.0.sh3p<\/a>, y descompr\u00edmelo (este archivo de *plug-in* tambi\u00e9n contiene el c\u00f3digo fuente del *plug-in*).<br \/>Como se describe en el <a href=\"https:\/\/sourceforge.net\/forum\/message.php?msg_id=5837358\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">foro de ayuda<\/a>, este *plug-in* crea un archivo SH3F que contiene todos los muebles que importaste en el cat\u00e1logo de muebles de Sweet Home 3D.<\/p>\n<h3 class=\"wp-block-heading\" id=\"contribucion-de-plugins\">Contribuci\u00f3n de *plug-ins*<\/h3>\n<p>Puedes publicar los *plug-ins* que programaste en el Sistema de Seguimiento de <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/\" target=\"_blank\" rel=\"noopener\">Contribuciones de *Plug-ins*<\/a> para compartirlos con la comunidad de usuarios de Sweet Home 3D.<br \/>Se pueden agregar muchas funciones a Sweet Home 3D gracias a los *plug-ins*, desde importadores hasta exportadores, pero tambi\u00e9n *plug-ins* capaces de modificar los datos de una casa como el <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/1\/\" target=\"_blank\" rel=\"noopener\">*Home Rotator Plug-in*<\/a> desarrollado por Michel Mbem y otros enumerados en el <a href=\"\/storage\/pluginsUserGuide.pdf\">Tutorial para *Plug-ins* y Extensiones<\/a> (PDF) escrito por Hans Dirkse y en la p\u00e1gina <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/es\/plugins-y-herramientas\/\" data-type=\"page\" data-id=\"437\">*Plug-ins* y herramientas<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n A partir de la versi\u00f3n 1.5, es posible a\u00f1adir nuevas funciones a Sweet Home 3D con archivos de plug-in colocados en su carpeta de plug-ins. Esto permite a los programadores de Java desarrollar y distribuir nuevas funciones para Sweet Home 3D sin modificar los archivos de c\u00f3digo fuente de la versi\u00f3n actual (lo cual [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":10601,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-10620","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/es\/wp-json\/wp\/v2\/pages\/10620","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/es\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/es\/wp-json\/wp\/v2\/comments?post=10620"}],"version-history":[{"count":3,"href":"https:\/\/wp-test-1.sweethome3d.eu\/es\/wp-json\/wp\/v2\/pages\/10620\/revisions"}],"predecessor-version":[{"id":11793,"href":"https:\/\/wp-test-1.sweethome3d.eu\/es\/wp-json\/wp\/v2\/pages\/10620\/revisions\/11793"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/es\/wp-json\/wp\/v2\/media\/10601"}],"wp:attachment":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/es\/wp-json\/wp\/v2\/media?parent=10620"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}