source: spip-zone/_plugins_/jpgraph/jpgraph_fonctions.php @ 32400

Last change on this file since 32400 was 32400, checked in by olivier.gautier@…, 11 years ago

On complète les possibilités de personnalisation du modèle "courbe".
On peut désormais :

  • définir des marqueurs (forme, taille, couleur de contour et couleur de fond)
  • définir la couleur de fond
  • définir un dégradé de 2 couleurs comme couleur de fond
  • afficher la courbe en marches (lignes verticales et horizontales)

Au passage, on limite la hauteur et largeur à 1600px pour ne pas faire planter les serveurs.
Je pense qu'on pourra réduire encore... ?

File size: 6.5 KB
Line 
1<?php
2
3if (!defined('_DIR_LIB')) define('_DIR_LIB', _DIR_RACINE . 'lib/');
4define('_DIR_JPGRAPH_LIB', _DIR_LIB . 'jpgraph-3.0.6/');
5
6
7//
8// cree un hash unique
9// (a ameliorer activer le cache de jpgraph ou celui de spip ?)
10function jpgraph_name_hash($type="graph",$largeur,$hauteur,$donnee) {
11    // repertoire IMG/jpgraph dispo ?
12    if (!is_dir(_DIR_IMG."jpgraph/")) {                                     
13                   if (!mkdir (_DIR_IMG."jpgraph/", 0777)) // on essaie de le creer 
14                        spip_log("plugin jgraph: impossible de creer le reperoitre image");
15    }
16
17    // creer le nom unique
18    $donnee[] = $largeur;
19    $donnee[] = $hauteur;
20    $hash = md5(serialize($donnee));
21    return _DIR_IMG."jpgraph/$type-$hash.png";
22}
23
24function jpgraph_nom_marqueur($nom) {
25       
26}
27
28//
29// filtre pour creer des courbes simples
30//
31function filtre_jpgraph($str,
32        $type_graphe="courbe",
33        $donnee="",
34        $legende="",
35        $largeur=400,
36        $hauteur=300,
37        $titre="",
38        $couleur="orange",
39        $couleur_fond="",
40        $fond_degrade="",
41        $epaisseur="",
42        $marqueur_forme="",
43        $marqueur_couleur="",
44        $marqueur_epaisseur="",
45        $marqueur_couleur_fond="",
46        $style=""){
47   
48    // traiter les donnees
49    $type_graphe = strtolower(trim($type_graphe));  // pour pb avec les modeles si du blanc en fin de ligne
50    $couleur = trim($couleur);
51    $couleur_fond = trim($couleur_fond);
52    $epaisseur = (int) $epaisseur;
53    $marqueur_forme = trim($marqueur_forme);
54    $marqueur_couleur=trim($marqueur_couleur);
55    $marqueur_epaisseur=(int) $marqueur_epaisseur;
56    $marqueur_couleur_fond = trim($marqueur_couleur_fond);
57    $style = trim ($style);
58   
59    $donnee =  explode(";", $donnee);   
60    foreach ($donnee as $key => $value)
61         $donnee[$key] = (float) $value;   
62    if (count($donnee)<2) 
63        $donnee[] = "1";   // securite pour empecher les erreurs si donnnee pas renseigne 
64   
65    if ($fond_degrade) {
66        $fond_degrade = explode(";", $fond_degrade);
67        foreach ($fond_degrade as $key => $value) $fond_degrade[$key] = trim($value);
68        if (count($fond_degrade)<2) {
69                $fond_degrade[0]='white@0.5';
70                $fond_degrade[1]='orange@0.5';
71        }
72    }
73   
74    $legende =  explode(";", $legende); 
75    foreach ($legende as $key => $value) 
76            $legende[$key] = utf8_decode($value);
77    $largeur = (int) $largeur;    if (($largeur<=0) OR ($largeur>1600)) $largeur = 400;
78    $hauteur = (int) $hauteur;    if (($hauteur<=0) OR ($hauteur>1600)) $hauteur = 300;
79   
80    // retrouver jpgraph
81        $cwd = getcwd();
82        chdir(realpath(_DIR_JPGRAPH_LIB));
83    require_once ('src/jpgraph.php');
84    switch($type_graphe) {
85        case "courbe":      require_once ('src/jpgraph_line.php'); break;
86        case "barre":       require_once ('src/jpgraph_bar.php');  break;
87        case "camembert":   require_once ('src/jpgraph_pie.php');  break;
88        default:            $type_graphe = "courbe";
89                            require_once ('src/jpgraph_line.php'); 
90                            break;       
91    }
92    chdir($cwd);
93   
94   
95    // creation du graphe
96    switch($type_graphe) {
97        case "courbe":      $graph = new Graph($largeur,$hauteur);
98                            $graph->SetScale('textlin');
99                            // Create the linear plot
100                            $plot=new LinePlot($donnee);
101                            $plot->SetColor($couleur);
102                            if ($style=='marches') $plot->SetStepStyle();
103                            if ($fond_degrade) $plot->SetFillGradient($fond_degrade[0],$fond_degrade[1]);
104                            if ($couleur_fond) $plot->SetFillColor($couleur_fond);
105                            if ($epaisseur) $plot->SetWeight($epaisseur);
106                            if ($marqueur_forme) {
107                            switch($marqueur_forme) {
108                                case 'carre': $plot->mark->SetType(MARK_SQUARE); break;
109                                case 'triangle': $plot->mark->SetType(MARK_UTRIANGLE); break;
110                                case 'triangle_bas': $plot->mark->SetType(MARK_DTRIANGLE); break;
111                                case 'losange': $plot->mark->SetType(MARK_DIAMOND); break;
112                                case 'cercle': $plot->mark->SetType(MARK_CIRCLE); break;
113                                case 'cercle_plein': $plot->mark->SetType(MARK_FILLEDCIRCLE); break;
114                                case 'croix': $plot->mark->SetType(MARK_CROSS); break;
115                                case 'croix_x': $plot->mark->SetType(MARK_X); break;
116                                case 'etoile': $plot->mark->SetType(MARK_STAR); break;
117                                default: $plot->mark->SetType(MARK_SQUARE); break;
118                        }
119                            if ($marqueur_couleur) $plot->mark->SetColor($marqueur_couleur);
120                            if ($marqueur_couleur_fond) $plot->mark->SetFillColor($marqueur_couleur_fond);
121                            if ($marqueur_epaisseur)$plot->mark->SetWidth($marqueur_epaisseur);
122                            }
123                           
124                            // titre & legende
125                            $graph->title->Set(utf8_decode($titre));
126                            if (count($legende)>1) 
127                                $graph->xaxis->SetTickLabels($legende); 
128                            break;
129                           
130        case "barre":       $graph = new Graph($largeur,$hauteur);
131                            $graph->SetScale('textlin');
132                            // Create the linear plot
133                            $plot = new BarPlot($donnee);
134                            $plot->SetFillColor($couleur);   
135                            // titre & legende
136                            $graph->title->Set(utf8_decode($titre));
137                            if (count($legende)>1)
138                                $graph->xaxis->SetTickLabels($legende);                                                     
139                            break;
140                           
141         case "camembert":  $graph = new PieGraph($largeur,$hauteur);   
142                            // Create the linear plot
143                            $plot = new PiePlot($donnee);
144                            $plot->SetTheme("earth");   
145                            // titre & legende
146                            $graph->title->Set(utf8_decode($titre));
147                            if (count($legende)>1) 
148                                $plot->SetLegends($legende);       
149                            break;
150    }
151   
152    // Attacher le trace au graph
153    $graph->Add($plot); 
154   
155    // export du graphe dans un fichier   
156    $filename = jpgraph_name_hash($type_graphe,$largeur,$hauteur,$donnee);
157    @unlink($filename); // http://jpgraph.intellit.nl/index.php?topic=4547.msg11823
158    $graph->Stroke($filename);
159   
160    $titre = str_replace("'","&#039",$titre);
161    return "<span class='spip_documents jgraph'><img src='$filename' alt='$titre' width='$largeur' height='$hauteur' /></span>";
162
163}
164
165
166?>
Note: See TracBrowser for help on using the repository browser.