Εισαγωγή

Από την έκδοση 1.5, είναι δυνατή η προσθήκη νέων λειτουργιών στο Sweet Home 3D με αρχεία πρόσθετων που τοποθετούνται στον φάκελο πρόσθετων σας. Αυτό επιτρέπει στους προγραμματιστές Java να αναπτύξουν και να διανείμουν νέες λειτουργίες για το Sweet Home 3D χωρίς να τροποποιήσουν τα αρχεία πηγαίου κώδικα της τρέχουσας έκδοσης (που είναι καλό για την προς τα πάνω συμβατότητα), και χωρίς να παραδώσουν μια πλήρη έκδοση του προγράμματος (που είναι καλό για το μέγεθος παράδοσης).
Αυτό το έγγραφο περιγράφει τα εργαλεία που απαιτούνται για τη δημιουργία πρόσθετων, στη συνέχεια δείχνει πώς να προγραμματίσετε ένα πρόσθετο που υπολογίζει τον μέγιστο όγκο των κινητών επίπλων που προστέθηκαν σε ένα σπίτι, και τέλος δίνει κάποιες πρόσθετες πληροφορίες που θα σας βοηθήσουν να προχωρήσετε περαιτέρω.

Εγκατάσταση εργαλείων ανάπτυξης

Αν το Sweet Home 3D απευθύνεται σε ένα γενικό κοινό, η ανάπτυξη πρόσθετων απαιτεί ειδικές δεξιότητες, και θα πρέπει να ξέρετε πώς να προγραμματίζετε σε Java με ένα IDE, πριν προχωρήσετε περαιτέρω. Αυτός ο οδηγός δείχνει πώς να δημιουργήσετε ένα πρόσθετο με το Eclipse, αλλά μπορείτε να χρησιμοποιήσετε το IDE της επιλογής σας, ή καθόλου IDE.

Κατεβάστε και εγκαταστήστε το Eclipse

Πρώτα κατεβάστε το Eclipse από το https://www.eclipse.org/. Η έκδοση με το όνομα Eclipse IDE for Java Developers είναι αρκετή για την ανάπτυξη ενός πρόσθετου, αλλά μπορείτε να κατεβάσετε οποιαδήποτε έκδοση για ανάπτυξη Java.
Μόλις κατέβει, η εγκατάσταση του Eclipse είναι πολύ απλή: απλά αποσυμπιέστε το αρχείο που θα πάρετε, ανοίξτε τον φάκελο eclipse και ανάλογα με το σύστημά σας, εκτελέστε το αρχείο με όνομα eclipse.exe (στα Windows), eclipse.app (στο Mac OS X) ή eclipse (στο Linux).
Στην πρώτη εκτέλεση, το Eclipse θα σας ζητήσει να επιλέξετε έναν φάκελο workspace, όπου θα αποθηκεύονται τα έργα των πρόσθετων.
Μόλις γίνει αυτό, επιλέξτε File > New > Project από το μενού για να δημιουργήσετε ένα νέο έργο, επιλέξτε Java > Java project στον οδηγό New project που θα εμφανιστεί, εισάγετε VolumePlugin ως όνομα έργου και κάντε κλικ στο κουμπί Finish. Τέλος, κλείστε την καρτέλα Welcome για να ανακαλύψετε τον χώρο εργασίας σας όπως φαίνεται στην εικόνα 1.

Εικόνα 1. Χώρος εργασίας Eclipse

Κατεβάστε και εγκαταστήστε τη βιβλιοθήκη Sweet Home 3D

