smile quelques besoins d'aide

This topic has been viewed 8140 times and has 24 replies
Thread status: Active
Vos suggestions et questions en français [img]http://www.sweethome3d.com/images/flags/fr_small.gif[/img]
guillaume_ll
Posts: 16
Joined: Tue May 04, 2010 2:13 pm
Country: Nantes, France

quelques besoins d'aide

Post by guillaume_ll »

Bonjour.

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.
User avatar
Puybaret
Posts: 9440
Joined: Mon Nov 07, 2005 12:00 pm
Country: Paris, France
Contact:

Re: quelques besoins d'aide

Post by Puybaret »

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");
putPropertyValue(Property.SMALL_ICON,pathToIconFromProjectRoot);
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).
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
guillaume_ll
Posts: 16
Joined: Tue May 04, 2010 2:13 pm
Country: Nantes, France

Re: quelques besoins d'aide

Post by guillaume_ll »

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 :

Code: Select all


	protected static void emptyCatalog(FurnitureCatalog catalog) {

		List<CatalogPieceOfFurniture> toDel = new ArrayList<CatalogPieceOfFurniture>();

		for (FurnitureCategory fc : catalog.getCategories()) {
			for (CatalogPieceOfFurniture cpof : fc.getFurniture()) {
				toDel.add(cpof);
			}
		}

		for (CatalogPieceOfFurniture cpof : toDel) {
			catalog.delete(cpof);
		}
	}

	@Override
	public PluginAction[] getActions() {
		selectDefaultElement();
		FurnitureCategory defaultCat = defaultElement.getCategory();
		FurnitureCatalog catalog = getUserPreferences().getFurnitureCatalog();
		emptyCatalog(catalog);
		catalog.add(defaultCat, defaultElement);
(…)
Bon, je vais mater DefaultFurnitureCatalog :)

Merci( pour le soft et pour les réponses )
guillaume_ll
Posts: 16
Joined: Tue May 04, 2010 2:13 pm
Country: Nantes, France

Re: quelques besoins d'aide

Post by guillaume_ll »

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.
guillaume_ll
Posts: 16
Joined: Tue May 04, 2010 2:13 pm
Country: Nantes, France

Re: quelques besoins d'aide

Post by guillaume_ll »

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.
guillaume_ll
Posts: 16
Joined: Tue May 04, 2010 2:13 pm
Country: Nantes, France

Re: quelques besoins d'aide

Post by guillaume_ll »

J'ai un petit problème là :
Comment dans un plugin sa propre URL ?

dans mon plugin, j'ai un properties qui contient

Code: Select all

model#1=/lelouet/sh3d/plugins/sweetServer/ServersFiles/panduit_cn1.obj
cet emplacement est correct dans l'archive .jar

cependant, au chargement du plugin j'ai

Code: Select all

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Unknown resource /lelouet/sh3d/plugins/sweetServer/ServersFiles/panduit_cn1.obj
	at com.eteks.sweethome3d.tools.ResourceURLContent.<init>(Unknown Source)
	at lelouet.sh3d.plugins.sweetServer.FurnitureBundleIterator.getContent(FurnitureBundleIterator.java:63)
	at lelouet.sh3d.plugins.sweetServer.FurnitureBundleIterator.readPieceOfFurniture(FurnitureBundleIterator.java:292)
	at lelouet.sh3d.plugins.sweetServer.FurnitureBundleIterator.hasNext(FurnitureBundleIterator.java:392)
Je 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").
guillaume_ll
Posts: 16
Joined: Tue May 04, 2010 2:13 pm
Country: Nantes, France

Re: quelques besoins d'aide

Post by guillaume_ll »

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.
User avatar
Puybaret
Posts: 9440
Joined: Mon Nov 07, 2005 12:00 pm
Country: Paris, France
Contact:

Re: quelques besoins d'aide

Post by Puybaret »

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
guillaume_ll
Posts: 16
Joined: Tue May 04, 2010 2:13 pm
Country: Nantes, France

Re: quelques besoins d'aide

Post by guillaume_ll »

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

Code: Select all

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/s ... e%3Dclosed
User avatar
Puybaret
Posts: 9440
Joined: Mon Nov 07, 2005 12:00 pm
Country: Paris, France
Contact:

Re: quelques besoins d'aide

Post by Puybaret »

On ne gagnera pas d'argent avec...
Et ton entreprise mène ce projet juste par philanthropie ! [:D]
Bon, je vais te contacter par email...


Pour "choper" l'URL, il y a plus propre:

Code: Select all

getPluginClassLoader().getResource("/lelouet/sh3d/plugins/sweetServer/ServersFiles/panduit_cn1.obj")
Si tu cherches à construire une instance de ResourceURLContent, il y a aussi:

Code: Select all

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
Post Reply New Topic

Who is online

Users browsing this forum: No registered users and 1 guest