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é 8753 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 DOFORM 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 AsString, ;
lcFichierEtiquetteJPG_OutPut AsString, ;
llIf_GES_else_NRJ) AsString
Local lcReturn AsCharacter
lcReturn="?"
* en final une chaine DOcase caseTYPE("m.lcDPE")=="N"
lcDPE=ALLTRIM(STR(m.lcDPE,6,3)) caseTYPE("m.lcDPE")=="C"
lcDPE=ALLTRIM(STR(VAL(m.lcDPE),6,3)) OTHERWISE
m.lcDPE="" ENDCASE LOCAL lcC asCharacter IF"."$m.lcDPE DOWHILE.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)
* Emplacement de l'image indice dans l'image Main Local liIndice_Left AsInteger 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 AsInteger Local liIndice_Top_Min AsInteger Local liClasseStartValue AsInteger Local liClasseEndValue AsInteger If m.llIf_GES_else_NRJ && GES DoCase CaseVal(m.lcDPE)<6 * Classe A :
liClasseStartValue=0
liClasseEndValue=6
liIndice_Top_Min=27
lcReturn="A"
CaseVal(m.lcDPE)>=6 AndVal(m.lcDPE)<11 * Classe B :
liClasseStartValue=6
liClasseEndValue=11
liIndice_Top_Min=66
lcReturn="B"
CaseVal(m.lcDPE)>=11 AndVal(m.lcDPE)<21 * Classe C :
liClasseStartValue=11
liClasseEndValue=21
liIndice_Top_Min=105
lcReturn="C"
CaseVal(m.lcDPE)>=21 AndVal(m.lcDPE)<36 * Classe D :
liClasseStartValue=21
liClasseEndValue=36
liIndice_Top_Min=143
lcReturn="D"
CaseVal(m.lcDPE)>=36 AndVal(m.lcDPE)<56 * Classe E :
liClasseStartValue=36
liClasseEndValue=56
liIndice_Top_Min=182
lcReturn="E"
CaseVal(m.lcDPE)>=56 AndVal(m.lcDPE)<=80 * Classe F :
liClasseStartValue=56
liClasseEndValue=80
liIndice_Top_Min=220
lcReturn="F"
CaseVal(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 DoCase CaseVal(m.lcDPE)<51 * Classe A :
liClasseStartValue=0
liClasseEndValue=50
liIndice_Top_Min=26
lcReturn="A"
CaseVal(m.lcDPE)>=51 AndVal(m.lcDPE)<91 * Classe B :
liClasseStartValue=51
liClasseEndValue=91
liIndice_Top_Min=65
lcReturn="B"
CaseVal(m.lcDPE)>=91 AndVal(m.lcDPE)<151 * Classe C :
liClasseStartValue=91
liClasseEndValue=151
liIndice_Top_Min=104
lcReturn="C"
CaseVal(m.lcDPE)>=151 AndVal(m.lcDPE)<231 * Classe D :
liClasseStartValue=151
liClasseEndValue=231
liIndice_Top_Min=142
lcReturn="D"
CaseVal(m.lcDPE)>=231 AndVal(m.lcDPE)<331 * Classe E :
liClasseStartValue=231
liClasseEndValue=331
liIndice_Top_Min=181
lcReturn="E"
CaseVal(m.lcDPE)>=331 AndVal(m.lcDPE)<=450 * Classe F :
liClasseStartValue=331
liClasseEndValue=450
liIndice_Top_Min=219
lcReturn="F"
CaseVal(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 AsInteger Local liRectangle_left AsInteger Local liRectangle_width AsInteger Local liRectangle_height AsInteger * 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 AsString If m.llIf_GES_else_NRJ && GES
lcFichierSource_Main = Fullpath("DPE_GES_0.bmp") Else
lcFichierSource_Main = Fullpath("DPE_NRJ_0.bmp") Endif IfNotFile(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 AsString If m.llIf_GES_else_NRJ && GES
lcFichierSource_Indice = Fullpath("DPE_GES_INDICE.bmp") ELSE
lcFichierSource_Indice = Fullpath("DPE_NRJ_INDICE.bmp") endif IfNotFile(m.lcFichierSource_Indice) CopyFile (m.lcFichierSource_Main) To (m.lcFichierEtiquetteJPG_OutPut)
=Messagebox("Fichier manquant : "+m.lcFichierSource_Indice, 16+0, "DPE_Etiquette()") Return m.lcReturn Endif
IfVal(m.lcDPE)<=0 && retourner un graph vide CopyFile (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 AsString
lcLibrairieGDIplusX = Fullpath("SYSTEM.APP") && SYSTEM.ASPP ou SYSTEM_LEAN.APP ou SYSTEM.PRG selon choix développeur et distribution IfNotFile(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)
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
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