Ke staženíOnlineGalerie

Průvodce pro vývojáře pluginů

Úvod

Od verze 1.5 je možné přidávat nové funkce do Sweet Home 3D pomocí souborů pluginů umístěných ve tvé složce pluginů. To umožňuje Java programátorům vyvíjet a distribuovat nové funkce pro Sweet Home 3D bez úpravy zdrojových souborů aktuální verze (což je dobré pro kompatibilitu směrem nahoru) a bez dodávání plné verze programu (což je dobré pro velikost dodávky).
Tento dokument popisuje nástroje potřebné k vytváření pluginů, poté ukazuje, jak naprogramovat plugin, který vypočítá maximální objem movitého nábytku přidaného do domova, a nakonec poskytuje některé dodatečné informace, které ti pomohou jít dál.

Instalace vývojových nástrojů

Pokud Sweet Home 3D cílí na širokou veřejnost, vývoj pluginů vyžaduje speciální dovednosti a měl bys vědět, jak programovat v Javě s IDE, než půjdeš dál. Tento průvodce ukazuje, jak sestavit plugin s Eclipse, ale můžeš použít IDE podle svého výběru, nebo žádné IDE vůbec.

Stáhni a nainstaluj Eclipse

Nejprve si stáhni Eclipse z https://www.eclipse.org/. Verze nazvaná Eclipse IDE for Java Developers stačí k vývoji pluginu, ale můžeš si stáhnout jakoukoli verzi pro vývoj v Javě.
Po stažení je instalace Eclipse velmi jednoduchá: stačí rozbalit archiv, který získáš, otevřít složku eclipse a v závislosti na tvém systému spustit soubor s názvem eclipse.exe (pod Windows), eclipse.app (pod Mac OS X) nebo eclipse (pod Linuxem).
Při prvním spuštění bude Eclipse vyžadovat, abys zvolil složku workspace, kde budou uloženy projekty pluginů.
Jakmile je to hotovo, zvol File > New > Project z menu pro vytvoření nového projektu, vyber Java > Java project v průvodci New project, který se zobrazí, zadej VolumePlugin jako název projektu a klikni na tlačítko Finish. Nakonec zavři záložku Welcome, abys objevil svůj workspace, jak je ukázáno na obrázku 1.

Průvodce pro vývojáře pluginů
Obrázek 1. Eclipse workspace

Stáhni a nainstaluj knihovnu Sweet Home 3D

Vývoj pluginu je založen na některých třídách Sweet Home 3D, které musí Eclipse znát, aby mohl sestavit tvůj projekt. Nejjednodušší způsob, jak přidat třídy Sweet Home 3D do Eclipse, je stáhnout JAR spustitelnou verzi Sweet Home 3D dostupnou na https://sourceforge.net/projects/sweethome3d/files/SweetHome3D/SweetHome3D-7.5/SweetHome3D-7.5.jar/download. Po stažení přetáhni soubor SweetHome3D-7.5.jar na ikonu projektu VolumePlugin v pohledu Package Explorer v Eclipse a zvol položku Build Path > Add to Build Path v kontextovém menu souboru SweetHome3D-7.5.jar, jak je ukázáno na obrázku 2.

Obrázek 2. Přidání SweetHome3D-7.5.jar
do Build Path

Programování pluginu

Nyní, když jsi nainstaloval potřebné nástroje, podívejme se, jak můžeš naprogramovat svůj první plugin pro Sweet Home 3D.

Vytvoření třídy pluginu

Nejprve vytvoř novou podtřídu com.eteks.sweethome3d.plugin.Plugin výběrem položky menu File > New > Class v Eclipse.

Obrázek 3. Vytvoření nové třídy

V dialogu New Java Class zadej VolumePlugin jako název třídy, zadej balíček (zde byl zvolen balíček com.eteks.test) a zvol com.eteks.sweethome3d.plugin.Plugin jako nadtřídu VolumePlugin. Jakmile je to hotovo, klikni na Finish. Eclipse vytvoří soubor nové třídy s následujícím obsahem:

package com.eteks.test;
import com.eteks.sweethome3d.plugin.Plugin;
import com.eteks.sweethome3d.plugin.PluginAction;
public class VolumePlugin extends Plugin {
@Override
public PluginAction[] getActions() {
// TODO Auto-generated method stub
return null;
}
}

Jak můžeš uhodnout z komentáře TODO, musíš nyní změnit implementaci metody getActions, aby vrátila akci pluginu schopnou vypočítat objem movitého nábytku. Nahraď return null; následujícím příkazem:

  return new PluginAction [] {new VolumeAction()};  

a zvol Edition > Quick Fix z menu Eclipse pro vytvoření chybějící třídy VolumeAction, jak je ukázáno na obrázku 4.

Obrázek 4. Použití Quick fix pro generování chybějící třídy

V dialogu New Java Class, který se objeví, vyber zaškrtávací políčko Enclosing type pro vytvoření vnitřní třídy VolumePlugin a klikni na Finish. Tím se vytvoří třída VolumeAction, která dědí z třídy com.eteks.sweethome3d.plugin.PluginAction a obsahuje prázdnou metodu execute:

  public class VolumeAction extends PluginAction {
@Override
public void execute() {
// TODO Auto-generated method stub
}
}

Tato metoda je ta, kterou Sweet Home 3D zavolá, když uživatel spustí akci pluginu; takže toto je místo, kde musíš implementovat, jak vypočítat objem nábytku a zobrazit ho:

  public class VolumeAction extends PluginAction {  
@Override
public void execute() {
float volumeInCm3 = 0;
// Vypočítej součet objemu ohraničujícího boxu
// každého movitého kusu nábytku v domově
for (PieceOfFurniture piece : getHome(). getFurniture()) {
if (piece. isMovable()) {
volumeInCm3 += piece. getWidth()
* piece. getDepth()
* piece. getHeight();
}
}

// Zobraz výsledek v okně se zprávou (³ je pro 3 v horním indexu)
String message = String. format(
"Maximální objem movitého nábytku v domově je %.2f m³.",
volumeInCm3 / 1000000);
JOptionPane. showMessageDialog(null, message);
}
}

Nyní, když jsi specifikoval, co chceš, aby plugin dělal, musíš popsat, jak uživatel spustí tuto novou akci. Máš na výběr mezi přidáním nové položky menu do menu a/nebo nového tlačítka do panelu nástrojů. Tato volba se provádí nastavením příslušných vlastností akce pluginu při jejím vytvoření. Například, pokud chceš, aby uživatelé spustili akci objemu pomocí položky menu Compute volume nalezené v menu Tools, přidáš následující konstruktor do třídy VolumeAction:

  public VolumeAction() {
putPropertyValue(Property.NAME, "Compute volume");
putPropertyValue(Property.MENU, "Tools");
// Povolí akci ve výchozím nastavení
setEnabled(true);
}

Třída pluginu VolumePlugin je nyní naprogramována a téměř připravena fungovat jako plugin v Sweet Home 3D. Poslední dvě věci, které je třeba udělat, jsou:

Vytvoření popisného souboru pluginu

Soubor ApplicationPlugin.properties popisuje název pluginu, jeho třídu, minimální verze Sweet Home 3D a Javy, pod kterými je podporován, a právní záležitosti. Zvol File > New > File z menu Eclipse, zadej název souboru ApplicationPlugin.properties a klikni na Finish, jak je ukázáno na obrázku 5.

Obrázek 5. Vytvoření nového souboru

Poté zadej následující popis do nového souboru a ulož ho:

name=Movable furniture volume
class=com.eteks.test.VolumePlugin
description=Computes the volume of the movable furniture in home
version=1.0
license=GNU GPL
provider=(C) Copyrights 2024 Space Mushrooms
applicationMinimumVersion=1.5
javaMinimumVersion=1.5

