Page d'accueilFindIt !Contact Cahier Swing

Cahier Swing

 Forum Cahier Swing

Ce forum est dédié au Cahier du Programmeur Swing et Sweet Home 3D son étude de cas.
Utilisez-le pour toute demande d'information supplémentaire ou pour toute suggestion au sujet de cet ouvrage et de cette application.
Pour les informations relatives à l'ouvrage Bien programmer en Java 7 et au Cahier du programmeur Java, merci d'utiliser le forum qui leur est dédié.
Vous pouvez consulter ces forums librement. Pour y participer, inscrivez-vous tout d'abord.

Sujets Messages récents Identification Inscription
Messages du sujet Récupérer une image de la vue 2D de Home

pingoui38

Ville : Levallois Perret
Membre depuis : 10 août 2007
Messages : 25
 10 sept. 2007 à 16:22
Salut manu,
je suis en train de générer un pdf pour pouvoir imprimer le resultat obtenu par sweetHome3D
Il me reste à récupérer la vu 2D mais en vain

J'ai insérer la méthode getImage pour obtenir une Image de mon composant graphique.

public Image getImage(){
if(this==null){return null;}
int width = this.getWidth();
int height = this.getHeight();
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
this.paintAll(g);
return image;
}

dans ma class, permettant de générer le pdf, je fait un
planComponent.getImage()
mais j'ai un nullPointerException

Comment puis-je générer une image de mon contexte graphique?
Comment puis-je récupérer seulement les mur et les meubles (pas de grille, ni de regle)?

merci pour ton aide

Manu

Ville : Paris / France
Membre depuis : 29 avr. 2003
Messages : 394
 14 sept. 2007 à 07:47
> dans ma class, permettant de générer le pdf, je fait un
> planComponent.getImage()
> mais j'ai un nullPointerException

Hum... sans stack trace, c'est difficile de deviner le problème.
Par ailleurs, en Java, la condition "this == null" est toujours fausse. ;-)


> Comment puis-je générer une image de mon contexte graphique?
> Comment puis-je récupérer seulement les mur et les meubles (pas de grille, ni de regle)?

Je créerais plutôt une autre méthode de dessin proche de paintComponent dans laquelle je dessinerais que les parties du plan voulues à l'aide d'un objet Graphics qui dessinera dans ton PDF (attention aussi à ne pas dessiner les contours de sélection). Ca te permettra d'avoir une image du plan en vectoriel, ce qui rend souvent mieux.
Si tu veux du code concret, regarde la nouvelle méthode print de la classe PlanComponent et les nouvelles classes HomePDFPrinter et HomePrintableComponent que j'ai ajoutées dans la version 1.0 de Sweet Home 3D qui vient de sortir.
---
Manu (moderator/modérateur)

pingoui38

Ville : Levallois Perret
Membre depuis : 10 août 2007
Messages : 25
 15 sept. 2007 à 17:32
Merci beaucoup... Il y a de nombreuse réponse à ce que je cherche réaliser dans la dernière version de sweetHome 3D :D

Par contre, je souhaiterai récupérer un bufferedImage de mon planComponent
J'utilise iText tout comme toi mais je mets en page le pdf avec un Tableau

Et j'ai du mal à inséser un g2d facilement à la place prévu à cette effet... c'est pourquoi je souhaite utiliser un bufferImage
[code]
//création d'un objet com.lowagie.text.Image
Image monImg=Image.getInstance(monBufferedImage , null);
[/code]

http://www.hiboox.com/lang-fr/image.php?img=y8n8jcas.jpg
Pour le moment, mon logiciel crée ce pdf

Le planCompoment sera à la place de la belle chaise ;)
J'arrive à remplir le reste du pdf




pingoui38

Ville : Levallois Perret
Membre depuis : 10 août 2007
Messages : 25
 16 sept. 2007 à 23:45
Yes!!!! j'arrive à récupérer le plan mais effectivement, je récupere la grille et le contour des trait ce qui est moyen comme résultat