Η ανάπτυξη ενός πρόσθετου βασίζεται σε κάποιες κλάσεις του Sweet Home 3D που το Eclipse πρέπει να γνωρίζει για να μπορεί να δημιουργήσει το έργο σας. Ο ευκολότερος τρόπος να προσθέσετε τις κλάσεις του Sweet Home 3D στο Eclipse είναι να κατεβάσετε την εκτελέσιμη έκδοση JAR του Sweet Home 3D που είναι διαθέσιμη στο https://sourceforge.net/projects/sweethome3d/files/SweetHome3D/SweetHome3D-7.5/SweetHome3D-7.5.jar/download. Μόλις κατέβει, σύρετε και αφήστε το αρχείο SweetHome3D-7.5.jar στο εικονίδιο του έργου VolumePlugin στην προβολή Package Explorer του Eclipse, και επιλέξτε το στοιχείο Build Path > Add to Build Path στο μενού περιεχομένου του αρχείου SweetHome3D-7.5.jar, όπως φαίνεται στην εικόνα 2.

Εικόνα 2. Προσθήκη του SweetHome3D-7.5.jar
στο Build Path

Προγραμματισμός ενός πρόσθετου

Τώρα που εγκαταστήσατε τα απαραίτητα εργαλεία, ας δούμε πώς μπορείτε να προγραμματίσετε το πρώτο σας πρόσθετο για το Sweet Home 3D.

Δημιουργία της κλάσης του πρόσθετου

Πρώτα, δημιουργήστε μια νέα υποκλάση της com.eteks.sweethome3d.plugin.Plugin επιλέγοντας το στοιχείο μενού File > New > Class στο Eclipse.

Εικόνα 3. Δημιουργία νέας κλάσης

Στο παράθυρο διαλόγου New Java Class, εισάγετε VolumePlugin ως όνομα κλάσης, εισάγετε ένα πακέτο (εδώ το επιλεγμένο πακέτο ήταν com.eteks.test), και επιλέξτε com.eteks.sweethome3d.plugin.Plugin ως την υπερκλάση του VolumePlugin. Μόλις τελειώσετε, κάντε κλικ στο Finish. Το Eclipse θα δημιουργήσει το αρχείο της νέας κλάσης με το ακόλουθο περιεχόμενο:

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;
}
}

Όπως μπορείτε να μαντέψετε από το σχόλιο TODO, πρέπει τώρα να αλλάξετε την υλοποίηση της μεθόδου getActions για να επιστρέψει μια ενέργεια πρόσθετου ικανή να υπολογίσει τον όγκο των κινητών επίπλων. Αντικαταστήστε το return null; με την ακόλουθη δήλωση:

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

και επιλέξτε Edition > Quick Fix από το μενού του Eclipse για να δημιουργήσετε την ελλείπουσα κλάση VolumeAction, όπως φαίνεται στην εικόνα 4.

Εικόνα 4. Χρήση του Quick fix για τη δημιουργία μιας ελλείπουσας κλάσης

Στο παράθυρο διαλόγου New Java Class που εμφανίζεται, επιλέξτε το πλαίσιο ελέγχου Enclosing type για να δημιουργήσετε μια εσωτερική κλάση του VolumePlugin και κάντε κλικ στο Finish. Αυτό θα δημιουργήσει την κλάση VolumeAction που κληρονομεί από την κλάση com.eteks.sweethome3d.plugin.PluginAction και περιέχει μια κενή μέθοδο execute:

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

Αυτή η μέθοδος είναι αυτή που το Sweet Home 3D θα καλέσει όταν ο χρήστης θα εκτελέσει την ενέργεια του πρόσθετου· επομένως αυτό είναι το μέρος όπου πρέπει να υλοποιήσετε πώς να υπολογίσετε τον όγκο των επίπλων και να τον εμφανίσετε:

  public class VolumeAction extends PluginAction {  
@Override
public void execute() {
float volumeInCm3 = 0;
// Υπολογίζουμε το άθροισμα του όγκου του περιβάλλοντος κουτιού
// κάθε κινητού επίπλου στο σπίτι
for (PieceOfFurniture piece : getHome(). getFurniture()) {
if (piece. isMovable()) {
volumeInCm3 += piece. getWidth()
* piece. getDepth()
* piece. getHeight();
}
}

// Εμφάνιση του αποτελέσματος σε ένα παράθυρο μηνύματος (το ³ είναι για το 3 σε εκθέτη)
String message = String. format(
"Ο μέγιστος όγκος των κινητών επίπλων στο σπίτι είναι %.2f m³.",
volumeInCm3 / 1000000);
JOptionPane. showMessageDialog(null, message);
}
}