Vytvoření JAR pluginu

JAR plugin obsahuje class soubory vytvořené z kompilace souboru VolumePlugin.java, a soubor ApplicationPlugin.properties. Protože Eclipse kompiluje Java soubor, jakmile ho uložíš, stačí zvolit File > Export… z menu a vybrat Java > JAR file v dialogu Export , který se zobrazí. V průvodci Jar Export, který se objeví, jak je ukázáno na obrázku 6, vyber zaškrtávací políčko projektu a zadej cestu k JAR souboru umístěnému ve složce pluginů Sweet Home 3D. Tato příslušná složka závisí na tvém systému následovně:

Obrázek 6. Export do JAR souboru

Testování pluginu

Plugin, který jsi vyvinul, poběží v Sweet Home 3D, buď s verzí Java Web Start, verzí instalátorů, nebo s SweetHome3D-7.5.jar, který jsi předtím stáhl. Protože ten poslední je spustitelný JAR, můžeš ho spustit dvojklikem na něj nebo následujícím příkazem:

Plugin, který jsi vyvinul, poběží v Sweet Home 3D, buď s verzí Java Web Start, verzí instalátorů, nebo s SweetHome3D-7.5.jar, který jsi předtím stáhl. Protože ten poslední je spustitelný JAR, můžeš ho spustit dvojklikem na něj nebo následujícím příkazem:

java -jar /cesta/k/SweetHome3D-7.5.jar

Dokud testuješ, pravděpodobně budeš preferovat spuštění Sweet Home 3D tímto příkazem, abys mohl číst v konzoli stack trace výjimek vyhozených během provádění tvého pluginu.

Jakmile je Sweet Home 3D spuštěn, uvidíš nové menu a jeho položku, jak je ukázáno na obrázku 7:

Obrázek 7. Menu pluginu

Pokud zvolíš novou položku menu pro příklad domova vytvořený v uživatelské příručce, získáš následující výsledek:

Obrázek 8. Plugin v akci

Ladění pluginu

Pokud potřebuješ ladit svůj plugin z Eclipse, vytvoř konfiguraci ladění podle těchto kroků:

Obrázek 9. Vytvoření konfigurace ladění
Obrázek 10. Nastavení classpath konfigurace ladění
Obrázek 11. Nastavení cesty ke zdrojům konfigurace ladění
Obrázek 12. Perspektiva ladění Eclipse

Pokaždé, když upravíš zdrojový kód svého pluginu, nezapomeň vygenerovat JAR pluginu před spuštěním konfigurace ladění, kterou jsi vytvořil. Pro urychlení procesu exportu JAR v Eclipse jdi do druhého kroku průvodce exportem JAR a vyber možnost Save the description of this JAR in the workspace. Tím se přidá nová položka do projektu s kontextovou položkou menu Create JAR.

Nasazení pluginu

Jakmile je připraven, tvůj plugin může být nasazen na počítač jiných uživatelů Sweet Home 3D jednoduše zkopírováním do jejich složky pluginů. Od verze 1.6 může být soubor pluginu také nainstalován do složky pluginů Sweet Home 3D dvojklikem na něj, pokud má příponu SH3P (jednoduše změň příponu souboru z .zip na .sh3p). Pokud dvojklik na soubor .sh3p nespustí Sweet Home 3D (nejpravděpodobnější pod Linuxem), můžeš také nainstalovat plugin následujícím příkazem v okně Terminal (kde SweetHome3D je název spustitelného souboru poskytovaného s instalátory Sweet Home 3D):

/cesta/k/SweetHome3D /cesta/k/plugin.sh3p

Pro ukončení používání pluginu odstraň jeho soubor ze složky pluginů a znovu spusť Sweet Home 3D.

