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