Τώρα που καθόρισες τι θέλεις να κάνει το πρόσθετο, πρέπει να περιγράψεις πώς ο χρήστης θα εκτελέσει αυτή τη νέα ενέργεια. Έχεις την επιλογή να προσθέσεις ένα νέο στοιχείο μενού σε ένα μενού, και/ή ένα νέο κουμπί στη γραμμή εργαλείων. Αυτή η επιλογή γίνεται ορίζοντας τις κατάλληλες ιδιότητες της ενέργειας του πρόσθετου κατά τη δημιουργία του. Για παράδειγμα, αν θέλεις οι χρήστες να εκτελούν την ενέργεια όγκου με το στοιχείο μενού Υπολογισμός όγκου που βρίσκεται στο μενού Εργαλεία, θα προσθέσεις τον ακόλουθο κατασκευαστή στην κλάση VolumnAction:

  public VolumeAction() {
putPropertyValue(Property.NAME, "Compute volume");
putPropertyValue(Property.MENU, "Tools");
// Ενεργοποιεί την ενέργεια από προεπιλογή
setEnabled(true);
}

Η κλάση πρόσθετου VolumePlugin είναι τώρα προγραμματισμένη και σχεδόν έτοιμη να λειτουργήσει ως πρόσθετο στο Sweet Home 3D. Τα δύο τελευταία πράγματα που πρέπει να κάνεις είναι:

  • δημιουργία ενός αρχείου περιγραφής ApplicationPlugin.properties,
  • τοποθέτηση των αρχείων μαζί σε ένα αρχείο JAR.

Δημιουργία του αρχείου περιγραφής πρόσθετου

Ένα αρχείο ApplicationPlugin.properties περιγράφει το όνομα του πρόσθετου, την κλάση του, τις ελάχιστες εκδόσεις Sweet Home 3D και Java υπό τις οποίες υποστηρίζεται, και νομικά θέματα. Επέλεξε File > New > File από το μενού Eclipse, βάλε το όνομα αρχείου ApplicationPlugin.properties και κάνε κλικ στο Finish, όπως φαίνεται στο σχήμα 5.

Σχήμα 5. Δημιουργία νέου αρχείου

Στη συνέχεια βάλε την ακόλουθη περιγραφή στο νέο αρχείο και αποθήκευσέ το:

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

Δημιουργία του JAR πρόσθετου

Το JAR πρόσθετου περιέχει τα αρχεία class που δημιουργήθηκαν από τη μεταγλώττιση του αρχείου VolumePlugin.java, και το αρχείο ApplicationPlugin.properties. Καθώς το Eclipse μεταγλωττίζει ένα αρχείο Java μόλις το αποθηκεύσεις, απλά πρέπει να επιλέξεις File > Export… από το μενού και να επιλέξεις Java > JAR file στο παράθυρο διαλόγου Export που θα εμφανιστεί. Στον οδηγό Jar Export που εμφανίζεται όπως φαίνεται στο σχήμα 6, επέλεξε το πλαίσιο ελέγχου του έργου και βάλε τη διαδρομή ενός αρχείου JAR που βρίσκεται στο φάκελο πρόσθετων του Sweet Home 3D. Αυτός ο κατάλληλος φάκελος εξαρτάται από το σύστημά σου ως εξής:

  • στα Windows Vista / 7 / 8 / 10 / 11, αυτός ο φάκελος είναι C:UsersuserAppDataRoamingeTeksSweet Home 3Dplugins,
  • στα Windows XP και προηγούμενες εκδόσεις των Windows, αυτός ο φάκελος είναι C:Documents and SettingsuserApplication DataeTeksSweet Home 3Dplugins,
  • στο macOS, είναι ο υποφάκελος Library/Application Support/eTeks/Sweet Home 3D/plugins του φακέλου χρήστη σου,
  • στο Linux και άλλα Unix, είναι ο υποφάκελος .eteks/sweethome3d/plugins του φακέλου χρήστη σου.
