{"id":11746,"date":"2025-11-05T16:28:15","date_gmt":"2025-11-05T16:28:15","guid":{"rendered":"https:\/\/www.sweethome3d.com\/guia-para-desarrolladores-de-plug-ins\/"},"modified":"2025-12-19T10:19:45","modified_gmt":"2025-12-19T10:19:45","slug":"guia-para-desarrolladores-de-plug-ins","status":"publish","type":"page","link":"https:\/\/www.sweethome3d.com\/es\/guia-para-desarrolladores-de-plug-ins\/","title":{"rendered":"Gu\u00eda para desarrolladores de plug-ins"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introducci\u00f3n<\/h2>\n\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 la <a href=\"#deployingPlugin\">carpeta de plug-ins<\/a>. Esto permite a los programadores de Java desarrollar y distribuir nuevas funciones para <a href=\"https:\/\/www.sweethome3d.com\/es\/\">Sweet Home 3D<\/a> 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 vivienda y, finalmente, ofrece <a href=\"#goingFurther\">informaci\u00f3n adicional<\/a> que le ayudar\u00e1 a ir m\u00e1s all\u00e1. <\/p>\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n<h2 class=\"wp-block-heading\" id=\"installingTools\">Instalaci\u00f3n de herramientas de desarrollo<\/h2>\n\n<p>Si 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\n<h3 class=\"wp-block-heading\">Descargar e instalar Eclipse<\/h3>\n\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: solo tiene que descomprimir el archivo que obtendr\u00e1, abrir la carpeta eclipse y, dependiendo de su sistema, ejecutar 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-in.<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>. Por \u00faltimo, cierre la pesta\u00f1a <em>Welcome<\/em> para descubrir su espacio de trabajo como se muestra en la figura 1. <\/p>\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"388\" height=\"315\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipse.png\" alt=\"\" class=\"wp-image-5845 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipse.png 388w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipse-300x244.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipse-111x90.png 111w\" data-sizes=\"(max-width: 388px) 100vw, 388px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 388px; --smush-placeholder-aspect-ratio: 388\/315;\" \/><figcaption class=\"wp-element-caption\">Figura 1. Espacio de trabajo de Eclipse <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Descargar e instalar la biblioteca de Sweet Home 3D<\/h3>\n\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 JAR ejecutable de Sweet Home 3D disponible en <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>. 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\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"452\" height=\"157\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/addToBuildPath.png\" alt=\"\" class=\"wp-image-5846 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/addToBuildPath.png 452w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/addToBuildPath-300x104.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/addToBuildPath-259x90.png 259w\" data-sizes=\"(max-width: 452px) 100vw, 452px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 452px; --smush-placeholder-aspect-ratio: 452\/157;\" \/><figcaption class=\"wp-element-caption\">Figura 2. A\u00f1adir SweetHome3D-7.5.jar<br\/> a Build Path <\/figcaption><\/figure>\n<\/div>\n\n<h2 class=\"wp-block-heading programmingPlugin\">Programaci\u00f3n de un plug-in<\/h2>\n\n<p>Ahora que ha instalado las herramientas necesarias, veamos c\u00f3mo puede programar su primer plug-in para Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">Creaci\u00f3n de la clase de plug-in<\/h3>\n\n<p>En primer lugar, 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\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"418\" height=\"509\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newJavaClass.png\" alt=\"\" class=\"wp-image-5847 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newJavaClass.png 418w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newJavaClass-246x300.png 246w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newJavaClass-74x90.png 74w\" data-sizes=\"(max-width: 418px) 100vw, 418px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 418px; --smush-placeholder-aspect-ratio: 418\/509;\" \/><figcaption class=\"wp-element-caption\">Figura 3. Creaci\u00f3n de una nueva clase <\/figcaption><\/figure>\n<\/div>\n\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 que devuelva una acci\u00f3n de plug-in capaz de calcular el volumen de los muebles m\u00f3viles. Sustituya 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\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"615\" height=\"117\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/quickFix.png\" alt=\"\" class=\"wp-image-5848 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/quickFix.png 615w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/quickFix-300x57.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/quickFix-473x90.png 473w\" data-sizes=\"(max-width: 615px) 100vw, 615px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 615px; --smush-placeholder-aspect-ratio: 615\/117;\" \/><figcaption class=\"wp-element-caption\">Figura 4. Uso de Quick fix para generar una clase que falta <\/figcaption><\/figure>\n<\/div>\n\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 inicie 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. <strong>isMovable<\/strong>()) {<br\/> volumeInCm3 += piece. <strong>getWidth<\/strong>() <br\/> * piece. <g id=\"gid_4\">getDepth<\/g>() <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 iniciar\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 inicien 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 pl-14\">\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\n<h3 class=\"wp-block-heading\" id=\"creating-the-plugin-description-file\">Creaci\u00f3n del archivo de descripci\u00f3n del plug-in<\/h3>\n\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 que se soporta,\n y aspectos legales. Elija <i>File &gt; New &gt; File<\/i> en el men\u00fa\n 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\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img decoding=\"async\" width=\"264\" height=\"384\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newFile.png\" alt=\"\" class=\"wp-image-5849 lazyload\" style=\"--smush-placeholder-width: 264px; --smush-placeholder-aspect-ratio: 264\/384;width:264px;height:auto\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newFile.png 264w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newFile-206x300.png 206w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/newFile-62x90.png 62w\" data-sizes=\"(max-width: 264px) 100vw, 264px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><figcaption class=\"wp-element-caption\">Figura 5. Creaci\u00f3n de un nuevo archivo <\/figcaption><\/figure>\n<\/div>\n\n<p>A continuaci\u00f3n, 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 vivienda<br\/><strong>version<\/strong>=1.0<br\/><strong>license<\/strong>=GNU GPL<br\/><strong>provider<\/strong>=(C) Copyrights 2024 Space Mushrooms<br\/><strong>applicationMinimumVersion<\/strong>=1.5<br\/><strong>javaMinimumVersion<\/strong>=1.5<\/pre>\n\n<h3 class=\"wp-block-heading\" id=\"creatingPluginJAR\">Creaci\u00f3n del JAR del plug-in<\/h3>\n\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> en el 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 pl-14\">\n<li>  en Windows Vista \/ 7 \/ 8 \/ 10 \/ 11, esta carpeta es <tt>C:\\Users\\<i>usuario<\/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>usuario<\/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 carpeta de usuario\n,<\/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\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"499\" height=\"440\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/jarExport.png\" alt=\"\" class=\"wp-image-5850 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/jarExport.png 499w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/jarExport-300x265.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/jarExport-102x90.png 102w\" data-sizes=\"(max-width: 499px) 100vw, 499px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 499px; --smush-placeholder-aspect-ratio: 499\/440;\" \/><figcaption class=\"wp-element-caption\">Figura 6. Exportaci\u00f3n a un archivo JAR <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"testing-the-plugin\">Prueba del plug-in<\/h3>\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\/\" target=\"_blank\" rel=\"noopener\">instaladores<\/a> o el archivo <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 este \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\/\" target=\"_blank\" rel=\"noopener\">instaladores<\/a> o el archivo <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 este \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 seguimiento de la pila 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\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"447\" height=\"53\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginMenu.png\" alt=\"\" class=\"wp-image-5851 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginMenu.png 447w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginMenu-300x36.png 300w\" data-sizes=\"(max-width: 447px) 100vw, 447px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 447px; --smush-placeholder-aspect-ratio: 447\/53;\" \/><figcaption class=\"wp-element-caption\">Figura 7. Men\u00fa del plug-in <\/figcaption><\/figure>\n<\/div>\n\n<p>Si elige el nuevo elemento de men\u00fa para el <a href=\"\/examples\/userGuideExample.sh3d\">ejemplo de vivienda<\/a> creado en la <a href=\"https:\/\/www.sweethome3d.com\/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\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"448\" height=\"137\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginInAction.png\" alt=\"\" class=\"wp-image-5853 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginInAction.png 448w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginInAction-300x92.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginInAction-294x90.png 294w\" data-sizes=\"(max-width: 448px) 100vw, 448px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 448px; --smush-placeholder-aspect-ratio: 448\/137;\" \/><figcaption class=\"wp-element-caption\">Figura 8. Plug-in en acci\u00f3n <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Depuraci\u00f3n del plug-in<\/h3>\n\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 pl-14\">\n<li>Elija <i>Run &gt; Debug Configurations&#8230;<\/i> en el men\u00fa, seleccione el elemento <i>Java Application<\/i> en la lista de configuraciones disponibles del cuadro de di\u00e1logo \n          <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\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"629\" height=\"390\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/debugConfiguration.png\" alt=\"\" class=\"wp-image-5854 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/debugConfiguration.png 629w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/debugConfiguration-300x186.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/debugConfiguration-145x90.png 145w\" data-sizes=\"(max-width: 629px) 100vw, 629px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 629px; --smush-placeholder-aspect-ratio: 629\/390;\" \/><figcaption class=\"wp-element-caption\"><em>Figura 9. Creaci\u00f3n de una configuraci\u00f3n de depuraci\u00f3n <\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\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\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"618\" height=\"482\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/classpathConfiguration.png\" alt=\"\" class=\"wp-image-5855 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/classpathConfiguration.png 618w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/classpathConfiguration-300x234.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/classpathConfiguration-115x90.png 115w\" data-sizes=\"(max-width: 618px) 100vw, 618px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 618px; --smush-placeholder-aspect-ratio: 618\/482;\" \/><figcaption class=\"wp-element-caption\">Figura 10. Configuraci\u00f3n del classpath de la configuraci\u00f3n de depuraci\u00f3n <\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\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\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"773\" height=\"549\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration.png\" alt=\"\" class=\"wp-image-5856 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration.png 773w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration-300x213.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration-127x90.png 127w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/sourcepathConfiguration-768x545.png 768w\" data-sizes=\"(max-width: 773px) 100vw, 773px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 773px; --smush-placeholder-aspect-ratio: 773\/549;\" \/><figcaption class=\"wp-element-caption\"><em><em><em>Figura 11. Configuraci\u00f3n de la ruta de origen de la configuraci\u00f3n de depuraci\u00f3n <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Por \u00faltimo, 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> en el 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\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image aligncenter size-full\"><img decoding=\"async\" width=\"601\" height=\"398\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipseDebug.png\" alt=\"\" class=\"wp-image-5857 lazyload\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipseDebug.png 601w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipseDebug-300x199.png 300w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/eclipseDebug-136x90.png 136w\" data-sizes=\"(max-width: 601px) 100vw, 601px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 601px; --smush-placeholder-aspect-ratio: 601\/398;\" \/><figcaption class=\"wp-element-caption\">Figura 12. Perspectiva de depuraci\u00f3n de Eclipse <\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-64989fb1 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/09\/warning-1.gif\" alt=\"\" class=\"wp-image-4679 lazyload\" style=\"--smush-placeholder-width: 21px; --smush-placeholder-aspect-ratio: 21\/21;width:21px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n\n\n\n<p>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 ha creado. 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\n<h3 class=\"wp-block-heading\" id=\"deployingPlugin\">Implementaci\u00f3n del plug-in<\/h3>\n\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 al hacer doble clic en un archivo .sh3p no se 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 decoding=\"async\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/09\/warning-1.gif\" alt=\"\" class=\"wp-image-4679 lazyload\" style=\"--smush-placeholder-width: 21px; --smush-placeholder-aspect-ratio: 21\/21;width:21px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n\n\n\n<p>Si quiere que su plug-in pueda ejecutarse con todos los <a href=\"https:\/\/www.sweethome3d.com\/es\/descarga\/\">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 en la que 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\n<h2 class=\"wp-block-heading\" id=\"goingFurther\">Yendo m\u00e1s all\u00e1<\/h2>\n\n<p>La programaci\u00f3n del primer plug-in le mostr\u00f3 la imagen completa. Aqu\u00ed tiene informaci\u00f3n adicional que le ayudar\u00e1 a ir m\u00e1s all\u00e1. <\/p>\n\n<h3 class=\"wp-block-heading\">API de Sweet Home 3D &#8211; Javadoc<\/h3>\n\n<p>La documentaci\u00f3n m\u00e1s \u00fatil para desarrollar un nuevo plugin 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\/>Utilice 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 su plugin si quiere que sea compatible con versiones futuras de Sweet Home 3D. Esto ser\u00e1 suficiente para programar cualquier plugin 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\u00ede en su API, ya que puede cambiar en el futuro sin garant\u00eda de compatibilidad ascendente (de todos modos, no ver\u00e1 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\n<h3 class=\"wp-block-heading\">Arquitectura de las clases del modelo<\/h3>\n\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:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/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<p>[uml_diagram slug=\u00bbmodel-classes-diagram\u00bb map_name=\u00bbmodel-classes-diagram\u00bb caption=\u00bbFigure 13. UML diagram of com.eteks.sweethome3d.model package\u00bb caption_small=\u00bb(click on a class to view its javadoc)\u00bb]<\/p>\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 que 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 ha creado en el plano de la casa: <\/p>\n\n<ul class=\"wp-block-list pl-14\">\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 ayudarle a comprender qu\u00e9 clases est\u00e1n disponibles en el modelo de Sweet Home 3D y c\u00f3mo puede acceder a ellas, pero probablemente notar\u00e1 que no se citan constructores ni mutadores (o setters si lo prefiere). Es solo por falta de espacio, pero puede usarlos sin problema en una clase de plugin. Tenga 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 permite que todos los cambios se reflejen inmediatamente en la pantalla.  <\/p>\n\n<div class=\"wp-block-group warning-banner is-nowrap is-layout-flex wp-container-core-group-is-layout-9123dee2 wp-block-group-is-layout-flex\">\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" width=\"190\" height=\"190\" data-src=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/11\/Frame-281.png\" alt=\"\" class=\"wp-image-786 lazyload\" style=\"--smush-placeholder-width: 190px; --smush-placeholder-aspect-ratio: 190\/190;width:130px\" data-srcset=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/11\/Frame-281.png 190w, https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/11\/Frame-281-90x90.png 90w\" data-sizes=\"(max-width: 190px) 100vw, 190px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" \/><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer !h-auto wp-container-content-16d1eb73\"><\/div>\n\n\n\n<p>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 perteneciente al modelo deben realizarse en el hilo de despacho de eventos (Event Dispatch Thread). <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Arquitectura de las clases de plugin<\/h3>\n\n<p>La arquitectura de las clases de plugin 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 que se supone que solo debe usar 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:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginClassesDiagram.png\">formato PDF<\/a>). <\/p>\n\n<p>[uml_diagram slug=\u00bbplugin-classes-diagram\u00bb map_name=\u00bbplugin-classes-diagram\u00bb caption=\u00bbFigure 14. UML diagram of com.eteks.sweethome3d.plugin package\u00bb caption_small=\u00bb(click on a class to view its javadoc)\u00bb]<\/p>\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 plugins instalados en la <a href=\"#creating-the-plugin-jar\">carpeta de plugins<\/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 plugin encontrado en el momento del inicio. A continuaci\u00f3n, 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 a\u00f1adir\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>Tenga en cuenta que la clase <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> le 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 modifique 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 debe 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 haya realizado. <\/p>\n\n<h3 class=\"wp-block-heading\">Localizaci\u00f3n<\/h3>\n\n<p>Si planea desarrollar un plugin para la comunidad de usuarios de Sweet Home 3D, intente localizar las cadenas que muestra, ya sea en el nombre de las acciones y el men\u00fa o en los di\u00e1logos que cree (o al menos prepare 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> le ayudar\u00e1n a organizar la traducci\u00f3n de las propiedades de las acciones con archivos .properties, y si necesita traducir otras cadenas en su plugin (como la del di\u00e1logo mostrado por el <a href=\"#testing-the-plugin\">plugin probado<\/a>) reutilice 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 prefiere limitar el n\u00famero de archivos de propiedades, incluso podr\u00eda 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 su plugin. <\/p>\n\n<p>Si quiere un ejemplo que utilice esta arquitectura, descargue el plugin <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\u00edmalo (este archivo de plugin tambi\u00e9n contiene el c\u00f3digo fuente del plugin).<br\/>Como se describe en el <a href=\"https:\/\/sourceforge.net\/forum\/message.php?msg_id=5837358\" target=\"_blank\" rel=\"noopener\">foro de ayuda<\/a>, este plugin crea un archivo SH3F que contiene todos los muebles que import\u00f3 en el cat\u00e1logo de muebles de Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">Contribuci\u00f3n de plugins<\/h3>\n\n<p>Puede publicar los plugins que haya programado en el Sistema de Seguimiento de <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/\" target=\"_blank\" rel=\"noopener\">Contribuciones de Plugins<\/a> para compartirlos con la comunidad de usuarios de Sweet Home 3D.<br\/>Se pueden a\u00f1adir muchas funciones a Sweet Home 3D gracias a los plugins, desde importadores hasta exportadores, pero tambi\u00e9n plugins capaces de modificar los datos de una casa como el <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/1\/\" target=\"_blank\" rel=\"noopener\">Plugin Home Rotator<\/a> desarrollado por Michel Mbem y otros que figuran en el <a href=\"\/storage\/pluginsUserGuide.pdf\">Tutorial para Plugins y Extensiones<\/a> (PDF) escrito por Hans Dirkse y en la p\u00e1gina <a href=\"https:\/\/www.sweethome3d.com\/plugins\/\" data-type=\"page\" data-id=\"437\">Plugins 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 la 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<a href=\"https:\/\/www.sweethome3d.com\/es\/guia-para-desarrolladores-de-plug-ins\/\">Continue reading <span class=\"sr-only\">\u00abGu\u00eda para desarrolladores de plug-ins\u00bb<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":11740,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-resources.php","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-11746","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/www.sweethome3d.com\/es\/wp-json\/wp\/v2\/pages\/11746","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sweethome3d.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.sweethome3d.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/es\/wp-json\/wp\/v2\/comments?post=11746"}],"version-history":[{"count":2,"href":"https:\/\/www.sweethome3d.com\/es\/wp-json\/wp\/v2\/pages\/11746\/revisions"}],"predecessor-version":[{"id":12448,"href":"https:\/\/www.sweethome3d.com\/es\/wp-json\/wp\/v2\/pages\/11746\/revisions\/12448"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/es\/wp-json\/wp\/v2\/media\/11740"}],"wp:attachment":[{"href":"https:\/\/www.sweethome3d.com\/es\/wp-json\/wp\/v2\/media?parent=11746"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}