FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Petit passage furtif
Papier millimétré Emptypar Froggy One Hier à 14:26

» demande explication KGF pour imprimer en mm
Papier millimétré Emptypar JL35 Mar 26 Mar 2024 - 10:06

» SPIN et aide langage (résolu)
Papier millimétré Emptypar leclode Sam 23 Mar 2024 - 15:20

» Aide-mémoire des mots-clés Panoramic
Papier millimétré Emptypar papydall Mer 20 Mar 2024 - 21:23

» Je ne comprend pas pourquoi la largeur de la scene 3d change
Papier millimétré Emptypar Marc Mar 12 Mar 2024 - 20:06

» Comment télécharger panoramic?
Papier millimétré Emptypar lepetitmarocain Sam 9 Mar 2024 - 13:31

» @lepetitmarocain <==> KGFGrid
Papier millimétré Emptypar Klaus Dim 3 Mar 2024 - 9:59

» Tangram-Toukaré
Papier millimétré Emptypar jjn4 Mer 28 Fév 2024 - 18:12

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Papier millimétré Emptypar jjn4 Mer 28 Fév 2024 - 18:09

» KGF_dll - nouvelles versions
Papier millimétré Emptypar Klaus Mer 28 Fév 2024 - 17:01

» Mes souhaits d'amélioration de Panoramic.
Papier millimétré Emptypar Pedro Lun 26 Fév 2024 - 18:12

» Testez-votre-QI
Papier millimétré Emptypar jjn4 Dim 25 Fév 2024 - 17:12

» Utilisation d'Élip
Papier millimétré Emptypar jjn4 Sam 24 Fév 2024 - 18:33

» Récapitulatif ludothèque panoramic jjn4
Papier millimétré Emptypar jjn4 Sam 24 Fév 2024 - 18:11

» Générateur de mots de passe
Papier millimétré Emptypar mindstorm Mar 20 Fév 2024 - 20:09

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mars 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
25262728293031
CalendrierCalendrier
Le Deal du moment : -15%
(Adhérents Fnac) LEGO® Star Wars™ ...
Voir le deal
552.49 €

 

 Papier millimétré

Aller en bas 
2 participants
AuteurMessage
JL35




Nombre de messages : 7089
Localisation : 77
Date d'inscription : 29/11/2007

Papier millimétré Empty
MessageSujet: Papier millimétré   Papier millimétré EmptySam 28 Avr 2018 - 10:34

C'est quelque chose qui ne doit plus servir à grand chose de nos jours, mais bon, disons que c'est un gadget:
Code:
' Papier millimétré à imprimer
LABEL Imprime
DIM kgf$,rah,rav,x%,y%,mg%,mh%,fpm$
DIM prn$,Pr_lt%,Pr_ht%,phnd%,chnd%
kgf$ = "C:\PANORAMIC\KGF\KGF.dll": ' chemin de KGF.dll
fpm$ = "C:\TEMP\Millim.bmp": ' fichier provisoire
WIDTH 0,5000: HEIGHT 0,7050: COLOR 0,128,255,255: CAPTION 0,"   -   PAPIER   MILLIMÉTRÉ   -"
BUTTON 2: TOP 2,0: WIDTH 2,200: LEFT 2,SCREEN_X/2-120: CAPTION 2,"Imprimer"
  FONT_BOLD 2: FONT_SIZE 2,14: ON_CLICK 2,Imprime
' Définition imprimante: 4962 x 7013 pixels (voir SUB Pr_Init: données Pr_lt% et Pr_ht%)
DLL_ON kgf$
    prn$ = ""
    x% = DLL_CALL4("PrinterManager",1,ADR(phnd%),ADR(chnd%),ADR(prn$))
    Pr_lt% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),3,0,0)
    Pr_ht% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),4,0,0)
    x% = DLL_CALL4("PrinterManager",7,ADR(phnd%),ADR(chnd%),0)
DLL_OFF: ' dimensions en pixels de la feuille A4 imprimée
rah = Pr_lt%/210: ' pixels par millimètre, horizontaux, à l'impression
rav = Pr_ht%/297: ' pixels par millimètre, verticaux, à l'impression
mg% = 5*rah: mh% = 3.5*rav: ' marges gauche ( 5 mm) et haut ( 3,5 mm)
PICTURE 1: TOP 1,25: WIDTH 1,200*rah: HEIGHT 1,290*rav
2D_TARGET_IS 1: 2D_PEN_COLOR 255,96,40
FOR y% = 0 TO 290
    2D_PEN_WIDTH 1: IF y%/10 = INT(y%/10) THEN 2D_PEN_WIDTH 3
    2D_LINE 0,y%*rav,WIDTH(1),y%*rav
NEXT y%
FOR x% = 0 TO 200
    2D_PEN_WIDTH 1: IF x%/10 = INT(x%/10) THEN 2D_PEN_WIDTH 3
    2D_LINE x%*rah,0,x%*rah,HEIGHT(1)
NEXT x%
END
' ==============================================================================
Imprime:
  x% = MESSAGE_CONFIRMATION_YES_NO("Imprimante prête ?"): IF x%<>1 THEN RETURN
  FILE_SAVE 1,fpm$
  Pr_Init(0,"")
  Pr_Image(fpm$,mg%,mh%,WIDTH(1),HEIGHT(1),0)
  Pr_Impr()
  FILE_DELETE fpm$
RETURN
' ==============================================================================
SUB Pr_init(orient%,prn$)
  ' Initialisation imprimante ('début d'impression')
  ' orient% = 0 Portrait, = 1 Paysage
  ' prn$ = "": imprimante par défaut
  '            sinon nom de l'imprimante (pour essais)
  '            par exemple "Microsoft XPS Document Writer" impression virtuelle
  '            dans un fichier .XPS
  ' Dans les paramètres des fonctions, le positionnement initial doit être fait en
  ' valeurs absolues: distances par rapport aux bords gauche et haut de la feuille
  ' A4, sans tenir compte des marges non imprimables.
  ' Les couleurs sont à exprimer au format BGR (en non pas RGB): B*256*256+G*256+R
  DLL_ON kgf$
  IF VARIABLE("phnd%") = 0 THEN DIM phnd%
  IF VARIABLE("chnd%") = 0 THEN DIM chnd%
  IF VARIABLE("inip%") = 0 THEN DIM inip%
  IF VARIABLE("Pr_res%") = 0 THEN DIM Pr_res%
  IF VARIABLE("Pr_px%") = 0 THEN DIM Pr_px%: ' pixels par mm (600 dpi)
  IF VARIABLE("Pr_lt%") = 0 THEN DIM Pr_lt%: ' largeur totale
  IF VARIABLE("Pr_ht%") = 0 THEN DIM Pr_ht%: ' hauteur totale
  IF VARIABLE("Pr_mg%") = 0 THEN DIM Pr_mg%: ' marge gauche
  IF VARIABLE("Pr_mh%") = 0 THEN DIM Pr_mh%: ' marge haut
  IF VARIABLE("Pr_lu%") = 0 THEN DIM Pr_lu%: ' largeur utile
  IF VARIABLE("Pr_hu%") = 0 THEN DIM Pr_hu%: ' hauteur utile
  IF prn$ <> "": ' pour essais sans impression réelle
      Pr_res%=DLL_CALL4("PrinterManager",10,ADR(phnd%),ADR(chnd%),ADR(prn$))
  END_IF
  ' Orientation portrait (0) ou paysage (1)
  Pr_res% = DLL_CALL4("PrinterManager",4,ADR(phnd%),ADR(chnd%),orient%): ' orientation
  Pr_res% = DLL_CALL4("PrinterManager",1,ADR(phnd%),ADR(chnd%),0): ' init
  ' Dimensions sans les marges, en pixels:
  ' ==========
  ' ATTENTION: Les dimensions sont actualisées en fonction de l'option orientation !
  ' ==========
  Pr_lt% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),3,0,0): ' largeur totale
  Pr_ht% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),4,0,0): ' hauteur totale
  IF orient% = 0
      Pr_px% = Pr_ht%/297: ' pixels par mm, à l'impression en 600 dpi
  ELSE
      Pr_px% = Pr_lt%/297: ' idem (paysage)
  END_IF
  ' Marges non imprimables: décalage en pixels à soustraire gauche et haut:
  Pr_mg% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),1,0,0): ' marge gauche
  Pr_mh% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),2,0,0): ' marge haut
  ' Dimensions utiles, en pixels:
  IF Pr_mg% = 0 OR Pr_mh%= 0: ' cas imprimante virtuelle (PDFCreator)
      Pr_mg% = 75: Pr_mh% = 75: ' forçage comme imprimante réelle
      Pr_lu% = Pr_lt% - 2*Pr_mg%: Pr_hu% = Pr_ht% - 2*Pr_mh%
  ELSE
      Pr_lu% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),7,0,0): ' largeur utile
      Pr_hu% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),8,0,0): ' hauteur utile
  END_IF
  ' Couleur trait noir, épaisseur = 1, arrière-plan transparent:
  inip% = -2
  Pr_res% = DLL_CALL6("PrinterFunction",6,ADR(phnd%),ADR(chnd%),0,inip%,1)
  inip% = 1
