|
Sweet Home 3D Forum » List all forums » » Forum: Forum en français » » » Thread: quelques besoins d'aide |
|
| Print at Dec 22, 2025, 8:41:05 AM | |
| Posted by guillaume_ll at May 4, 2010, 4:26:21 PM |
quelques besoins d'aideBonjour. Dans le cadre de mon stage, je dois faire un plugin de gestion de serveurs dans un datacenter. La première étape consiste à remplacer le catalog normal par un catalog de fournitures qui sont des serveurs. Je voudrais savoir comment je dois faire de la manière la plus propre. Mon autre question est, comment faire une toolbar? ie, dans un plugin, l'action est liée non pas à un menu mais à un bouton de la toolbar : y a-t-il une configuration spéciale à faire? J'ai essayé dans le pluginaction putPropertyValue(Property.TOOL_BAR, "true"); putPropertyValue(Property.SMALL_ICON,pathToIconFromProjectRoot); mais cela n'a pas marché. Y aurait il des tutos pour développer des plug ins un peu plus détaillés? Merci, guillaume. |
| Posted by Puybaret at May 5, 2010, 9:53:27 AM |
|
Re: quelques besoins d'aide La première étape consiste à remplacer le catalog normal par un catalog de fournitures qui sont des serveurs. Je voudrais savoir comment je dois faire de la manière la plus propre. Si vous voulez remplacer complètement le catalogue existant par un autre via un plug-in, implémentez la méthode getActions de votre plug-in pour y supprimer au départ tous les meubles existants grâce à la méthode delete de la classe FurnitureCatalog puis y ajouter les vôtres grâce à la méthode add de cette classe (le catalogue fait partie des préférences). Si vous voulez reprendre la façon de créer les meubles du catalogue, regardez le code source de la classe DefaultFurnitureCatalog. putPropertyValue(Property.TOOL_BAR, "true"); Attention, si vous spécifiez ces propriétés programmatiquement et non via un fichier properties, il faut passer un objet booléen à la méthode putPropertyValue pour la propriété Property.TOOL_BAR et un objet de type Content pour la propriété Property.SMALL_ICON (comme par exemple une instance de ResourceURLContent qui référencera le chemin du fichier de l'icone dans le fichier sh3p).putPropertyValue(Property.SMALL_ICON,pathToIconFromProjectRoot); Y aurait il des tutos pour développer des plug ins un peu plus détaillés? Non, mais le code source devrait beaucoup vous aider. En plus si vous êtes français, vous pouvez lire aussi le cahier du programmeur Swing si ce n'est déjà fait. Ca ne parle pas des plug-ins qui sont apparus bien après, mais ça détaille bien l'architecture de Sweet Home 3D.Bonne chance pour votre stage. ![]() ---------------------------------------- Emmanuel Puybaret, Sweet Home 3D creator |
| Posted by guillaume_ll at May 5, 2010, 10:36:28 AM |
|
Re: quelques besoins d'aide Une petite remarque en passant, si le plug-in est fait dans un projet maven, le ApplicationPlugin.properties et les images utilisées doivent être dans le repertoire src/main/resources/{packagedir}/ , et l'exportation du jar doit être fait avec les options "export all output foldes for checked projects" Ensuite, comme demandé sur le forum ubuntu-fr , serait il possible d'en faire une dépendance maven? ie, déposer le jar sur un serveur avec la hiérarchie spécifique aux dépots maven. Je l'ai fait en local, mais je n'aurai pas les éventuelles modifs, et je n'ai pas le source, et mon plugin ne peut pas être compilé par d'autres personnes. J'avais bien vu la méthode delete du catalog, mais j'éspérais qu'il y aurait un autre moyen que recréer une liste temporaire d'éléments à supprimer, puis la supprimer. Mais effectivement, ça marche : Bon, je vais mater DefaultFurnitureCatalog :) Merci( pour le soft et pour les réponses ) |
| Posted by guillaume_ll at May 5, 2010, 11:29:31 AM |
|
Re: quelques besoins d'aide problème quand j'exporte mon projet maven : En lisant le .jar, sh3d s'arrête au premier ApplicationPlugin.properties . Et étant donné que j'ai exporté tout le projet, cela veut dire que un seul de mes plugin sera reconnu par sh3d, vu que mes plugins sont dans le même projet. Résultat, je dois faire un projet par plugin… bof bof. |
| Posted by guillaume_ll at May 5, 2010, 2:33:28 PM |
|
Re: quelques besoins d'aide au passage, ce serait bien de mettre certaines fonctions de defaultFurnitureCatalog.java en static, en particulier les getOptionnalString, getOptionnalFloat, getContent, getDoorOrWindowSashes, getLightSources, getModelRotation . Ça me permettrait d'y faire appel directement à partir du plugin au lieu de devoir les recopier dans celui ci. |
| Posted by guillaume_ll at May 5, 2010, 3:57:16 PM |
|
Re: quelques besoins d'aide J'ai un petit problème là : Comment dans un plugin sa propre URL ? dans mon plugin, j'ai un properties qui contient model#1=/lelouet/sh3d/plugins/sweetServer/ServersFiles/panduit_cn1.objcet emplacement est correct dans l'archive .jar cependant, au chargement du plugin j'ai Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Unknown resource /lelouet/sh3d/plugins/sweetServer/ServersFiles/panduit_cn1.objJe suppose donc que le getContent devrait avoir en paramètre l'URL du jar qui contient le plugin, mais je ne vois pas comment la récupérer. J'ai accès à getPluginClassLoader(), mais ça ne me donne pas son URL. À noter que le .properties qui contient cette ligne, lui aussi dans le .jar, est trouvé lors du new ResourceBundle("blabla.properties"). |
| Posted by guillaume_ll at May 5, 2010, 4:14:37 PM |
|
Re: quelques besoins d'aide Bon, je regarde l'archive de KatorLegaz. À priori, il est possible donc de rajouter des modèles sans rien ajout en code. Donc je vais simplement ajouter des catégories, avec des éléments, et supprimer tous les éléments qui ne font pas partie cette catégorie. |
| Posted by Puybaret at May 5, 2010, 4:51:50 PM |
|
Re: quelques besoins d'aide Guillaume, le projet sur lequel tu travailles sera-t-il open source et donc disponible pour la communauté, ou c'est un développement privé pour l'entreprise où tu es en stage ? Parce que je veux bien assurer un peu de support pour un projet open source, mais pour un développement privé, c'est une toute autre histoire... ---------------------------------------- Emmanuel Puybaret, Sweet Home 3D creator |
| Posted by guillaume_ll at May 5, 2010, 5:33:28 PM |
|
Re: quelques besoins d'aide Le projet est assez vaste, et la partie que je fais sera surement libre : On ne gagnera pas d'argent avec, puisque c'est seulement pour visualiser en interne un datacenter. Mon stage est sur la consommation énergétique dans les dacacenters, le plugin est juste un outil pour charger un fichier décrivant le datacenter (ça va saxer …) et le visualiser Bon, rajouter des modèles 3D directement n'est pas possible à priori dans un plugin( il faut un catalogfurniture je pense) /!\ J'ai réussi à chopper l'URL correcte du jar avec URL jarURL = ((URLClassLoader) getPluginClassLoader()).getURLs()[0];C'est crade mais c'était ça ou devenir fou. Pour info le projet est pour l'instant ici : http://code.google.com/p/lelouettests/source/...sipation%3Fstate%3Dclosed |
| Posted by Puybaret at May 5, 2010, 6:56:48 PM |
|
Re: quelques besoins d'aide On ne gagnera pas d'argent avec... Et ton entreprise mène ce projet juste par philanthropie ! Bon, je vais te contacter par email... Pour "choper" l'URL, il y a plus propre: getPluginClassLoader().getResource("/lelouet/sh3d/plugins/sweetServer/ServersFiles/panduit_cn1.obj")Si tu cherches à construire une instance de ResourceURLContent, il y a aussi: new ResourceURLContent(instancePlugin, "/lelouet/sh3d/plugins/sweetServer/ServersFiles/panduit_cn1.obj")Avec la classe DefaultFurnitureCatalog, tu peux charger un ensemble de meubles d'un fichier SH3F qui contient un fichier .properties décrivant des meubles avec les fichiers de leur icône et de leur modèle. Après tu n'as plus qu'à injecter dans le catalogue des préférences les meubles lus. Tu peux aussi décrire tes meubles dans un fichier /com/eteks/sweethome3d/io/AdditionalFurnitureCatalog.properties que tu ajoutes au classpath avec les fichiers des icônes et des modèles. Ensuite, tu n'enlèves que les meubles dont l'URL est relative à com/eteks/sweethome3d/io/resources. au passage, ce serait bien de mettre certaines fonctions de defaultFurnitureCatalog.java en static, en particulier les getOptionnalString, getOptionnalFloat, getContent, getDoorOrWindowSashes, getLightSources,getModelRotation. Ben non puisque tu n'en as pas besoin finalement ![]() Tu verras à l'usage que ma politique de développement est de restreindre l'accès public le plus souvent possible, car une classe ou une méthode public = une API à maintenir. ---------------------------------------- Emmanuel Puybaret, Sweet Home 3D creator |
| Posted by guillaume_ll at May 5, 2010, 7:32:40 PM |
|
Re: quelques besoins d'aide Et ton entreprise mène ce projet juste par philanthropie ! Effectivement ![]() Tu verras à l'usage que ma politique de développement est de restreindre l'accès public le plus souvent possible, car une classe ou une méthode public = une API à maintenir. Bah, c'est pas plus à maintenir parce que c'est public que si ça ne l'est pas… Et de toute façon, tant qu'on ne tourne pas dans une vm avec politique de sécurité accrue, on peut faire un singleton, rendre ses méthodes publiques, et déléguer des appels static d'une classe utilitaire vers ce singleton. Mais c'est chiant(à maintenir)… |
| Posted by Puybaret at May 5, 2010, 8:39:51 PM |
|
Re: quelques besoins d'aide Bah, c'est pas plus à maintenir parce que c'est public que si ça ne l'est pas… Ben si, puisqu'une méthode ou une classe public c'est une API que d'autres projets comme le tien peuvent utiliser (et tu n'es pas le seul ;-). On ne peut plus la supprimer, y ajouter des paramètres, etc... sans casser la compatibilité ascendante. Il faut donc réfléchir encore plus avant de fixer sa signature "dans le marbre".Par contre, si une méthode privée t'intéresse, tu la recopies et je gardes la liberté de la faire évoluer plus tard sans te gêner. ---------------------------------------- Emmanuel Puybaret, Sweet Home 3D creator |
| Posted by guillaume_ll at May 11, 2010, 12:30:57 PM |
|
Re: quelques besoins d'aide Bonjour. Je voudrais modifier le comportement de sh3d afin que les servers que j'ajoute via le catalogue de la fenêtre de gauche soient des instances d'une classe particulière ( http://code.google.com/p/lelouettests/source/...center/model/GServer.java ) qui hérite donc de HomePieceOfFurniture. Est ce une fonctionnalité prévue dans l'architecture de plugin? dois je réécrire la fenêtre de gauche ? |
| Posted by Puybaret at May 11, 2010, 1:45:25 PM |
|
Re: quelques besoins d'aide 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: getHome().addFurnitureListener(new CollectionListener<HomePieceOfFurniture>() {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. ---------------------------------------- Emmanuel Puybaret, Sweet Home 3D creator |
| Posted by guillaume_ll at May 11, 2010, 5:04:26 PM |
|
Re: quelques besoins d'aide Je viens de voir le EventQueue, je ne connaissais pas ; ça m'a permis de corriger un bug (que j'ai découvert en même temps), et donc ai je bien compris ? De ce que j'ai compris du bug, en AWT, les déplacements d'un objet peuvent être rendus dans des threads différents. Ce qui fait des race conditions : La solution que j'ai trouvée a été de déporter les mises à jour du modèle dans un Runnable placé dans l'EventQueue . ( au départ, l'idée était surtout de réduire la charge CPU en mutualisant les mises à jour, mais ça a corrigé un bug en même temps ) Sinon, en supprimant le home.removeFurnitureListener(this);interception of item com.eteks.sweethome3d.model.HomePieceOfFurniture@256f8834 creationJe trouve facilement comment filtrer pour laisser passer les ajouts d'éléments rack et model, mais par la suite je voudrais convertir les "HomePieceOfFurniture" en "GRack" ou "GServer", selon la catégorie du modèle. Est il alors possible de récupérer, à partir d'une HomePieceOfFurniture la catégorie de son modèle ? Concernant la création d'objets dans sh3d, je compte utiliser une factory ( http://code.google.com/p/lelouettests/source/...odel/GElementFactory.java ) crée dans le plugin et ajoutée au listener, ce qui devrait à mon avis supprimer le problème du classloader (puisque l'objet factory est atteignable et connait son class loader) Est ce un raisonnement correct ? |
| Posted by guillaume_ll at May 11, 2010, 5:04:51 PM |
|
Re: quelques besoins d'aide erg, je ne peux pas modifier. J'ai oublié de te remercier au début du post :/ |
| Posted by Puybaret at May 11, 2010, 7:03:54 PM |
|
Re: quelques besoins d'aide Tu as plus ou moins bien compris le principe de l'EventQueue. invokeLater diffère l'exécution du Runnable en paramètre dans l'Event Dispatch Thread qui gère les événements et le dessin à l'écran. Quand on fait appel à invokeLater alors qu'on est déjà dans l'EDT, le Runnable sera exécuté une fois que le traitement de l'événement courant est terminé. C'est le cas ici, et je m'en suis servi car la suppression du meuble juste après son ajout provoquait un bug dans le tableau des meubles. En différant la suppression, ça passait mieux mais ça pourrait désynchroniser certains traitements. La factory ne changera pas le problème du classpath, puisque la factory est une classe qui est gérée elle aussi par le classloader du plug-in. Mais je ne connais pas ta stratégie ; tant que tu ne veux tu pas relire tes objets après les avoir enregistrés, tes sous-classes ne poseront pas de problème. Pour gérer tes catégories d'objets, tu peux peut-être utilisé le champ "description" dont la valeur est lue dans les fichiers .properties des meubles avec une clé description#n et que l'on retrouve dans les classes CatalogPieceOfFurniture et HomePieceOfFuniture. Dans les faits, ce champ n'est pas utilisé dans la version actuelle de Sweet Home 3D donc tu peux en faire ce que tu veux. ---------------------------------------- Emmanuel Puybaret, Sweet Home 3D creator |
| Posted by guillaume_ll at May 11, 2010, 7:18:35 PM |
|
Re: quelques besoins d'aide Merci, je vais tester le champs description( et ainsi je verrai si la factory marche ou pas) |
| Posted by guillaume_ll at Jun 4, 2010, 12:33:58 PM |
|
Re: quelques besoins d'aide Salut. J'ai une nouvelle question : est il possible de changer le modèle graphique associé à un élément ? Exemple, si je passe d'un modèle 1U à un modèle2U, et que j'ai des modèles par défaut différents selon les U, il faudrait que le serveur change de peau. Et une autre question : Puis je ajouter un JFrame/JPanel dans la fenêtre principale, dans un plugin ? Pour l'instant je l'ajoute dans une fenêtre en plus (avec bouton afficher/masquer), mais je préfèrerais l'intégrer à la fenetre standarde. |
| Posted by Puybaret at Jun 12, 2010, 12:30:32 AM |
|
Re: quelques besoins d'aide Ca n'est pas possible de changer le modèle 3D associé à un meuble. Ajouter une JFrame à une fenêtre est impossible puisque une instance de JFrame est une fenêtre, mais vous pouvez ajouter un JPanel à la fenêtre principale. Pour la retrouver, utilisez la méthode getFrames et explorez la hiérarchie des composants enfants pour retrouver le container où vous voulez ajouter votre panneau. C'est assez bidouille mais ça marchera. ---------------------------------------- Emmanuel Puybaret, Sweet Home 3D creator |
| Posted by Puybaret at Jun 12, 2010, 12:35:28 AM |
|
Re: quelques besoins d'aide Pardon, j'ai oublié mais il y a encore plus simple pour retrouver l'instance de JFrame qui est active ; utilisez : KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow()---------------------------------------- Emmanuel Puybaret, Sweet Home 3D creator |
| Posted by guillaume_ll at Jun 12, 2010, 3:03:48 AM |
|
Re: quelques besoins d'aide Effectivement, le tableau de gestion est en fait un JPanel et pas un JFrame (qui est ajouté à une JFrame au chargement du plugin ). Merci, je testerai ça. J'ai résolu le changement de peau en utilisant un setHeight() plutôt. Mais je ferai ça plus proprement plus tard avec un invokelater pour régénérer un HomePieceOfFurniture à partir des données de l'objet modifié. |
| Posted by guillaume_ll at Jun 30, 2010, 11:41:06 AM |
|
Re: quelques besoins d'aide Bonjour. Je voudrais savoir s'il est possible de simuler un environnement pour faire mes tests unitaires. Par exemple, simuler le chargement du plugin, ou créer un environnement propice aux bugs afin de pouvoir les détecter et supprimer plus facilement. Typiquement là, je cherche à charger des modèles 3D un à un, mais si le chargement se fait sans problème avec un new ResourceURLContent, l'afffichage n'est pas correct, et je me perds en conjectures sur la localisation des mes erreurs. Au passage, le KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow() me renvoit null quand je teste. Merci. |
| Posted by Puybaret at Jul 2, 2010, 12:48:31 PM |
|
Re: quelques besoins d'aide Tu peux créer des tests unitaires sans problème en t'inspirant par exemple de ceux fournis avec le code source dans le répertoire test. La simulation d'environnements séparés peut s'effectuer en redéfinissant la méthode getApplicationFolder de la classe FileUserPreferences. ---------------------------------------- Emmanuel Puybaret, Sweet Home 3D creator |
| Posted by guillaume_ll at Jul 2, 2010, 2:41:05 PM |
|
Re: quelques besoins d'aide Merci beaucoup. |
|
|
Current timezone is GMT Dec 22, 2025, 8:41:05 AM |