Σχήμα 6. Εξαγωγή σε αρχείο JAR

Δοκιμή του πρόσθετου

Το πρόσθετο που ανέπτυξες θα τρέχει στο Sweet Home 3D, είτε με την έκδοση Java Web Start, την έκδοση εγκαταστάσεων, ή το SweetHome3D-7.5.jar που κατέβασες προηγουμένως. Καθώς το τελευταίο είναι ένα εκτελέσιμο JAR, μπορείς να το τρέξεις κάνοντας διπλό κλικ πάνω του ή με την ακόλουθη εντολή:

Το πρόσθετο που ανέπτυξες θα τρέχει στο Sweet Home 3D, είτε με την έκδοση Java Web Start, την έκδοση εγκαταστάσεων, ή το SweetHome3D-7.5.jar που κατέβασες προηγουμένως. Καθώς το τελευταίο είναι ένα εκτελέσιμο JAR, μπορείς να το τρέξεις κάνοντας διπλό κλικ πάνω του ή με την ακόλουθη εντολή:

java -jar /path/to/SweetHome3D-7.5.jar

Όσο κάνεις δοκιμές, πιθανότατα θα προτιμάς να τρέχεις το Sweet Home 3D με αυτή την εντολή, για να μπορείς να διαβάζεις στην κονσόλα το stack trace των εξαιρέσεων που πετιούνται κατά την εκτέλεση του πρόσθετού σου.

Μόλις εκκινηθεί το Sweet Home 3D, θα δεις το νέο μενού και το στοιχείο του να εμφανίζονται όπως φαίνεται στο σχήμα 7:

Σχήμα 7. Μενού πρόσθετου

Αν επιλέξεις το νέο στοιχείο μενού για το παράδειγμα σπιτιού που δημιουργήθηκε στον οδηγό χρήστη, θα δεις το παρακάτω αποτέλεσμα:

Εικόνα 8. Πρόσθετο σε λειτουργία

Αποσφαλμάτωση του πρόσθετου

Αν χρειάζεται να κάνεις αποσφαλμάτωση του πρόσθετου σου από το Eclipse, δημιούργησε μια ρύθμιση αποσφαλμάτωσης ακολουθώντας αυτά τα βήματα:

  • Επίλεξε Run > Debug Configurations… από το μενού, επίλεξε το στοιχείο Java Application από τη λίστα διαθέσιμων ρυθμίσεων στο παράθυρο διαλόγου Debug configurations, κάνε κλικ στο κουμπί New πάνω αριστερά και βάλε ένα όνομα για τη ρύθμιση.
  • Κάνε κλικ στο κουμπί Search… στα δεξιά του πεδίου κειμένου Main class και κάνε διπλό κλικ στην κλάση SweetHome3DBootstrap
    ανάμεσα στις προτεινόμενες κλάσεις.
Εικόνα 9. Δημιουργία ρύθμισης αποσφαλμάτωσης
  • Κάνε κλικ στην καρτέλα Classpath, επίλεξε το υπο-στοιχείο VolumePlugin (default classpath) του στοιχείου User Entries στη λίστα Classpath και κάνε κλικ στο κουμπί Remove.
  • Κάνε κλικ στο στοιχείο User Entries στη λίστα Classpath, κάνε κλικ στο κουμπί Add JARs…, επίλεξε το στοιχείο SweetHome3D-7.5.jar και επιβεβαίωσε την επιλογή σου.
