Download destra.procedur

Back to the list

   1 : * DESTRA    PROCEDUR  MAUGIS    07/10/26    21:15:30     5840           
   2 : **********************************************************************
   3 : 'DEBPROC' DESTRA TBR*'TABLE'      TBDES0/'TABLE'
   4 :                  EVOL2/'EVOLUTIO' TBDES2/'TABLE' ;
   5 : * MT1/'MOT' LT1/'MOT' MT2/'MOT' LT2/'MOT' MT3/'MOT'
   6 : * LT3/'MOT' MT4/'MOT' XBOR1/'FLOTTANT' XBOR2/'FLOTTANT' MT5/'MOT'
   7 : * YBOR1/'FLOTTANT' YBOR2/'FLOTTANT' MT6/'MOT'
   8 : * MT7 N1/'ENTIER' (N2/'ENTIER' ...) LENTI1/'LISTENTI' MT7/'MOT'
   9 : * MOT#/'MOT' ;
  10 : 
  11 : ************************************************************************
  12 : *
  13 : *  Trace les évolutions contenues dans la table TBR
  14 : *  construites par TRACHIS ou TRACHIT
  15 : *
  16 : ************************************************************************
  17 : *
  18 : *  Entrée :
  19 : *  --------
  20 : *
  21 : *   TBR     : table des évolutions (Cf. TRACHIS ou TRACHIT)
  22 : *             indicée par des entiers, puis par VALEUR, LEGEND1, LEGEND2
  23 : *
  24 : *   TBDES0  : table de spécifications de tracer (optionnelle, Cf. DESS)
  25 : *             Ses indices compléteront (titre) ou remplaceront (chaîne
  26 : *             de tracer) le remplissage automatique.
  27 : *             Elle est indicée par les mêmes indices que la table,
  28 : *             ce qui permet de gérer tranquillou les évolutions complexes.
  29 : *
  30 : *   EVOL2   : évolution supplémentaire éventuelle à superposer, avec
  31 : *
  32 : *   TBDES2  : sa table de spécifications de tracer (optionnelle, Cf. DESS)
  33 : *             indicée de façon standard (suivant les sous-évolutions)
  34 : *
  35 : *   MOT#    : mot, option simple de dessin :
  36 : *             'LOGX' 'LOGY' 'GRIL' 'MIMA' 'DATE' 'LOGO' 'SEPA'
  37 : *             'AXES' 'NCLK'
  38 : *             les options 'CARR', 'LEGE' étant choisie par défaut
  39 : *
  40 : *   MT1 MT2 MT3 : mots-clefs 'TITR' 'TITX' 'TITY' suivis de
  41 : *   LT1 LT2 LT3 : chaînes de caractères correspondantes
  42 : *
  43 : *   MT4   MT5   : mots-clefs 'XBOR' 'YBOR' suivis respectivement de
  44 : *   XBOR1 XBOR2
  45 : *   YBOR1 YBOR2 : FLOTTANTS valant les bornes d'abscisse et
  46 : *                 d'ordonnée respectivement
  47 : *
  48 : *   MT6     : mot-clef 'TABMIMA' pour afficher en tablature les extrema
  49 : *             des évolutions.
  50 : *
  51 : *   MT7     : mot-clef 'CHOI' (ou 'CHOIX') pour sélectionner les
  52 : *             entrées de TBR à tracer (défaut = toutes), suivi de
  53 : *   N1 N2...: indice de TBR à tracer OU
  54 : *   LENTI1  : LISTENTI des indices de TBR
  55 : *
  56 : ************************************************************************
  57 : *
  58 : *   Remarques
  59 : *   ---------
  60 : *
  61 : *   La table doit être donnée en premier ;
  62 : *   les autres options avec mot clef viennent ensuite dans un ordre
  63 : *   quelconque.
  64 : *
  65 : ************************************************************************
  66 : *
  67 : *   NEVL : nombre de courbes à tracer
  68 : *
  69 : ************************************************************************
  70 : *
  71 : *  Auteur : Françoise Auriol (TTMF) 1998
  72 : *
  73 : * -----------------------
  74 : *
  75 : *  Modifié : P. Maugis (LSCE) le 07/08/2007 :
  76 : *    - introduction de TBDES0
  77 : *    - prise en compte d'évolutions complexes
  78 : *
  79 : ************************************************************************
  80 : 
  81 : *  Récupération des options de dessin
  82 : *  ----------------------------------
  83 : *  et construction de la table des options
  84 : 
  85 : *--Valeurs par défaut :
  86 :    LNTAB = FAUX ;
  87 :    TTR   = 'GIBI FECIT' ;
  88 :    LREGU = FAUX ;
  89 : 
  90 : *  table des options LOP
  91 :    LOP   = 'TABLE' ;
  92 : 
  93 : *  On va afficher les légendes
  94 :    LOP.1 = 'MOT' 'LEGE' ;
  95 :    IOP   = 2 ;
  96 : 
  97 : *  On lit une par une les données précisées par des mots-clefs
  98 :    'REPETER' bcl ;
  99 :      'ARGUMENT' mot1/'MOT'  ;
 100 :      'SI' ('NON' ('EXISTE' MOT1)) ;
 101 :         'QUITTER' bcl ;
 102 :      'FINSI' ;
 103 : 
 104 : *    options simples de DESSIN
 105 :      'SI' (     ('EGA' MOT1 'LOGX') 'OU' ('EGA' MOT1 'LOGY')
 106 :            'OU' ('EGA' MOT1 'GRIL') 'OU' ('EGA' MOT1 'MIMA')
 107 :            'OU' ('EGA' MOT1 'DATE') 'OU' ('EGA' MOT1 'LOGO')
 108 :            'OU' ('EGA' MOT1 'SEPA') 'OU' ('EGA' MOT1 'AXES')
 109 :            'OU' ('EGA' MOT1 'NCLK') ) ;
 110 :         LOP.IOP     = 'MOT' MOT1 ;
 111 :         IOP         = IOP + 1 ;
 112 :         'ITERER' bcl ;
 113 :      'FINSI' ;
 114 : 
 115 : *    options avec arguments ou spécifiques
 116 :      'SI' (('EGA' MOT1 'TITR') 'OU' ('EGA' MOT1 'TITRE')) ;
 117 :         'ARGUMENT' TTR*'MOT' ;
 118 :         LOP.IOP     = 'MOT' 'TITR' ;
 119 :         LOP.(IOP+1) = 'MOT' TTR ;
 120 :         IOP         = IOP + 2 ;
 121 :         'ITERER' bcl ;
 122 :      'FINSI' ;
 123 :      'SI' ('EGA' MOT1 'TITX') ;
 124 :         'ARGUMENT' TTX*'MOT' ;
 125 :         LOP.IOP     = 'MOT' 'TITX' ;
 126 :         LOP.(IOP+1) = 'MOT' TTX ;
 127 :         IOP         = IOP + 2 ;
 128 :         'ITERER' bcl ;
 129 :      'FINSI' ;
 130 :      'SI' ('EGA' MOT1 'TITY') ;
 131 :         'ARGUMENT' TTY*'MOT' ;
 132 :         LOP.IOP     = 'MOT' 'TITY' ;
 133 :         LOP.(IOP+1) = 'MOT' TTY ;
 134 :         IOP         = IOP + 2 ;
 135 :         'ITERER' bcl ;
 136 :      'FINSI' ;
 137 :      'SI' ('EGA' MOT1 'XBOR') ;
 138 :         'ARGUMENT' XBOR1*'FLOTTANT' XBOR2*'FLOTTANT' ;
 139 :         LOP.IOP     = 'MOT' 'XBOR' ;
 140 :         LOP.(IOP+1) = 'MINIMUM' ('PROG' XBOR1 XBOR2) ;
 141 :         LOP.(IOP+2) = 'MAXIMUM' ('PROG' XBOR1 XBOR2) ;
 142 :         IOP         = IOP + 3 ;
 143 :         'ITERER' bcl ;
 144 :      'FINSI' ;
 145 :      'SI' ('EGA' MOT1 'YBOR') ;
 146 :         'ARGUMENT' YBOR1*'FLOTTANT' YBOR2*'FLOTTANT' ;
 147 :         LOP.IOP     = 'MOT' 'YBOR' ;
 148 :         LOP.(IOP+1) = 'MINIMUM' ('PROG' YBOR1 YBOR2) ;
 149 :         LOP.(IOP+2) = 'MAXIMUM' ('PROG' YBOR1 YBOR2) ;
 150 :         IOP         = IOP + 3 ;
 151 :         'ITERER' bcl ;
 152 :      'FINSI' ;
 153 :      'SI' ('EGA' MOT1 'TABMIMA') ;
 154 :         LNTAB = vrai ;
 155 :         'ITERER' bcl ;
 156 :      'FINSI' ;
 157 :      'SI' (('EGA' MOT1 'CHOI') 'OU' ('EGA' MOT1 'CHOIX')) ;
 158 : *       cette lecture suppose qu'aucun autre mot-clef ne demande
 159 : *       d'entier ni de LISTENTI en entrée
 160 : *       cette option n'est pas transmise à DESSIN car il y aura
 161 : *       restriction aux sous-évolutions concernées.
 162 :         'ARGUMENT' I/'ENTIER' LIEVL/'LISTENTI' ;
 163 :         'SI' ((       ('EXISTE' I)  'ET'        ('EXISTE' lievl)) 'OU'
 164 :               (('NON' ('EXISTE' I)) 'ET' ('NON' ('EXISTE' lievl)))) ;
 165 :            'ERREUR' 'Fournir des entiers ou une liste d entiers' ;
 166 :         'FINSI' ;
 167 :         'SI' ('EXISTE' lievl) ;
 168 : *          donnée d'une liste. Rien à faire
 169 :         'FINSI' ;
 170 :         'SI' ('EXISTE' I) ;
 171 : *          donnée d'un entier, boucle sur les suivants éventuels
 172 :            LIEVL = 'LECT' I ;
 173 :            'REPETER' bcl1 ;
 174 :               'ARGUMENT' I/'ENTIER' ;
 175 :               'SI' ('NON' ('EXISTE' I)) ;
 176 :                  'QUITTER' bcl1 ;
 177 :               'SINON' ;
 178 :                  LIEVL = LIEVL 'ET' ('LECT' I) ;
 179 :               'FINSI' ;
 180 :            'FIN' bcl1 ;
 181 :         'FINSI' ;
 182 :         NEVL = 'DIME' LIEVL ;
 183 :         'ITERER' bcl ;
 184 :      'FINSI' ;
 185 :      'SI' ('EGA' MOT1 'REGU') ;
 186 :         LREGU = vrai ;
 187 :         'ITERER' bcl ;
 188 :      'FINSI' ;
 189 : 
 190 : *    donnée non identifiée
 191 :      'ERREUR' ('CHAINE' 'Dans les donnees de DESTRA, mot-clef '
 192 :                          mot1 ' inconnu.');
 193 :    'FIN' bcl ;
 194 : 
 195 : *  on complète les d'options jusqu'au nb maximal par des LEGE
 196 :    NOP    = IOP - 1 ;
 197 :    NOPMAX = 40 ;
 198 :    'SI' (NOP < NOPMAX) ;
 199 :       NB2 = NOPMAX - NOP ;
 200 :       'REPETER' BLOC4 NB2 ;
 201 :          LOP.IOP = 'MOT' 'LEGE' ;
 202 :          IOP     = IOP + 1  ;
 203 :       'FIN' BLOC4 ;
 204 :    'FINSI'  ;
 205 : 
 206 : *  on prend toutes les sous-évolutions si pas de contre-ordre
 207 :    'SI' ('NEG' ('TYPE' LIEVL) 'LISTENTI') ;
 208 :       NEVL  = 'DIME' TBR ;
 209 :       LIEVL = 'LECT' 1 'PAS' 1 NEVL ;
 210 :    'FINSI' ;
 211 : 
 212 : *  liste des types de tirets :
 213 : *  ---------------------------
 214 :    litir  = 'MOTS' ' ' 'TIRL' 'TIRR' 'TIRC' 'TIRM' ;
 215 :    ntir   = 'DIME' litir ;
 216 : 
 217 : *  liste des types de marqueurs :
 218 : *  ------------------------------
 219 :    limarq = 'MOTS' 'CROI' 'ETOI' 'PLUS' 'CARR' 'LOSA' 'TRIU' 'TRID'
 220 :                    'TRIL' 'TRIR' 'ROND' 'MOIN' 'BARR' ;
 221 :    nmarq  = 'DIME' limarq ;
 222 : 
 223 : *  Constructions préliminaires :
 224 : *  -----------------------------
 225 : *  TBDES  : table décrivant la nature des traits et marqueurs
 226 : *  K      : indice dans TBDES des informations concernant la sous-évolution K,
 227 : *           permet de gérer les évolutions complexes
 228 : *  LIMIN  : liste des valeurs mini de chaque évolution
 229 : *  LIMAX  : liste des valeurs maxi de chaque évolution
 230 : 
 231 :    TBDES  = 'TABLE' ;
 232 :    TBDES.'TITRE' = 'TABLE' ;
 233 :    LIMIN  = 'PROG' ;
 234 :    LIMAX  = 'PROG' ;
 235 :    K      = 0 ;
 236 :    'REPETER' BLOC1 NEVL ;
 237 : *     on boucle sur chaque entrée sélectionnée de la table
 238 :       J       = &BLOC1 ;
 239 :       I       = 'EXTR' LIEVL J  ;
 240 :       EV2     = TBR.I.'VALEUR' ;
 241 : 
 242 : *--   grosse évolution finale à envoyer à DESSIN
 243 :       'SI' ('EGA' J 1) ;
 244 :          evtot = ev2 ;
 245 :       'SINON' ;
 246 :          evtot = EVTOT 'ET' EV2 ;
 247 :       'FINSI' ;
 248 : 
 249 :       VV      = 'EXTR' EV2 'ORDO' ;
 250 : *     minimum
 251 :       LIMIN   = LIMIN 'ET' ('PROG' ('MINI' VV)) ;
 252 : *     maximum
 253 :       LIMAX   = LIMAX 'ET' ('PROG' ('MAXI' VV)) ;
 254 : 
 255 : *     type de trait
 256 :       ITIR    = (@MOD ((I - 1) / nmarq) ntir) + 1 ;
 257 : *     marque
 258 :       IMAR    = (@MOD (I - 1) nmarq) + 1 ;
 259 : 
 260 : *--   remplissage table de dessin
 261 :       NK      = 'DIME' ev2 ;
 262 :       K       = K + 1 ;
 263 :       K0      = K ;
 264 : 
 265 :       motdes  = 'CHAINE' ('EXTR' litir ITIR)
 266 :                          ' MARQ ' ('EXTR' limarq IMAR) ;
 267 :       'SI' (LREGU) ;
 268 :          motdes = 'CHAINE' motdes ' REGU' ;
 269 :       'FINSI' ;
 270 :       TBDES.K0 = 'MOT' motdes ;
 271 : 
 272 : *     On n'écrit la légende qu'une fois. Pour cela, on inhibe
 273 : *     l'affichage d'une légende pour les sous-évolutions suivantes
 274 : *     Il faut en revanche spécifier les propriétés de tracer pour chaque sous-évolution
 275 :       TBDES.'TITRE'.K0 = 'CHAINE' TBR.I.'LEGEND1' ' ' TBR.I.'LEGEND2' ;
 276 :       'SI' (NK > 1) ;
 277 :          'REPETER' bclk (nk - 1) ;
 278 :             K = K + 1 ;
 279 :             TBDES.K = 'MOT' motdes ;
 280 :             TBDES.'TITRE'.K = 'MOT' 'PAS DE LEGENDE' ;
 281 :          'FIN' bclk ;
 282 :       'FINSI' ;
 283 : 
 284 : *     substitution avec les indices éventuellement existants de TBDES0
 285 :       'SI' ('EXISTE' tbdes0) ;
 286 :          'SI' ('EXISTE' tbdes0 'TITRE') ;
 287 :             'SI' ('EXISTE' tbdes0.'TITRE' J) ;
 288 : *              ici aussi, on ne traite la légende qu'une seule fois
 289 :                TBDES.'TITRE'.K0 = 'CHAINE' TBDES0.'TITRE'.J
 290 :                                            TBDES .'TITRE'.K0 ;
 291 :             'FINSI' ;
 292 :          'FINSI' ;
 293 :          'SI' ('EXISTE' tbdes0 J) ;
 294 :             'REPETER' bclk nk ;
 295 : *              traitement de chaque sous-évolution
 296 :                i       = k0 + &bclk - 1 ;
 297 :                TBDES.i = 'CHAINE' TBDES0.J ;
 298 :             'FIN' bclk ;
 299 :          'FINSI' ;
 300 :       'FINSI' ;
 301 :    'FIN' BLOC1 ;
 302 : 
 303 : *  Prise en compte de l'évolution supplémentaire éventuelle
 304 : *  --------------------------------------------------------
 305 :    'SI' ('EXISTE' EVOL2) ;
 306 : *     on concatène l'évolution
 307 :       i0    = 'DIME' evtot ;
 308 :       evtot = evtot 'ET' evol2 ;
 309 :       'SI' ('EXISTE' TBDES2) ;
 310 : *        de même pour la table de spécifs.
 311 :          n  = 'DIME' tbdes2 ;
 312 :          'SI' ('NEG' n 0) ;
 313 : *           les indices de TBDES2 ne sont pas nécessairement consécutifs
 314 :             tind2 = 'INDEX' tbdes2 ;
 315 :             'REPETER' bcl5 n ;
 316 : *              comme le mot-clef 'TITRE' est aussi un opérateur, on
 317 : *              prend quelques précautions
 318 :                'SI' ('EGA' ('TYPE' tind2 . &bcl5) 'MOT') ;
 319 :                   ind = 'CHAINE' tind2 . &bcl5 ;
 320 :                'SINON' ;
 321 :                   ind = tind2 . &bcl5 ; 
 322 :                'FINSI' ;
 323 :                'SI' ('EGA' ind 'TITRE') ;
 324 : *                 gestion des titres
 325 :                   nt = 'DIME' (tbdes2.'TITRE') ;
 326 :                   'SI' ('NEG' nt 0) ;
 327 : *                    les indices de TBDES2.'TITRE' ne sont pas nécessairement consécutifs
 328 :                      tind2t  = 'INDEX' (tbdes2.'TITRE')  ;
 329 :                      'REPETER' bcl6 nt ;
 330 :                         indt = tind2t . &bcl6 ;
 331 :                         'SI' ('NEG' ('TYPE' indt) 'ENTIER') ;
 332 :                            'ERREUR' 'Les indices de la table'
 333 :                                     'doivent etre ENTIERS.';
 334 :                         'FINSI' ;
 335 :                         l    = i0 + indt ;
 336 :                         tbdes.'TITRE'.l = tbdes2.'TITRE'.indt ;
 337 :                      'FIN' bcl6 ;
 338 :                    'FINSI' ;
 339 :                    'ITERER' bcl5 ;
 340 :                'FINSI' ;
 341 :                'SI' ('NEG' ('TYPE' ind) 'ENTIER') ;
 342 :                   'ERREUR'
 343 :                   'Les indices de la table doivent etre ENTIERS.';
 344 :                'FINSI' ;
 345 :                j   = i0 + ind ;
 346 :                tbdes.j = tbdes2.ind ;
 347 :             'FIN' bcl5 ;
 348 :          'FINSI' ;
 349 :       'FINSI' ;
 350 :    'FINSI' ;
 351 : 
 352 : *  Dessin :
 353 : *  --------
 354 : *  construction de la commande
 355 :    'DESSIN' EVTOT  TBDES
 356 :             LOP.1 LOP.2 LOP.3 LOP.4 LOP.5 LOP.6 LOP.7 LOP.8
 357 :             LOP.9 LOP.10 LOP.11 LOP.12 LOP.13 LOP.14 LOP.15 LOP.16
 358 :             LOP.17 LOP.18 LOP.19 LOP.20 LOP.21 LOP.22 LOP.23 LOP.24
 359 :             LOP.25 LOP.26 LOP.27 LOP.28 LOP.29 LOP.30 LOP.31 LOP.32
 360 :             LOP.33 LOP.34 LOP.35 LOP.36 LOP.37 LOP.38 LOP.39 LOP.40 ;
 361 : 
 362 : *  Affichage d'un tableau avec les maxima et minima
 363 : *  ------------------------------------------------
 364 : *  de toutes les évolutions concernées
 365 :    'SI' LNTAB ;
 366 :       STTR  = 'MOT' TBR. 1 .'LEGEND1'   ;
 367 : 
 368 : *     26 lignes par tableau (cause limitation espace de dessin).
 369 : *     Nombre de tableaux nécessaires :
 370 :       NBOUT = (NEVL + 25) / 26 ;
 371 : 
 372 :       I2    = 0 ;
 373 :       TL    = 'TABLE' ;
 374 :       KL    = 'TABLE' ;
 375 :       'REPETER' BOUT NBOUT ;
 376 : *       on affiche les valeurs pour les courbes d'indice I1 à I2=I1+26
 377 : *       TL : table des noms d'évolution
 378 : *       KL : table
 379 :         I1  = I2 + 1 ;
 380 :         I2  = 'MINIMUM' ('LECT' (I1 + 25) NEVL) ;
 381 : *       nommation de chaque ligne du tableau
 382 :         'REPETER' BOUL 26 ;
 383 :            L     = &BOUL ;
 384 :            J     = I1 + L - 1 ;
 385 :            'SI' (J '<EG' NEVL) ;
 386 :               I    = 'EXTR' LIEVL J ;
 387 :               KL.L = I ;
 388 :               TL.L = 'MOT' TBR.I.'LEGEND2' ;
 389 :            'SINON' ;
 390 : *             entrées bidons car la ligne de commande réclame 26 entrées
 391 :               KL.L = 1 ;
 392 :               TL.L = 'MOT' 'PIPO' ;
 393 :            'FINSI' ;
 394 :         'FIN' BOUL ;
 395 : 
 396 : *       évolution des valeurs à afficher (indice, mini, maxi)
 397 :         'SI' (I2 > I1) ;
 398 :            LI1   = 'LECT' I1 'PAS' 1 I2 ;
 399 :         'SINON' ;
 400 :            LI1   = 'LECT' I1 ;
 401 :         'FINSI' ;
 402 :         LLIIND = LI1 * 1. ;
 403 :         LLIMIN = 'EXTR' LIMIN LI1 ;
 404 :         LLIMAX = 'EXTR' LIMAX LI1 ;
 405 : 
 406 : *       On dessine le tableau, avec les valeurs mises en évolution
 407 : *       ainsi que le nombre de pages
 408 :         EVM1 = 'EVOL' 'MANU' 'ABS' LLIIND LLIMIN ;
 409 :         EVM2 = 'EVOL' 'MANU' 'ABS' LLIIND LLIMAX ;
 410 : 
 411 : *       sous-titre avec éventuel numéro de page
 412 :         TTR2 = 'MOT' STTR ;
 413 :         'SI' (NBOUT > 1) ;
 414 :            TTR2 = 'CHAINE' STTR '  page ' &BOUT ' / ' NBOUT ;
 415 :         'FINSI' ;
 416 : 
 417 :         ML   = 'MOT' 'TLIG' ;
 418 :         'NTAB' (EVM1 'ET' EVM2)'NOPAGE' 'LIGCOU' 5 'TITCOU' 4 'COLCOU' 6
 419 :         'NODATE' 'TCOL' 2 'MINI' 'TCOL' 3 'MAXI' 'TITR' TTR 'STITR' TTR2
 420 :         ML 2 TL.1 ML 3 TL.2 ML 4 TL.3 ML 5 TL.4 ML 6 TL.5 ML 7 TL.6 ML 8
 421 :         TL.7 ML 9 TL.8 ML 10 TL.9 ML 11 TL.10 ML 12 TL.11  ML 13 TL.12
 422 :         ML 14 TL.13 ML 15 TL.14 ML 16 TL.15 ML 17 TL.16 ML 18 TL.17 ML
 423 :         19 TL.18 ML 20 TL.19 ML 21 TL.20 ML 22 TL.21 ML 23 TL.22 ML 24
 424 :         TL.23 ML 25 TL.24 ML 26 TL.25 ML 27 TL.26 ;
 425 : 
 426 : 
 427 :       'FIN' BOUT ;
 428 :    'FINSI' ;
 429 : 
 430 : 'FINP';
 431 : 
 432 : 
 433 : 
 434 :  

© Cast3M 2003 - All rights reserved.
Disclaimer