{"id":11701,"date":"2025-11-05T16:28:15","date_gmt":"2025-11-05T16:28:15","guid":{"rendered":"https:\/\/www.sweethome3d.com\/guia-do-desenvolvedor-de-plug-ins\/"},"modified":"2025-12-19T10:19:42","modified_gmt":"2025-12-19T10:19:42","slug":"guia-do-desenvolvedor-de-plug-ins","status":"publish","type":"page","link":"https:\/\/www.sweethome3d.com\/pt-br\/guia-do-desenvolvedor-de-plug-ins\/","title":{"rendered":"Guia do desenvolvedor de plug-ins"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introdu\u00e7\u00e3o<\/h2>\n\n<p>A partir da vers\u00e3o 1.5, \u00e9 poss\u00edvel adicionar novos recursos 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 novos recursos para o <a href=\"https:\/\/www.sweethome3d.com\/pt-br\/\">Sweet Home 3D<\/a> sem modificar os arquivos de origem da vers\u00e3o atual (o que \u00e9 bom para a compatibilidade ascendente) e sem fornecer 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 o ajudar\u00e3o a ir mais longe. <\/p>\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n<h2 class=\"wp-block-heading\" id=\"installingTools\">Instalando ferramentas de desenvolvimento<\/h2>\n\n<p>Se o Sweet Home 3D for destinado a um p\u00fablico geral, o desenvolvimento de 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 um 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 o IDE de sua escolha ou nenhum IDE. <\/p>\n\n<h3 class=\"wp-block-heading\">Baixe e instale o Eclipse<\/h3>\n\n<p>Primeiro, baixe o Eclipse em <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\/>Depois de baixado, instalar o Eclipse \u00e9 muito simples: basta descompactar o arquivo que voc\u00ea receber\u00e1, abrir a pasta do Eclipse e, dependendo do seu sistema, executar 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 exigir\u00e1 que voc\u00ea escolha uma pasta de <em>workspace<\/em>, onde os projetos de plug-in ser\u00e3o armazenados.<br\/>Depois de feito, escolha <em>Arquivo &gt; Novo &gt; Projeto<\/em> no menu para criar um novo projeto, selecione <em>Java &gt; Projeto Java<\/em> no assistente <em>Novo projeto<\/em> que ser\u00e1 exibido, insira VolumePlugin como nome do projeto e clique no bot\u00e3o <em>Concluir<\/em>. Finalmente, feche a guia <em>Bem-vindo<\/em> para descobrir seu workspace, como mostrado na 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. Workspace do Eclipse <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Baixe e instale a biblioteca Sweet Home 3D<\/h3>\n\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 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>. Depois de 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; Adicionar ao Build Path<\/em> no menu contextual do arquivo SweetHome3D-7.5.jar, como mostrado na 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. Adicionando SweetHome3D-7.5.jar<br\/> ao Build Path <\/figcaption><\/figure>\n<\/div>\n\n<h2 class=\"wp-block-heading programmingPlugin\">Programando um plug-in<\/h2>\n\n<p>Agora que voc\u00ea instalou as ferramentas necess\u00e1rias, vamos ver como voc\u00ea pode programar seu primeiro plug-in para Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">Criando a classe de plug-in<\/h3>\n\n<p>Primeiro, crie uma nova subclasse de com.eteks.sweethome3d.plugin.Plugin escolhendo o item de menu <em>Arquivo &gt; Novo &gt; Classe<\/em> no 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. Criando uma nova classe <\/figcaption><\/figure>\n<\/div>\n\n<p>Na caixa de di\u00e1logo <em>Nova Classe Java<\/em>, insira VolumePlugin como o 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 de feito, clique em <g id=\"gid_1\">Concluir<\/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 imaginar pelo coment\u00e1rio TODO, agora voc\u00ea deve 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>Edi\u00e7\u00e3o &gt; Corre\u00e7\u00e3o R\u00e1pida<\/em> no menu do Eclipse para criar a classe VolumeAction ausente, como mostrado na 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. Usando a corre\u00e7\u00e3o r\u00e1pida para gerar uma classe ausente <\/figcaption><\/figure>\n<\/div>\n\n<p>Na caixa de di\u00e1logo <em>Nova Classe Java<\/em> que aparece, marque a caixa de sele\u00e7\u00e3o <em>Tipo delimitador<\/em> para criar uma classe interna de VolumePlugin e clique em <em>Concluir<\/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 <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. <g id=\"gid_2\">isMovable<\/g>()) {<br\/> volumeInCm3 += piece. <strong>getWidth<\/strong>() <br\/> * piece. <strong>getDepth<\/strong>() <br\/> * piece. <strong>getHeight<\/strong>();<br\/>  }<br\/> }<br\/>            <br\/> \/\/ Display the result in a message box (\u00b3 is for 3 in supercript)<br\/> String message = String. <g id=\"gid_0\">format<\/g>(<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>Agora que voc\u00ea especificou o que deseja 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 op\u00e7\u00e3o de 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 quiser 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 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>A classe de plug-in <a href=\"\/examples\/VolumePlugin\/VolumePlugin.java\">VolumePlugin<\/a> agora est\u00e1 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 pl-14\">\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\n<h3 class=\"wp-block-heading\" id=\"creating-the-plugin-description-file\">Criando o arquivo de descri\u00e7\u00e3o do plug-in<\/h3>\n\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 informa\u00e7\u00f5es legais. Escolha <i>Arquivo &gt; Novo &gt; Arquivo<\/i> no\n menu do Eclipse, insira o nome do arquivo <tt>ApplicationPlugin.properties<\/tt> e clique em <i>Concluir<\/i>, como mostrado\n na 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. Criando um novo arquivo <\/figcaption><\/figure>\n<\/div>\n\n<p>Em seguida, insira a <a href=\"\/examples\/VolumePlugin\/ApplicationPlugin.properties\">descri\u00e7\u00e3o a seguir<\/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 em casa<br\/><strong>version<\/strong>=1.0<br\/><strong>license<\/strong>=GNU GPL<br\/><strong>provider<\/strong>=(C) Copyrights 2024 Space Mushrooms<br\/><strong>applicationMinimumVersion<\/strong>=1.5<br\/><strong>javaMinimumVersion<\/strong>=1.5<\/pre>\n\n<h3 class=\"wp-block-heading\" id=\"creatingPluginJAR\">Criando o JAR do plug-in<\/h3>\n\n<p>O JAR do plug-in cont\u00e9m os arquivos <tt>class<\/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\">Arquivo <x id=\"gid_6\"><\/x> Exportar&#8230;<\/g> no menu e selecionar <g id=\"gid_7\">Java <x id=\"gid_8\"><\/x> Arquivo JAR<\/g> na caixa de di\u00e1logo <g id=\"gid_9\">Exportar<\/g><x id=\"gid_10\"><\/x> que ser\u00e1 exibida. No assistente <i>Exportar Jar<\/i> que aparece como mostrado na figura 6, marque a caixa de sele\u00e7\u00e3o do projeto\n e insira 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 pl-14\">\n<li>  no Windows Vista \/ 7 \/ 8 \/ 10 \/ 11, esta pasta \u00e9 <tt>C:\\Users\\<i>usu\u00e1rio<\/i>\\AppData\\Roaming\\eTeks\\Sweet\n Home 3D\\plugins<\/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 Data\\eTeks\\Sweet\n Home 3D\\plugins<\/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\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. Exportando para um arquivo JAR <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"testing-the-plugin\">Testando o plug-in<\/h3>\n\n<p>O <a href=\"\/examples\/VolumePlugin\/VolumePlugin.jar\">plug-in<\/a> que voc\u00ea desenvolveu ser\u00e1 executado no Sweet Home 3D, seja com a vers\u00e3o <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, a vers\u00e3o <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" 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 ser\u00e1 executado no Sweet Home 3D, seja com a vers\u00e3o <a href=\"\/storage\/SweetHome3D.jnlp\">Java Web Start<\/a>, a vers\u00e3o <a href=\"https:\/\/downloads.sourceforge.net\/sweethome3d\/\" 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, 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>Depois que o Sweet Home 3D for iniciado, voc\u00ea ver\u00e1 o novo menu e seu item aparecerem como mostrado na 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. Menu do plug-in <\/figcaption><\/figure>\n<\/div>\n\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:\/\/www.sweethome3d.com\/pt-br\/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\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 em a\u00e7\u00e3o <\/figcaption><\/figure>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Depurando o plug-in<\/h3>\n\n<p>Se voc\u00ea precisar depurar seu plug-in no Eclipse, crie uma configura\u00e7\u00e3o de depura\u00e7\u00e3o seguindo estas etapas:<\/p>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Escolha <i>Executar &gt; Configura\u00e7\u00f5es de depura\u00e7\u00e3o&#8230;<\/i> no menu, selecione o item <i>Aplicativo Java<\/i> na lista de configura\u00e7\u00f5es dispon\u00edveis da caixa de di\u00e1logo \n          <i>Configura\u00e7\u00f5es de depura\u00e7\u00e3o<\/i>, clique no bot\u00e3o <i>Novo<\/i> na parte superior esquerda e insira um nome para a configura\u00e7\u00e3o.<\/li>\n\n\n\n<li>Clique no bot\u00e3o <i>Pesquisar&#8230;<\/i> \u00e0 direita do campo de texto <i>Classe principal<\/i> e clique duas vezes na classe <i>SweetHome3DBootstrap<\/i> <br\/> entre as classes propostas.<\/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. Criando uma configura\u00e7\u00e3o de depura\u00e7\u00e3o <\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Clique na guia <em>Classpath<\/em>, selecione o subitem <em>VolumePlugin (classpath padr\u00e3o)<\/em> do item <em>Entradas do usu\u00e1rio<\/em> na lista <em>Classpath<\/em> e clique no bot\u00e3o <em>Remover<\/em>.<\/li>\n\n\n\n<li>Clique no item<em> Entradas do usu\u00e1rio<\/em> na lista <em>Classpath<\/em>, clique no bot\u00e3o <em>Adicionar JARs&#8230;<\/em>, selecione o item SweetHome3D-7.5.jar e confirme sua escolha.<\/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. Definindo o classpath da configura\u00e7\u00e3o de depura\u00e7\u00e3o <\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Selecione a guia <em>Origem<\/em>, clique no bot\u00e3o <em>Adicionar\u2026<\/em>, clique duas vezes no item <em>Projeto Java<\/em> na caixa de di\u00e1logo <em>Adicionar Origem<\/em>, selecione o item <em>VolumePlugin<\/em> no popup <em>Sele\u00e7\u00e3o de Projeto<\/em> e confirme sua escolha.<\/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. Definindo o caminho de origem da configura\u00e7\u00e3o de depura\u00e7\u00e3o <\/em><\/em><\/em><\/figcaption><\/figure>\n<\/div>\n\n<ul class=\"wp-block-list pl-14\">\n<li>Finalmente, clique no bot\u00e3o <i>Depurar<\/i> para iniciar o Sweet Home 3D no modo de depura\u00e7\u00e3o. Depois que o programa estiver em execu\u00e7\u00e3o, abra o arquivo <tt>VolumePlugin.java<\/tt>, \n defina um ponto de interrup\u00e7\u00e3o no m\u00e9todo <i>execute<\/i> e escolha <i>Ferramentas &gt; Calcular volume<\/i> no menu do Sweet Home 3D. O Eclipse parar\u00e1 no ponto de interrup\u00e7\u00e3o selecionado\n para permitir que voc\u00ea execute o programa passo a passo e inspecione o valor das vari\u00e1veis.  <\/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 depura\u00e7\u00e3o do 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 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 a segunda etapa do assistente de exporta\u00e7\u00e3o do JAR e selecione a op\u00e7\u00e3o <em>Salvar a descri\u00e7\u00e3o deste JAR no workspace<\/em>. Isso adicionar\u00e1 um novo item no projeto com um item de menu contextual <em>Criar JAR<\/em>.  <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\" id=\"deployingPlugin\">Implantando o plug-in<\/h3>\n\n<p>Depois de 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 altere a extens\u00e3o do arquivo de .zip para .sh3p). Se clicar duas vezes em um arquivo .sh3p n\u00e3o iniciar o Sweet Home 3D (maior probabilidade no Linux), voc\u00ea tamb\u00e9m pode instalar um plug-in com o seguinte comando em uma janela de <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 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>Se voc\u00ea quiser que seu plug-in possa ser executado com todos os <a href=\"https:\/\/www.sweethome3d.com\/pt-br\/download\/\">instaladores do Sweet Home 3D<\/a> dispon\u00edveis neste site, tome cuidado para mant\u00ea-lo compat\u00edvel com o Java 5, selecionando <code>1.5<\/code> no campo <em>N\u00edvel de conformidade do compilador<\/em> dispon\u00edvel na se\u00e7\u00e3o <em>Compilador Java<\/em> da caixa de di\u00e1logo mostrada pelo item de menu <em>Projeto &gt; Propriedades<\/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 o 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\n<h2 class=\"wp-block-heading\" id=\"goingFurther\">Indo mais longe<\/h2>\n\n<p>A programa\u00e7\u00e3o do primeiro plug-in mostrou a voc\u00ea o panorama geral. Aqui est\u00e3o algumas informa\u00e7\u00f5es adicionais que o ajudar\u00e3o a ir mais longe. <\/p>\n\n<h3 class=\"wp-block-heading\">API do Sweet Home 3D &#8211; Javadoc<\/h3>\n\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\/>Use 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 seu plug-in se quiser que ele seja compat\u00edvel com vers\u00f5es futuras do Sweet Home 3D. Isso ser\u00e1 suficiente para programar qualquer plug-in que funcione com os dados da casa dispon\u00edveis no Sweet Home 3D.<br\/>Os pacotes que correspondem \u00e0s outras camadas do programa est\u00e3o inclu\u00eddos no Javadoc apenas para fins informativos. N\u00e3o confie na API deles, pois ela ainda pode mudar no futuro sem garantia de compatibilidade (de qualquer forma, voc\u00ea n\u00e3o ver\u00e1 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).  <\/p>\n\n<h3 class=\"wp-block-heading\">Arquitetura das classes do modelo<\/h3>\n\n<p>O Sweet Home 3D \u00e9 baseado em uma arquitetura MVC (Model View Controller), portanto, entender como sua camada de Modelo \u00e9 organizada \u00e9 essencial. A figura 13 (dispon\u00edvel tamb\u00e9m em <a href=\"https:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/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 de Modelo. <\/p>\n\n<p>[uml_diagram slug=&#8221;model-classes-diagram&#8221; map_name=&#8221;model-classes-diagram&#8221; caption=&#8221;Figure 13. UML diagram of com.eteks.sweethome3d.model package&#8221; caption_small=&#8221;(click on a class to view its javadoc)&#8221;]<\/p>\n\n<p>A classe central na camada de Modelo \u00e9 a classe <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/HomeApplication.html\">HomeApplication<\/a> (10), a superclasse abstrata da classe principal do aplicativo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/SweetHome3D.html\">SweetHome3D<\/a>. A inst\u00e2ncia desta classe d\u00e1 acesso \u00e0s inst\u00e2ncias de <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 usu\u00e1rio 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 de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/model\/Home.html\">Home<\/a> (7) armazena todos os objetos que o usu\u00e1rio criou na planta da casa: <\/p>\n\n<ul class=\"wp-block-list pl-14\">\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>Esses 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\u00e2mera no modo <em>Visitante virtual<\/em>. Todas as informa\u00e7\u00f5es externas gerenciadas por objetos do Modelo, 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) s\u00e3o acessadas 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 ajud\u00e1-lo a entender quais classes est\u00e3o dispon\u00edveis no modelo do Sweet Home 3D e como voc\u00ea pode acess\u00e1-las, mas voc\u00ea provavelmente notar\u00e1 que nenhum construtor e nenhum mutador (ou setters, se preferir) s\u00e3o citados nele. \u00c9 apenas por falta de espa\u00e7o, mas voc\u00ea pode us\u00e1-los sem problema em uma classe de plug-in. Observe tamb\u00e9m que qualquer modifica\u00e7\u00e3o de um objeto existente do modelo ser\u00e1 notificada aos componentes exibidos 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 na tela.  <\/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>O modelo do Sweet Home 3D <strong>n\u00e3o<\/strong> \u00e9 thread safe por raz\u00f5es de desempenho. Todas as <strong>modifica\u00e7\u00f5es<\/strong> de um objeto pertencente ao modelo devem ser feitas na Event Dispatch Thread. <\/p>\n<\/div>\n\n<h3 class=\"wp-block-heading\">Arquitetura das classes de plug-in<\/h3>\n\n<p>A arquitetura das classes de plug-in \u00e9 muito mais simples de entender do que a da camada de Modelo. 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 voc\u00ea deve 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:\/\/www.sweethome3d.com\/wp-content\/uploads\/2025\/12\/pluginClassesDiagram.png\">formato PDF<\/a>). <\/p>\n\n<p>[uml_diagram slug=&#8221;plugin-classes-diagram&#8221; map_name=&#8221;plugin-classes-diagram&#8221; caption=&#8221;Figure 14. UML diagram of com.eteks.sweethome3d.plugin package&#8221; caption_small=&#8221;(click on a class to view its javadoc)&#8221;]<\/p>\n\n<p>Uma inst\u00e2ncia de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginManager.html\">PluginManager<\/a> (1) \u00e9 criada na inicializa\u00e7\u00e3o do aplicativo e procura os plug-ins instalados na <a href=\"#creating-the-plugin-jar\">pasta de plug-ins<\/a> do usu\u00e1rio. Cada vez que uma nova casa \u00e9 editada, este gerenciador instancia e configura um objeto <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> (3) para cada plug-in encontrado no momento da inicializa\u00e7\u00e3o. Em seguida, ele 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 seu m\u00e9todo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html#execute()\">execute<\/a> e suas <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.Property.html\">propriedades<\/a> modific\u00e1veis (2).   <\/p>\n\n<p>Observe que a classe <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html\">Plugin<\/a> lhe d\u00e1 acesso a uma inst\u00e2ncia de <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 de seu m\u00e9todo <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/Plugin.html#getUndoableEditSupport()\">getUndoableEditSupport<\/a>. Assim que voc\u00ea modificar uma casa ou seus objetos (m\u00f3veis, paredes&#8230;) no m\u00e9todo execute de uma inst\u00e2ncia de <a href=\"\/javadoc\/com\/eteks\/sweethome3d\/plugin\/PluginAction.html\">PluginAction<\/a>, voc\u00ea tamb\u00e9m deve postar 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> para o suporte de edi\u00e7\u00e3o desfaz\u00edvel retornado pelo m\u00e9todo getUndoableEditSupport, caso contr\u00e1rio, os usu\u00e1rios n\u00e3o poder\u00e3o desfazer\/refazer corretamente as altera\u00e7\u00f5es que voc\u00ea fez. <\/p>\n\n<h3 class=\"wp-block-heading\">Localiza\u00e7\u00e3o<\/h3>\n\n<p>Se voc\u00ea planeja desenvolver um plug-in para a comunidade de usu\u00e1rios do Sweet Home 3D, tente localizar as strings que ele exibe, seja no nome e menu das a\u00e7\u00f5es ou nas caixas de di\u00e1logo que voc\u00ea criar (ou pelo menos prepare 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> ir\u00e3o ajud\u00e1-lo a organizar a tradu\u00e7\u00e3o das propriedades das a\u00e7\u00f5es com arquivos .properties, e se voc\u00ea precisar traduzir outras strings em seu plug-in (como a mostrada na caixa de di\u00e1logo do <a href=\"#testing-the-plugin\">plug-in testado<\/a>), reutilize esses arquivos .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 voc\u00ea preferir limitar o n\u00famero de arquivos de propriedade, voc\u00ea pode at\u00e9 mesmo escrever os valores das propriedades da a\u00e7\u00e3o e outras strings no <a href=\"#creating-the-plugin-description-file\">arquivo de descri\u00e7\u00e3o<\/a> ApplicationPlugin.properties do seu plug-in. <\/p>\n\n<p>Se voc\u00ea quiser um exemplo que use esta arquitetura, baixe 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 descompacte-o (este arquivo de plug-in tamb\u00e9m cont\u00e9m o c\u00f3digo-fonte do plug-in).<br\/>Conforme descrito no <a href=\"https:\/\/sourceforge.net\/forum\/message.php?msg_id=5837358\" target=\"_blank\" rel=\"noopener\">F\u00f3rum de Ajuda<\/a>, este plug-in cria um arquivo SH3F que cont\u00e9m todos os m\u00f3veis que voc\u00ea importou para o cat\u00e1logo de m\u00f3veis do Sweet Home 3D.<\/p>\n\n<h3 class=\"wp-block-heading\">Contribuindo com plug-ins<\/h3>\n\n<p>Voc\u00ea pode postar os plug-ins que voc\u00ea programou no Sistema de Rastreamento de <a href=\"https:\/\/sourceforge.net\/p\/sweethome3d\/plug-ins\/\" target=\"_blank\" rel=\"noopener\">Contribui\u00e7\u00f5es de Plug-ins<\/a> para compartilh\u00e1-los com a comunidade de usu\u00e1rios do Sweet Home 3D.<br\/>Muitos recursos podem ser adicionados ao Sweet Home 3D gra\u00e7as aos plug-ins, de 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\">Plug-in Home Rotator<\/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:\/\/www.sweethome3d.com\/plugins\/\" 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 novos recursos ao Sweet Home 3D com arquivos de plug-in colocados na sua pasta de plug-ins. Isso permite que programadores Java desenvolvam e distribuam novos recursos para o Sweet Home 3D sem modificar os arquivos de origem da vers\u00e3o atual (o que \u00e9 bom para a<a href=\"https:\/\/www.sweethome3d.com\/pt-br\/guia-do-desenvolvedor-de-plug-ins\/\">Continue reading <span class=\"sr-only\">&#8220;Guia do desenvolvedor de plug-ins&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":11672,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-resources.php","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-11701","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/www.sweethome3d.com\/pt-br\/wp-json\/wp\/v2\/pages\/11701","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sweethome3d.com\/pt-br\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.sweethome3d.com\/pt-br\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/pt-br\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/pt-br\/wp-json\/wp\/v2\/comments?post=11701"}],"version-history":[{"count":2,"href":"https:\/\/www.sweethome3d.com\/pt-br\/wp-json\/wp\/v2\/pages\/11701\/revisions"}],"predecessor-version":[{"id":12445,"href":"https:\/\/www.sweethome3d.com\/pt-br\/wp-json\/wp\/v2\/pages\/11701\/revisions\/12445"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.sweethome3d.com\/pt-br\/wp-json\/wp\/v2\/media\/11672"}],"wp:attachment":[{"href":"https:\/\/www.sweethome3d.com\/pt-br\/wp-json\/wp\/v2\/media?parent=11701"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}