]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/Utilitai/UniteAster.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / Utilitai / UniteAster.py
1 #@ MODIF UniteAster Utilitai  DATE 29/08/2006   AUTEUR MCOURTOI M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2005  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 types
22
23 import aster
24 from Cata.cata import _F, DEFI_FICHIER, INFO_EXEC_ASTER, DETRUIRE
25
26 #-------------------------------------------------------------------------------
27 #-------------------------------------------------------------------------------
28 #-------------------------------------------------------------------------------
29 class UniteAster:
30    """Classe pour manipuler les fichiers en Python en accord avec les unités
31    logiques utilisées en Fortran.
32    De manière analogue au Fortran, les états possibles d'une unité sont :
33       'F' : fermé, 'O' : ouvert, 'R' : réservé.
34
35    Méthodes :
36       Nom      : Retourne le nom du fichier associé à une unité,
37       Etat     : Retourne l'état d'une unité,
38       Libre    : Retourne un numéro d'unité libre,
39       EtatInit : Remet une, plusieurs ou toutes les unités dans leur état initial.
40
41    Méthode privée :
42       _setinfo : pour remplir le dictionnaire des 'infos'
43    Attribut privé :
44       infos[numéro unité] = { 'nom' : x, 'etat' : x , 'etat_init' : x }
45    """
46 #-------------------------------------------------------------------------------
47    def __init__(self):
48       """Initialise le dictionnaire des unités.
49       """
50       self.infos = {}
51
52 #-------------------------------------------------------------------------------
53    def _setinfo(self, ul):
54       """Remplit les infos de l'unité 'ul'.
55       """
56       # ul peut etre un entier Aster
57       try:
58          unit = ul.valeur
59       except:
60          unit = int(ul)
61       # Si la clé n'existe pas
62       ini = False
63       if not self.infos.has_key(unit):
64          self.infos[unit] = {}
65          self.infos[unit]['nom']       = ''
66          self.infos[unit]['etat']      = '?'
67          self.infos[unit]['etat_init'] = '?'
68          ini = True
69
70       __tab=INFO_EXEC_ASTER(UNITE=unit, LISTE_INFO=('ETAT_UNITE'))
71       
72       # O:ouvert, F:fermé, R:réservé
73       self.infos[unit]['etat'] = __tab['ETAT_UNITE',1].strip()[0]
74       if ini:
75          self.infos[unit]['etat_init'] = self.infos[unit]['etat']
76
77       # nom du fichier
78       if self.infos[unit]['etat'] in ['O', 'R']:
79          nomfich=''.join([__tab['NOMFIC%d' % i,1] for i in range(1,5)]).strip()
80       elif self.infos[unit]['etat'] == 'F':
81          nomfich='fort.'+str(unit)
82       else:
83          message = "Etat de l'unité inconnu : %s" % self.infos[unit]['etat']
84          print __tab.EXTR_TABLE()
85          raise aster.FatalError,"<F> <UniteAster._setinfo> %s" % message
86       self.infos[unit]['nom'] = nomfich
87       #print 'DEBUG infos[unit] = ', self.infos[unit]
88       DETRUIRE(CONCEPT=_F(NOM=__tab),INFO=1)
89
90 #-------------------------------------------------------------------------------
91    def Libre(self, nom=None, action='RESERVER'):
92       """Réserve/associe et retourne une unité libre en y associant, s'il est
93       fourni, le fichier 'nom'.
94       """
95       __tab=INFO_EXEC_ASTER(LISTE_INFO=('UNITE_LIBRE'))
96       unit = __tab['UNITE_LIBRE',1]
97       DETRUIRE(CONCEPT=_F(NOM=__tab),INFO=1)
98       if nom==None:
99          nom='fort.'+str(unit)
100
101       # Si la clé existe, c'est que le fichier n'était pas libre
102       if self.infos.has_key(unit):
103          message = "Cette unité est déjà affectée au fichier %s" % \
104             self.infos[unit]['nom']
105          raise aster.FatalError,"<F> <UniteAster.Libre> %s" % message
106
107       DEFI_FICHIER(ACTION=action, UNITE=unit , FICHIER=nom.strip())
108       self.infos[unit] = {}
109       self.infos[unit]['nom']       = nom.strip()
110       self.infos[unit]['etat']      = 'R'
111       self.infos[unit]['etat_init'] = 'F'
112       return unit
113
114 #-------------------------------------------------------------------------------
115    def Nom(self, ul):
116       """Retourne le nom du fichier associé à l'unité 'ul'.
117       """
118       # ul peut etre un entier Aster
119       try:
120          unit = ul.valeur
121       except:
122          unit = int(ul)
123       # Si la clé n'existe pas
124       if not self.infos.has_key(unit):
125          self._setinfo(unit)
126       return self.infos[unit]['nom']
127
128 #-------------------------------------------------------------------------------
129    def Etat(self, ul, **kargs):
130       """Retourne l'état de l'unité si 'etat' n'est pas fourni
131       et/ou change son état :
132          kargs['etat']  : nouvel état,
133          kargs['nom']   : nom du fichier,
134          kargs['TYPE']  : type du fichier à ouvrir ASCII/BINARY/LIBRE,
135          kargs['ACCES'] : type d'accès NEW/APPEND/OLD (APPEND uniquement en ASCII).
136       """
137       # ul peut etre un entier Aster
138       try:
139          unit = ul.valeur
140       except:
141          unit = int(ul)
142       # Si la clé n'existe pas
143       if not self.infos.has_key(unit):
144          self._setinfo(unit)
145       if not kargs.has_key('etat'):
146          return self.infos[unit]['etat']
147
148       # En fonction de la demande, on bascule son état ou pas
149       new = kargs.get('etat')
150       if not new in ['R', 'F', 'O']:
151          message = "Nouvel état de l'unité incorrect : %s" % new
152          raise aster.FatalError,"<F> <UniteAster.Etat> %s" % message
153
154       if self.infos[unit]['etat'] == new:
155          pass
156       elif new == 'R':
157          if self.infos[unit]['etat'] == 'O':
158             DEFI_FICHIER(ACTION='LIBERER',  UNITE=unit)
159          DEFI_FICHIER(ACTION  = 'RESERVER', 
160                       UNITE   = unit,
161                       FICHIER = kargs.get('nom', self.infos[unit]['nom']))
162          self._setinfo(unit)
163       elif new == 'F':
164          DEFI_FICHIER(ACTION='LIBERER', UNITE=unit)
165       elif new == 'O':
166          if self.infos[unit]['etat'] == 'R':
167             DEFI_FICHIER(ACTION='LIBERER', UNITE=unit)
168          # valeurs par défaut
169          typ   = kargs.get('TYPE', 'ASCII')
170          if typ == 'ASCII':
171             acces = 'APPEND'
172          else:
173             acces = 'OLD'
174          acces = kargs.get('ACCES', acces)
175          DEFI_FICHIER(ACTION  ='ASSOCIER',
176                       UNITE   = unit,
177                       FICHIER = kargs.get('nom', self.infos[unit]['nom']),
178                       TYPE    = typ,
179                       ACCES   = acces,)
180          self._setinfo(unit)
181       self.infos[unit]['etat'] = new
182       return self.infos[unit]['etat']
183
184 #-------------------------------------------------------------------------------
185    def EtatInit(self, ul=None):
186       """Remet l'unité 'ul' dans son état initial.
187       Si 'ul' est omis, toutes les unités sont remises dans leur état initial.
188       """
189       if ul == None:
190          for uli, vul in self.infos.items():
191             self.Etat(uli, etat=vul['etat_init'])
192       else:
193          if not type(ul) in [types.ListType, types.TupleType]:
194             ul=[ul,]
195          for u in ul:
196             # u peut etre un entier Aster
197             try:
198                unit = u.valeur
199             except:
200                unit = int(u)
201             # Si la clé n'existe pas
202             if not self.infos.has_key(unit):
203                self._setinfo(unit)
204             else:
205                self.Etat(unit, etat=self.infos[unit]['etat_init'])