Calculettes pour l'hydraulique
dessinSection.class.php
Aller à la documentation de ce fichier.
1 <?php
2 /*
3  * hydraulic/inc_hyd/dessinSection.class.php
4  *
5  *
6  *
7  * Copyright 2012 Médéric Dulondel, David Dorchies <dorch@dorch.fr>
8  *
9  *
10  *
11  * This program is free software; you can redistribute it and/or modify
12  *
13  * it under the terms of the GNU General Public License as published by
14  *
15  * the Free Software Foundation; either version 2 of the License, or
16  *
17  * (at your option) any later version.
18  *
19  *
20  *
21  * This program is distributed in the hope that it will be useful,
22  *
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  *
25  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26  *
27  * GNU General Public License for more details.
28  *
29  *
30  *
31  * You should have received a copy of the GNU General Public License
32  *
33  * along with this program; if not, write to the Free Software
34  *
35  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
36  *
37  * MA 02110-1301, USA.
38  *
39  */
40 
41 /**
42  * Classe pour l'affichage du dessin des sections
43  *
44  * @date 10/04/2012
45  * @author Médéric Dulondel, David Dorchies
46  *
47  */
49  private $hauteurDessin; // Hauteur du dessin en px
50  private $largeurDessin; // Largeur du dessin en px
51  private $marges; // Marge à gauche et à droite du dessin pour le texte
52  private $mesCouleurs = array('red', 'blue', 'orange', 'green', 'grey', 'black', 'DarkMagenta ', 'cyan'); // Couleur des différentes lignes
53  private $sectionClass;
54  private $donnees = array();
55  private $rValMax = 0; // Hauteur maxi en m à figurer dans le dessin
56  private $rSnXmax = 0; // Largeur maximum en m à figurer dans le dessin
57 
58  function __construct($hauteur, $largeur, $marges, &$section, $lib_data) {
59  $this->hauteurDessin = (real) $hauteur;
60  $this->largeurDessin = (real) $largeur - $marges*2;
61  $this->marges = (real) $marges;
62  $this->sectionClass = &$section;
63  $this->donnees = $lib_data;
64  // On détermine la valeur la plus grande dans le tableau
65  foreach($this->donnees as $val){
66  if($val > $this->rValMax){
67  $this->rValMax = $val;
68  }
69  }
70  //spip_log($this,'hydraulic.'._LOG_DEBUG);
71  }
72 
73  /**
74  * Rajoute une ligne à notre dessin.
75  * $color correspond à la couleur de la ligne
76  * $y correspond à l'ordonnée exprimée en pixel de la ligne
77  */
78  function AddRow($color, $y){
79  $gauche = $this->marges;
80  $droite = round($gauche + $this->largeurDessin);
81  $y = round($y);
82  $ligneDessin = "
83  cx.strokeStyle = \"$color\";
84  cx.beginPath();
85  cx.moveTo($gauche, $y);
86  cx.lineTo($droite, $y);
87  cx.stroke();";
88  return $ligneDessin;
89  }
90 
91  /**
92  * Convertit un tirant d'eau en mètre en une ordonnée en pixels
93  */
94  private function GetDessinY($val) {
95  // La valeur maximum de l'échelle en px correspondant à 10% de la hauteur afin de faire plus propre
96  return round($this->hauteurDessin * (1- 0.9*$val/$this->rValMax), 1)-2;
97  }
98 
99  /**
100  * Convertit une largeur en mètre en une abscisse en pixels
101  * @param $Axe détermine si le pixel est à droite (1) ou à gauche (-1) de l'axe de symétrie
102  * @return Abscisse en pixel à dessiner
103  */
104  private function GetDessinX($val,$Axe) {
105  return $this->marges + round(($this->largeurDessin-14) * (1/2 + $Axe*$val/$this->SnXmax), 1)+7;
106  }
107 
108  /**
109  * Transforme le tableau de tirants d"eau et charges à afficher en pixel + attribution des couleurs
110  */
111  function transformeValeur($tabDonnees) {
112  // On transforme nos valeurs en leur attribuant la valeur en pixel et une couleur qui leur est associé
113  $result = array();
114  $couleur = 0;
115  foreach($tabDonnees as $cle=>$valeur){
116  $result[$cle][] = $this->GetDessinY($valeur);
117  $result[$cle][] = $this->mesCouleurs[$couleur];
118  $couleur++;
119  }
120 
121  asort($result);
122 
123  return $result;
124  }
125 
126  // Retourne le dessin de la section
127  function GetDessinSection() {
128  // On transforme nos valeurs en pixels
129  $mesDonnees = $this->transformeValeur($this->donnees);
130 
131  // Hauteur dessin - Hauteur de berge, en format pixels
132  $diffHautBerge = $mesDonnees['rYB'][0];
133 
134  // On définit le style de notre dessin
135  $dessin = '<canvas id="cvsSection" width="'.($this->largeurDessin+2*$this->marges).'" height="'.$this->hauteurDessin.'"></canvas>';
136 
137  // On créé la base de notre dessin de section
138  $dessin.= '
139  <script type="text/javascript">
140  var cx = document.getElementById("cvsSection").getContext("2d");
141  cx.strokeStyle = "black";';
142  // Récupération des coordonnées de la section à dessiner
143  $tCoordSn = $this->sectionClass->DessinCoordonnees();
144 
145  // Détermination de la largeur max de la section
146  $this->SnXmax = max($tCoordSn['x'])*2;
147 
148  // Dessin des verticales au dessus des berges
149  $LargeurBerge = $this->sectionClass->CalcGeo('B')/2;
150  $xBergeGauche = $this->GetDessinX($LargeurBerge,-1);
151  $xBergeDroite = $this->GetDessinX($LargeurBerge,1);
152  $dessin.= "
153  cx.setLineDash([5]);
154  cx.beginPath();
155  cx.moveTo($xBergeGauche, 0);
156  cx.lineTo($xBergeGauche, $diffHautBerge);
157  cx.moveTo($xBergeDroite, 0);
158  cx.lineTo($xBergeDroite, $diffHautBerge);
159  cx.stroke();
160  cx.setLineDash([]);";
161 
162  // Dessin de la section
163  $tSnX = array();
164  $tSnY = array();
165  // Parcours des points à gauche
166  for($i=count($tCoordSn['x'])-1; $i>=0; $i-=1) {
167  $tSnX[] = $this->GetDessinX($tCoordSn['x'][$i],-1);
168  $tSnY[] = $this->GetDessinY($tCoordSn['y'][$i]);
169  }
170  // Parcours des points à droite
171  for($i=0; $i<count($tCoordSn['x']); $i++) {
172  $tSnX[] = $this->GetDessinX($tCoordSn['x'][$i],1);
173  $tSnY[] = $this->GetDessinY($tCoordSn['y'][$i]);
174  }
175  $dessin .= sprintf('
176  cx.lineWidth = 4;
177  cx.beginPath();
178  cx.moveTo(%d,%d);',$tSnX[0],$tSnY[0]);
179  for($i=1; $i<count($tSnX); $i++) {
180  $dessin .= sprintf('
181  cx.lineTo(%d,%d);',$tSnX[$i],$tSnY[$i]);
182  }
183  $dessin .= '
184  cx.stroke();
185  cx.lineWidth = 1.0;';
186 
187  // Affichage des valeurs pour chaque trait
188  $dessin .= '
189  cx.font = "12px sans-serif";';
190  $bDroiteGauche = true; // Pour alterner le placement des libellés
191  // On rajoute les différents libelles avec la couleur qui va bien
192  foreach($mesDonnees as $cle=>$valeur){
193  if($cle != 'rYB'){
194  list($y,$color) = $valeur;
195  // Ajout du trait
196  $dessin .= $this->AddRow($color, $y);
197  // Ajout du texte
198  $dessin .= '
199  cx.fillStyle = "'.$color.'";
200  cx.textAlign="'.((!$bDroiteGauche)?'left':'right').'";';
201  $x = ($bDroiteGauche)?($this->marges-5):($this->marges+$this->largeurDessin+5);
202  $texte = $cle.' = '.round($this->donnees[$cle], $this->sectionClass->oP->iPrec);
203  $y += 4;
204  $dessin.= "
205  cx.fillText(\"$texte\",$x,$y);";
206  $bDroiteGauche = !$bDroiteGauche;
207  }
208  }
209 
210  $dessin.= '
211  </script>';
212 
213  return $dessin;
214  }
215 }
216 ?>
GetDessinX($val, $Axe)
Convertit une largeur en mètre en une abscisse en pixels.
__construct($hauteur, $largeur, $marges, &$section, $lib_data)
GetDessinY($val)
Convertit un tirant d&#39;eau en mètre en une ordonnée en pixels.
Classe pour l&#39;affichage du dessin des sections.
transformeValeur($tabDonnees)
Transforme le tableau de tirants d"eau et charges à afficher en pixel + attribution des couleurs...
AddRow($color, $y)
Rajoute une ligne à notre dessin.