Pokud chceš, aby tvůj plugin mohl běžet se všemi instalátory Sweet Home 3D dostupnými na této webové stránce, dbej na to, aby zůstal kompatibilní s Java 5, výběrem1.5 v poli Compiler compliance level dostupném v sekci Java Compiler dialogu zobrazeného položkou menu Project > Properties v Eclipse.
Pokud používáš verzi Java kompilátoru, kde kompatibilita s Java 1.5 již není dostupná, zkus cílit alespoň na Java 1.8 stále používanou v nedávných verzích Sweet Home 3D a nastavjavaMinimumVersion v souboruApplicationPlugin.properties tvého pluginu odpovídajícím způsobem.

Další postup

Programování prvního pluginu ti ukázalo celkový přehled. Zde jsou další informace, které ti pomohou pokročit dále.

Sweet Home 3D API – javadoc

Nejužitečnější dokumentací pro vývoj nového pluginu je Sweet Home 3D API (Application Programming Interface), vygenerované nástrojem javadoc.
Ve svém pluginu používej pouze třídy z balíčků com.eteks.sweethome3d.plugin, com.eteks.sweethome3d.model, com.eteks.sweethome3d.tools a com.eteks.sweethome3d.viewcontroller, pokud chceš, aby byl kompatibilní s budoucími verzemi Sweet Home 3D. To bude více než dostačující pro programování jakéhokoli pluginu, který pracuje s daty domů dostupnými v Sweet Home 3D.
Balíčky odpovídající ostatním vrstvám programu jsou zahrnuty v Javadocu pouze pro informační účely. Nespoléhej se na jejich API, protože se může v budoucnu změnit bez záruky zpětné kompatibility (v každém případě neuvidíš žádný odkaz na třídu z balíčků com.eteks.sweethome3d.swing, com.eteks.sweethome3d.j3d, com.eteks.sweethome3d.io nebo com.eteks.sweethome3d ve výše zmíněných balíčcích).

Architektura tříd modelu

Sweet Home 3D je založen na architektuře MVC (Model View Controller), takže porozumění organizaci jeho vrstvy Model je zásadní. Obrázek 13 (dostupný také ve formátu PDF) představuje téměř všechny třídy a rozhraní dostupné ve verzi 1.5 balíčku com.eteks.sweethome3d.model, který odpovídá této vrstvě Model.

UML Diagram model-classes-diagram
Figure 13. UML diagram of com.eteks.sweethome3d.model package
(click on a class to view its javadoc)

Centrální třídou ve vrstvě Model je třída HomeApplication (10), abstraktní nadtřída hlavní třídy aplikace SweetHome3D. Instance této třídy poskytuje přístup k aktuálně upravovaným instancím Home (7) a k objektu UserPreferences (11), který ukládá používanou jednotku délky (12), katalog nábytku (14) a katalog textur (15), ze kterých uživatel vybírá kusy nábytku (17) a textury (18).
Instance Home (7) ukládá všechny objekty, které uživatel vytvořil v plánu domu:

Tyto objekty implementují rozhraní Selectable (1), stejně jako objekt ObserverCamera (4), který ukládá polohu kamery v režimu Virtuální návštěvník. Všechny externí informace spravované objekty Model, jako jsou ikona a 3D model kusu nábytku (16) nebo obrázek textury (20), jsou přístupné přes rozhraní Content (19), implementované třídou URLContent a dalšími třídami z balíčku com.eteks.sweethome3d.tools.

Tento UML diagram by ti měl pomoci pochopit, které třídy jsou dostupné v modelu Sweet Home 3D a jak k nim můžeš přistupovat, ale pravděpodobně si všimneš, že v něm nejsou uvedeny žádné konstruktory ani mutátory (nebo settery, pokud preferuješ). Je to jen kvůli nedostatku místa, ale můžeš je bez problémů používat ve třídě pluginu. Všimni si také, že jakákoli modifikace existujícího objektu modelu bude oznámena zobrazeným komponentám buď pomocí PropertyChangeEventů, CollectionEventů (8) nebo SelectionEventů (6), což umožňuje okamžité zobrazení všech změn na obrazovce.

Model Sweet Home 3D není vláknově bezpečný z důvodů výkonu. Všechny modifikace objektu patřícího do modelu by měly být prováděny ve vlákně Event Dispatch Thread.

Architektura tříd pluginu

Architektura tříd pluginu je mnohem jednodušší na pochopení než architektura vrstvy Model. Balíček com.eteks.sweethome3d.plugin obsahuje pouze tři třídy, z nichž by ses měl používat pouze třídy Plugin a PluginAction, jak je znázorněno na obrázku 14 (dostupném také ve formátu PDF).

UML Diagram plugin-classes-diagram
Figure 14. UML diagram of com.eteks.sweethome3d.plugin package
(click on a class to view its javadoc)

Instance PluginManager (1) je vytvořena při spuštění aplikace a vyhledává pluginy nainstalované ve složce pluginů uživatele. Pokaždé, když je upravován nový dům, tento manažer vytvoří a nakonfiguruje objekt Plugin (3) pro každý plugin nalezený při spuštění. Poté volá metodu getActions pro získání všech akcí (4), které budou přidány jako položky menu a/nebo tlačítka panelu nástrojů v okně domu. Každá akce je instancí PluginAction, která se podobá třídě Action, s její metodou execute a jejími modifikovatelnými vlastnostmi (2).

Všimni si, že třída Plugin ti poskytuje přístup k instanci UndoableEditSupport prostřednictvím její metody getUndoableEditSupport. Jakmile upravíš dům nebo jeho objekty (nábytek, zdi…) v metodě execute instance PluginAction, měl bys také odeslat objekt UndoableEdit do podpory vratných úprav vrácené metodou getUndoableEditSupport, jinak uživatelé nebudou moci správně vrátit/znovu provést změny, které jsi provedl.

Lokalizace

Pokud plánuješ vyvinout plugin pro komunitu uživatelů Sweet Home 3D, snaž se lokalizovat řetězce, které zobrazuje buď v názvech akcí a menu, nebo v dialozích, které vytvoříš (nebo alespoň připrav jeho lokalizaci). Dva konstruktory třídy PluginAction ti pomohou organizovat překlad vlastností akcí pomocí souborů .properties, a pokud potřebuješ přeložit další řetězce ve svém pluginu (jako ten v dialogu zobrazeném testovaným pluginem), znovu použij tyto soubory .properties s Java třídou ResourceBundle.
Pokud preferuješ omezit počet souborů properties, můžeš dokonce zapsat hodnoty vlastností akcí a další řetězce do popisného souboru ApplicationPlugin.properties tvého pluginu.

Pokud chceš příklad, který používá tuto architekturu, stáhni si plugin Export to SH3F dostupný na https://www.sweethome3d.com/plugins/ExportToSH3F-1.0.sh3p a rozbal ho (tento soubor pluginu obsahuje také zdrojový kód pluginu).
Jak je popsáno v Fóru nápovědy, tento plugin vytváří soubor SH3F, který obsahuje veškerý nábytek, který jsi importoval do katalogu nábytku Sweet Home 3D.

Přispívání pluginy

Pluginy, které jsi naprogramoval, můžeš zveřejnit v systému sledování Příspěvků pluginů, abys je sdílel s komunitou uživatelů Sweet Home 3D.
Díky pluginům lze do Sweet Home 3D přidat mnoho funkcí, od importérů po exportéry, ale také pluginy schopné upravovat data domu, jako je Plugin pro rotaci domu vyvinutý Michelem Mbemem a další uvedené v Tutoriálu pro pluginy a rozšíření (PDF) napsaném Hansem Dirkse a na stránce Pluginy a nástroje.

This site is registered on wpml.org as a development site. Switch to a production site key to remove this banner.