]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA76/Macro/lire_table_ops.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA76 / Macro / lire_table_ops.py
1 #@ MODIF lire_table_ops Macro  DATE 26/05/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 import string
22
23 # ------------------------------------------------------------------------------
24 def lecture_table(texte,nume,separ):
25   """Méthode de construction du dictionnaire PARAMETRE / LISTE DE VALEURS
26   format ASTER
27   Les lignes contenant autre chose que des séquences de nombres
28   réels et de séparateurs sont considérées comme délimitant deux
29   fonctions différentes. Cette situation correspond à l exception
30   ValueError levée par le map de float. Le deuxieme indice de
31   VALE_PARA et VALE_RESU est l indice permettant de pointer sur la
32   fonction voulue, au sens de ce découpage.
33   """
34
35   from Utilitai.transpose import transpose
36   if string.strip(separ)=='' : separ=None
37   tab_lue={}
38   nume_lign=[]
39   idt_deb='#DEBUT_TABLE\n'
40   idt_fin='#FIN_TABLE\n'
41   idt_tit='#TITRE'
42   if nume>texte.count(idt_deb) :
43      message=        "<F> <CREA_TABLE> NUME_TABLE :le nombre de blocs de tables dans "
44      message=message+"le fichier est "+str(texte.count(idt_deb))
45      return 1,message,None,None,None
46   for i in range(nume):
47      texte=texte[texte.index(idt_deb)+1:]
48   texte=texte[:texte.index(idt_fin)]
49
50   titre_tab=[string.rstrip(elem[7:-1]) for elem in texte if elem.find(idt_tit)!=-1]
51   texte_tab=[elem.split(separ) for elem in texte if elem.find(idt_tit)==-1]
52
53   if ( separ!=None) :
54      tab_trav=[]
55      for line in texte_tab :
56         ligne=[]
57         for elem in line :
58            if ( elem != '' and elem !='\n') :
59               ligne.append(string.strip(elem))
60         tab_trav.append(ligne)
61      texte_tab=tab_trav
62
63   list_para=texte_tab[0]
64   list_type=texte_tab[1]
65   texte_tab.pop(0)
66   texte_tab.pop(0)
67   nb_para=len(texte_tab[0])
68
69   for line in texte_tab :
70     if len(line)!=nb_para :
71        message=        "<F> <CREA_TABLE> incoherence dans le nombre de colonnes "
72        message=message+"de la table a lire"
73        return 1,message,None,None,None
74   texte_tab=transpose(texte_tab)
75   for i in range(nb_para):
76     tab_trav=[]
77     list_val=[]
78     col_type=list_type[i]
79     if col_type=='R':
80        try              : 
81               texte_tab[i]=map(float,texte_tab[i])
82               nume_lign.append([0])
83        except ValueError:
84 # Presence de - dans la ligne
85               for indice in range(len(texte_tab[i])):
86                         if texte_tab[i][indice]!='-':
87                              tab_trav.append(indice+1)
88                              list_val.append(float(texte_tab[i][indice]))
89                              
90               nume_lign.append(tab_trav)
91               texte_tab[i]=list_val
92     elif col_type=='I' :
93        try              :
94               texte_tab[i]=map(int,texte_tab[i])
95               nume_lign.append([0])
96 # Presence de - dans la ligne
97        except ValueError:
98               for indice in range(len(texte_tab[i])):
99                         if texte_tab[i][indice]!='-':
100                              tab_trav.append(indice+1)
101                              list_val.append(float(texte_tab[i][indice]))
102               nume_lign.append(tab_trav)
103               texte_tab[i]=list_val
104
105     else :
106        try              : nume_lign.append([0])
107        except ValueError: pass
108     
109     tab_lue[list_para[i]]=(list_type[i],texte_tab[i],nume_lign[i])
110
111   return 0,None,titre_tab,list_para,tab_lue
112
113
114 # ------------------------------------------------------------------------------
115 def lire_table_ops(self,UNITE,FORMAT,NUME_TABLE,SEPARATEUR,
116                         TYPE_TABLE,PARA,TITRE,**args):   
117   """Méthode corps de la macro LIRE_TABLE
118   """
119   import os
120   from Accas import _F
121   from Utilitai.Utmess     import UTMESS
122   from Utilitai.UniteAster import UniteAster
123
124   ier=0
125   ### On importe les definitions des commandes a utiliser dans la macro
126   CREA_TABLE  =self.get_cmd('CREA_TABLE')
127
128   ### La macro compte pour 1 dans la numerotation des commandes
129   self.set_icmd(1)
130
131   ### Lecture de la table dans un fichier d unité logique UNITE
132   UL = UniteAster()
133   nomfich=UL.Nom(UNITE)
134   if not os.path.isfile(nomfich):
135      UTMESS('F', nompro, "le fichier '%s' est introuvable" % nomfich)
136
137   file=open(nomfich,'r')
138   texte=file.readlines()
139   file.close()
140
141   ### mise en forme de la liste de valeurs suivant le format choisi :
142   if FORMAT=='ASTER':
143     ier,message,titr_tab,list_para,tab_lue=lecture_table(texte,NUME_TABLE,SEPARATEUR)
144     if ier!=0 :
145        self.cr.fatal(message)
146        return ier
147   else                : pass
148
149   ### création de la table ASTER :
150   self.DeclareOut('ut_tab',self.sd)
151   mcfact=[]
152   num_col=0
153   for tab_para in list_para:
154     mcsimp={}
155     mcsimp['PARA']=tab_para
156
157     if tab_lue[tab_para][2] != [0] :
158        mcsimp['NUME_LIGN']=tab_lue[tab_para][2]
159        
160     if tab_lue[tab_para][0] not in ('I','R') :
161        mcsimp['TYPE_K'] =tab_lue[tab_para][0]
162        mcsimp['LISTE_K']=tab_lue[tab_para][1]
163     elif tab_lue[tab_para][0]=='I' :
164        mcsimp['LISTE_I']=tab_lue[tab_para][1]
165     elif tab_lue[tab_para][0]=='R' :
166        mcsimp['LISTE_R']=tab_lue[tab_para][1]
167
168     mcfact.append( _F(**mcsimp) )
169     num_col = num_col + 1
170   motscles={}
171   motscles['LISTE']=mcfact
172
173   ut_tab=CREA_TABLE(TITRE=titr_tab,TYPE_TABLE=TYPE_TABLE, **motscles)
174
175   # remet UNITE dans son état initial
176   UL.EtatInit()
177   return ier