]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA76/Macro/impr_table_ops.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA76 / Macro / impr_table_ops.py
1 #@ MODIF impr_table_ops Macro  DATE 10/10/2005   AUTEUR MCOURTOI 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 from types import ListType, TupleType, StringTypes
27 EnumTypes=(ListType, TupleType)
28
29
30 # ------------------------------------------------------------------------------
31 def impr_table_ops(self, FORMAT, TABLE, INFO, **args):
32    """
33    Macro IMPR_TABLE permettant d'imprimer une table dans un fichier.
34    Erreurs<S> dans IMPR_TABLE pour ne pas perdre la base.
35    """
36    macro='IMPR_TABLE'
37    import aster
38    from Accas               import _F
39    from Cata.cata           import table_jeveux
40    from Utilitai.Utmess     import UTMESS
41    from Utilitai.UniteAster import UniteAster
42    ier=0
43    # La macro compte pour 1 dans la numerotation des commandes
44    self.set_icmd(1)
45
46    # On importe les definitions des commandes a utiliser dans la macro
47    # Le nom de la variable doit etre obligatoirement le nom de la commande
48    DETRUIRE         = self.get_cmd('DETRUIRE')
49    RECU_FONCTION    = self.get_cmd('RECU_FONCTION')
50
51    #----------------------------------------------
52    # 0. Traitement des arguments, initialisations
53    # unité logique des fichiers réservés
54    ul_reserve=(8,)
55    UL = UniteAster()
56
57    # 0.1. Fichier
58    nomfich=None
59    if args['UNITE'] and args['UNITE']<>6:
60       nomfich=UL.Nom(args['UNITE'])
61    if nomfich and os.path.exists(nomfich) and os.stat(nomfich).st_size<>0:
62       if FORMAT=='XMGRACE':
63          UTMESS('A',macro,'Le fichier '+nomfich+' existe déjà, on écrit ' \
64                 'à la suite.')
65
66    # 0.2. Création des dictionnaires des FILTRES
67    Filtre=[]
68    if args['FILTRE']:
69       for Fi in args['FILTRE']:
70          dF = Fi.cree_dict_valeurs(Fi.mc_liste)
71          for mc in dF.keys():
72             if dF[mc]==None: del dF[mc]
73          Filtre.append(dF)
74    # format pour l'impression des filtres
75    form_filtre='\nFILTRE -> NOM_PARA: %-16s CRIT_COMP: %-4s VALE: %s'
76
77    # 0.3. Création de la liste des tables (une seule sans SENSIBILITE)
78    form_sens='\n... SENSIBILITE AU PARAMETRE %s'
79    ltab=[]
80    if args['SENSIBILITE']:
81       nmemo='&NOSENSI.MEMO.CORR'.ljust(24)
82       vect=aster.getvectjev(nmemo)
83       if vect:
84          lps=args['SENSIBILITE']
85          if not type(lps) in EnumTypes:
86             lps=[lps,]
87          for ps in [ps.get_name() for ps in lps]:
88             trouv=False
89             for ch in vect[0:len(vect):2]:
90                if ch[0:8].strip()==TABLE.get_name() and ch[8:16].strip()==ps:
91                   trouv=True
92                   ncomp=ch[16:24].strip()
93                   sdtab=table_jeveux(ncomp)
94                   tabs=sdtab.EXTR_TABLE()
95                   tabs.titr+=form_sens % ps
96                   ltab.append([tabs, sdtab])
97             if not trouv:
98                UTMESS('A',macro,'Dérivée de %s par rapport à %s non disponible'\
99                      % (TABLE.get_name(), ps))
100       else:
101          UTMESS('A',macro,'Pas de calcul de sensibilité accessible.')
102    else:
103       ltab.append([TABLE.EXTR_TABLE(), TABLE])
104
105    if len(ltab)<1:
106       return ier
107
108    # 0.4.1. liste des paramètres à conserver
109    nom_para=ltab[0][0].para
110    if args['NOM_PARA']:
111       nom_para=args['NOM_PARA']
112    if not type(nom_para) in EnumTypes:
113       nom_para=[nom_para,]
114
115    # 0.4.2. Traiter le cas des UL réservées
116    if args['UNITE'] and args['UNITE'] in ul_reserve:
117       UL.Etat(args['UNITE'], etat='F')
118
119    #----------------------------------------------
120    # Boucle sur les tables
121    for tab, sdtab in ltab:
122
123       # ----- 1. Infos de base
124       if INFO==2:
125          print 'IMPRESSION DE LA TABLE : %s' % sdtab.get_name()
126
127       if args['TITRE']:
128          tab.titr=args['TITRE'] + '\n' + tab.titr
129
130       # ----- 2. Filtres
131       for Fi in Filtre:
132          col = getattr(tab, Fi['NOM_PARA'])
133          # peu importe le type
134          opts=[Fi[k] for k in ('VALE','VALE_I','VALE_C','VALE_K') if Fi.has_key(k)]
135          kargs={}
136          for k in ('CRITERE','PRECISION'):
137             if Fi.has_key(k):
138                kargs[k]=Fi[k]
139          tab = tab & ( getattr(col, Fi['CRIT_COMP'])(*opts,**kargs) )
140          # trace l'operation dans le titre
141          #if FORMAT in ('TABLEAU','ASTER'):
142          tab.titr+=form_filtre % (Fi['NOM_PARA'], Fi['CRIT_COMP'], \
143                ' '.join([str(v) for v in opts]))
144
145       # ----- 3. Tris
146       if args['TRI']:
147          # une seule occurence de TRI
148          T0=args['TRI'][0]
149          dT=T0.cree_dict_valeurs(T0.mc_liste)
150          tab.sort(CLES=dT['NOM_PARA'], ORDRE=dT['ORDRE'])
151
152       # ----- 4. Impression
153       # vérification des paramètres
154       for p in nom_para:
155          if not p in tab.para:
156             UTMESS('A', 'IMPR_TABLE', 'Paramètre absent de la table : %s' % p)
157       
158       # sélection des paramètres
159       timp=tab[nom_para]
160
161       # passage des mots-clés de mise en forme à la méthode Impr
162       kargs=args.copy()
163       kargs.update({
164          'FORMAT'    : FORMAT,
165          'FICHIER'   : nomfich,
166          'dform'     : {},
167       })
168       # pour l'impression des fonctions
169       kfonc={
170          'FORMAT'    : FORMAT,
171          'FICHIER'   : nomfich,
172       }
173
174       # 4.1. au format AGRAF
175       if FORMAT=='AGRAF':
176          kargs['dform']={ 'formR' : '%12.5E' }
177          kfonc['FORMAT']='TABLEAU'
178       
179       # 4.2. au format XMGRACE et dérivés
180       elif FORMAT=='XMGRACE':
181          kargs['dform']={ 'formR' : '%.8g' }
182          kargs['PILOTE']=args['PILOTE']
183          kfonc['PILOTE']=args['PILOTE']
184
185       # 4.3. format spécifié dans les arguments
186       if args['FORMAT_R']:
187          kargs['dform'].update({ 'formR' : fmtF2PY(args['FORMAT_R']) })
188
189       # 4.4. regroupement par paramètre : PAGINATION
190       if args['PAGINATION']:
191          l_ppag=args['PAGINATION']
192          if not type(l_ppag) in EnumTypes:
193             l_ppag=[l_ppag,]
194          kargs['PAGINATION'] = [p for p in l_ppag if p in nom_para]
195          l_para_err          = [p for p in l_ppag if not p in nom_para]
196          if len(l_para_err)>0:
197             UTMESS('A', 'IMPR_TABLE', 'Paramètres absents de la table (ou de '\
198                    'NOM_PARA) : %s' % ', '.join(l_para_err))
199
200       timp.Impr(**kargs)
201
202       # ----- 5. IMPR_FONCTION='OUI'
203       if args['IMPR_FONCTION'] and args['IMPR_FONCTION']=='OUI':
204          # cherche parmi les cellules celles qui contiennent un nom de fonction
205          dfon={}
206          for row in timp:
207             for par,cell in row.items():
208                if type(cell) in StringTypes:
209                 if aster.getvectjev(cell.strip().ljust(19)+'.PROL')<>None:
210                   dfon[cell.strip().ljust(19)]=par
211          # impression des fonctions trouvées
212          for f,par in dfon.items():
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             )
221             __fonc.Trace(**kfonc)
222             DETRUIRE(CONCEPT=_F(NOM=('__fonc',),), ALARME='NON', INFO=1,)
223
224    # 99. Traiter le cas des UL réservées
225    UL.EtatInit()
226
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