Εικόνα 10. Ρύθμιση του classpath στη ρύθμιση αποσφαλμάτωσης
  • Επίλεξε την καρτέλα Source, κάνε κλικ στο κουμπί Add…, κάνε διπλό κλικ στο στοιχείο Java Project στο παράθυρο διαλόγου Add Source, επίλεξε το στοιχείο VolumePlugin στο αναδυόμενο παράθυρο Project Selection και επιβεβαίωσε την επιλογή σου.
Εικόνα 11. Ρύθμιση της διαδρομής πηγαίου κώδικα στη ρύθμιση αποσφαλμάτωσης
  • Τέλος, κάνε κλικ στο κουμπί Debug για να εκκινήσεις το Sweet Home 3D σε λειτουργία αποσφαλμάτωσης. Μόλις το πρόγραμμα τρέξει, άνοιξε το αρχείο VolumePlugin.java, βάλε ένα σημείο διακοπής στη μέθοδο execute και επίλεξε Tools > Compute volume από το μενού του Sweet Home 3D. Το Eclipse θα σταματήσει στο επιλεγμένο σημείο διακοπής για να σου επιτρέψει να εκτελέσεις το πρόγραμμα βήμα-βήμα και να επιθεωρήσεις τις τιμές των μεταβλητών.
Εικόνα 12. Προοπτική αποσφαλμάτωσης του Eclipse

Κάθε φορά που τροποποιείς τον πηγαίο κώδικα του πρόσθετου σου, μην ξεχνάς να δημιουργήσεις το JAR του πρόσθετου πριν εκκινήσεις τη ρύθμιση αποσφαλμάτωσης που δημιούργησες. Για να επιταχύνεις τη διαδικασία εξαγωγής JAR στο eclipse, πήγαινε στο δεύτερο βήμα του οδηγού εξαγωγής JAR και επίλεξε την επιλογή Save the description of this JAR in the workspace. Αυτό θα προσθέσει ένα νέο στοιχείο στο έργο με ένα στοιχείο μενού περιεχομένου Create JAR.

Ανάπτυξη του πρόσθετου

Όταν είναι έτοιμο, το πρόσθετο σου μπορεί να αναπτυχθεί στον υπολογιστή άλλων χρηστών του Sweet Home 3D απλά αντιγράφοντάς το στον φάκελο προσθέτων τους. Από την έκδοση 1.6, ένα αρχείο πρόσθετου μπορεί επίσης να εγκατασταθεί στον φάκελο προσθέτων του Sweet Home 3D κάνοντας διπλό κλικ σε αυτό, αν η επέκτασή του είναι SH3P (απλά άλλαξε την επέκταση του αρχείου από .zip σε .sh3p). Αν το διπλό κλικ σε ένα αρχείο .sh3p δεν εκκινεί το Sweet Home 3D (πιο πιθανό στο Linux), μπορείς επίσης να εγκαταστήσεις ένα πρόσθετο με την ακόλουθη εντολή σε ένα παράθυρο Terminal (όπου SweetHome3D είναι το όνομα του εκτελέσιμου αρχείου που παρέχεται με τα προγράμματα εγκατάστασης του Sweet Home 3D):

/path/to/SweetHome3D /path/to/plugin.sh3p

Για να σταματήσεις να χρησιμοποιείς ένα πρόσθετο, αφαίρεσε το αρχείο του από τον φάκελο προσθέτων και επανεκκίνησε το Sweet Home 3D.

Αν θέλεις το πρόσθετο σου να μπορεί να τρέξει με όλα τα προγράμματα εγκατάστασης του Sweet Home 3D που είναι διαθέσιμα σε αυτόν τον ιστότοπο, φρόντισε να το διατηρήσεις συμβατό με Java 5, επιλέγοντας 1.5 στο πεδίο Compiler compliance level που είναι διαθέσιμο στην ενότητα Java Compiler του παραθύρου διαλόγου που εμφανίζεται από το στοιχείο μενού Project > Properties του Eclipse.
Αν χρησιμοποιείς μια έκδοση του μεταγλωττιστή Java όπου η συμβατότητα Java 1.5 δεν είναι πλέον διαθέσιμη, προσπάθησε να στοχεύσεις τουλάχιστον στη Java 1.8 που χρησιμοποιείται ακόμα στις πρόσφατες εκδόσεις του Sweet Home 3D και ρύθμισε το javaMinimumVersion στο αρχείο ApplicationPlugin.properties του πρόσθετου σου αναλόγως.

Περαιτέρω εξέλιξη

Ο προγραμματισμός του πρώτου πρόσθετου σου έδειξε τη γενική εικόνα. Εδώ είναι κάποιες επιπλέον πληροφορίες που θα σε βοηθήσουν να προχωρήσεις περαιτέρω.

Sweet Home 3D API – Javadoc

Η πιο χρήσιμη τεκμηρίωση για την ανάπτυξη ενός νέου πρόσθετου είναι το Sweet Home 3D API (Application Programming Interface), που δημιουργείται με το εργαλείο javadoc.
Χρησιμοποίησε μόνο τις κλάσεις των πακέτων com.eteks.sweethome3d.plugin, com.eteks.sweethome3d.model, com.eteks.sweethome3d.tools και com.eteks.sweethome3d.viewcontroller στο πρόσθετό σου αν θέλεις να είναι συμβατό προς τα πάνω με μελλοντικές εκδόσεις του Sweet Home 3D. Αυτό θα είναι αρκετό για να προγραμματίσεις οποιοδήποτε πρόσθετο που λειτουργεί με τα δεδομένα σπιτιού που είναι διαθέσιμα στο Sweet Home 3D.
Τα πακέτα που αντιστοιχούν στα άλλα επίπεδα του προγράμματος περιλαμβάνονται στο Javadoc μόνο για ενημερωτικούς σκοπούς. Μη βασίζεσαι στο API τους, καθώς μπορεί να αλλάξει στο μέλλον χωρίς εγγύηση συμβατότητας προς τα πάνω (έτσι κι αλλιώς δε θα δεις καμία αναφορά σε κλάση των πακέτων com.eteks.sweethome3d.swing, com.eteks.sweethome3d.j3d, com.eteks.sweethome3d.io ή com.eteks.sweethome3d στα προαναφερθέντα πακέτα).

Αρχιτεκτονική κλάσεων μοντέλου

Το Sweet Home 3D βασίζεται σε αρχιτεκτονική MVC (Model View Controller), οπότε η κατανόηση του τρόπου οργάνωσης του επιπέδου Model είναι απαραίτητη. Η εικόνα 13 (διαθέσιμη επίσης σε μορφή PDF) παρουσιάζει σχεδόν όλες τις κλάσεις και διεπαφές που είναι διαθέσιμες στην έκδοση 1.5 του πακέτου com.eteks.sweethome3d.model που αντιστοιχεί σε αυτό το επίπεδο Model.

[uml_diagram slug=”model-classes-diagram” map_name=”model-classes-diagram” caption=”Figure 13. UML diagram of com.eteks.sweethome3d.model package” caption_small=”(click on a class to view its javadoc)”]

Η κεντρική κλάση στο επίπεδο Model είναι η κλάση HomeApplication (10), η αφηρημένη υπερκλάση της κύριας κλάσης εφαρμογής SweetHome3D. Το στιγμιότυπο αυτής της κλάσης δίνει πρόσβαση στα στιγμιότυπα Home (7) που υπόκεινται σε επεξεργασία, και στο αντικείμενο UserPreferences (11) που αποθηκεύει τη μονάδα μήκους σε χρήση (12), τον κατάλογο επίπλων (14) και τον κατάλογο υφών (15) από τους οποίους ο χρήστης επιλέγει κομμάτια επίπλων (17) και υφές (18).
Ένα στιγμιότυπο Home (7) αποθηκεύει όλα τα αντικείμενα που δημιούργησε ο χρήστης στο σχέδιο σπιτιού:

  • τη λίστα των αντικειμένων HomePieceOfFurniture (13) που υλοποιούν τη διεπαφή PieceOfFurniture (16),
  • τη συλλογή των αντικειμένων Wall (9),
  • τη λίστα των αντικειμένων Room (5),
  • τη συλλογή των αντικειμένων DimensionLine (2),
  • τη συλλογή των αντικειμένων Label (3).

