{"id":10556,"date":"2025-10-01T14:53:41","date_gmt":"2025-10-01T14:53:41","guid":{"rendered":"https:\/\/wp-test-1.sweethome3d.eu\/guia-do-desenvolvedor-de-plug-ins\/"},"modified":"2025-10-31T17:19:54","modified_gmt":"2025-10-31T17:19:54","slug":"guia-do-desenvolvedor-de-plug-ins","status":"publish","type":"page","link":"https:\/\/wp-test-1.sweethome3d.eu\/pt\/guia-do-desenvolvedor-de-plug-ins\/","title":{"rendered":"Guia do desenvolvedor de plug-ins"},"content":{"rendered":"<ul class=\"simpletoc-list\">\n<li><a href=\"#introducao\">Introdu\u00e7\u00e3o<\/a>\n\n<\/li>\n<li><a href=\"#instalando-ferramentas-de-desenvolvimento\">Instalando ferramentas de desenvolvimento<\/a>\n\n\n<\/li>\n\n<li><a href=\"#programando-um-plugin\">Programando um plug-in<\/a>\n\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<\/li>\n\n<li><a href=\"#indo-alem\">Indo al\u00e9m<\/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=\"introducao\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Introdu\u00e7\u00e3o<\/h2>\n<p>A partir da vers\u00e3o 1.5, \u00e9 poss\u00edvel adicionar novas funcionalidades ao <a href=\"\/\">Sweet Home 3D<\/a> com arquivos de plug-in colocados na sua <a href=\"#deployingPlugin\">pasta de plug-ins<\/a>. Isso permite que programadores Java desenvolvam e distribuam novas funcionalidades para o Sweet Home 3D sem modificar os arquivos fonte da vers\u00e3o atual (o que \u00e9 bom para compatibilidade futura), e sem entregar uma vers\u00e3o completa do programa (o que \u00e9 bom para o tamanho da entrega).<br\/>Este documento descreve as <a href=\"#installingTools\" data-type=\"internal\" data-id=\"#installingTools\">ferramentas<\/a> necess\u00e1rias para criar plug-ins, depois mostra como <a href=\"#programmingPlugin\">programar um plug-in<\/a> que calcula o volume m\u00e1ximo dos m\u00f3veis m\u00f3veis adicionados a uma casa, e finalmente fornece algumas <a href=\"#goingFurther\">informa\u00e7\u00f5es adicionais<\/a> que te ajudar\u00e3o a ir al\u00e9m. <\/p>\n<h2 class=\"wp-block-heading\" id=\"instalando-ferramentas-de-desenvolvimento\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Instalando ferramentas de desenvolvimento<\/h2>\n<p>Se o Sweet Home 3D \u00e9 destinado a um p\u00fablico geral, desenvolver plug-ins requer habilidades especiais, e voc\u00ea deve saber como programar em <a href=\"https:\/\/java.sun.com\" target=\"_blank\" rel=\"noopener\">Java<\/a> com uma IDE<a href=\"https:\/\/ant.apache.org\/\" target=\"_blank\" rel=\"noopener\"><\/a>, antes de prosseguir. Este guia mostra como construir um plug-in com o <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">Eclipse<\/a>, mas voc\u00ea pode usar a IDE de sua escolha, ou nenhuma IDE. <\/p>\n<h3 class=\"wp-block-heading\" id=\"baixar-e-instalar-o-eclipse\">Baixar e instalar o Eclipse<\/h3>\n<p>Primeiro baixe o Eclipse de <a href=\"https:\/\/www.eclipse.org\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.eclipse.org\/<\/a>. A vers\u00e3o chamada <em>Eclipse IDE for Java Developers<\/em> \u00e9 suficiente para desenvolver um plug-in, mas voc\u00ea pode baixar qualquer vers\u00e3o para desenvolvimento Java. <br\/>Uma vez baixado, instalar o Eclipse \u00e9 muito simples: apenas descompacte o arquivo que voc\u00ea obteve, abra a pasta eclipse e dependendo do seu sistema, execute o arquivo chamado  <code>eclipse.exe<\/code>  (no Windows),  <code>eclipse.app<\/code>  (no Mac OS X) ou  <code>eclipse<\/code>  (no Linux).<br\/>Na primeira execu\u00e7\u00e3o, o Eclipse solicitar\u00e1 que voc\u00ea escolha uma pasta de <em>workspace<\/em>, onde ser\u00e3o armazenados os projetos de plug-in.<br\/>Depois disso, escolha <em>File &gt; New &gt; Project<\/em> no menu para criar um novo projeto, selecione <em>Java &gt; Java project<\/em> no assistente <em>New project<\/em> que ser\u00e1 exibido, digite VolumePlugin como nome do projeto e clique no bot\u00e3o <em>Finish<\/em>. Finalmente, feche a aba <em>Welcome<\/em> para descobrir seu workspace como mostrado na 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=\"Guia do desenvolvedor 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. Workspace do Eclipse <\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"baixar-e-instalar-a-biblioteca-do-sweet-home-3d\">Baixar e instalar a biblioteca do Sweet Home 3D<\/h3>\n<p>O desenvolvimento de um plug-in \u00e9 baseado em algumas classes do Sweet Home 3D que o Eclipse deve conhecer para poder construir seu projeto. A maneira mais f\u00e1cil de adicionar as classes do Sweet Home 3D ao Eclipse \u00e9 baixar a vers\u00e3o JAR execut\u00e1vel do Sweet Home 3D dispon\u00edvel em <g id=\"gid_0\">https:\/\/sourceforge.net\/projects\/sweethome3d\/files\/SweetHome3D\/SweetHome3D-7.5\/SweetHome3D-7.5.jar\/download<\/g>. Uma vez baixado, arraste e solte o arquivo SweetHome3D-7.5.jar no \u00edcone do projeto <em>VolumePlugin<\/em> na visualiza\u00e7\u00e3o <em>Package Explorer<\/em> do Eclipse, e escolha o item <em>Build Path &gt; Add to Build Path<\/em> no menu contextual do arquivo SweetHome3D-7.5.jar, como mostrado na 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. Adicionando SweetHome3D-7.5.jar<br\/> ao Build Path <\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<p><\/p>\n<h2 class=\"wp-block-heading\" id=\"programando-um-plugin\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Programando um plug-in<\/h2>\n<p>Agora que voc\u00ea instalou as ferramentas necess\u00e1rias, vamos ver como voc\u00ea pode programar seu primeiro plug-in para o Sweet Home 3D.<\/p>\n<h3 class=\"wp-block-heading\" id=\"criando-a-classe-do-plugin\">Criando a classe do plug-in<\/h3>\n<p>Primeiro, crie uma nova subclasse de com.eteks.sweethome3d.plugin.Plugin escolhendo o item de menu <em>File &gt; New &gt; Class<\/em> no 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. Criando uma nova classe <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<p>Na caixa de di\u00e1logo <em>New Java Class<\/em>, digite VolumePlugin como nome da classe, insira um pacote (aqui o pacote escolhido foi com.eteks.test), e escolha com.eteks.sweethome3d.plugin.Plugin como a superclasse de VolumePlugin. Depois disso, clique em <g id=\"gid_1\">Finish<\/g>. O Eclipse criar\u00e1 o arquivo da nova classe com o seguinte conte\u00fado:  <\/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 voc\u00ea pode adivinhar pelo coment\u00e1rio TODO, voc\u00ea deve agora alterar a implementa\u00e7\u00e3o do m\u00e9todo getActions para retornar uma a\u00e7\u00e3o de plug-in capaz de calcular o volume dos m\u00f3veis m\u00f3veis. Substitua return null; pela seguinte declara\u00e7\u00e3o: <\/p>\n\n<pre class=\"wp-block-preformatted\">  return new <strong>PluginAction<\/strong> [] {new <strong>VolumeAction<\/strong>()};  <\/pre>\n\n<p>e escolha <em>Edition &gt; Quick Fix<\/em> no menu do Eclipse para criar a classe VolumeAction ausente, como mostrado na 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. Usando Quick fix para gerar uma classe ausente <\/em><\/figcaption><\/figure>\n<\/div>\n<p>Na caixa de di\u00e1logo <em>New Java Class<\/em> que aparece, selecione a caixa de sele\u00e7\u00e3o <em>Enclosing type<\/em> para criar uma classe interna de VolumePlugin e clique em <em>Finish<\/em>. Isso criar\u00e1 a classe VolumeAction que herda da classe com.eteks.sweethome3d.plugin.PluginAction e cont\u00e9m um m\u00e9todo execute vazio: <\/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 \u00e9 aquele que o Sweet Home 3D chamar\u00e1 quando o usu\u00e1rio iniciar a a\u00e7\u00e3o do plug-in; portanto, este \u00e9 o lugar onde voc\u00ea deve implementar como calcular o volume dos m\u00f3veis e exibi-lo:<\/p>\n\n<pre class=\"wp-block-preformatted\">  public class <g id=\"gid_0\">VolumeAction<\/g> extends <strong>PluginAction<\/strong> {  <br\/>  @Override<br\/>  public void <strong>execute<\/strong>() { <br\/>  float volumeInCm3 = 0;<br\/> \/\/ Calcula a soma do volume da caixa delimitadora de <br\/> \/\/ cada pe\u00e7a de m\u00f3vel m\u00f3vel na casa<br\/> for (PieceOfFurniture piece : <strong>getHome<\/strong>(). <g id=\"gid_1\">getFurniture<\/g>()) {<br\/> if (piece. <strong>isMovable<\/strong>()) {<br\/> volumeInCm3 += piece. <strong>getWidth<\/strong>() <br\/> * piece. <strong>getDepth<\/strong>() <br\/> * piece. <strong>getHeight<\/strong>();<br\/>  }<br\/> }<br\/>            <br\/> \/\/ Exibe o resultado em uma caixa de mensagem (\u00b3 \u00e9 para 3 em sobrescrito)<br\/> String message = String. <strong>format<\/strong>(<br\/> \"O volume m\u00e1ximo dos m\u00f3veis m\u00f3veis na casa \u00e9 %.2f m\u00b3.\", <br\/> volumeInCm3 \/ 1000000);<br\/> JOptionPane. <strong>showMessageDialog<\/strong>(null, message);<br\/>  }<br\/>  }<\/pre>\n\n<p>Agora que voc\u00ea especificou o que quer que o plug-in fa\u00e7a, voc\u00ea deve descrever como o usu\u00e1rio iniciar\u00e1 esta nova a\u00e7\u00e3o. Voc\u00ea tem a escolha entre adicionar um novo <strong>item de menu<\/strong> a um menu, e\/ou um novo <strong>bot\u00e3o<\/strong> \u00e0 barra de ferramentas. Esta escolha \u00e9 feita definindo as propriedades apropriadas da a\u00e7\u00e3o do plug-in em sua cria\u00e7\u00e3o. Por exemplo, se voc\u00ea quer que os usu\u00e1rios iniciem a a\u00e7\u00e3o de volume com o item de menu <em>Calcular volume<\/em> encontrado no menu <em>Ferramentas<\/em>, voc\u00ea adicionar\u00e1 o seguinte construtor \u00e0 classe VolumeAction:   <\/p>\n\n<pre class=\"wp-block-preformatted\">  public <strong>VolumeAction<\/strong>() {<br\/>           <strong>putPropertyValue<\/strong>(Property.NAME, \"Calcular volume\");<br\/>           <strong>putPropertyValue<\/strong>(Property.MENU, \"Ferramentas\");<br\/> \/\/ Habilita a a\u00e7\u00e3o por padr\u00e3o<br\/>           <strong>setEnabled<\/strong>(true);<br\/> }<\/pre>\n\n<p>A classe do plug-in <a href=\"\/examples\/VolumePlugin\/VolumePlugin.java\">VolumePlugin<\/a> est\u00e1 agora programada e quase pronta para funcionar como um plug-in no Sweet Home 3D. As duas \u00faltimas coisas a fazer s\u00e3o: <\/p>\n\n<ul class=\"wp-block-list\">\n<li>criar um arquivo de descri\u00e7\u00e3o <tt>ApplicationPlugin.properties<\/tt>,<\/li>\n\n\n\n<li>colocar os arquivos juntos em um arquivo JAR.<br\/><\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\" id=\"criando-o-arquivo-de-descricao-do-plugin\">Criando o arquivo de descri\u00e7\u00e3o do plug-in<\/h3>\n<p>Um arquivo <tt>ApplicationPlugin.properties<\/tt>\n descreve o nome do plug-in, sua classe, as vers\u00f5es m\u00ednimas do Sweet Home 3D e Java sob as quais ele \u00e9 suportado,\n e quest\u00f5es legais. Escolha <i>File &gt; New &gt; File<\/i> do\n menu do Eclipse, digite o nome do arquivo <tt>ApplicationPlugin.properties<\/tt> e clique em <i>Finish<\/i>, como mostrado\n na 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. Criando um novo arquivo <\/em><\/figcaption><\/figure>\n<\/div>\n<p>Ent\u00e3o insira a <a href=\"\/examples\/VolumePlugin\/ApplicationPlugin.properties\">seguinte descri\u00e7\u00e3o<\/a> no novo arquivo e salve-o:<\/p>\n\n<pre class=\"wp-block-preformatted\"><strong>name<\/strong>=Volume de m\u00f3veis m\u00f3veis<br\/><strong>class<\/strong>=com.eteks.test.VolumePlugin<br\/><strong>description<\/strong>=Calcula o volume dos m\u00f3veis m\u00f3veis na casa<br\/><strong>version<\/strong>=1.0<br\/><strong>license<\/strong>=GNU GPL<br\/><strong>provider<\/strong>=(C) Direitos autorais 2024 Space Mushrooms<br\/><strong>applicationMinimumVersion<\/strong>=1.5<br\/><strong>javaMinimumVersion<\/strong>=1.5<\/pre>\n<h3 class=\"wp-block-heading\" id=\"criando-o-jar-do-plugin\">Criando o JAR do plug-in<\/h3>\n<p>O JAR do plug-in cont\u00e9m os arquivos de <tt>classe<\/tt> criados a partir da compila\u00e7\u00e3o do arquivo <tt>VolumePlugin.java<\/tt>,\n e o arquivo <tt>ApplicationPlugin.properties<\/tt>. Como o Eclipse compila um arquivo Java assim que voc\u00ea o salva, voc\u00ea<x id=\"gid_4\"><\/x> s\u00f3 precisa escolher <g id=\"gid_5\">File <x id=\"gid_6\"><\/x> Export&#8230;<\/g> do menu e selecionar <g id=\"gid_7\">Java <x id=\"gid_8\"><\/x> JAR file<\/g> na caixa de di\u00e1logo <g id=\"gid_9\">Export<\/g><x id=\"gid_10\"><\/x> que ser\u00e1 exibida. No assistente <i>Jar Export<\/i> que aparece como mostrado na figura 6, selecione a caixa de sele\u00e7\u00e3o do projeto\n e digite o caminho de um arquivo JAR colocado na pasta de plug-ins do Sweet Home 3D. Esta pasta apropriada depende\n do seu sistema da seguinte forma:   <\/p>\n\n<ul class=\"wp-block-list\">\n<li>  no Windows Vista \/ 7 \/ 8 \/ 10 \/ 11, esta pasta \u00e9 <tt>C:Users<i>usu\u00e1rio<\/i>AppDataRoamingeTeksSweet\n Home 3Dplugins<\/tt>,<\/li>\n\n\n\n<li>  no Windows XP e vers\u00f5es anteriores do Windows, esta pasta \u00e9 <tt>C:Documents and Settings<i>usu\u00e1rio<\/i>Application DataeTeksSweet\n Home 3Dplugins<\/tt>,<\/li>\n\n\n\n<li>  no macOS, \u00e9 a subpasta <tt>Library\/Application Support\/eTeks\/Sweet Home 3D\/<\/tt><tt>plugins<\/tt> da sua\n pasta de usu\u00e1rio,<\/li>\n\n\n\n<li>  no Linux e outros Unix, \u00e9 a subpasta <tt>.eteks\/sweethome3d\/<\/tt><tt>plugins<\/tt> da sua pasta de usu\u00e1rio.<\/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. Exportando para um arquivo JAR <\/em><\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"testando-o-plugin\">Testando o plug-in<\/h3>\n<p>O <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> que voc\u00ea desenvolveu funcionar\u00e1 no Sweet Home 3D, seja com a vers\u00e3o <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, a vers\u00e3o dos <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">instaladores<\/a>, ou o <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 voc\u00ea baixou anteriormente. Como o \u00faltimo \u00e9 um JAR execut\u00e1vel, voc\u00ea pode execut\u00e1-lo clicando duas vezes nele ou com o seguinte comando: <\/p>\n\n<p>O <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> que voc\u00ea desenvolveu funcionar\u00e1 no Sweet Home 3D, seja com a vers\u00e3o <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, a vers\u00e3o dos <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">instaladores<\/a>, ou o <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 voc\u00ea baixou anteriormente. Como o \u00faltimo \u00e9 um JAR execut\u00e1vel, voc\u00ea pode execut\u00e1-lo clicando duas vezes nele ou com o seguinte comando: <\/p>\n\n<pre class=\"wp-block-preformatted\">java -jar \/<em>caminho<\/em>\/<em>para<\/em>\/SweetHome3D-7.5.jar<\/pre>\n\n<p>Enquanto voc\u00ea estiver testando, voc\u00ea provavelmente preferir\u00e1 executar o Sweet Home 3D com este comando, para poder ler no console o rastreamento de pilha das exce\u00e7\u00f5es lan\u00e7adas durante a execu\u00e7\u00e3o do seu plug-in.<\/p>\n\n<p>Uma vez que o Sweet Home 3D \u00e9 iniciado, voc\u00ea ver\u00e1 o novo menu e seu item aparecerem como mostrado na 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. Menu do plug-in <\/em><\/figcaption><\/figure>\n<\/div>\n<p>Se voc\u00ea escolher o novo item de menu para o <a href=\"\/examples\/userGuideExample.sh3d\">exemplo de casa<\/a> criado no <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/pt\/guia-do-usuario-do-sweet-home-3d\/\" data-type=\"page\" data-id=\"424\">guia do usu\u00e1rio<\/a>, voc\u00ea obter\u00e1 o seguinte 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 em a\u00e7\u00e3o <\/em><\/figcaption><\/figure>\n<\/div><h3 class=\"wp-block-heading\" id=\"depurando-o-plugin\">Depurando o plug-in<\/h3>\n<p>Se voc\u00ea precisar depurar seu plug-in do Eclipse, crie uma configura\u00e7\u00e3o de depura\u00e7\u00e3o seguindo estes passos:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>Escolha <i>Run &gt; Debug Configurations&#8230;<\/i> do menu, selecione o item <i>Java Application<\/i> na lista de configura\u00e7\u00f5es dispon\u00edveis da caixa de di\u00e1logo \n          <i>Debug configurations<\/i>, clique no bot\u00e3o <i>New <\/i> no canto superior esquerdo e digite um nome para a configura\u00e7\u00e3o.<\/li>\n\n\n\n<li>Clique no bot\u00e3o <i>Search&#8230;<\/i> \u00e0 direita do campo de texto <i>Main class<\/i> e clique duas vezes na classe <i>SweetHome3DBootstrap<\/i> <br\/> entre as classes propostas.<\/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. Criando uma configura\u00e7\u00e3o de depura\u00e7\u00e3o <\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>Clique na aba <em>Classpath<\/em>, selecione o subitem <em>VolumePlugin (default classpath)<\/em> do item <em>User Entries<\/em> na lista <em>Classpath<\/em> e clique no bot\u00e3o <em>Remove<\/em>.<\/li>\n\n\n\n<li>Clique no item<em> User Entries<\/em> na lista <em>Classpath<\/em>, clique no bot\u00e3o <em>Add JARs&#8230;<\/em>, selecione o item SweetHome3D-7.5.jar e confirme sua escolha.<\/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. Configurando o classpath da configura\u00e7\u00e3o de depura\u00e7\u00e3o <\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>Selecione a aba <em>Source<\/em>, clique no bot\u00e3o <em>Add\u2026<\/em>, clique duas vezes no item <em>Java Project<\/em> na caixa de di\u00e1logo <em>Add Source<\/em>, selecione o item <em>VolumePlugin<\/em> no popup <em>Project Selection<\/em> e confirme sua escolha.<\/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. Configurando o caminho fonte da configura\u00e7\u00e3o de depura\u00e7\u00e3o <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n<ul class=\"wp-block-list\">\n<li>Finalmente, clique no bot\u00e3o <i>Debug<\/i> para iniciar o Sweet Home 3D no modo de depura\u00e7\u00e3o. Uma vez que o programa esteja em execu\u00e7\u00e3o, abra o arquivo <g id=\"gid_1\">VolumePlugin.java<\/g>, <x id=\"gid_2\"><\/x> defina um ponto de interrup\u00e7\u00e3o no m\u00e9todo <g id=\"gid_3\">execute<\/g> e escolha <g id=\"gid_4\">Tools <x id=\"gid_5\"><\/x> Compute volume<\/g> do menu do Sweet Home 3D. O Eclipse parar\u00e1 no ponto de interrup\u00e7\u00e3o\n selecionado para permitir que voc\u00ea execute o programa passo a passo e inspecione o valor das vari\u00e1veis.  <\/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 depura\u00e7\u00e3o do 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 voc\u00ea modificar o c\u00f3digo fonte do seu plug-in, n\u00e3o se esque\u00e7a de <a href=\"#creatingPluginJAR\">gerar o JAR do plug-in<\/a> antes de iniciar a configura\u00e7\u00e3o de depura\u00e7\u00e3o que voc\u00ea criou. Para acelerar o processo de exporta\u00e7\u00e3o do JAR no eclipse, v\u00e1 para o segundo passo do assistente de exporta\u00e7\u00e3o do JAR e selecione a op\u00e7\u00e3o <em>Save the description of this JAR in the workspace<\/em>. Isso adicionar\u00e1 um novo item no projeto com um item de menu contextual <em>Create JAR<\/em>.  <\/p>\n<\/div>\n<h3 class=\"wp-block-heading\" id=\"implantando-o-plugin\">Implantando o plug-in<\/h3>\n<p>Uma vez pronto, seu plug-in pode ser implantado no computador de outros usu\u00e1rios do Sweet Home 3D simplesmente copiando-o em sua <a href=\"#creatingPluginJAR\">pasta de plug-ins<\/a>. A partir da vers\u00e3o 1.6, um arquivo de plug-in tamb\u00e9m pode ser instalado na pasta de plug-ins do Sweet Home 3D clicando duas vezes nele, se sua extens\u00e3o for SH3P (simplesmente mude a extens\u00e3o do arquivo de .zip para .sh3p). Se clicar duas vezes em um arquivo .sh3p n\u00e3o iniciar o Sweet Home 3D (mais chances no Linux), voc\u00ea tamb\u00e9m pode instalar um plug-in com o seguinte comando em uma janela do <em>Terminal<\/em> (onde    <code>SweetHome3D<\/code>  \u00e9 o nome do arquivo execut\u00e1vel fornecido com os instaladores do Sweet Home 3D):<\/p>\n\n<pre class=\"wp-block-preformatted\"><em>\/caminho\/para\/<\/em>SweetHome3D <em>\/caminho\/para\/<\/em>plugin.sh3p<\/pre>\n\n<p>Para parar de usar um plug-in, remova seu arquivo da pasta de plug-ins e reinicie o 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>Se voc\u00ea quiser que seu plug-in seja capaz de executar com todos os <a href=\"http:\/\/download\">instaladores do Sweet Home 3D<\/a> dispon\u00edveis neste site, tome cuidado para mant\u00ea-lo compat\u00edvel com Java 5, selecionando <code>1.5<\/code> no campo <em>Compiler compliance level<\/em> dispon\u00edvel na se\u00e7\u00e3o <em>Java Compiler<\/em> da caixa de di\u00e1logo mostrada pelo item de menu <em>Project &gt; Properties<\/em> do Eclipse.<br\/>Se voc\u00ea usar uma vers\u00e3o do compilador Java onde a compatibilidade com Java 1.5 n\u00e3o est\u00e1 mais dispon\u00edvel, tente direcionar pelo menos para Java 1.8 ainda usado em vers\u00f5es recentes do Sweet Home 3D e defina <code>javaMinimumVersion<\/code> no arquivo <code>ApplicationPlugin.properties<\/code> do seu plug-in de acordo.<\/p>\n<\/div>\n<h2 class=\"wp-block-heading\" id=\"indo-alem\"><img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"12\" src=\"https:\/\/www.sweethome3d.com\/images\/bullet.gif\">Indo al\u00e9m<\/h2>\n<p>A programa\u00e7\u00e3o do primeiro plug-in mostrou-te o panorama geral. Aqui tens algumas informa\u00e7\u00f5es adicionais que te ajudar\u00e3o a ir mais longe. <\/p>\n<h3 class=\"wp-block-heading\" id=\"api-do-sweet-home-3d-javadoc\">API do Sweet Home 3D &#8211; javadoc<\/h3>\n<p>A documenta\u00e7\u00e3o mais \u00fatil para desenvolver um novo plug-in \u00e9 a <a href=\"\/javadoc\/index.html\">API do Sweet Home 3D<\/a> (Interface de Programa\u00e7\u00e3o de Aplica\u00e7\u00f5es), gerada com a ferramenta javadoc.<br\/>Usa apenas as classes dos pacotes <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> e <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/viewcontroller\/package-summary.html\">com.eteks.sweethome3d.viewcontroller<\/a> no teu plug-in se quiseres que seja compat\u00edvel com vers\u00f5es futuras do Sweet Home 3D. Isto ser\u00e1 amplamente suficiente para programar qualquer plug-in que trabalhe com os dados da casa dispon\u00edveis no Sweet Home 3D.<br\/>Os pacotes correspondentes \u00e0s outras camadas do programa est\u00e3o inclu\u00eddos no Javadoc apenas para fins informativos. N\u00e3o te baseies na sua API, pois pode ainda mudar no futuro sem garantia de compatibilidade ascendente (de qualquer forma, n\u00e3o ver\u00e1s nenhuma refer\u00eancia a uma classe dos pacotes <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> ou <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/package-summary.html\">com.eteks.sweethome3d<\/a> nos pacotes mencionados anteriormente).  <\/p>\n<h3 class=\"wp-block-heading\" id=\"arquitetura-das-classes-do-modelo\">Arquitetura das classes do modelo<\/h3>\n<p>O Sweet Home 3D baseia-se numa arquitetura MVC (Model View Controller), por isso compreender como est\u00e1 organizada a sua camada Model \u00e9 essencial. A figura 13 (dispon\u00edvel tamb\u00e9m em <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/wp-content\/uploads\/2025\/10\/modelClassesDiagram.png\">formato PDF<\/a>) apresenta quase todas as classes e interfaces dispon\u00edveis na vers\u00e3o 1.5 do pacote <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/package-summary.html\">com.eteks.sweethome3d.model<\/a> que corresponde a esta camada Model. <\/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>A classe central na camada Model \u00e9 a classe <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeApplication.html\">HomeApplication<\/a> (10), a superclasse abstrata da classe principal da aplica\u00e7\u00e3o <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/SweetHome3D.html\">SweetHome3D<\/a>. A inst\u00e2ncia desta classe d\u00e1 acesso \u00e0s inst\u00e2ncias <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) atualmente editadas, e ao objeto <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/UserPreferences.html\">UserPreferences<\/a> (11) que armazena a <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/LengthUnit.html\">unidade de comprimento<\/a> em uso (12), o <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/FurnitureCatalog.html\">cat\u00e1logo de m\u00f3veis<\/a> (14) e o <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TexturesCatalog.html\">cat\u00e1logo de texturas<\/a> (15) a partir dos quais o utilizador escolhe <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogPieceOfFurniture.html\">pe\u00e7as de mobili\u00e1rio<\/a> (17) e <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CatalogTexture.html\">texturas<\/a> (18).<br\/>Uma inst\u00e2ncia <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) armazena todos os objetos que o utilizador criou na planta da casa: <\/p>\n\n<ul class=\"wp-block-list\">\n<li>a lista de objetos <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomePieceOfFurniture.html\">HomePieceOfFurniture<\/a> (13) que implementam a interface <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">PieceOfFurniture<\/a> (16),<\/li>\n\n\n\n<li>a cole\u00e7\u00e3o de objetos <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Wall<\/a> (9),<\/li>\n\n\n\n<li>a lista de objetos <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Wall.html\">Room<\/a> (5),<\/li>\n\n\n\n<li>a cole\u00e7\u00e3o de objetos <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/DimensionLine.html\">DimensionLine<\/a> (2),<\/li>\n\n\n\n<li>a cole\u00e7\u00e3o de objetos <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Label.html\">Label<\/a> (3).<\/li>\n<\/ul>\n\n<p>Estes objetos implementam a interface <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Selectable.html\">Selectable<\/a> (1) bem como o objeto <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/ObserverCamera.html\">ObserverCamera<\/a> (4), que armazena a localiza\u00e7\u00e3o da c\u00e2mara no modo <em>Visitante virtual<\/em>. Toda a informa\u00e7\u00e3o externa gerida pelos objetos Model, como o \u00edcone e o modelo 3D de uma <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/PieceOfFurniture.html\">pe\u00e7a de mobili\u00e1rio<\/a> (16), ou a imagem de uma <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/TextureImage.html\">textura<\/a> (20) \u00e9 acedida atrav\u00e9s da interface <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Content.html\">Content<\/a> (19), implementada pela classe <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/URLContent.html\">URLContent<\/a> e outras classes do pacote <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/tools\/package-summary.html\">com.eteks.sweethome3d.tools<\/a>. <\/p>\n\n<p>Este diagrama UML deve ajudar-te a compreender quais classes est\u00e3o dispon\u00edveis no modelo do Sweet Home 3D e como podes aceder a elas, mas provavelmente notar\u00e1s que nenhum construtor e nenhum mutador (ou setters se preferires) s\u00e3o citados nele. \u00c9 apenas por falta de espa\u00e7o, mas podes us\u00e1-los sem problema numa classe de plug-in. Nota tamb\u00e9m que qualquer modifica\u00e7\u00e3o de um objeto existente do modelo ser\u00e1 notificada aos componentes exibidos seja com <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/beans\/PropertyChangeEvent.html\" target=\"_blank\" rel=\"noopener\">PropertyChangeEvent<\/a>s, com <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/CollectionEvent.html\">CollectionEvent<\/a>s (8) ou com <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/SelectionEvent.html\">SelectionEvent<\/a>s (6), permitindo assim que todas as altera\u00e7\u00f5es sejam refletidas imediatamente no ecr\u00e3.  <\/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>O modelo do Sweet Home 3D <strong>n\u00e3o \u00e9<\/strong> thread safe por raz\u00f5es de desempenho. Todas as <strong>modifica\u00e7\u00f5es<\/strong> de um objeto pertencente ao modelo devem ser feitas no Event Dispatch Thread. <\/p>\n<\/div>\n<h3 class=\"wp-block-heading\" id=\"arquitetura-das-classes-de-plugin\">Arquitetura das classes de plug-in<\/h3>\n<p>A arquitetura das classes de plug-in \u00e9 muito mais simples de compreender do que a da camada Model. O pacote <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/package-summary.html\">com.eteks.sweethome3d.plugin<\/a> cont\u00e9m apenas tr\u00eas classes entre as quais deves usar apenas as classes <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> e <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, como mostrado na figura 14 (tamb\u00e9m dispon\u00edvel em <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>Uma inst\u00e2ncia <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginManager.html\">PluginManager<\/a> (1) \u00e9 criada no arranque da aplica\u00e7\u00e3o e procura os plug-ins instalados na <a href=\"#creating-the-plugin-jar\">pasta de plug-ins<\/a> do utilizador. Cada vez que uma nova casa \u00e9 editada, este gestor instancia e configura um objeto <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> (3) para cada plug-in encontrado no momento do arranque. Depois, chama o m\u00e9todo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getActions()\">getActions<\/a> para recuperar todas as <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">a\u00e7\u00f5es<\/a> (4) que ser\u00e3o adicionadas como itens de menu e\/ou bot\u00f5es da barra de ferramentas na janela da casa. Cada a\u00e7\u00e3o \u00e9 uma inst\u00e2ncia de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, que se parece com a classe <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/Action.html\" target=\"_blank\" rel=\"noopener\">Action<\/a>, com o seu m\u00e9todo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#execute()\">execute<\/a> e as suas <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.Property.html\">propriedades<\/a> modific\u00e1veis (2).   <\/p>\n\n<p>Nota que a classe <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> d\u00e1-te acesso a uma inst\u00e2ncia <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEditSupport.html\" target=\"_blank\" rel=\"noopener\">UndoableEditSupport<\/a> atrav\u00e9s do seu m\u00e9todo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getUndoableEditSupport()\">getUndoableEditSupport<\/a>. Assim que modificares uma casa ou os seus objetos (m\u00f3veis, paredes&#8230;) no m\u00e9todo execute de uma inst\u00e2ncia <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, deves tamb\u00e9m publicar um objeto <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/javax\/swing\/undo\/UndoableEdit.html\" target=\"_blank\" rel=\"noopener\">UndoableEdit<\/a> no suporte de edi\u00e7\u00e3o anul\u00e1vel retornado pelo m\u00e9todo getUndoableEditSupport, caso contr\u00e1rio os utilizadores n\u00e3o conseguir\u00e3o desfazer\/refazer corretamente as altera\u00e7\u00f5es que fizeste. <\/p>\n<h3 class=\"wp-block-heading\" id=\"localizacao\">Localiza\u00e7\u00e3o<\/h3>\n<p>Se planeias desenvolver um plug-in para a comunidade de utilizadores do Sweet Home 3D, tenta localizar as strings que exibe seja nos nomes das a\u00e7\u00f5es e menu ou nos di\u00e1logos que criares (ou pelo menos prepara a sua localiza\u00e7\u00e3o). Dois <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#PluginAction(java.lang.String,%20java.lang.String,%20java.lang.ClassLoader)\">construtores da classe PluginAction<\/a> ajudar-te-\u00e3o a organizar a tradu\u00e7\u00e3o das propriedades das a\u00e7\u00f5es com ficheiros .properties, e se precisares de traduzir outras strings no teu plug-in (como a do di\u00e1logo mostrado pelo <a href=\"#testing-the-plugin\">plug-in testado<\/a>) reutiliza estes ficheiros .properties com a classe Java <a href=\"https:\/\/java.sun.com\/j2se\/1.5.0\/docs\/api\/java\/util\/ResourceBundle.html\" target=\"_blank\" rel=\"noopener\">ResourceBundle<\/a>.<br\/>Se preferires limitar o n\u00famero de ficheiros de propriedades, podes at\u00e9 escrever os valores das propriedades das a\u00e7\u00f5es e outras strings no <a href=\"#creating-the-plugin-description-file\">ficheiro de descri\u00e7\u00e3o<\/a> ApplicationPlugin.properties do teu plug-in. <\/p>\n\n<p>Se quiseres um exemplo que usa esta arquitetura, descarrega o plug-in <em>Export to SH3F<\/em> dispon\u00edvel em <a href=\"\/storage\/plugins\/ExportToSH3F-1.0.sh3p\">https:\/\/www.sweethome3d.com\/plugins\/ExportToSH3F-1.0.sh3p<\/a>, e descompacta-o (este ficheiro de plug-in cont\u00e9m tamb\u00e9m o c\u00f3digo fonte do plug-in).<br\/>Como descrito no <a href=\"https:\/\/sourceforge.net\/forum\/message.php?msg_id=5837358\" class=\"broken_link\" target=\"_blank\" rel=\"noopener\">f\u00f3rum de Ajuda<\/a>, este plug-in cria um ficheiro SH3F que cont\u00e9m todos os m\u00f3veis que importaste no cat\u00e1logo de m\u00f3veis do Sweet Home 3D.<\/p>\n<h3 class=\"wp-block-heading\" id=\"contribuir-com-plugins\">Contribuir com plug-ins<\/h3>\n<p>Podes publicar os plug-ins que programaste no Sistema de Rastreamento <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/\" target=\"_blank\" rel=\"noopener\">Contribui\u00e7\u00f5es de Plug-ins<\/a> para os partilhares com a comunidade de utilizadores do Sweet Home 3D.<br\/>Muitas funcionalidades podem ser adicionadas ao Sweet Home 3D gra\u00e7as aos plug-ins, desde importadores a exportadores, mas tamb\u00e9m plug-ins capazes de modificar os dados de uma casa como o <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/1\/\" target=\"_blank\" rel=\"noopener\">Home Rotator Plug-in<\/a> desenvolvido por Michel Mbem e outros listados no <a href=\"\/storage\/pluginsUserGuide.pdf\">Tutorial para Plug-ins e Extens\u00f5es<\/a> (PDF) escrito por Hans Dirkse e na p\u00e1gina <a href=\"https:\/\/wp-test-1.sweethome3d.eu\/pt\/plugins-e-ferramentas\/\" data-type=\"page\" data-id=\"437\">Plug-ins e ferramentas<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introdu\u00e7\u00e3o A partir da vers\u00e3o 1.5, \u00e9 poss\u00edvel adicionar novas funcionalidades ao Sweet Home 3D com arquivos de plug-in colocados na sua pasta de plug-ins. Isso permite que programadores Java desenvolvam e distribuam novas funcionalidades para o Sweet Home 3D sem modificar os arquivos fonte da vers\u00e3o atual (o que \u00e9 bom para compatibilidade futura), [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":10535,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-10556","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/pt\/wp-json\/wp\/v2\/pages\/10556","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/pt\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/pt\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/pt\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/pt\/wp-json\/wp\/v2\/comments?post=10556"}],"version-history":[{"count":2,"href":"https:\/\/wp-test-1.sweethome3d.eu\/pt\/wp-json\/wp\/v2\/pages\/10556\/revisions"}],"predecessor-version":[{"id":10769,"href":"https:\/\/wp-test-1.sweethome3d.eu\/pt\/wp-json\/wp\/v2\/pages\/10556\/revisions\/10769"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wp-test-1.sweethome3d.eu\/pt\/wp-json\/wp\/v2\/media\/10535"}],"wp:attachment":[{"href":"https:\/\/wp-test-1.sweethome3d.eu\/pt\/wp-json\/wp\/v2\/media?parent=10556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}