voici comment je procède
[code]
private Image getImage(){
try {
//Je récupére mon JComponent et je l'insere dans un BuferredImage
JComponent component =controller.getPlanController().getView();
BufferedImage image = new BufferedImage(300,300,BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
component.paintAll(g);
//création d'un objet com.lowagie.text.Image
monImg=Image.getInstance(image,null);
//On la centre
monImg.setAlignment(Image.MIDDLE);

} catch (BadElementException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return monImg;
}
[/code]

Comment puis-je récuprérer seulement les murs et les meubles?

merci d'avance pour ton aide :)

Manu

Ville : Paris / France
Membre depuis : 29 avr. 2003
Messages : 394
 18 sept. 2007 à 09:03
Vous avancez bien ! :-)

> Comment puis-je récuprérer seulement les murs et les meubles?

N'appelez pas paintAll, mais une méthode qui dessine uniquement ce que vous voulez, ou ajoutez un champ booléen à votre classe qui permet de savoir dans les méthodes de dessin si vous êtes en train d'imprimer ou non.
J'ai choisi la première option c'est pourquoi la méthode paintContent dans PlanComponent prend un paramètre supplémentaire paintMode utilisé pour ne dessiner que ce qu'on veut, suivant qu'on dessine à l'écran, qu'on imprime ou qu'on copie dans le presse-papier (voir ligne 801 dans http://sweethome3d.cvs.sourceforge.net/sweethome3d/SweetHome3D/src/com/eteks/sweethome3d/swing/PlanComponent.java?revision=1.69&view=markup ).
---
Manu (moderator/modérateur)

pingoui38

Ville : Levallois Perret
Membre depuis : 10 août 2007
Messages : 25
 18 sept. 2007 à 22:47
> Vous avancez bien ! :-)
>
Oui ça avance et grâce à vous... ;)

Grâce à vos derniers conseil... j'arrive à récupérer le plan nickel... sauf que l'affichage n'est pas terrible... le fond de l'image est noir et les mur blancs :(
J'ai simplifié mon code au maxi pour debuger en en vain
Il me manque plus grand chose mais l'image reste noire :(
Je vois la lumière mais j'arrive pas à l'atteindre :D

PlanComponent:
[code]
public BufferedImage printPDF( float cellWidth, float cellHeight) {
BufferedImage image = new BufferedImage(300,300, BufferedImage.TYPE_INT_RGB);
Graphics2D g2D = (Graphics2D)image.getGraphics();
// Print component contents
paintContent(g2D, scale, Color.WHITE, Color.BLACK, PaintMode.PRINT);
g2D.dispose();
return image;
}
[/code]

pingoui38

Ville : Levallois Perret
Membre depuis : 10 août 2007
Messages : 25
 30 sept. 2007 à 22:16
Ouf.... je peux clore ce chapitre.... j'ai créé un BufferedImage avec un Type TYPE_INT_ARGB... et cela fonctionne... ne ne comprend pas bien pourquoi le type TYPE_INT_RGB ne fonctionnait pas .... mystère....

Le principale c'est que ça fonctionne maintenant ;-)

Manu

Ville : Paris / France
Membre depuis : 29 avr. 2003
Messages : 394
 30 sept. 2007 à 23:58
Heureusement que vous avez trouvé par vous-même, parce qu'à la lecture de votre code, je n'y aurai pas pensé !
Bonne chance pour la suite...
---
Manu (moderator/modérateur)

pingoui38

Ville : Levallois Perret
Membre depuis : 10 août 2007
Messages : 25
 1 oct. 2007 à 19:22
merci.... je vois enfin le bout du tunnel ;-)... enfin il me reste encore du boulot
Il va fallour que je bosse sur le bufferedImage car je n'ai toujours pas compris le "type " qui ne fonctionne pas



Page d'accueilFindIt !ContactDébut de la page

© Copyrights 1997-2023 eTeks - Tous droits réservés

Cahier Swing