END_SUB
' ==============================================================================
SUB Pr_Image(f$,x%,y%,w%,h%,u%)
  ' Impression de l'image f$ en x%,y%, dimensions w% x h% (sera redimensionnée pour
  ' tenir dans le cadre donné).
  ' u% = 0: unités pixels, u% = 1, unités millimètres
  ' ******** NB: coordonnées d'impression absolues (pixels): de 0,0 à 4962,7013 ********
  ' ATTENTION :
  ' =========
  ' les coordonnées prises en compte ont pour origine le début de la zone imprimable.
  ' Il faut donc soustraire les marges pour partir de l'angle supérieur gauche de la feuille.
  IF inip% = 0 THEN EXIT_SUB: ' imprimante non initialisée (Sub Pr_Init)
  IF u% = 1: ' unités en mm, conversion en pixels
      x% = x%*Pr_mmpix: y% = y%*Pr_mmpix: w% = w%*Pr_mmpix: h% = h%*Pr_mmpix
  END_IF
  x% = x%-Pr_mg%: y% = y%-Pr_mh%: ' sinon, marges ajoutées d'office
  Pr_res% = DLL_call6("PrinterFunction",4,ADR(phnd%),ADR(chnd%),0,x%,y%): ' positionnement
  Pr_res% = DLL_call6("PrinterFunction",7,ADR(phnd%),ADR(chnd%),ADR(f$),w%,h%)
END_SUB
' ==============================================================================
SUB Pr_Impr()
  ' Lancement de l'impression réelle ('fin d'impression')
  IF inip% = 0 THEN EXIT_SUB: ' imprimante non initialisée (Sub Pr_Init)
  Pr_res% = DLL_CALL4("PrinterManager",3,ADR(phnd%),ADR(chnd%),0)
  inip% = 0
  DLL_OFF
END_SUB
' ==============================================================================
A ajuster:
- le chemin du fichier provisoire d'impression, en tête
- le chemin de KGF.dll de l'ami Klaus, kgf$ en tête
La surface utile (imprimée) est de 200 x 290 mm

Edit: calcul automatique des dimensions de la page en pixels imprimés (fonction de KGF.dll)


Dernière édition par JL35 le Sam 28 Avr 2018 - 14:36, édité 6 fois
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Papier millimétré Empty
MessageSujet: Re: Papier millimétré   Papier millimétré EmptySam 28 Avr 2018 - 10:54

Chouette !

Je suis sûr que tu peux simplifier la configuration du logiciel en demandant à KGF.dll de te fournir des renseignements sur l'imprimante. Cela te permettra d'adapter tout ) n'importe quelle imprimante et de gérer le cas de plusieurs imprimantes. Regarde PrinterFunction code 8:
Code:
      8 = retourner une dimension de la feuille
                opt1% = code de la valeur à retourner
                        1      PHYSICALOFFSETX    décalage horizontal en pixel
                        2      PHYSICALOFFSETY    décalage vertical en pixel
                        3      PHYSICALWIDTH        largeur totale en pixel
                        4      PHYSICALHEIGHT      hauteur totale en pixel
                        5      LOGPIXELSX                résolution horizontale en pixels/pouce
                        6      LOGPIXELSY                résolution verticale en pixels/pouce
                        7      HORZRES                    largeur utile en pixels
                        8      VERTRES                      hauteur utile en pixels
                        9      HORZSIZE                    largeur utile en millimètres
                        10      VERTSIZE                    hauteur utile en millimètres
Tu as même le nombre de pixels par pouce, et ce séparément pour la direction horizontale et verticale - et oui, il y a des impeimantes qui n'ont pas la même résolution dans les deux sens !

Je sais bien que tu utilises déjà ce code, mais uniquement pour avoir le nombre de pixels au total. Je pense que tu peux aller plus loin...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JL35




Nombre de messages : 7089
Localisation : 77
Date d'inscription : 29/11/2007

Papier millimétré Empty
MessageSujet: Re: Papier millimétré   Papier millimétré EmptySam 28 Avr 2018 - 13:11

Effectivement Klaus, je suis parti du principe que la résolution en pixels par mm sur l'imprimante était la même en horizontal et en vertical, ce qui n'est pas forcément le cas.
Mais bon, la sub Pr_Init() renvoie les deux valeurs Pr_lt% et Pr_ht% en pixels.

J'ai ajouté là-haut la fonction préalable de demande de ces paramètres. Il faut pour ça que l'imprimante soit allumée,
je lance la fonction, mais je ne peux pas en sortir sans impression systématique d'une page blanche à la fermeture...
Y a-t'il moyen d'obtenir ces renseignements sans impression physique ? J'avais noté qu'il fallait mettre une valeur quelconque comme nom d'imprimante de la fonction 10 de PrinterManager, mais ça imprime quand même... (dans la sub, Prn$<>"")

Un moment, autant pour moi, je regarde PrinterFunction...


Dernière édition par JL35 le Sam 28 Avr 2018 - 13:46, édité 1 fois
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

Papier millimétré Empty
MessageSujet: Re: Papier millimétré   Papier millimétré EmptySam 28 Avr 2018 - 13:38

As-tu essayé de placer
Code:
  Pr_res% = DLL_CALL4("PrinterManager",1,ADR(phnd%),ADR(chnd%),0): ' init
plus loin, après la récupération des paramètres de l'imprimante ? Cela devrait te permettre de récupérer la configuration avant d'initialiser l'impression, et donc de sortir; le cas échéant, sans imprimer de page blanche. Dès que cette command a été passée, une page blanche est préparée dans le buffer pour le driver, et en arrêtant, celle-ci est imprimée.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JL35




Nombre de messages : 7089
Localisation : 77
Date d'inscription : 29/11/2007

Papier millimétré Empty
MessageSujet: Re: Papier millimétré   Papier millimétré EmptySam 28 Avr 2018 - 13:58

Bon, je n'y arrive pas, je récupère les paramètres, mais pas moyen de sortir sans une impression bidon:
Si, ça marche ! je corrige là-haut
Code:
DLL_ON kgf$
    prn$ = ""
    x% = DLL_CALL4("PrinterManager",1,ADR(phnd%),ADR(chnd%),ADR(prn$))
    Pr_lt% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),3,0,0)
    Pr_ht% = DLL_CALL6("PrinterFunction",8,ADR(phnd%),ADR(chnd%),4,0,0)
    x% = DLL_CALL4("PrinterManager",7,ADR(phnd%),ADR(chnd%),0)
DLL_OFF: ' dimensions en pixels de la feuille A4 imprimée
Revenir en haut Aller en bas
Contenu sponsorisé





Papier millimétré Empty
MessageSujet: Re: Papier millimétré   Papier millimétré Empty

Revenir en haut Aller en bas
 
Papier millimétré
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Contenu du presse-papier
» Contenu du presse-papier
» Gestion du presse-papier
» Un presse-papier amélioré
» Effacer le presse papier...

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: