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.
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.
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 # ======================================================================
24 from Cata.cata import _F, DEFI_FICHIER, INFO_EXEC_ASTER, DETRUIRE
26 #-------------------------------------------------------------------------------
27 #-------------------------------------------------------------------------------
28 #-------------------------------------------------------------------------------
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é.
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.
42 _setinfo : pour remplir le dictionnaire des 'infos'
44 infos[numéro unité] = { 'nom' : x, 'etat' : x , 'etat_init' : x }
46 #-------------------------------------------------------------------------------
48 """Initialise le dictionnaire des unités.
52 #-------------------------------------------------------------------------------
53 def _setinfo(self, ul):
54 """Remplit les infos de l'unité 'ul'.
56 # ul peut etre un entier Aster
61 # Si la clé n'existe pas
63 if not self.infos.has_key(unit):
65 self.infos[unit]['nom'] = ''
66 self.infos[unit]['etat'] = '?'
67 self.infos[unit]['etat_init'] = '?'
70 __tab=INFO_EXEC_ASTER(UNITE=unit, LISTE_INFO=('ETAT_UNITE'))
72 # O:ouvert, F:fermé, R:réservé
73 self.infos[unit]['etat'] = __tab['ETAT_UNITE',1].strip()[0]
75 self.infos[unit]['etat_init'] = self.infos[unit]['etat']
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)
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)
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'.
95 __tab=INFO_EXEC_ASTER(LISTE_INFO=('UNITE_LIBRE'))
96 unit = __tab['UNITE_LIBRE',1]
97 DETRUIRE(CONCEPT=_F(NOM=__tab),INFO=1)
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
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'
114 #-------------------------------------------------------------------------------
116 """Retourne le nom du fichier associé à l'unité 'ul'.
118 # ul peut etre un entier Aster
123 # Si la clé n'existe pas
124 if not self.infos.has_key(unit):
126 return self.infos[unit]['nom']
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).
137 # ul peut etre un entier Aster
142 # Si la clé n'existe pas
143 if not self.infos.has_key(unit):
145 if not kargs.has_key('etat'):
146 return self.infos[unit]['etat']
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
154 if self.infos[unit]['etat'] == new:
157 if self.infos[unit]['etat'] == 'O':
158 DEFI_FICHIER(ACTION='LIBERER', UNITE=unit)
159 DEFI_FICHIER(ACTION = 'RESERVER',
161 FICHIER = kargs.get('nom', self.infos[unit]['nom']))
164 DEFI_FICHIER(ACTION='LIBERER', UNITE=unit)
166 if self.infos[unit]['etat'] == 'R':
167 DEFI_FICHIER(ACTION='LIBERER', UNITE=unit)
169 typ = kargs.get('TYPE', 'ASCII')
174 acces = kargs.get('ACCES', acces)
175 DEFI_FICHIER(ACTION ='ASSOCIER',
177 FICHIER = kargs.get('nom', self.infos[unit]['nom']),
181 self.infos[unit]['etat'] = new
182 return self.infos[unit]['etat']
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.
190 for uli, vul in self.infos.items():
191 self.Etat(uli, etat=vul['etat_init'])
193 if not type(ul) in [types.ListType, types.TupleType]:
196 # u peut etre un entier Aster
201 # Si la clé n'existe pas
202 if not self.infos.has_key(unit):
205 self.Etat(unit, etat=self.infos[unit]['etat_init'])