]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA10/Macro/impr_table_ops.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA10 / Macro / impr_table_ops.py
1 #@ MODIF impr_table_ops Macro  DATE 10/11/2009   AUTEUR COURTOIS M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2004  EDF R&D                  WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
9 # (AT YOUR OPTION) ANY LATER VERSION.                                                  
10 #                                                                       
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
15 #                                                                       
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
18 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
19 # ======================================================================
20
21 # RESPONSABLE MCOURTOI M.COURTOIS
22
23 import os.path
24 import re
25
26
27 def impr_table_ops(self, FORMAT, TABLE, INFO, **args):
28    """
29    Macro IMPR_TABLE permettant d'imprimer une table dans un fichier.
30    Erreurs<S> dans IMPR_TABLE pour ne pas perdre la base.
31    """
32    macro='IMPR_TABLE'
33    import aster
34    from Accas import _F
35    from Cata.cata import table_jeveux
36    from Utilitai.Utmess  import  UTMESS
37    from Utilitai.UniteAster import UniteAster
38    ier=0
39    # La macro compte pour 1 dans la numerotation des commandes
40    self.set_icmd(1)
41
42    # On importe les definitions des commandes a utiliser dans la macro
43    # Le nom de la variable doit etre obligatoirement le nom de la commande
44    DETRUIRE         = self.get_cmd('DETRUIRE')
45    RECU_FONCTION    = self.get_cmd('RECU_FONCTION')
46
47    #----------------------------------------------
48    # 0. Traitement des arguments, initialisations
49    # unité logique des fichiers réservés
50    ul_reserve=(8,)
51    UL = UniteAster()
52
53    # 0.1. Fichier
54    nomfich=None
55    if args['UNITE'] and args['UNITE']<>6:
56       nomfich=UL.Nom(args['UNITE'])
57    if nomfich and os.path.exists(nomfich) and os.stat(nomfich).st_size<>0:
58       if FORMAT=='XMGRACE':
59          UTMESS('A','TABLE0_6',valk=nomfich)
60
61    # 0.2. Création des dictionnaires des FILTRES
62    Filtre=[]
63    if args['FILTRE']:
64       for Fi in args['FILTRE']:
65          dF = Fi.cree_dict_valeurs(Fi.mc_liste)
66          for mc in dF.keys():
67             if dF[mc]==None: del dF[mc]
68          Filtre.append(dF)
69    # format pour l'impression des filtres
70    form_filtre='\nFILTRE -> NOM_PARA: %-16s CRIT_COMP: %-4s VALE: %s'
71
72    # 0.3. Création de la liste des tables (une seule sans SENSIBILITE)
73    form_sens='\n... SENSIBILITE AU PARAMETRE %s (SD COMP %s)'
74    ltab=[]
75    if args['SENSIBILITE']:
76       lps=args['SENSIBILITE']
77       if not type(lps) in (list, tuple):
78          lps=[lps,]
79       for ps in lps:
80          ncomp = self.jdc.memo_sensi.get_nocomp(TABLE.nom, ps.nom)
81          if ncomp != None:
82             sdtab = table_jeveux(ncomp)
83             tabs = sdtab.EXTR_TABLE()
84             tabs.titr = TABLE.TITRE() + tabs.titr + form_sens % (ps.get_name(), ncomp)
85             ltab.append([tabs, sdtab])
86    else:
87       ltab.append([TABLE.EXTR_TABLE(), TABLE])
88
89    if len(ltab)<1:
90       return ier
91
92    # 0.4.1. liste des paramètres à conserver
93    nom_para=ltab[0][0].para
94    if args['NOM_PARA']:
95       nom_para=args['NOM_PARA']
96    if not type(nom_para) in (list, tuple):
97       nom_para=[nom_para,]
98
99    # 0.4.2. Traiter le cas des UL réservées
100    if args['UNITE'] and args['UNITE'] in ul_reserve:
101       UL.Etat(args['UNITE'], etat='F')
102
103    #----------------------------------------------
104    # Boucle sur les tables
105    for tab, sdtab in ltab:
106
107       # ----- 1. Infos de base
108       if INFO==2:
109          print 'IMPRESSION DE LA TABLE : %s' % sdtab.get_name()
110
111       if args['TITRE']:
112          tab.titr=args['TITRE'] + '\n' + tab.titr
113
114       # ----- 2. Filtres
115       for Fi in Filtre:
116          col = getattr(tab, Fi['NOM_PARA'])
117          # peu importe le type
118          opts=[Fi[k] for k in ('VALE','VALE_I','VALE_C','VALE_K') if Fi.has_key(k)]
119          kargs={}
120          for k in ('CRITERE','PRECISION'):
121             if Fi.has_key(k):
122                kargs[k]=Fi[k]
123          tab = tab & ( getattr(col, Fi['CRIT_COMP'])(*opts,**kargs) )
124          # trace l'operation dans le titre
125          #if FORMAT in ('TABLEAU','ASTER'):
126          tab.titr+=form_filtre % (Fi['NOM_PARA'], Fi['CRIT_COMP'], \
127                ' '.join([str(v) for v in opts]))
128
129       # ----- 3. Tris
130       if args['TRI']:
131          # une seule occurence de TRI
132          T0=args['TRI'][0]
133          dT=T0.cree_dict_valeurs(T0.mc_liste)
134          tab.sort(CLES=dT['NOM_PARA'], ORDRE=dT['ORDRE'])
135
136       # ----- 4. Impression
137       # vérification des paramètres
138       for p in nom_para:
139          if not p in tab.para:
140            UTMESS('A','TABLE0_7',valk=p)
141       
142       # sélection des paramètres et suppression des colonnes vides
143       timp = tab.SansColonneVide(nom_para)
144       
145       # passage des mots-clés de mise en forme à la méthode Impr
146       kargs=args.copy()
147       kargs.update({
148          'FORMAT'    : FORMAT,
149          'FICHIER'   : nomfich,
150          'dform'     : {},
151       })
152       # pour l'impression des fonctions
153       kfonc={
154          'FORMAT'    : FORMAT,
155          'FICHIER'   : nomfich,
156       }
157
158       # 4.1. au format TABLEAU
159       if FORMAT=='TABLEAU':
160          # surcharge par les formats de l'utilisateur
161          kargs['dform']={
162             'csep'   : args['SEPARATEUR'],
163             'ccom'   : args['COMMENTAIRE'],
164             'ccpara' : args['COMM_PARA'],
165             'cdeb'   : args['DEBUT_LIGNE'],
166             'cfin'   : args['FIN_LIGNE'],
167          }
168       
169       # 4.2. au format AGRAF
170       elif FORMAT=='AGRAF':
171          kargs['dform']={ 'formR' : '%12.5E' }
172          kfonc['FORMAT']='TABLEAU'
173       
174       # 4.3. au format XMGRACE et dérivés
175       elif FORMAT=='XMGRACE':
176          kargs['dform']={ 'formR' : '%.8g' }
177          kargs['PILOTE']=args['PILOTE']
178          kfonc['PILOTE']=args['PILOTE']
179
180       # 4.4. format spécifié dans les arguments
181       if args['FORMAT_R']:
182          kargs['dform'].update({ 'formR' : fmtF2PY(args['FORMAT_R']) })
183
184       # 4.5. regroupement par paramètre : PAGINATION
185       if args['PAGINATION']:
186          l_ppag=args['PAGINATION']
187          if not type(l_ppag) in (list, tuple):
188             l_ppag=[l_ppag,]
189          kargs['PAGINATION'] = [p for p in l_ppag if p in nom_para]
190          l_para_err          = [p for p in l_ppag if not p in nom_para]
191          if len(l_para_err)>0:
192              UTMESS('A','TABLE0_8',valk=l_para_err)
193
194       timp.Impr(**kargs)
195
196       # ----- 5. IMPR_FONCTION='OUI'
197       if args['IMPR_FONCTION'] == 'OUI':
198          # cherche parmi les cellules celles qui contiennent un nom de fonction
199          dfon = []
200          p_extr = set(['FONCTION', 'FONCTION_C'])
201          p_extr.intersection_update(timp.para)
202          if len(p_extr) > 0:
203             # on réduit timp aux colonnes FONCTION et FONCTION_C
204             textr = timp.__getitem__(list(p_extr))
205             for row in textr:
206                for par,cell in row.items():
207                   if type(cell) in (str, unicode):
208                      cell = cell.strip()
209                      if aster.getvectjev('%-19s.PROL' % cell) != None:
210                         dfon.append(['%-19s' % cell, par])
211             # impression des fonctions trouvées
212             for f,par in dfon:
213                __fonc=RECU_FONCTION(
214                   TABLE=sdtab,
215                   FILTRE=_F(
216                      NOM_PARA=par,
217                      VALE_K=f,
218                   ),
219                   NOM_PARA_TABL=par,
220                   TITRE = 'Fonction %s' % f,
221                )
222                __fonc.Trace(**kfonc)
223                DETRUIRE(CONCEPT=_F(NOM=(__fonc,),), ALARME='NON', INFO=1,)
224
225    # 99. Traiter le cas des UL réservées
226    UL.EtatInit()
227    return ier
228
229
230 def fmtF2PY(fformat):
231    """Convertit un format Fortran en format Python (printf style).
232    Gère uniquement les fortrans réels, par exemple : E12.5, 1PE13.6, D12.5...
233    """
234    fmt=''
235    matP=re.search('([0-9]+)P',fformat)
236    if matP:
237       fmt+=' '*int(matP.group(1))
238    matR=re.search('([eEdDfFgG]{1})([\.0-9]+)',fformat)
239    if matR:
240       fmt+='%'+matR.group(2)+re.sub('[dD]+','E',matR.group(1))
241    try:
242       s=fmt % -0.123
243    except (ValueError, TypeError), msg:
244       fmt='%12.5E'
245       print 'Error :',msg
246       print 'Format par défaut utilisé :',fmt
247    return fmt