Αυτά τα αντικείμενα υλοποιούν τη διεπαφή Selectable (1) όπως και το αντικείμενο ObserverCamera (4), που αποθηκεύει τη θέση της κάμερας στη λειτουργία Εικονικού επισκέπτη. Όλες οι εξωτερικές πληροφορίες που διαχειρίζονται τα αντικείμενα Model, όπως το εικονίδιο και το 3D μοντέλο ενός κομματιού επίπλων (16), ή η εικόνα μιας υφής (20) προσπελαύνονται μέσω της διεπαφής Content (19), που υλοποιείται από την κλάση URLContent και άλλες κλάσεις του πακέτου com.eteks.sweethome3d.tools.

Αυτό το διάγραμμα UML θα σε βοηθήσει να καταλάβεις ποιες κλάσεις είναι διαθέσιμες στο μοντέλο του Sweet Home 3D και πώς μπορείς να τις προσπελάσεις, αλλά πιθανόν θα παρατηρήσεις ότι δεν αναφέρονται κατασκευαστές και μεταλλάκτες (ή setters αν προτιμάς) σε αυτό. Είναι απλά λόγω έλλειψης χώρου αλλά μπορείς να τα χρησιμοποιήσεις χωρίς πρόβλημα σε μια κλάση πρόσθετου. Σημείωσε επίσης ότι οποιαδήποτε τροποποίηση ενός υπάρχοντος αντικειμένου του μοντέλου θα ειδοποιηθεί στα εμφανιζόμενα στοιχεία είτε με PropertyChangeEvents, με CollectionEvents (8) ή με SelectionEvents (6), επιτρέποντας έτσι όλες οι αλλαγές να αντανακλώνται άμεσα στην οθόνη.

Το μοντέλο του Sweet Home 3D δεν είναι thread safe για λόγους απόδοσης. Όλες οι τροποποιήσεις ενός αντικειμένου που ανήκει στο μοντέλο θα πρέπει να γίνονται στο Event Dispatch Thread.

Αρχιτεκτονική κλάσεων πρόσθετου

Η αρχιτεκτονική των κλάσεων πρόσθετου είναι πολύ πιο απλή στην κατανόηση από αυτή του επιπέδου Model. Το πακέτο com.eteks.sweethome3d.plugin περιέχει μόνο τρεις κλάσεις από τις οποίες υποτίθεται ότι θα χρησιμοποιήσεις μόνο τις κλάσεις Plugin και PluginAction, όπως φαίνεται στην εικόνα 14 (διαθέσιμη επίσης σε μορφή PDF).

[uml_diagram slug=”plugin-classes-diagram” map_name=”plugin-classes-diagram” caption=”Figure 14. UML diagram of com.eteks.sweethome3d.plugin package” caption_small=”(click on a class to view its javadoc)”]

Ένα στιγμιότυπο PluginManager (1) δημιουργείται κατά την εκκίνηση της εφαρμογής και αναζητά τα πρόσθετα που είναι εγκατεστημένα στον φάκελο προσθέτων του χρήστη. Κάθε φορά που γίνεται επεξεργασία ενός νέου σπιτιού, αυτός ο διαχειριστής δημιουργεί στιγμιότυπα και ρυθμίζει ένα αντικείμενο Plugin (3) για κάθε πρόσθετο που βρέθηκε κατά την εκκίνηση. Στη συνέχεια, καλεί τη μέθοδο getActions για να ανακτήσει όλες τις ενέργειες (4) που θα προστεθούν ως στοιχεία μενού ή/και κουμπιά γραμμής εργαλείων στο παράθυρο του σπιτιού. Κάθε ενέργεια είναι ένα στιγμιότυπο του PluginAction, που μοιάζει με την κλάση Action, με τη μέθοδο execute και τις τροποποιήσιμες ιδιότητές της (2).

Σημείωσε ότι η κλάση Plugin σου δίνει πρόσβαση σε ένα στιγμιότυπο UndoableEditSupport μέσω της μεθόδου getUndoableEditSupport. Μόλις τροποποιήσεις ένα σπίτι ή τα αντικείμενά του (έπιπλα, τοίχους…) στη μέθοδο execute ενός στιγμιότυπου PluginAction, θα πρέπει επίσης να στείλεις ένα αντικείμενο UndoableEdit στο undoable edit support που επιστρέφεται από τη μέθοδο getUndoableEditSupport, διαφορετικά οι χρήστες δε θα μπορούν να αναιρέσουν/επαναλάβουν σωστά τις αλλαγές που έκανες.

Τοπικοποίηση

Αν σχεδιάζεις να αναπτύξεις ένα πρόσθετο για την κοινότητα χρηστών του Sweet Home 3D, προσπάθησε να τοπικοποιήσεις τις συμβολοσειρές που εμφανίζει είτε στα ονόματα ενεργειών και μενού είτε στους διαλόγους που θα δημιουργήσεις (ή τουλάχιστον προετοίμασε την τοπικοποίησή του). Δύο κατασκευαστές της κλάσης PluginAction θα σε βοηθήσουν να οργανώσεις τη μετάφραση των ιδιοτήτων ενεργειών με αρχεία .properties, και αν χρειάζεται να μεταφράσεις άλλες συμβολοσειρές στο πρόσθετό σου (όπως αυτή στο διάλογο που εμφανίζεται από το δοκιμασμένο πρόσθετο) επαναχρησιμοποίησε αυτά τα αρχεία .properties με την κλάση Java ResourceBundle.
Αν προτιμάς να περιορίσεις τον αριθμό των αρχείων ιδιοτήτων, μπορείς ακόμη να γράψεις τις τιμές των ιδιοτήτων ενεργειών και άλλων συμβολοσειρών στο αρχείο περιγραφής ApplicationPlugin.properties του πρόσθετού σου.

Αν θέλεις ένα παράδειγμα που χρησιμοποιεί αυτή την αρχιτεκτονική, κατέβασε το πρόσθετο Export to SH3F που είναι διαθέσιμο στο https://www.sweethome3d.com/plugins/ExportToSH3F-1.0.sh3p και αποσυμπίεσέ το (αυτό το αρχείο πρόσθετου περιέχει επίσης τον πηγαίο κώδικα του πρόσθετου).
Όπως περιγράφεται στο Φόρουμ Βοήθειας, αυτό το πρόσθετο δημιουργεί ένα αρχείο SH3F που περιέχει όλα τα έπιπλα που έχεις εισάγει στον κατάλογο επίπλων του Sweet Home 3D.

Συνεισφορά πρόσθετων

Μπορείς να δημοσιεύσεις τα πρόσθετα που προγραμμάτισες στο Σύστημα Παρακολούθησης Συνεισφορών Πρόσθετων για να τα μοιραστείς με την κοινότητα χρηστών του Sweet Home 3D.
Πολλές λειτουργίες μπορούν να προστεθούν στο Sweet Home 3D χάρη στα πρόσθετα, από εισαγωγείς μέχρι εξαγωγείς, αλλά και πρόσθετα ικανά να τροποποιήσουν τα δεδομένα ενός σπιτιού όπως το Πρόσθετο Περιστροφής Σπιτιού που αναπτύχθηκε από τον Michel Mbem και άλλα που αναφέρονται στον Οδηγό για Πρόσθετα και Επεκτάσεις (PDF) που έγραψε ο Hans Dirkse και στη σελίδα Πρόσθετα και εργαλεία.