Imprimer un diagramme sans passer par une image

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Imprimer un diagramme sans passer par une image

Message par Micoute »

Bonjour à tous,

toujours pour mon logiciel de dépistage du diabète, je souhaiterais, pour la nouvelle mise à jour, imprimer des diagrammes sans passer par une image qui déforme les écritures, directement sur l'imprimante.

falsam m'avait montré comment faire des diagramme avec "ChartGadget", c'est parfait mais je voudrais savoir recopier l'écran vers l'imprimante, c'est pourquoi je me tourne vers vous pour solliciter votre aide qui me sera précieuse.

Je vous en remercie d'avance.

Le format pourra être en portrait ou en paysage qui ressemble plus à l'image sur l'écran.

Merci encore
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Imprimer un diagramme sans passer par une image

Message par microdevweb »

Bonjour Micoute,

Le mieux à mon sens est d'utilisé la bibliothèque Vector qui fonctionne très bien.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Imprimer un diagramme sans passer par une image

Message par boby »

Code : Tout sélectionner

Declare imprime(img,w,h)
Declare prepareprint()
If OpenWindow(0, 0, 0, 700, 350, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ; left column
  TextGadget    (6,  10,  10, 330, 20, "ListIcon Standard", #PB_Text_Center)
  ListIconGadget(0,  10,  25, 330, 70, "Column 1", 100)
  TextGadget    (7,  10, 105, 330, 20, "ListIcon with Checkbox", #PB_Text_Center)
  ListIconGadget(1,  10, 120, 330, 70, "Column 1", 100, #PB_ListIcon_CheckBoxes)  ; ListIcon with checkbox
  TextGadget    (8,  10, 200, 330, 20, "ListIcon with Multi-Selection", #PB_Text_Center)
  ListIconGadget(2,  10, 215, 330, 70, "Column 1", 100, #PB_ListIcon_MultiSelect) ; ListIcon with multi-selection
  ; right column
  TextGadget    (9, 360,  10, 330, 20, "ListIcon with separator lines",#PB_Text_Center)
  ListIconGadget(3, 360,  25, 330, 70, "Column 1", 100, #PB_ListIcon_GridLines)
  TextGadget   (10, 360, 105, 330, 20, "ListIcon with FullRowSelect and AlwaysShowSelection",#PB_Text_Center)
  ListIconGadget(4, 360, 120, 330, 70, "Column 1", 100, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
  TextGadget   (11, 360, 200, 330, 20, "ListIcon Standard with large icons",#PB_Text_Center)
  ListIconGadget(5, 360, 220, 330, 65, "", 200,#PB_ListIcon_GridLines)
  For a = 0 To 4            ; add columns to each of the first 5 listicons
    For b = 2 To 4          ; add 3 more columns to each listicon
      AddGadgetColumn(a, b, "Column " + Str(b), 65)
    Next
    For b = 0 To 2          ; add 4 items to each line of the listicons
      AddGadgetItem(a, b, "Item 1"+Chr(10)+"Item 2"+Chr(10)+"Item 3"+Chr(10)+"Item 4")
    Next
  Next
  ; Here we change the ListIcon display to large icons and show an image
  If LoadImage(0, #PB_Compiler_Home+"Examples\Sources\Data\File.bmp")     ; change path/filename to your own 32x32 pixel image
    SetGadgetAttribute(5, #PB_ListIcon_DisplayMode, #PB_ListIcon_LargeIcon)
    AddGadgetItem(5, 1, "Picture 1", ImageID(0))
    AddGadgetItem(5, 2, "Picture 2", ImageID(0))
  EndIf
  ButtonGadget(50,10,300,100,20,"imprimer ?")
  BindGadgetEvent(50,@prepareprint())
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Procedure prepareprint()
  Protected img,h,w,hpage,wpage,hprint,wprint
  w=WindowWidth(0)
  h=WindowHeight(0)
  StartDrawing(WindowOutput(0))
  DrawingMode(#PB_2DDrawing_AlphaChannel)
  img = GrabDrawingImage(#PB_Any,0,0,w,h)
  StopDrawing()
  StartDrawing(ImageOutput(img))
  DrawingMode(#PB_2DDrawing_AlphaChannel)
  Box(0,0,w,h,RGBA(0,0,0,255))   
  StopDrawing()
  ;Ici j'ouvre juste pour voir le résultat....
;   OpenWindow(1,0,0,WindowWidth(0),WindowHeight(0),"result")
;   ImageGadget(#PB_Any,0,0,WindowWidth(0),WindowHeight(0),ImageID(img))
  ;pour imprimer ça doit ressembler à ça (je te laisse le loins de modifier w et h par le DPI de l'imprimante tout ça...
  If PrintRequester()
    wpage = PrinterPageWidth()
    hpage = PrinterPageHeight()
    If hpage > wpage ;Impression en portrait
      MessageRequester("protrait","")
      If w*wpage>h*hpage
        wprint = wpage
        hprint = h*wpage/w
      Else
        hprint = hpage
        wprint = w*hpage/h
      EndIf
    Else ;Impression en paysage
      If w*wpage>h*hpage
        wprint=wpage
        hprint = h*wpage/w
      Else
        hprint = hpage
        wprint = w*hpage/h
      EndIf
    EndIf
    imprime(img,wprint,hprint)
  EndIf
EndProcedure
Procedure imprime(img,w,h)
  If StartPrinting("Print window")
    If StartDrawing(PrinterOutput())
      DrawImage(ImageID(img),0, 0 , w,h)
      StopDrawing()
    EndIf
    StopPrinting()
  EndIf
  FreeImage(img)
EndProcedure
Edit : Après quelques recherches j'ai trouvé un thread de luis sur le forum EN qui explique mon erreur, j'ai mis à jour le code, j'éspère que ça te conviendra Micoute.
imprimer des diagrammes sans passer par une image qui déforme les écritures, directement sur l'imprimante.
La fonction GrabDrawingImage() ne permet as de dessiner directelent sur l'imprimante, il faut passer par une image, mais j'espère que cette solution évitera de déformer les écritures, tiens moi au courant !
Dernière modification par boby le mer. 21/nov./2018 15:52, modifié 1 fois.
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Imprimer un diagramme sans passer par une image

Message par Micoute »

Merci boby,

c'est très gentil à toi de me donner de ton temps précieux, ta méthode est très intéressante, mais quand il faut passer par une image, c'est compliqué d'utiliser l'espace de l'écran et faire des calculs pour ça utilise toute une feuille en format A4, c'est pourquoi j'ai demandé sans passer par une image, car ça impose de faire une mise en page impeccable.

J'aimerais trouver une méthode passe-partout, mais il ne faut pas rêver.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Imprimer un diagramme sans passer par une image

Message par boby »

Rhoo Micoute voyons ! Je sais que l'école ça remonte un peut mais quand même ! Les proportions ça se résume à un simple calcule en croix (Et si t'es aussi mauvais que moi en math, l'utilisation d'un post'It est autorisé ! :mrgreen:) .

J'ai mis à jour le code, il regarde le format (portrait/paysage) il compare qui du width ou du heigh et le plus gros, et il adapte celui à adapter en fonction... Dit moi si ça te conviens.
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Imprimer un diagramme sans passer par une image

Message par Marc56 »

Pour faire des impressions sérieuses de texte + images on génère un état, c'est à dire une mise en page spéciale.

Etirer des images, ce sera toujours moche car il faut tenir compte de la résolution de l'écran et de celle de l'imprimante.

Il est plus fiable d'utiliser la nouvelle lib VectorDrawing comme a dit microdevweb.

Mais l'idéal c'est de générer du PDF (pas avec une imprimante virtuelle, mais avec des fonctions de lib (hélas toujours pas dans le package natif de PB, pourtant ce serait un argument de vente pour trouver des nouveaux clients pro, bien plus qu'avec des fonctions 3D, mais bon...)

Avantages à générer du PDF pour les éditions:
  • Ne pas se préoccuper de la résolution de l'imprimante. On dit, je veux une page A4.
  • Archiver les éditions
  • Envoyer des résultats par email sans s'occuper de ce qu'utilise le lecteur
  • L’utilisateur peut imprimer tel quel (donc à l'échelle source) ou zoomer et changer de format, ce qui permet de passer de A4 à US
:wink:
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Imprimer un diagramme sans passer par une image

Message par Micoute »

@Marc56, je trouve tes conseils très judicieux.

@boby, ta mise à jour est parfaite, j'adore et je vais sûrement adopter car ça s'approche de très près à ce que je souhaite faire.

Merci à vous deux car vous m'avez été très précieux.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Imprimer un diagramme sans passer par une image

Message par boby »

Utiliser la lib VectorDrawing est en effet une bonne solution pour ne pas avoir à se soucier de la résolution, mais, utiliser la lib VectorDrawing veux dire dessiner les graphes de micoute en vectoriel dans l'imprimante, la demande étant "comment qu'on imprime un gadget" (à moins que je racompte totalement nimportequoi dans ce cas je suis fort preneur de l'info) l'utilisation de la lib VectorDrawing n'est pas possible.

Pour le PDF, quand j'en ai besoin, j'utilise GhostScript, mais ça grossie drastiquement l'executable (environ 9Mo) et impose de faire des crédits pour les citer. Encore une fois, si tu as un import plus léger et aussi fonctionnel de lib permettant de composer/travailler du PDF, je suis preneur.

@Micoute, cool si ça te dépanne, ravis d'avoir aidé.
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Imprimer un diagramme sans passer par une image

Message par Micoute »

Merci boby, car je dois dire que ça m'a bien aidé, j'ai juste à suivre le cheminement qui m'est tout tracé.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Imprimer un diagramme sans passer par une image

Message par Marc56 »

boby a écrit : Pour le PDF, quand j'en ai besoin, j'utilise GhostScript, mais ça grossie drastiquement l'executable (environ 9Mo) et impose de faire des crédits pour les citer. Encore une fois, si tu as un import plus léger et aussi fonctionnel de lib permettant de composer/travailler du PDF, je suis preneur.
PurePDF
PurePDF Purebasic UserLibrary Version 2.08 (c) Lucky Luke
Enhancements by ABBKlaus using Adobe PDF-Reference V1.6
The PurePDF user library based upon the FPDF class contains
PureBasic functions to create PDF files.
This library is provided as freeware. It may be used freely for any purpose, personal or commercial. A credit in your application would be appreciated.
This library is written in PureBasic, built with Tailbite and distributed by Library Installer.
Help created with PureHELP Maker.


Le site n'existe plus, mais les fichiers sont toujours là et il a été transformé en module
(ABBKlaus a créé d'excellentes libs (PDF, CodeBar, Printer, ExcelWriter, RMCharts etc), et chacune avec l'aide contextuelle PureBasic. C'est ce travail qu'il serait intéressant de voir intégré à PB si l'auteur initial le veut bien)
Version module
https://www.purebasic.fr/english/viewto ... it=purepdf
Il est basé sur FPDF lib PHP très légère qui existe depuis 2001
http://www.fpdf.org/
Aucune DLL à installer avec l'application.

:wink:
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Imprimer un diagramme sans passer par une image

Message par Micoute »

Merci beaucoup Marc56, maintenant j'ai plus qu'à ...
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Imprimer un diagramme sans passer par une image

Message par MLD »

@boby
merci pour ton code. Je met dans ma bibli.
a+
boby
Messages : 261
Inscription : jeu. 07/juin/2007 22:54

Re: Imprimer un diagramme sans passer par une image

Message par boby »

@Marc56 merci du partage, des libs fort intéressante tout ça !!
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Imprimer un diagramme sans passer par une image

Message par microdevweb »

Je peux reproché certaines choses à Pb mais honnêtement la librairie VectorDrawing est top, j'ai fais pas mal d'états imprimé avec et même avec des preview écran (zoom etc). (je reproche d’ailleurs à java de ne pas avoir la possibilité de choisir le type d'unité de pouvoir les convertir aussi facilement que avec pb)

Tu peux même choisir comme unité le mm, donc essayé de copié ce qui est affiché à l'écran est à mon sens un très mauvais plan.

Réutilise par contre ton code est assez simple il suffit simplement de changé les unité de valeur et de refaire la mise en page
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Imprimer un diagramme sans passer par une image

Message par Micoute »

Merci microdevweb pour tes conseils avisés, on sent le vêcu
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre