source: spip-zone/_plugins_/hydraulic/branches/v0.3/formulaires/lechapt_calmon.php @ 60951

Last change on this file since 60951 was 60951, checked in by m.dulondel@…, 8 years ago
  • Les variables des formulaires lechapt_calmon et courbe_remous correspondent désormais avec le nom des attributs de chaque section.
  • Ajout de mots dans le dictionnaire des langues.
  • Javascript + squelette du formulaire calcul_ouvrage (la fonction gestion_radios est pas encore finis à 100%)
File size: 13.2 KB
Line 
1<?php
2/*
3 * formulaires/lechapt_calmon.php
4 *
5 *
6 *
7 * Copyright 2012 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// Cette fonction renvoit tous les indices des champs présents dans le formulaire.
42function mes_champs_coeff_materiau() {
43        $mes_champs_coeff = array('L','M','N','Q','D','J','Lg');
44        return $mes_champs_coeff;
45}
46
47// Cette fonction renvoit seulement les paramètres fixes, ainsi que leur code pour le dictionnaires des langues
48function mes_champs_sans_coeff_materiau(){
49        $mes_champs_sans_coeff = array(
50                'Q' => _T('hydraulic:param_Q'),
51                'D' => _T('hydraulic:param_D'),
52                'J' => _T('hydraulic:param_J'),
53                'Lg' => _T('hydraulic:param_Lg')
54        );
55       
56        return $mes_champs_sans_coeff;
57}
58
59// Découpe le paramètre champs en suivant les "_" et renvoit l'avant derner morceau.
60function id_decoupe($champs){
61        $decoup = explode('_', $champs, 3);
62        return $decoup[count($decoup)-1];
63}
64
65/*
66 * Tableau des données pour chaque type de tuyau. Ces valeurs sont associées
67 * aux numéros des options du select (voir page lechapt_calmon.php)
68 */
69function mes_saisies_materiau() {
70        $type_materiaux = array(
71       
72                                '1'          => array(
73                                                                           'L' =>1.863,
74                                                                           'M' =>2,
75                                                                           'N' =>5.33                   
76                                ),
77                               
78                                '2'          => array(
79                                                                           'L' =>1.601,
80                                                                           'M' =>1.975,
81                                                                           'N' =>5.25                   
82                                ),
83                               
84                                '3'          => array(
85                                                                           'L' =>1.40,
86                                                                           'M' =>1.96,
87                                                                           'N' =>5.19                   
88                                ),
89                               
90                                '4'          => array(
91                                                                           'L' =>1.16,
92                                                                           'M' =>1.93,
93                                                                           'N' =>5.11                   
94                                ),
95                               
96                                '5'          => array(
97                                                                           'L' =>1.1,
98                                                                           'M' =>1.89,
99                                                                           'N' =>5.01                   
100                                ),
101                               
102                                '6'          => array(
103                                                                           'L' =>1.049,
104                                                                           'M' =>1.86,
105                                                                           'N' =>4.93                   
106                                ),
107                               
108                                '7'          => array(
109                                                                           'L' =>1.01,
110                                                                           'M' =>1.84,
111                                                                           'N' =>4.88                   
112                                ),
113                               
114                                '8'          => array(
115                                                                           'L' =>0.916,
116                                                                           'M' =>1.78,
117                                                                           'N' =>4.78                   
118                                ),
119                               
120                                '9'          => array(
121                                                                           'L' =>0.971,
122                                                                           'M' =>1.81,
123                                                                           'N' =>4.81                   
124                                ),
125        );
126               
127  return $type_materiaux;
128 
129}
130
131function champs_obligatoires_lcalmon(){
132        /*
133         * Ce tableau contient la liste de tous les champs du formulaire.
134         * La suite de cette fonction se chargera de supprimer les valeurs non obligatoires.
135         */
136        $tChOblig = mes_champs_coeff_materiau();
137        $tChUtil = mes_champs_sans_coeff_materiau();
138       
139        $choix_champs = array();
140        foreach($tChUtil as $cle=>$valeur){
141                $choix_champs[$cle] = _request('choix_champs_'.$cle);
142        }
143
144        foreach($choix_champs as $cle=>$valeur){
145                // Si le choix du select est de calculer une valeur...
146                if(substr($valeur, 0,3) != 'val'){
147                        foreach($tChOblig as $cle1=>$valeur1){
148                                if($cle == $valeur1){
149                                        // ... alors on peut supprimer de notre tableau le champs calculé (il n'est pas obligatoire car grisé)
150                                        unset($tChOblig[$cle1]);
151                                        // Permet de tasser le tableau
152                                        $tChOblig = array_values($tChOblig);
153                                }
154                        }
155                }
156                // Si le choix du select est de faire varier une valeur alors on ajoute les 3 champs nécessaires
157                if(substr($valeur, 0, 3) == 'var'){
158                        $tChOblig[] = 'val_min_'.$cle;
159                        $tChOblig[] = 'val_max_'.$cle;
160                        $tChOblig[] = 'pas_var_'.$cle;
161                }       
162        }
163        $tChOblig[] = 'prec_lc';
164       
165        return $tChOblig;
166}
167
168function formulaires_lechapt_calmon_charger_dist() { 
169        $valeurs = array(
170                'mes_saisies_materiaux' => mes_saisies_materiau(),
171                'tableau_caract' => mes_champs_sans_coeff_materiau(),
172                'typeMateriau' => 1,
173                'prec_lc' => 0.001,
174                'L' => 1.863,
175                'M' => 2,
176                'N' => 5.33,
177                'Q' => 3,
178                'D' => 1.2,
179                'J' => 0.634482025,
180                'Lg'=> 100
181        );
182 
183        $mes_champs = mes_champs_sans_coeff_materiau();
184        // On parcourt tous le tableau des indices, et on initialise les valeurs des boutons radios, et des champs de variation
185        foreach($mes_champs as $cle=>$valeur){
186                if($cle == 'Q'){
187                        $valeurs['choix_champs_'.$cle] = 'calcul_val_'.$cle;
188                }
189                else{
190                        $valeurs['choix_champs_'.$cle] = 'val_fixe_'.$cle;
191                }
192               
193                $valeurs['val_min_'.$cle] = 1;
194                $valeurs['val_max_'.$cle] = 2;
195                $valeurs['pas_var_'.$cle] = 0.1;
196        }
197       
198    return $valeurs;
199}
200
201function formulaires_lechapt_calmon_verifier_dist(){   
202    $erreurs = array();
203    $datas = array();
204    $tChOblig= champs_obligatoires_lcalmon();
205    // Vérifier que les champs obligatoires sont bien là :
206    foreach($tChOblig as $obligatoire) {
207                if (_request($obligatoire) == NULL) {
208                        $erreurs[$obligatoire] = _T('hydraulic:champ_obligatoire');
209        }
210        // Les coefficients des matériaux doivent être strictement positifs
211        else if(($obligatoire == 'L' || $obligatoire == 'M' || $obligatoire == 'N') && _request($obligatoire) == 0){
212                        $erreurs[$obligatoire] = _T('hydraulic:valeur_positive');                       
213                }
214        else {
215            $datas[$obligatoire] = _request($obligatoire);
216        }
217    }
218
219        // Gestion des valeurs négatives
220    foreach($datas as $champ=>$data) {
221        if ($data < 0) $erreurs[$champ] = _T('hydraulic:valeur_positive_nulle');
222    }
223   
224    if (count($erreurs)) {
225        $erreurs['message_erreur'] = _T('hydraulic:saisie_erreur');
226    }
227
228    return $erreurs;
229}
230
231function formulaires_lechapt_calmon_traiter_dist(){
232    global $spip_lang;
233        include_spip('hyd_inc/cache');
234    include_spip('hyd_inc/log.class');
235    include_spip('hyd_inc/graph.class');
236       
237         /***************************************************************************
238    *                        Calcul de Lechapt et calmon
239    ****************************************************************************/
240    $echo = '';
241        $ValCal = '';
242        $result = array();
243        $choix_radio = array();
244        $tabLibelle = array();
245        $champs_materiau_coeff = mes_champs_coeff_materiau();
246        $champs_materiau_sans_coeff = mes_champs_sans_coeff_materiau();
247        $tChOblig = champs_obligatoires_lcalmon();
248    $iPrec=(int)-log10(_request('prec_lc'));
249
250    //On récupère les données
251    foreach($tChOblig as $champ) {
252        if (_request($champ)){
253            $datas[$champ] = _request($champ);
254        }
255
256        $datas[$champ] = str_replace(',','.',$datas[$champ]); // Bug #574
257    }
258
259    // On ajoute la langue en cours pour différencier le fichier de cache par langue
260    $datas['sLang'] = $spip_lang;
261
262    // Nom du fichier en cache pour calcul déjà fait
263    $CacheFileName=md5(serialize($datas));
264
265        // On transforme les champs du tableau en variables
266        foreach($champs_materiau_coeff as $champs){
267                ${$champs} = _request($champs);
268        }
269       
270        // On récupère les différents choix effectué sur les boutons radios ainsi que les libelles de tous les paramètres
271        foreach($champs_materiau_sans_coeff as $cle=>$valeur){
272                $choix_radio[$cle] = _request('choix_champs_'.$cle);
273                $tabLibelle[$cle] = _T('hydraulic:param_'.$cle);
274        }
275
276        $min = 0;
277        $max = 0;
278        $pas = 1;
279        $i = 0;
280               
281        foreach($choix_radio as $ind){
282                // Si il y a une valeur a calculer
283                if(substr($ind, 0, 3) == 'cal'){
284                        $ValCal = id_decoupe($ind);
285                }
286                // Sinon si une valeur varie
287                else if(substr($ind, 0, 3) == 'var'){
288                        // alors on récupère sa valeur maximum, minimum et son pas de variation
289                        $min = _request('val_min_'.id_decoupe($ind));
290                        $max = _request('val_max_'.id_decoupe($ind));
291                        $pas = _request('pas_var_'.id_decoupe($ind));
292                        // On fait pointer la variable qui varie sur l'indice de parcours du tableau i
293                        ${id_decoupe($ind)} = &$i;
294                }
295        }
296       
297        // Pour afficher correctement la valeur maximum
298        $max += $pas/2;
299       
300        $bNoCache = false; // true pour débugage
301    if(!$bNoCache && is_file(HYD_CACHE_DIRECTORY.$CacheFileName)) {
302        // On récupère toutes les données dans un cache déjà créé
303        $result = ReadCacheFile($CacheFileName);
304    }
305    else {
306                /*
307                 * Selon la variable à calculer, on gère les valeurs = à 0  et les valeurs infinies
308                 * et on fait le valcul correspondant.
309                 */
310                switch($ValCal){
311                        case 'Q':
312                                if($Lg == 0 && _request('choix_champs_Lg') != 'varier_val_Lg'){
313                                        $result[] = 0;
314                                }
315                                else{                   
316                                        for($i = $min; $i <= $max; $i+= $pas){
317                                                if($i == 0 && _request('choix_champs_Lg') == 'varier_val_Lg'){
318                                                        $result[] = INF;
319                                                }
320                                                else{
321                                                        $result[] = pow(((($J*pow($D, $N))/$L)*(1000/$Lg)), 1/$M);
322                                                }
323                                        }
324                                }
325                        break;
326                       
327                        case 'D': 
328                                if($J == 0 && _request('choix_champs_J') != 'varier_val_J'){
329                                        $result[] = 0;
330                                }
331                                else{
332                                        for($i = $min; $i <= $max; $i+= $pas){
333                                                if($i == 0 && _request('choix_champs_J') == 'varier_val_J'){
334                                                        $result[] = INF;
335                                                }
336                                                else{
337                                                        $result[] = pow(((($L*pow($Q, $M))/$J)*($Lg/1000)), 1/$N);
338                                                }
339                                        }
340                                }
341                        break;
342                       
343                        case 'J':
344                                if($D == 0 && _request('choix_champs_D') != 'varier_val_D'){
345                                        $result[] = 0;
346                                }
347                                else{
348                                        for($i = $min; $i <= $max; $i+= $pas){
349                                                if($i == 0 && _request('choix_champs_D') == 'varier_val_D'){
350                                                        $result[] = INF;
351                                                }
352                                                else{
353                                                        $result[] = (($L*pow($Q, $M))/pow($D, $N))*($Lg/1000) ;
354                                                }
355                                        }
356                                }
357                        break;
358                       
359                        case 'Lg':
360                                if($Q == 0 && _request('choix_champs_Q') != 'varier_val_Q'){
361                                        $result[] = 0;
362                                }
363                                else{
364                                        for($i = $min; $i <= $max; $i+= $pas){
365                                                if($i == 0 && _request('choix_champs_Q') == 'varier_val_Q'){
366                                                        $result[] = INF;
367                                                }
368                                                else{
369                                                        $result[] = (($J*pow($D, $N))/($L*pow($Q,$M)))*1000 ;
370                                                }
371                                        }
372                                }
373
374                        break;
375                }
376               
377                //Enregistrement des données dans fichier cache
378        WriteCacheFile($CacheFileName,$result);
379        }
380        /***************************************************************************
381    *                   Affichage du tableau de données
382    ****************************************************************************/
383        $cptValVar = 1;
384        $i = 0;
385        $tabClass = array();
386       
387        // On compte le nombre de valeur qui varie
388        foreach($tabLibelle as $cle=>$valeur){
389                if(substr(_request('choix_champs_'.$cle), 0, 3) == 'var'){
390                        $cptValVar++;
391                }
392        }
393        // On répertorie toutes les valeurs selon leur type dans un tableau
394        foreach($tabLibelle as $cle=>$valeur){
395                if(substr(_request('choix_champs_'.$cle), 0, 3) == 'cal'){
396                        $tabClass['cal'] = $tabLibelle[$cle];
397                }
398                else if(substr(_request('choix_champs_'.$cle), 0, 3) == 'var'){
399                        $tabClass['var'] = $tabLibelle[$cle];
400                }
401                else if(substr(_request('choix_champs_'.$cle), 0, 3) == 'var' || $cptValVar == 1){
402                        $tabClass['var'] = $tabLibelle[$cle];
403                        $cptValVar--;
404                }
405                else if(substr(_request('choix_champs_'.$cle), 0, 3) == 'val'){
406                        $tabClass['val'.$i] = $tabLibelle[$cle];
407                        $i++;
408                }
409        }
410       
411        // On génère les entêtes du tableau de résulats
412        $echo.='<table class="spip">
413                        <thead>
414                                <tr class="row_first">';
415                               
416                                foreach($tabClass as $cle=>$valeur){
417                                        if(substr($cle, 0, 3) == 'val'){
418                                                $echo.= '<th scope="col" rowspan="2">'.$tabClass[$cle].'</th>';
419                                        }
420                                }
421
422        $echo.= '               <th style="text-align:center;" scope="col" rowspan="2">'._T('hydraulic:abscisse').'<br/>'.$tabClass['var'].'</th>
423                                        <th style="text-align:center;" scope="col" rowspan="2">'._T('hydraulic:ordonnee').'<br/>'.$tabClass['cal'].'</th>
424                                </tr>   
425                        </thead>
426                        <tbody>';
427       
428        $i=0;
429        $tabAbs = array();
430       
431        if($cptValVar != 0){
432                $ValeurVarie = $min;
433        }
434        else{
435                $ValeurVarie = _request(substr($tabClass['var'],0,1));
436        }
437       
438        // On insère les différents résultats dans le tableau correspondant.
439        foreach($result as $indice){
440                $i++;
441                $echo.= '<tr class="align_right ';
442                $echo.=($i%2==0)?'row_even':'row_odd';
443                $echo.='">';
444               
445                                foreach($tabClass as $cle=>$valeur){
446                                        if(substr($cle, 0, 3) == 'val'){
447                                                $echo.= '<td>';
448                                                $decoup = explode(':', $tabClass[$cle], 2);
449                                                $echo.= _request($decoup[0]).'</td>';
450                                        }
451                                }       
452                               
453                $echo.= '<td>'.$ValeurVarie.'</td><td>'.format_nombre($indice, $iPrec).'</td>';         
454                $echo.= '</tr>';       
455                $tabAbs[] = $ValeurVarie;
456                $ValeurVarie+= $pas;
457        }       
458       
459    $echo.=     '</tbody>
460        </table>';
461
462        // Si la première valeur est infinie alors on la supprime et on tasse le tableau
463        if(is_infinite($result[0])){
464                unset($result[0]);
465                $result = array_values($result);
466                unset($tabAbs[0]);
467                $tabAbs = array_values($tabAbs);
468        }
469
470    /***************************************************************************
471    *                        Affichage du graphique
472    ****************************************************************************/
473
474        // Si notre tableau de résultats contient plus d'une ligne alors on l'affiche.
475        if(count($result) > 1){
476                $oGraph = new cGraph();
477                // Ligne de Lechapt et calmon
478                if(isset($result)) {
479                        $oGraph->AddSerie(
480                                _T('hydraulic:param_'.$ValCal),
481                                $tabAbs,
482                                $result,
483                                '#00a3cd',
484                                'lineWidth:3, showMarker:true, markerOptions:{style:\'filledCircle\', size:8}');
485                }
486                // Récupération du graphique
487                $echo .= $oGraph->GetGraph('ligne_lechapt_calmon',400,600);
488                $echo .= $tabClass['var'];
489        }
490        $res['message_ok'] = $echo;
491    return $res;
492}
493?>
Note: See TracBrowser for help on using the repository browser.