Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Histogrammes barres et/ou camembert | |
|
+5exdragon Jicehel Nardo26 JL35 Klaus 9 participants | |
Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Histogrammes barres et/ou camembert Mer 11 Juil 2012 - 10:05 | |
| Bug corrigé. Voici un extrait de ton fichier texte: - Citation :
- 50
90 50 #Minimum Y=0 #Maximum Y=1000 #Ecart Y=100 #Légende Y=0 #Titres Les légendes de l'axe vertical sont bien échelonnées de 0 à 1000, et le graphique est ajusté par rapport à cela, en 2D ou 3D, et wte ce soit LINE ou BAR. Les commandes #Legende Y= ne sont utiles que si la légende doit être différente de la valeur seule. Exemple: - Citation :
#Légende Y=(Rien) 0 #Légende Y=(Peu) 100 #Légende Y=(Peu) 200 #Légende Y=(Peu) 300 #Légende Y=(Moyen) 400 #Légende Y=(Moyen) 500
etc. Avec mes excuses pour le bug ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Histogrammes barres et/ou camembert Mer 11 Juil 2012 - 11:19 | |
| Complément d'info: Le fichier Autres_DLL.rtf a été mis à jour pour la doc de l'histogramme, et j'ai ajouté la doc de MouseOperations.dll. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 11 Juil 2012 - 12:41 | |
| Merci klaus
Tu n'as pas à t'excuser de quoi que ce soit . Les dlls que tu nous fournis sont tellement pointu et nous sont d'une si grande utilité .
quelqu'un à dit : "...que celui qui n'a jamais péché lui jette la première pierre."
Je récupère tout ce coup ci (dll + fichier rtf ) et je mets à jours mon appli sur le webdev. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re après essai Mer 11 Juil 2012 - 18:52 | |
| J'ai essayé la dernière version de histo.dll On a toujours la perte des cadres de légende pour les autres types que barres Je ne me suis pas servi de : #Légende Y juste : #Minimum Y=0 #Maximum Y =1000 #Ecart Y=100 | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Histogrammes barres et/ou camembert Mer 11 Juil 2012 - 22:44 | |
| C'est corrigé pour TOUS les types d'histogramme. Merci pour la visualisation très claire ! | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 12 Juil 2012 - 0:08 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Histogrammes barres et/ou camembert Jeu 12 Juil 2012 - 1:55 | |
| Juste pour s'amuser un peu: J'ai écrit aujourd'hui un "mini" histogramme, entièrement en Panoramic. Cela se présente sous forme d'un fichier BAS qu'un inclut avec #INCLUDE. Il y a aussi un programme de test. Copie le tout dans un même répertoire et exécute le programme de text: Cliquer d'abort sur Ouvrir, puis sur Histo, puis sur Fermer. Tu peux changer les données, et le type de graphique peut être différent pour chaque série ! Voici le module PanHisto.bas: - Code:
-
' PanHisto.bas if label("PanHisto_labels")=0 label PanHisto_labels : gosub PanHisto_labels gosub PanHisto_constantes gosub PanHisto_variables end_if return PanHisto_labels: label PanHisto_constantes label PanHisto_variables label PanHisto_open, PanHisto_close label PanHisto_draw label PanHisto_interne_conversion return PanHisto_constantes: return PanHisto_variables: ' variables d'interface dim PanHisto_form_size%(1) : ' 0=width 1=height dim PanHisto_form_no%, PanHisto_form_caption$ dim PanHisto_serie_count%, PanHisto_serie_size% dim PanHisto_serie_color%(4,2) : ' (,0)=R (,1)=G (,2)=B dim PanHisto_serie_values(4,49) dim PanHisto_type%(4) : ' 1=BAR 2=LINE 3=POINT dim PanHisto_y_delta, PanHisto_y_delta%, PanHisto_x_delta% dim PanHisto_Y_legend$(10) ' variables internes dim PanHisto_i%, PanHisto_j% dim PanHisto_interne_max,PanHisto_interne_min dim PanHisto_f_init%, PanHisto_org_x%, PanHisto_org_y% dim PanHisto_interne_y, PanHisto_interne_y%, PanHisto_interne_x% dim PanHisto_interne_interval(2) : ' (0)=longeur (1)=start (2)=end dim PanHisto_interne_h%, PanHisto_interne_bar_width%
return PanHisto_open: if PanHisto_f_init%=1 message "PanHisto est déjà ouvert !" return end_if for PanHisto_i%=0 to 2 if object_exists(PanHisto_form_no%+PanHisto_i%)=1 message "Impossible d'utiliser les numéros réservés !" return end_if next PanHisto_i% if (PanHisto_serie_count%<1) or (PanHisto_serie_count%>5) message "Nombre de séries invalide !" return end_if if (PanHisto_serie_size%<1) or (PanHisto_serie_size%>50) message "Taille des séries invalide !" return end_if
form PanHisto_form_no% : hide PanHisto_form_no% if PanHisto_form_size%(0)=0 PanHisto_form_size%(0) = width(PanHisto_form_no%) else width PanHisto_form_no%, PanHisto_form_size%(0) end_if if PanHisto_form_size%(1)=0 PanHisto_form_size%(1) = height(PanHisto_form_no%) else height PanHisto_form_no%, PanHisto_form_size%(1) end_if left PanHisto_form_no%,(screen_x-PanHisto_form_size%(0))/2 top PanHisto_form_no%,(screen_y-PanHisto_form_size%(1))/2 if PanHisto_form_caption$=""then PanHisto_form_caption$ = "PanHisto" caption PanHisto_form_no%,PanHisto_form_caption$ picture PanHisto_form_no%+1 : parent PanHisto_form_no%+1,PanHisto_form_no% full_space PanHisto_form_no%+1 2d_target_is PanHisto_form_no%+1 PanHisto_interne_h% = PanHisto_form_size%(1) - 34 - 10 print_target_is PanHisto_form_no%+1 PanHisto_Y_legend$(1) = "essai" : ' ******* provisoire PanHisto_f_init% = 1 return
PanHisto_close: if PanHisto_f_init%=0 message "PanHisto n'est pas ouvert !" return else PanHisto_f_init% = 0 2d_target_is 0 print_target_is 0 delete PanHisto_form_no% end_if return PanHisto_draw: if PanHisto_f_init%=0 message "PanHisto n'est pas ouvert !" return end_if show PanHisto_form_no% PanHisto_interne_max = -9999999 PanHisto_interne_min = 9999999 for PanHisto_i%=0 to PanHisto_serie_count%-1 for PanHisto_j%=0 to PanHisto_serie_size%-1 if PanHisto_serie_values(PanHisto_i%,PanHisto_j%)>PanHisto_interne_max PanHisto_interne_max = PanHisto_serie_values(PanHisto_i%,PanHisto_j%) end_if if PanHisto_serie_values(PanHisto_i%,PanHisto_j%)<PanHisto_interne_min PanHisto_interne_min = PanHisto_serie_values(PanHisto_i%,PanHisto_j%) end_if next PanHisto_j% next PanHisto_i% PanHisto_interne_interval(0) = PanHisto_interne_max PanHisto_interne_interval(1) = 0 PanHisto_interne_interval(2) = PanHisto_interne_max if PanHisto_interne_min<0 PanHisto_interne_interval(0) = PanHisto_interne_interval(0) - PanHisto_interne_min PanHisto_interne_interval(1) = PanHisto_interne_min end_if if PanHisto_Y_delta=0 PanHisto_Y_delta = int((PanHisto_interne_interval(0))/10+0.5) end_if PanHisto_interne_y = PanHisto_Y_delta gosub PanHisto_interne_conversion PanHisto_Y_delta% = PanHisto_interne_y% if PanHisto_X_delta%=0 PanHisto_X_delta% = int((PanHisto_form_size%(0)-8-10)/(PanHisto_serie_size%+1)+0.5) end_if PanHisto_interne_bar_width% = int(PanHisto_X_delta%/(PanHisto_serie_count%+1)+0.5)
PanHisto_org_x% = 0 for PanHisto_i%=0 to 10 if text_width(PanHisto_Y_legend$(PanHisto_i%),PanHisto_form_no%+1)>PanHisto_org_x% PanHisto_org_x% = text_width(PanHisto_Y_legend$(PanHisto_i%),PanHisto_form_no%+1) end_if next PanHisto_i% PanHisto_org_x% = PanHisto_org_x% + 10
' dessiner l'axe vertical 2d_poly_from PanHisto_org_x%,10 2d_poly_to PanHisto_org_x%,PanHisto_interne_h% ' dessiner l'axe horizontal PanHisto_interne_y = 0 gosub PanHisto_interne_conversion PanHisto_org_y% = PanHisto_interne_y% 2d_poly_from PanHisto_org_x%-10,PanHisto_org_y% 2d_poly_to PanHisto_form_size%(0)-8-10,PanHisto_org_y% ' dessiner les tags verticaux if PanHisto_interne_interval(1)<0 PanHisto_interne_y = 0 while PanHisto_interne_y>PanHisto_interne_interval(1) PanHisto_interne_y = PanHisto_interne_y - PanHisto_y_delta gosub PanHisto_interne_conversion 2d_poly_from PanHisto_org_x%-5,PanHisto_interne_y% 2d_poly_to PanHisto_org_x% ,PanHisto_interne_y% print_locate 10,PanHisto_interne_y%-5 print str$(PanHisto_interne_y) end_while end_if if PanHisto_interne_interval(2)>0 PanHisto_interne_y = 0 while PanHisto_interne_y<PanHisto_interne_interval(2) PanHisto_interne_y = PanHisto_interne_y + PanHisto_y_delta gosub PanHisto_interne_conversion 2d_poly_from PanHisto_org_x%-5,PanHisto_interne_y% 2d_poly_to PanHisto_org_x% ,PanHisto_interne_y% print_locate 10,PanHisto_interne_y%-5 print str$(PanHisto_interne_y) end_while end_if ' dessiner les données for PanHisto_i%=0 to PanHisto_serie_count%-1 2d_pen_color 0,0,0 2d_fill_color PanHisto_serie_color%(PanHisto_i%,0),PanHisto_serie_color%(PanHisto_i%,1),PanHisto_serie_color%(PanHisto_i%,2) select PanHisto_type%(PanHisto_i%) case 1: ' BAR 2d_fill_color PanHisto_serie_color%(PanHisto_i%,0),PanHisto_serie_color%(PanHisto_i%,1),PanHisto_serie_color%(PanHisto_i%,2) PanHisto_interne_x% = PanHisto_org_x% + int(PanHisto_X_delta%/2+0.5)+PanHisto_i%*PanHisto_interne_bar_width% case 2: ' LINE 2d_pen_color PanHisto_serie_color%(PanHisto_i%,0),PanHisto_serie_color%(PanHisto_i%,1),PanHisto_serie_color%(PanHisto_i%,2) PanHisto_interne_x% = PanHisto_org_x% + int(PanHisto_X_delta%/2+0.5) case 3: ' POINT 2d_fill_color PanHisto_serie_color%(PanHisto_i%,0),PanHisto_serie_color%(PanHisto_i%,1),PanHisto_serie_color%(PanHisto_i%,2) PanHisto_interne_x% = PanHisto_org_x% + int(PanHisto_X_delta%/2+0.5) end_select for PanHisto_j%=0 to PanHisto_serie_size%-1 PanHisto_interne_y = PanHisto_serie_values(PanHisto_i%,PanHisto_j%) gosub PanHisto_interne_conversion select PanHisto_type%(PanHisto_i%) case 1: ' BAR 2d_rectangle PanHisto_interne_x%,PanHisto_interne_y%,PanHisto_interne_x%+PanHisto_interne_bar_width%,PanHisto_org_y% case 2: ' LINE if PanHisto_j%=0 2d_poly_from PanHisto_interne_x%,PanHisto_interne_y% else 2d_poly_to PanHisto_interne_x%,PanHisto_interne_y% 2d_circle PanHisto_interne_x%,PanHisto_interne_y%,3 end_if case 3: ' POINT 2d_circle PanHisto_interne_x%,PanHisto_interne_y%,3 end_select PanHisto_interne_x% = PanHisto_interne_x% + PanHisto_X_delta% next PanHisto_j% next PanHisto_i% ' dessiner les tags horizontaux 2d_pen_color 0,0,0 2d_fill_color 255,255,255 PanHisto_interne_x% = PanHisto_org_x% + int(PanHisto_X_delta%/2+0.5) for PanHisto_i%=0 to PanHisto_serie_size%-1 2d_poly_from PanHisto_interne_x%,PanHisto_org_y% 2d_poly_to PanHisto_interne_x%,PanHisto_org_y%+5 print_locate PanHisto_interne_x%,PanHisto_org_y%+7 print str$(PanHisto_i%+1) PanHisto_interne_x% = PanHisto_interne_x% + PanHisto_X_delta% next PanHisto_i%
return
' convertir la valeur PanHisto_interne_y en pixels PanHisto_interne_y% PanHisto_interne_conversion: PanHisto_interne_y% = int((PanHisto_interne_y-PanHisto_interne_interval(1))*(PanHisto_interne_h%-20)/PanHisto_interne_interval(0)+0.5) PanHisto_interne_y% = PanHisto_interne_h%-10-PanHisto_interne_y% return
ET voici le programme de test: Test_PanHisto.bas: - Code:
-
' test_PanHisto.bas
label labels : gosub labels gosub constantes gosub variables gosub donnees gosub menu gosub GUI gosub include_PanHisto gosub initialisations end
labels: label include_PanHisto label constantes, variables, donnees, menu, GUI, initialisations label open, close, draw return constantes: return
variables: dim no%, i%, j% dim no_memo%, no_open%, no_close%, no_draw%, no_combo% return
donnees: return
menu: return
GUI: no% = no% + 1 : button no% : top no%,10 : left no%,10 caption no%,"Ouvrir" : on_click no%,open : no_open% = no% no% = no% + 1 : button no% : top no%,10 : left no%,100 : inactive no% caption no%,"Fermer" : on_click no%,close : no_close% = no% no% = no% + 1 : button no% : top no%,10 : left no%,190 : inactive no% caption no%,"Histo" : on_click no%,draw : no_draw% = no% no% = no% + 1 : memo no% : top no%,60 : left no%,10 width no%,80 : height no%,200 : no_memo% = no% item_add no%,"10" item_add no%,"-20" item_add no%,"30" item_add no%,"20" item_add no%,"40" no% = no% + 1 : memo no% : top no%,60 : left no%,110 width no%,80 : height no%,200 item_add no%,"50" item_add no%,"60" item_add no%,"80" item_add no%,"40" item_add no%,"10" no% = no% + 1 : memo no% : top no%,60 : left no%,210 width no%,80 : height no%,200 item_add no%,"20" item_add no%,"50" item_add no%,"10" item_add no%,"70" item_add no%,"-10" no% = no% + 1 : combo no% : top no%,270 : left no%,10 width no%,80 : no_combo% = no% item_add no%,"BAR" item_add no%,"LINE" item_add no%,"POINT" text no%,"BAR" no% = no% + 1 : combo no% : top no%,270 : left no%,110 width no%,80 item_add no%,"BAR" item_add no%,"LINE" item_add no%,"POINT" text no%,"BAR" no% = no% + 1 : combo no% : top no%,270 : left no%,210 width no%,80 item_add no%,"BAR" item_add no%,"LINE" item_add no%,"POINT" text no%,"BAR"
return
initialisations: PanHisto_form_no% = no% + 1 return
open: PanHisto_form_size%(0)=600 PanHisto_form_size%(1)=500 PanHisto_form_caption$ = "Essai d'histogramme"
PanHisto_serie_count% = 3 PanHisto_serie_size% = 5
PanHisto_serie_color%(0,0)= 255 PanHisto_serie_color%(0,1)= 0 PanHisto_serie_color%(0,2)= 0 PanHisto_serie_color%(1,0)= 0 PanHisto_serie_color%(1,1)= 255 PanHisto_serie_color%(1,2)= 0 PanHisto_serie_color%(2,0)= 0 PanHisto_serie_color%(2,1)= 0 PanHisto_serie_color%(2,2)= 255
for i%=0 to 2 for j%=0 to count(no_combo%+i%) if text$(no_combo%+i%)=item_read$(no_combo%+i%,j%+1) PanHisto_type%(i%) = j%+1 exit_for end_if next j% next i%
for i%=0 to 2 for j%=0 to count(no_memo%)-1 PanHisto_serie_values(i%,j%) = val(item_read$(no_memo%+i%,j%+1)) next j% next i% gosub PanHisto_open if PanHisto_f_init%=1 inactive no_open% active no_close% active no_draw% end_if return
close: gosub PanHisto_close inactive no_close% inactive no_draw% active no_open% return
draw: gosub PanHisto_draw inactive no_draw% return
include_PanHisto: #INCLUDE "PanHisto.bas"
Dernière édition par Klaus le Jeu 12 Juil 2012 - 10:18, édité 1 fois | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Histogrammes barres et/ou camembert Jeu 12 Juil 2012 - 9:09 | |
| Intéressant... Juste une petite remarque en aparté: Je vois que tu utilises la même méthode que cosmos70 ( cf ici) pour ta librairie PanHisto.bas. Pour ma part je trouve que la méthode de DJ Peters ( voir ici) me parait plus "propre". En effet, faire des déclarations de procédure dans un bloc conditionnel (if 1=2...) ne me semble pas le meilleur endroit... | |
| | | Invité Invité
| Sujet: Re: Histogrammes barres et/ou camembert Jeu 12 Juil 2012 - 9:43 | |
| Bonjour, - Citation :
- Je vois que tu utilises la même méthode que cosmos70 (cf ici)
Je sais que cela fait bizarre, mais le programme n'est pas fini. Il me permet de manière simple, de ne pas être géné par toute la liste des objets lors de la construction du programme. J'atteind plus facilement les lignes de déclaration des labels et des dims. Une fois le programme terminé je remettrais les objets au dessus. J'aurai pu mettre un gosub, mais ça ne me disais rien de déclarer une étiquette juste pour du provisoir, même si c'est la méthode favorite de Klaus. moi à partir du moment que le programme fonctionne. Juste un détail, je bouleverse mon programme, et c'est pour cela que je ne publie pas de correction. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Histogrammes barres et/ou camembert Jeu 12 Juil 2012 - 10:20 | |
| Tu as raison, Nardo26. J'ai retiré les deux lignes. C'étaient en réalité des résidus de mes tests... | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Histogrammes barres et/ou camembert Jeu 12 Juil 2012 - 10:25 | |
| Du moment que ça marche... Pour rappel, DJ Peters faisait comme ceci : exemple de Librairie.bas: - Code:
-
LABEL Fin_lib ' en dessous il mettait la déclaration des libelles et des variables specifique à la librairie LABEL ProcX,ProcY,ProcZ,... DIM VarX,VarY,VarZ,... GOTO Fin_Lib : ' Le goto en fait, remplace le IF 1=2
' là il mettait ses procédures ProcX: ... RETURN ProcY: ... RETURN ProcZ: ... RETURN ... ' puis il finissait le fichier de librairie par son label de fin de librairie FinLib: Et donc au niveau de l'include, il le mettait tout en haut de son prog... - Code:
-
' debut du prog principal #include "librairie.bas" ...
C'est la même chose que le coup du test (if 1=2) mais fait à l'aide d'un goto... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Histogrammes barres et/ou camembert Jeu 12 Juil 2012 - 11:03 | |
| Si tu regardes bien, il n'y a plus le "if 1!2" ... Nouvelle version: On peut maintenant saisir des libellés pour les séries de données. Ils sont saisis dans les EDIT en-dessous de chaque liste de données. Si au moins 1 libellé est présent, un encart supplémentaire sera inséré à droite du graphique, avec un rappel de la couleur de la série et avec son libellé. PanHisto.bas: - Code:
-
' test_PanHisto.bas
label labels : gosub labels gosub constantes gosub variables gosub donnees gosub menu gosub GUI gosub include_PanHisto gosub initialisations end
labels: label include_PanHisto label constantes, variables, donnees, menu, GUI, initialisations label open, close, draw return constantes: return
variables: dim no%, i%, j% dim no_memo%, no_open%, no_close%, no_draw%, no_combo%, no_serleg% return
donnees: return
menu: return
GUI: no% = no% + 1 : button no% : top no%,10 : left no%,10 caption no%,"Ouvrir" : on_click no%,open : no_open% = no% no% = no% + 1 : button no% : top no%,10 : left no%,100 : inactive no% caption no%,"Fermer" : on_click no%,close : no_close% = no% no% = no% + 1 : button no% : top no%,10 : left no%,190 : inactive no% caption no%,"Histo" : on_click no%,draw : no_draw% = no% no% = no% + 1 : memo no% : top no%,60 : left no%,10 width no%,80 : height no%,200 : no_memo% = no% item_add no%,"10" item_add no%,"-20" item_add no%,"30" item_add no%,"20" item_add no%,"40" no% = no% + 1 : memo no% : top no%,60 : left no%,110 width no%,80 : height no%,200 item_add no%,"50" item_add no%,"60" item_add no%,"80" item_add no%,"40" item_add no%,"10" no% = no% + 1 : memo no% : top no%,60 : left no%,210 width no%,80 : height no%,200 item_add no%,"20" item_add no%,"50" item_add no%,"10" item_add no%,"70" item_add no%,"-10" no% = no% + 1 : combo no% : top no%,270 : left no%,10 width no%,80 : no_combo% = no% item_add no%,"BAR" item_add no%,"LINE" item_add no%,"POINT" text no%,"BAR" no% = no% + 1 : combo no% : top no%,270 : left no%,110 width no%,80 item_add no%,"BAR" item_add no%,"LINE" item_add no%,"POINT" text no%,"BAR" no% = no% + 1 : combo no% : top no%,270 : left no%,210 width no%,80 item_add no%,"BAR" item_add no%,"LINE" item_add no%,"POINT" text no%,"BAR" no% = no% + 1 : edit no% : top no%,300 : left no%,10 width no%,80 : no_serleg% = no% no% = no% + 1 : edit no% : top no%,300 : left no%,110 width no%,80 no% = no% + 1 : edit no% : top no%,300 : left no%,210 width no%,80
return
initialisations: PanHisto_form_no% = no% + 1 return
open: PanHisto_form_size%(0)=600 PanHisto_form_size%(1)=500 PanHisto_form_caption$ = "Essai d'histogramme"
PanHisto_serie_count% = 3 PanHisto_serie_size% = 5
PanHisto_serie_color%(0,0)= 255 PanHisto_serie_color%(0,1)= 0 PanHisto_serie_color%(0,2)= 0 PanHisto_serie_color%(1,0)= 0 PanHisto_serie_color%(1,1)= 255 PanHisto_serie_color%(1,2)= 0 PanHisto_serie_color%(2,0)= 0 PanHisto_serie_color%(2,1)= 0 PanHisto_serie_color%(2,2)= 255 PanHisto_serie_legend_width% = 0 for i%=0 to 2 PanHisto_serie_legend$(i%) = text$(no_serleg%+i%) next i%
for i%=0 to 2 for j%=0 to count(no_combo%+i%) if text$(no_combo%+i%)=item_read$(no_combo%+i%,j%+1) PanHisto_type%(i%) = j%+1 exit_for end_if next j% next i%
for i%=0 to 2 for j%=0 to count(no_memo%)-1 PanHisto_serie_values(i%,j%) = val(item_read$(no_memo%+i%,j%+1)) next j% next i% gosub PanHisto_open if PanHisto_f_init%=1 inactive no_open% active no_close% active no_draw% end_if return
close: gosub PanHisto_close inactive no_close% inactive no_draw% active no_open% return
draw: gosub PanHisto_draw inactive no_draw% return
include_PanHisto: #INCLUDE "PanHisto.bas"
Test_PanHisto.bas: - Code:
-
' PanHisto.bas if label("PanHisto_labels")=0 label PanHisto_labels : gosub PanHisto_labels gosub PanHisto_constantes gosub PanHisto_variables end_if return PanHisto_labels: label PanHisto_constantes label PanHisto_variables label PanHisto_open, PanHisto_close label PanHisto_draw label PanHisto_interne_conversion return PanHisto_constantes: return PanHisto_variables: ' variables d'interface dim PanHisto_form_size%(1) : ' 0=width 1=height dim PanHisto_form_no%, PanHisto_form_caption$ dim PanHisto_serie_count%, PanHisto_serie_size% dim PanHisto_serie_color%(4,2) : ' (,0)=R (,1)=G (,2)=B dim PanHisto_serie_values(4,49) dim PanHisto_serie_legend_width%, PanHisto_serie_legend$(4) dim PanHisto_type%(4) : ' 1=BAR 2=LINE 3=POINT dim PanHisto_y_delta, PanHisto_y_delta%, PanHisto_x_delta% dim PanHisto_Y_legend$(10) ' variables internes dim PanHisto_i%, PanHisto_j% dim PanHisto_interne_max,PanHisto_interne_min dim PanHisto_f_init%, PanHisto_org_x%, PanHisto_org_y% dim PanHisto_interne_y, PanHisto_interne_y%, PanHisto_interne_x% dim PanHisto_interne_interval(2) : ' (0)=longeur (1)=start (2)=end dim PanHisto_interne_h%, PanHisto_interne_bar_width%
return PanHisto_open: if PanHisto_f_init%=1 message "PanHisto est déjà ouvert !" return end_if for PanHisto_i%=0 to 2 if object_exists(PanHisto_form_no%+PanHisto_i%)=1 message "Impossible d'utiliser les numéros réservés !" return end_if next PanHisto_i% if (PanHisto_serie_count%<1) or (PanHisto_serie_count%>5) message "Nombre de séries invalide !" return end_if if (PanHisto_serie_size%<1) or (PanHisto_serie_size%>50) message "Taille des séries invalide !" return end_if
form PanHisto_form_no% : hide PanHisto_form_no% if PanHisto_form_size%(0)=0 PanHisto_form_size%(0) = width(PanHisto_form_no%) else width PanHisto_form_no%, PanHisto_form_size%(0) end_if if PanHisto_form_size%(1)=0 PanHisto_form_size%(1) = height(PanHisto_form_no%) else height PanHisto_form_no%, PanHisto_form_size%(1) end_if left PanHisto_form_no%,(screen_x-PanHisto_form_size%(0))/2 top PanHisto_form_no%,(screen_y-PanHisto_form_size%(1))/2 if PanHisto_form_caption$=""then PanHisto_form_caption$ = "PanHisto" caption PanHisto_form_no%,PanHisto_form_caption$ picture PanHisto_form_no%+1 : parent PanHisto_form_no%+1,PanHisto_form_no% full_space PanHisto_form_no%+1 if PanHisto_serie_legend_width%=0 for PanHisto_i%=0 to 4 if text_width(PanHisto_serie_legend$(PanHisto_i%),PanHisto_form_no%+1)>PanHisto_serie_legend_width% PanHisto_serie_legend_width% = text_width(PanHisto_serie_legend$(PanHisto_i%),PanHisto_form_no%+1) end_if next PanHisto_i% if PanHisto_serie_legend_width%>0 then PanHisto_serie_legend_width% = PanHisto_serie_legend_width% + 20 end_if if PanHisto_serie_legend_width%>0 width PanHisto_form_no%+1, width(PanHisto_form_no%+1) - PanHisto_serie_legend_width% - 5 picture PanHisto_form_no%+2 : parent PanHisto_form_no%+2,PanHisto_form_no% height PanHisto_form_no%+2, height(PanHisto_form_no%+1) width PanHisto_form_no%+2, width(PanHisto_form_no%)-width(PanHisto_form_no%+1)-8-5 left PanHisto_form_no%+2, width(PanHisto_form_no%+1)+5 end_if 2d_target_is PanHisto_form_no%+1 PanHisto_interne_h% = PanHisto_form_size%(1) - 34 - 10 print_target_is PanHisto_form_no%+1 PanHisto_f_init% = 1 return
PanHisto_close: if PanHisto_f_init%=0 message "PanHisto n'est pas ouvert !" return else PanHisto_f_init% = 0 2d_target_is 0 print_target_is 0 delete PanHisto_form_no% end_if return PanHisto_draw: if PanHisto_f_init%=0 message "PanHisto n'est pas ouvert !" return end_if show PanHisto_form_no% PanHisto_interne_max = -9999999 PanHisto_interne_min = 9999999 for PanHisto_i%=0 to PanHisto_serie_count%-1 for PanHisto_j%=0 to PanHisto_serie_size%-1 if PanHisto_serie_values(PanHisto_i%,PanHisto_j%)>PanHisto_interne_max PanHisto_interne_max = PanHisto_serie_values(PanHisto_i%,PanHisto_j%) end_if if PanHisto_serie_values(PanHisto_i%,PanHisto_j%)<PanHisto_interne_min PanHisto_interne_min = PanHisto_serie_values(PanHisto_i%,PanHisto_j%) end_if next PanHisto_j% next PanHisto_i% PanHisto_interne_interval(0) = PanHisto_interne_max PanHisto_interne_interval(1) = 0 PanHisto_interne_interval(2) = PanHisto_interne_max if PanHisto_interne_min<0 PanHisto_interne_interval(0) = PanHisto_interne_interval(0) - PanHisto_interne_min PanHisto_interne_interval(1) = PanHisto_interne_min end_if if PanHisto_Y_delta=0 PanHisto_Y_delta = int((PanHisto_interne_interval(0))/10+0.5) end_if PanHisto_interne_y = PanHisto_Y_delta gosub PanHisto_interne_conversion PanHisto_Y_delta% = PanHisto_interne_y% if PanHisto_X_delta%=0 PanHisto_X_delta% = int(width(PanHisto_form_no%+1)/(PanHisto_serie_size%+1)+0.5) end_if PanHisto_interne_bar_width% = int(PanHisto_X_delta%/(PanHisto_serie_count%+1)+0.5)
PanHisto_org_x% = 30
' dessiner l'axe vertical 2d_poly_from PanHisto_org_x%,10 2d_poly_to PanHisto_org_x%,PanHisto_interne_h% ' dessiner l'axe horizontal PanHisto_interne_y = 0 gosub PanHisto_interne_conversion PanHisto_org_y% = PanHisto_interne_y% 2d_poly_from PanHisto_org_x%-10,PanHisto_org_y% 2d_poly_to width(PanHisto_form_no%+1)-10,PanHisto_org_y%
' dessiner les tags verticaux if PanHisto_interne_interval(1)<0 PanHisto_interne_y = 0 while PanHisto_interne_y>PanHisto_interne_interval(1) PanHisto_interne_y = PanHisto_interne_y - PanHisto_y_delta gosub PanHisto_interne_conversion 2d_poly_from PanHisto_org_x%-5,PanHisto_interne_y% 2d_poly_to PanHisto_org_x% ,PanHisto_interne_y% print_locate 10,PanHisto_interne_y%-5 print str$(PanHisto_interne_y) end_while end_if if PanHisto_interne_interval(2)>0 PanHisto_interne_y = 0 while PanHisto_interne_y<PanHisto_interne_interval(2) PanHisto_interne_y = PanHisto_interne_y + PanHisto_y_delta gosub PanHisto_interne_conversion 2d_poly_from PanHisto_org_x%-5,PanHisto_interne_y% 2d_poly_to PanHisto_org_x% ,PanHisto_interne_y% print_locate 10,PanHisto_interne_y%-5 print str$(PanHisto_interne_y) end_while end_if ' dessiner les données for PanHisto_i%=0 to PanHisto_serie_count%-1 2d_pen_color 0,0,0 2d_fill_color PanHisto_serie_color%(PanHisto_i%,0),PanHisto_serie_color%(PanHisto_i%,1),PanHisto_serie_color%(PanHisto_i%,2) select PanHisto_type%(PanHisto_i%) case 1: ' BAR 2d_fill_color PanHisto_serie_color%(PanHisto_i%,0),PanHisto_serie_color%(PanHisto_i%,1),PanHisto_serie_color%(PanHisto_i%,2) PanHisto_interne_x% = PanHisto_org_x% + int(PanHisto_X_delta%/2+0.5)+PanHisto_i%*PanHisto_interne_bar_width% case 2: ' LINE 2d_pen_color PanHisto_serie_color%(PanHisto_i%,0),PanHisto_serie_color%(PanHisto_i%,1),PanHisto_serie_color%(PanHisto_i%,2) PanHisto_interne_x% = PanHisto_org_x% + int(PanHisto_X_delta%/2+0.5) case 3: ' POINT 2d_fill_color PanHisto_serie_color%(PanHisto_i%,0),PanHisto_serie_color%(PanHisto_i%,1),PanHisto_serie_color%(PanHisto_i%,2) PanHisto_interne_x% = PanHisto_org_x% + int(PanHisto_X_delta%/2+0.5) end_select for PanHisto_j%=0 to PanHisto_serie_size%-1 PanHisto_interne_y = PanHisto_serie_values(PanHisto_i%,PanHisto_j%) gosub PanHisto_interne_conversion select PanHisto_type%(PanHisto_i%) case 1: ' BAR 2d_rectangle PanHisto_interne_x%,PanHisto_interne_y%,PanHisto_interne_x%+PanHisto_interne_bar_width%,PanHisto_org_y% case 2: ' LINE if PanHisto_j%=0 2d_poly_from PanHisto_interne_x%,PanHisto_interne_y% else 2d_poly_to PanHisto_interne_x%,PanHisto_interne_y% 2d_circle PanHisto_interne_x%,PanHisto_interne_y%,3 end_if case 3: ' POINT 2d_circle PanHisto_interne_x%,PanHisto_interne_y%,3 end_select PanHisto_interne_x% = PanHisto_interne_x% + PanHisto_X_delta% next PanHisto_j% next PanHisto_i% ' dessiner les tags horizontaux 2d_pen_color 0,0,0 2d_fill_color 255,255,255 PanHisto_interne_x% = PanHisto_org_x% + int(PanHisto_X_delta%/2+0.5) for PanHisto_i%=0 to PanHisto_serie_size%-1 2d_poly_from PanHisto_interne_x%,PanHisto_org_y% 2d_poly_to PanHisto_interne_x%,PanHisto_org_y%+5 print_locate PanHisto_interne_x%,PanHisto_org_y%+7 print str$(PanHisto_i%+1) PanHisto_interne_x% = PanHisto_interne_x% + PanHisto_X_delta% next PanHisto_i% ' dessiner les légendes des séries if PanHisto_serie_legend_width%>0 2d_target_is PanHisto_form_no%+2 print_target_is PanHisto_form_no%+2 for PanHisto_i%=0 to PanHisto_serie_count%-1 2d_fill_color PanHisto_serie_color%(PanHisto_i%,0),PanHisto_serie_color%(PanHisto_i%,1),PanHisto_serie_color%(PanHisto_i%,2) 2d_rectangle 5,5+PanHisto_i%*50,PanHisto_serie_legend_width%-5,15+PanHisto_i%*50 2d_fill_color 255,255,255 print_locate 5,20+PanHisto_i%*50 print PanHisto_serie_legend$(PanHisto_i%) next PanHisto_i% end_if
return
' convertir la valeur PanHisto_interne_y en pixels PanHisto_interne_y% PanHisto_interne_conversion: PanHisto_interne_y% = int((PanHisto_interne_y-PanHisto_interne_interval(1))*(PanHisto_interne_h%-20)/PanHisto_interne_interval(0)+0.5) PanHisto_interne_y% = PanHisto_interne_h%-10-PanHisto_interne_y% return
C'est sympa de pouvoir faire cela en Panoramic pur, sans DLL, non ? | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: RE Jeu 12 Juil 2012 - 12:33 | |
| Ouahou !.....
Je n'ai pas eu le temps de tester la version 1 que tu en es à la version 2 voir 3
Là j'ai un message : Out of memory | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| | | | Severin
Nombre de messages : 547 Localisation : Braunschweig / Germany Date d'inscription : 13/12/2010
| Sujet: Re: Histogrammes barres et/ou camembert Jeu 12 Juil 2012 - 20:14 | |
| @ Klaus keine Möglichkeit diese Programme zu starten. Severin Bei PanHisto gefriert der Bildschirm und wenn sich der Bildschirm erholt hat "out of memory" bei test_PanHisto fehler gosub Linie 7 Fehler gefunden': PanHisto ruft sich selbst auf!!! Schönes programm, geht das auch als ein komplett programm? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Histogrammes barres et/ou camembert Jeu 12 Juil 2012 - 21:41 | |
| @Severin: Verstehe Dein Problem nicht. - In Test_PanHisto.bas, Zeile 7 ist: "gosub menu", und das entsprechende Unterprogramm enthält nut ein Return... - Der Bildschirm gefriert ? Bei mir nicht.
Gebrauchsanweisung: - Copiere Test_PanHisto.bas und PanHisto.bas in den selben Ordner. - Starte Test_PanHisto.bas. - Klick auf button "Ouvrir" (Öffnen) - Klick auf button "Histo" ==> das Histogramm wird angezeigt - Klick auf button "Fermer" (Schliesses) ==> das Histogramm verschwindet, und der button "Ouvrir" ist wieder aktif
Man kann jetzt die Parameter ändern, andere Werte eingeben, den Histogramm-Typ für jéde Datenfolge getrennt einstellen, und auch Labels für jede Datenfolge eingeben. Anschliessend wieder auf "Ouvrir" klicken, danach auf "Histo" ==> das Histogramm erscheint und passt sich den neuen Werten an.
Augenblickliche Grenzen (in PanHisto fest kodiert, aber leicht abänderbar): bis zu 5 Datenfolgen (von 0 bis 4) Die Datenfolgen haben bis zu 50 Werte (von 0 bis 49) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Histogrammes barres et/ou camembert Jeu 12 Juil 2012 - 21:55 | |
| @Ygeronimi: je te donne aussi les limites actuelles du programme, qui sont codées en dur dans PanHisto.bas (mais modifiables facilement): jusqu'à 5 séries de données (de 0 à 4) les séries peuvent avoir jusqu'à 50 valeurs (de 0 à 49) Effectivement, si le nombre de valeurs grandir, le graphe se rétrécit Le programme adapte automatiquement la largeur de chaque barre à la largeur de la fenêtre: - Code:
-
PanHisto_form_size%(0)=600 PanHisto_form_size%(1)=500 avec indice 0 pour la largeur. En mode ligne ou en mode point, cela devrait être beaucoup plus intéressant, si le nombre de valeurs grandit. Ceci dit, pour le moment, c'est une maquette. Les graphismes fonctionnent, le dimensionnement automatique également, l'ajustement pour les libellés des séries aussi. Je te donne la To-DO-List que j'ai actuellement: - ajouter des libelles de l'axe horizontal - rendre le nombre de séries et le nombre de données par série paramétrable et donner des possibilités de tailles importantes - faire un paramétrage séparé de la taille du graphe , indépendant de la taille de la fenêtre d'affichage - faire des barres automatiques de défilement verticaux et horizontaux, si le graphe ne tient pas dans la fenêtre déterminée Ce sont les deux derniers points qui te permettront d'utiliser ce module avec des séries longues. Pour le moment, le programme est une sorte de maquette, une étude de faisabilité technique, et d'une certaine manière un sondage pour voir s'il y a un intérêt pour ce genre d'outils. | |
| | | Severin
Nombre de messages : 547 Localisation : Braunschweig / Germany Date d'inscription : 13/12/2010
| Sujet: Re: Histogrammes barres et/ou camembert Jeu 12 Juil 2012 - 21:55 | |
| Ich hatte schon berichtet "PanHisto" ruft sich selbst auf. Habe es bereinigt und es läuft. Severin | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Histogrammes barres et/ou camembert Jeu 12 Juil 2012 - 21:59 | |
| @Tous: Pour éviter des problèmes de version, comme ceux rencontrés par Ygeronimi, j'ai placé les 2 modules dans mon WebDav, dont je rappelle les coordonnées ici: Site: http://www.mydrive.ch/Identifiant: panoramic@klausgunther Mot de passe: panoramic123 Dossier: PanHisto Ce dossier sera systématiquement tenu à jour. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 12 Juil 2012 - 22:31 | |
| @ Klaus, J'ai commencé à penser ( inutile de rire ) pour GDF Suez v0.1 où j'avais entamé le dessin d'un histogramme de type "lignes". Je me suis confronté à un problème de taille du dessin qui devenait plus grand que la fenêtre en fonction du nombre de données et comme il n'y a pas d'option bar sur un scene2d....je te laisse imaginer la suite. Alors, il m'est venu l'idée , que je n'ai pas essayé avec la prise en main de histo.dll , de créer un fichier bmp de taille variable en fonction du nombre de données puis de le placé dans un sprite qui lui serait déplacé de droite à gauche par une barre de la largeur du scene2d. MAIS HEUREUSEMENT ..... ....KLAUS EST ARRIVE E E et tu m'as sauvé de quelques dizaines, voir plus, de lignes de code avec histo.dll | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Histogrammes barres et/ou camembert Jeu 12 Juil 2012 - 22:52 | |
| @Ygeronimi: Je vois bien le genre de dilemme auquel tu t'es heurté. Bon, Histo.dll règle cet aspect, et tant mieux. Car l'idée su sprite, c'était bien tenté, mais irréalisable: un sprite fait au maximum 200x200 pixels... Pour PanHisto, je suis en train d'implémenter exactement cela: une scroll_bar horizontale pour pouvoir défiler le picture. Je vais placer l'axe vertical dans une zone fixe à gauche, avec ses taquets et libellés, et laisser défiler le graphe lui-même horizontalement en_dessous de cette zone, de sorte à avoir toujours les références verticales à l'écran. je définis ma propre zone de scrolling dans le picture d'affichage. Nouvelle version: j'ai défini deux pseudo-constantes: - Code:
-
' nombre maxi de séries possibles (base 0) dim PanHisto_const_serie_max% : PanHisto_const_serie_max% = 4 : ' 0...4 ' nombre maxi de données dans une série (base 0) dim PanHisto_const_serie_max_values% : PanHisto_const_serie_max_values% = 49 : ' 0...49
qui permettent d'ajuster le nombre maxi de séries et de données par série. Et j'ai ajouté une documentation complète dans le module PanHisto.bas, avec l'explication de chaque variable d'interface, de chacune des 3 routines appelables de l'extérieur, et un guide détaillé d'intégration du module. Ca devrait aider... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 12 Juil 2012 - 23:12 | |
| @ Klaus ,
Une autre chose est peut être possible , reste à voir le rendu visuel , si c'est pas trop désagréable à l'oeil mais là , exit le problème du nombre de données .
on bloque l'affichage sur 12 données par exemple ( 1/mois pour ce qui concerne un relevé de compteur gaz ou edf ) on stock les données dans un dlist
affichage du graph avec les 12 premières données avec la scroll bar si +1 on ré initialise le graph en partant de la ligne à la ligne 13 et on affiche avec la scroll bar à -1 on fait l'inverse
( heu...je crois que l'on pense à la même chose finalement)
mais j'ai peur du scintillement du à la réinitialisation du graph | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Histogrammes barres et/ou camembert Jeu 12 Juil 2012 - 23:51 | |
| Presque, mais pas tout à fait. Ce que je suis en train de faire, c'est la chose suivante: - je crée un picture pour le graphe, suffisamment large pour tout contenir avec une présentation visuelle lisible - par la scroll_bar, je modifie la propriété LEFT de ce picture, qui de ce fait défile sans aucun scintillement.
C'est en cours... | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Histogrammes barres et/ou camembert Ven 13 Juil 2012 - 6:42 | |
| J'avais rencontré le même problème avec la représentation graphique des arbres AVL et j'en étais arrivé à la même conclusion... un bon picture !! y'a qu'ça de vrai !! Enfin presque, j'avais fais une sorte de bascule avec un buffer pour construire mon image, puis je l'affichais une fois terminé. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Histogrammes barres et/ou camembert Ven 13 Juil 2012 - 19:39 | |
| J'ai mis une nouvelle version en ligne.
Cette version permet d'avoir un nombre de données par série beaucoup plus important, sans être limité par la taille de l'affichage. Il y a maintenant la notion de "largeur minimale" d'une barre, qui est gérée par la variable interface PanHisto_min_bar_width%. Si sa valeur est zéro, le programme utilise 5 pixels par défaut. Aucune barre ne peut être plus étroite que cette valeur. Si tel serait le cas en essayant de comprimer le graphique dans l'espace disponible du picture, celui-ci sera automatiquement étendu horizontalement, pour accueillir le graphe complet. Il y a alors une barre de défilement en-dessous du graphe qui permet de le décaler horizontalement. Le graphe glissera sous la fenêtre contenant l'axe vertical et sous celle avec les légendes des séries.
EDIT
Petite correction du placement des taquets de l'axe horizontal, et ajustement de la dimension verticale de la fenêtre de visualisation. | |
| | | Contenu sponsorisé
| Sujet: Re: Histogrammes barres et/ou camembert | |
| |
| | | | Histogrammes barres et/ou camembert | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |