Dans le constructeur d'une sous-classe de PluginAction, je viens d'essayer de remplacer à la volée une instance de
HomePieceOfFurniture par une instance d'une sous-classe public
MyPieceOfFurniture appartenant au plug-in. Ca donne ça:
Code: Select all
getHome().addFurnitureListener(new CollectionListener<HomePieceOfFurniture>() {
public void collectionChanged(final CollectionEvent<HomePieceOfFurniture> ev) {
if (ev.getType() == CollectionEvent.Type.ADD) {
final Home home = (Home)ev.getSource();
home.removeFurnitureListener(this);
// Remplacement du meuble par une autre instance d'une sous-classe
final MyPieceOfFurniture myPiece = new MyPieceOfFurniture(ev.getItem());
home.addPieceOfFurniture(myPiece, ev.getIndex());
home.addFurnitureListener(this);
// Suppression du meuble précédemment ajouté
EventQueue.invokeLater(new Runnable() {
public void run() {
home.deletePieceOfFurniture(ev.getItem());
List<Selectable> selectedItems =
new ArrayList<Selectable>(home.getSelectedItems());
selectedItems.add(myPiece);
home.setSelectedItems(selectedItems);
}
});
}
}
});
Ca marche sur le moment, mais comme je le pressentais, le fichier sh3d qui contient des instances de
MyPieceOfFurniture ne peut plus être lu après par Sweet Home 3D, parce que la classe
MyPieceOfFurniture n'appartient pas au classpath de Sweet Home 3D. Cette classe n'est accessible que du plug-in et la lecture d'un fichier SH3D ne se fait pas dans le plug-in.
Si tu veux toujours continuer tes développements sous la forme d'un plug-in, je te conseille d'utiliser plutôt les méthodes
setVisualProperty et
getVisualProperty de la classe
Home. Une "property value" peut être n'importe quelle instance d'une classe accessible dans Sweet Home 3D ; par exemple, un instance de
HashMap dans laquelle tu stockes les valeurs supplémentaires dont tu as besoin pour chaque meuble (tu peux utiliser une instance de
HomePieceOfFurniture comme clé de ta map).
Ca n'est pas super génial, mais ça marche sans problème et je m'en sers dans le
plug-in de rendu avancé pour stocker les valeurs saisies par l'utilisateur dans la boîte de dialogue.