ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Création d''étiquettes DPE (Diagnostic de Performance Energétique) NRJ et GES avec GDIplusX   



L'auteur

Francis Faure
France France
Membre Actif (personne physique)
# 0000000001
enregistré le 11/10/2004

http://www.wanagain.net
52 ans
Faure Francis
de la société Design Or Decline
Fiche personnelle


Note des membres
pas de note

Contributions > 11 - GDI +

Création d''étiquettes DPE (Diagnostic de Performance Energétique) NRJ et GES avec GDIplusX
# 0000000843
ajouté le 02/01/2013 17:59:18 et modifié le 02/01/2013
consulté 5674 fois
Niveau débutant

Version(s) Foxpro :
VFP 9.0


Le téléchargement des pièces jointes est limité aux membres
Veuillez vous identifier ou vous inscrire si vous n'avez pas encore de compte ...
Description
Bonjour,

Suite à un échange en forum :
Ci-joint une première version d'un programme permettant de générer des étiquettes DPE (utilisation de GDIplusX)

Cordialement
Francis
Code source :

* Formulaire de test
DO FORM test_dpe.scx




*--------------------------------------------------------------------------------------------------
* 01/01/2013
* Francis FAURE
* But : Générer des étiquettes DPE (Diagnostic de Performance Energétique) NRJ et GES
*       étiquettes : format image.jpg

* Prérequis :
*   VFP9 (Visual FoxPro 9)
*   GDI+ installé sur Windows (normalment le cas depuis Windows 98SE)
*   Librairie OpenSource GDIplusX disponible gratuitement sur VPX (CodePlex)
*   http://www.codeplex.com/vfpx/wiki/view.aspx?title=gdiplusx&referringtitle=home

* Remerciements :
*   Ce source est inspiré d'exemples publiés sur le site Internet "VFPIMAGING"
*   (Blog de César Chalom)
*   http://weblogs.foxite.com/vfpimaging/

* Source des images :
*   http://www.developpement-durable.gouv.fr/-Diagnostic-de-Performance,855-.html
*--------------------------------------------------------------------------------------------------
* Créer un fichier JPG contenant une étiquette DPE NRJ ou GES
* Paramétre 1   : NRJ : Valeur de la consommation énergétique (exprimée en kWh EP /m² /an)
*                 GES : Valeur émissions de Gaz à Effet de Serre (exprimée en kg éqCO2 /m² /an)
* [Paramétre 2] : Nom du fichier étiquettte.JPG à créer (par défaut "DPE_EtiquetteNRJ/GES.jpg" en répertoire temporaire)
* [Paramétre 3] : .T. pour GES, .F. pour NRJ (défaut)
*
* Retour : La Classe
Function DPE_Etiquette(;
    lcDPE As String, ;
    lcFichierEtiquetteJPG_OutPut As String, ;
    llIf_GES_else_NRJ) As String

  Local lcReturn As Character
  lcReturn="?"

  * en final une chaine
  DO case
    case TYPE("m.lcDPE")=="N"
      lcDPE=ALLTRIM(STR(m.lcDPE,6,3))
    case TYPE("m.lcDPE")=="C"
      lcDPE=ALLTRIM(STR(VAL(m.lcDPE),6,3))
    OTHERWISE
      m.lcDPE=""
  ENDCASE
  LOCAL lcC as Character
  IF "."$m.lcDPE
    DO WHILE .T.
      lcC = RIGHT(m.lcDPE,1)
      IF m.lcC$"0."
         lcDPE = LEFT(m.lcDPE, LEN(m.lcDPE)-1)
         IF m.lcC=="."
           exit
         ENDIF
      ELSE
        exit
      endif
    ENDDO
  endif

  * -------------------- Paramétrages de la fonction
  * (peut devenir des propriétés d'une classe)

  * Fichier.jpg final
  If Type("m.lcFichierEtiquetteJPG_OutPut")<>"C"
    If m.llIf_GES_else_NRJ && GES
      lcFichierEtiquetteJPG_OutPut = Addbs(Getenv("temp"))+"DPE_Etiquette_GES.jpg"
    Else
      lcFichierEtiquetteJPG_OutPut = Addbs(Getenv("temp"))+"DPE_Etiquette_NRJ.jpg"
    Endif
  Else
    lcFichierEtiquetteJPG_OutPut = Fullpath(m.lcFichierEtiquetteJPG_OutPut)
  Endif
  If File(m.lcFichierEtiquetteJPG_OutPut)
    Erase (m.lcFichierEtiquetteJPG_OutPut)
  Endif

  * Emplacement de l'image indice dans l'image Main
  Local liIndice_Left As Integer
  If m.llIf_GES_else_NRJ && GES
    liIndice_Left=267 && le 'left' (x) est fixe selon l'image
  Else
    liIndice_Left=269 && le 'left' (x) est fixe selon l'image
  Endif
  * le 'top' (y) est a positionner selon la valeur dans l'image selon valeur DPE
  * Il aurait été simple de caluler la position Indice_Top dans l'image si c'était linéraire
  *    Mais les classes n'ont pas la même "taille"...
  *     Il faut donc placer selon la classe
  Local liIndice_Top As Integer
  Local liIndice_Top_Min As Integer
  Local liClasseStartValue As Integer
  Local liClasseEndValue As Integer
  If m.llIf_GES_else_NRJ && GES
    Do Case
      Case Val(m.lcDPE)<6
        * Classe A :
        liClasseStartValue=0
        liClasseEndValue=6
        liIndice_Top_Min=27
        lcReturn="A"

      Case Val(m.lcDPE)>=6 And Val(m.lcDPE)<11
        * Classe B :
        liClasseStartValue=6
        liClasseEndValue=11
        liIndice_Top_Min=66
        lcReturn="B"

      Case Val(m.lcDPE)>=11 And Val(m.lcDPE)<21
        * Classe C :
        liClasseStartValue=11
        liClasseEndValue=21
        liIndice_Top_Min=105
        lcReturn="C"

      Case Val(m.lcDPE)>=21 And Val(m.lcDPE)<36
        * Classe D :
        liClasseStartValue=21
        liClasseEndValue=36
        liIndice_Top_Min=143
        lcReturn="D"

      Case Val(m.lcDPE)>=36 And Val(m.lcDPE)<56
        * Classe E :
        liClasseStartValue=36
        liClasseEndValue=56
        liIndice_Top_Min=182
        lcReturn="E"

      Case Val(m.lcDPE)>=56 And Val(m.lcDPE)<=80
        * Classe F :
        liClasseStartValue=56
        liClasseEndValue=80
        liIndice_Top_Min=220
        lcReturn="F"

      Case Val(m.lcDPE)>80
        * Classe G :
        liClasseStartValue=80
        liClasseEndValue=110 && ?
        liIndice_Top_Min=259
        lcReturn="G"

      Otherwise
        =Messagebox("Erreur de programmation", 16+0, "DPE_Etiquette()")
        Cancel
    Endcase
  Else && NRJ
    Do Case
      Case Val(m.lcDPE)<51
        * Classe A :
        liClasseStartValue=0
        liClasseEndValue=50
        liIndice_Top_Min=26
        lcReturn="A"

      Case Val(m.lcDPE)>=51 And Val(m.lcDPE)<91
        * Classe B :
        liClasseStartValue=51
        liClasseEndValue=91
        liIndice_Top_Min=65
        lcReturn="B"

      Case Val(m.lcDPE)>=91 And Val(m.lcDPE)<151
        * Classe C :
        liClasseStartValue=91
        liClasseEndValue=151
        liIndice_Top_Min=104
        lcReturn="C"

      Case Val(m.lcDPE)>=151 And Val(m.lcDPE)<231
        * Classe D :
        liClasseStartValue=151
        liClasseEndValue=231
        liIndice_Top_Min=142
        lcReturn="D"

      Case Val(m.lcDPE)>=231 And Val(m.lcDPE)<331
        * Classe E :
        liClasseStartValue=231
        liClasseEndValue=331
        liIndice_Top_Min=181
        lcReturn="E"

      Case Val(m.lcDPE)>=331 And Val(m.lcDPE)<=450
        * Classe F :
        liClasseStartValue=331
        liClasseEndValue=450
        liIndice_Top_Min=219
        lcReturn="F"

      Case Val(m.lcDPE)>450
        * Classe G :
        liClasseStartValue=450
        liClasseEndValue=600 && ?
        liIndice_Top_Min=258
        lcReturn="G"

      Otherwise
        =Messagebox("Erreur de programmation", 16+0, "DPE_Etiquette()")
        Cancel
    Endcase
  Endif

  liIndice_Top = m.liIndice_Top_Min + ;
    (Val(m.lcDPE) - m.liClasseStartValue) * ;
    (34/(m.liClasseEndValue-m.liClasseStartValue)) - ; && 34 = hauteur en pixel des barres de classe
    18 && 18 est la pointe dans l'image de l'indice
  liIndice_Top = Max(20, m.liIndice_Top) && minimum à 20
  liIndice_Top = Min(265, m.liIndice_Top) && maximum à 265

  * position et taille du rectangle texte à insérer dans l'image de l'indice
  Local liRectangle_top As Integer
  Local liRectangle_left As Integer
  Local liRectangle_width As Integer
  Local liRectangle_height As Integer
  * Valeurs à fixer selon l'image d'indice si autre que DPE_INDICE.BMP fournie
  liRectangle_left=16
  liRectangle_top=10
  liRectangle_width=55
  liRectangle_height=20

  * -------------------- Paramétrages de la fonction

  * Fichier étiquette image modèle "Vierge" / Source (Grille Colorée) sans Indice
  * (Fichier image à fournir avec la procédure / intégrer au projet)
  Local lcFichierSource_Main As String
  If m.llIf_GES_else_NRJ && GES
    lcFichierSource_Main = Fullpath("DPE_GES_0.bmp")
  Else
    lcFichierSource_Main = Fullpath("DPE_NRJ_0.bmp")
  Endif
  If Not File(m.lcFichierSource_Main)
    =Messagebox("Fichier manquant : "+m.lcFichierSource_Main, 16+0, "DPE_Etiquette()")
    Return m.lcReturn
  Endif

  * Fichier étiquette image indice (le "médiator" noir) qui doit être intégrer aux fichiers main source
  * Fichier image a fournir avec la procédure / intégrer au projet
  * (dans mon cas j'ai choisi d'avoir le même fichier d'indice)
  Local lcFichierSource_Indice As String
  If m.llIf_GES_else_NRJ && GES
    lcFichierSource_Indice = Fullpath("DPE_GES_INDICE.bmp")
  ELSE
    lcFichierSource_Indice = Fullpath("DPE_NRJ_INDICE.bmp")
  endif
  If Not File(m.lcFichierSource_Indice)
    Copy File (m.lcFichierSource_Main) To (m.lcFichierEtiquetteJPG_OutPut)
    =Messagebox("Fichier manquant : "+m.lcFichierSource_Indice, 16+0, "DPE_Etiquette()")
    Return m.lcReturn
  Endif

  If Val(m.lcDPE)<=0 && retourner un graph vide
    Copy File (m.lcFichierSource_Main) To (m.lcFichierEtiquetteJPG_OutPut)
    Return m.lcReturn
  Endif

  * Prérequis : la librairie open source GDIplusX v1.2 disponible sur VPFX.CODEPLEX.COM
  Local lcLibrairieGDIplusX As String
  lcLibrairieGDIplusX = Fullpath("SYSTEM.APP")  && SYSTEM.ASPP ou SYSTEM_LEAN.APP ou SYSTEM.PRG selon choix développeur et distribution
  If Not File(m.lcLibrairieGDIplusX)
    =Messagebox("Librairie GDIplusX manquante", 16+0, "DPE_Etiquette()")
    Return (m.lcFichierSource_Main)
  Endif
  Do (m.lcLibrairieGDIplusX)

  * Début du traitement GDIplusX
  With _Screen.System.drawing As xfcdrawing

    Local loXFCbitmap_Main As xfcbitmap
    Local logXFCgraphics_Main As xfcgraphics
    loXFCbitmap_Main = .Bitmap.fromfile(m.lcFichierSource_Main)
    logXFCgraphics_Main = .graphics.fromimage(m.loXFCbitmap_Main)

    Local loXFCbitmap_Indice As xfcbitmap
    Local logXFCgraphics_Indice As xfcgraphics
    loXFCbitmap_Indice = .Bitmap.fromfile(m.lcFichierSource_Indice)
    logXFCgraphics_Indice = .graphics.fromimage(m.loXFCbitmap_Indice)

    * Ajouter le texte de la valeur DPE (lcDPE) dans l'image "indice"

    * Créer un objet Font
    Local loFont As xfcFont
    loFont = .Font.New("Verdana",9, .FontStyle.Bold, .GraphicsUnit.Point)

    * Créer un objet SolidBrush
    Local loBrush As xfcBrush
    loBrush = .SolidBrush.New(.Color.FromRgb(255,255,255))

    * Créer un objet Rectangle pour le texte a insérer dans l'image de l'indice
    Local loRect As xfcRectangle
    loRect = .Rectangle.New(;
      m.liRectangle_left,;
      m.liRectangle_top, ;
      m.liRectangle_width,;
      m.liRectangle_Height)

    * Créer un objet format du texte (pour le centrer dans le rectangle)
    Local loStringFormat As xfcStringFormat
    loStringFormat = .StringFormat.New()
    loStringFormat.Alignment = .StringAlignment.Center

    * ajouter le texte dans l'image de l'indice
    logXFCgraphics_Indice.SmoothingMode = .Drawing2D.SmoothingMode.HighQuality
    logXFCgraphics_Indice.InterpolationMode = .Drawing2D.InterpolationMode.HighQualityBicubic
    logXFCgraphics_Indice.DrawString(m.lcDPE, m.loFont, m.loBrush, m.loRect, m.loStringFormat)

    * ajouter l'image de l'indice dans l'image principale
    logXFCgraphics_Main.SmoothingMode = .Drawing2D.SmoothingMode.HighQuality
    logXFCgraphics_Main.InterpolationMode = .Drawing2D.InterpolationMode.HighQualityBicubic
    logXFCgraphics_Main.drawimage(m.loXFCbitmap_Indice, m.liIndice_Left, m.liIndice_Top)

    * créer le fichier final en JPEG, Qualité 100%
    Local myXFCencoderparameter As xfcencoderparameter
    Local myXFCencoderparameters As xfcencoderparameters
    myXFCencoderparameters = .imaging.encoderparameters.new(1)
    myXFCencoderparameter = .imaging.encoderparameter.new(.imaging.encoder.quality, 100)
    myXFCencoderparameters.Param.Add(m.myXFCencoderparameter)
    loXFCbitmap_Main.Save(m.lcFichierEtiquetteJPG_OutPut, .imaging.imageformat.jpeg, myXFCencoderparameters)

  Endwith
  Return m.lcReturn
Endfunc
*--------------------------------------------------------------------------------------------------

Commentaires
le 02/01/2013, GLS a écrit :
Merci Francis..

de bonnes idées mises en pratique..
je vais pourvoir me servir de ton post pour mes besoins de gestion d'images dans des graphes..

Amicalement
GLS

le 02/01/2013, Francis Faure a écrit :
De rien Gilles,
faut quand même tester ^^
n'hésites pas a poster ta version
c'est aussi cela l'esprit communautaire Open Source : utiliser un code open source = publier son code modifié/amélioré
Cordialement
Francis
ps : il est a remarquer que les premiers exemples postés sur le net sont de César Chalom qui est notre invité aux prochaines rencontres Atoutfox 2013 a l'Ibis de Roissy les 11 et 12 avril 2013


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2020.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3