1 #@ MODIF N_ETAPE Noyau DATE 03/09/2002 AUTEUR GNICOLAS G.NICOLAS
2 # CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
20 # ======================================================================
22 Ce module contient la classe ETAPE qui sert à vérifier et à exécuter
27 import types,sys,string,os
34 from N_Exception import AsException
36 from N_utils import AsType
38 class ETAPE(N_MCCOMPO.MCCOMPO):
40 Cette classe hérite de MCCOMPO car ETAPE est un OBJECT composite
45 # L'attribut de classe codex est utilisé pour rattacher le module de calcul éventuel (voir Build)
46 # On le met à None pour indiquer qu'il n'y a pas de module de calcul rattaché
49 def __init__(self,oper=None,reuse=None,args={}):
53 - definition : objet portant les attributs de définition d'une étape de type opérateur. Il
54 est initialisé par l'argument oper.
56 - reuse : indique le concept d'entrée réutilisé. Il se trouvera donc en sortie
57 si les conditions d'exécution de l'opérateur l'autorise
59 - valeur : arguments d'entrée de type mot-clé=valeur. Initialisé avec l'argument args.
66 self.parent=CONTEXT.get_current_step()
69 self.idracine=oper.label
70 self.appel=N_utils.callee_where()
76 def make_register(self):
78 Initialise les attributs jdc, id, niveau et réalise les
79 enregistrements nécessaires
82 self.jdc = self.parent.get_jdc_root()
83 self.id=self.parent.register(self)
86 self.jdc = self.parent =None
92 Cette methode a pour fonction de retirer tous les arguments egaux à None
93 de la liste des arguments. Ils sont supposés non présents et donc retirés.
95 for k in self.valeur.keys():
96 if self.valeur[k] == None:del self.valeur[k]
100 Demande la construction des sous-objets et les stocke dans l'attribut
103 self.mc_liste=self.build_mc()
105 def Build_sd(self,nom):
107 Construit le concept produit de l'opérateur. Deux cas
108 peuvent se présenter :
110 - le parent n'est pas défini. Dans ce cas, l'étape prend en charge la création
111 et le nommage du concept.
113 - le parent est défini. Dans ce cas, l'étape demande au parent la création et
114 le nommage du concept.
117 if not self.isactif():return
121 sd= self.parent.create_sdprod(self,nom)
122 if type(self.definition.op_init) == types.FunctionType:
123 apply(self.definition.op_init,(self,self.parent.g_context))
125 sd=self.get_sd_prod()
126 # On n'utilise pas self.definition.op_init car self.parent
128 if sd != None and self.reuse == None:
129 # On ne nomme le concept que dans le cas de non reutilisation
132 if self.jdc and self.jdc.par_lot == "NON" :
135 except AsException,e:
136 raise AsException("Etape ",self.nom,'ligne : ',self.appel[0],
137 'fichier : ',self.appel[1],e)
139 # XXX Normalement le contexte courant doit etre le parent.
140 # Il n'y a pas de raison de remettre le contexte au parent
141 #self.reset_current_step()
144 l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
145 raise AsException("Etape ",self.nom,'ligne : ',self.appel[0],
146 'fichier : ',self.appel[1]+'\n',
151 Cette methode est prevue pour faire une execution dans le cas
153 Par defaut, elle ne fait rien
157 def get_sd_prod(self):
159 Retourne le concept résultat de l'étape
161 cas 1 : sd_prod de oper n'est pas une fonction
162 il s'agit d'une sous classe de ASSD
163 on construit le sd à partir de cette classe
165 cas 2 : il s'agit d'une fonction
166 on l'évalue avec les mots-clés de l'étape (mc_liste)
167 on construit le sd à partir de la classe obtenue
170 if type(self.definition.sd_prod) == types.FunctionType:
171 d=self.cree_dict_valeurs(self.mc_liste)
173 sd_prod= apply(self.definition.sd_prod,(),d)
177 if CONTEXT.debug: traceback.print_exc()
178 l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],
180 raise AsException("impossible d affecter un type au resultat",
182 # sys.exc_info()[0],sys.exc_info()[1],)
184 sd_prod=self.definition.sd_prod
185 # on teste maintenant si la SD est réutilisée ou s'il faut la créer
187 # Il est preferable de traiter cette erreur ultérieurement : ce n'est pas une erreur fatale
188 #if AsType(self.reuse) != sd_prod:
189 # raise AsException("type de concept reutilise incompatible avec type produit")
192 self.sd= sd_prod(etape=self)
193 # Si reuse n'a pas ete donné, c'est une erreur. Ne pas corriger afin de la detecter ensuite
194 #if self.definition.reentrant == 'o':
195 # self.reuse = self.sd
198 def get_type_produit(self):
200 Retourne le type du concept résultat de l'étape
202 cas 1 : sd_prod de oper n'est pas une fonction
203 il s'agit d'une sous classe de ASSD
204 on retourne le nom de la classe
205 cas 2 : il s'agit d'une fonction
206 on l'évalue avec les mots-clés de l'étape (mc_liste)
207 et on retourne son résultat
209 if type(self.definition.sd_prod) == types.FunctionType:
210 d=self.cree_dict_valeurs(self.mc_liste)
212 sd_prod= apply(self.definition.sd_prod,(),d)
214 #traceback.print_exc()
217 sd_prod=self.definition.sd_prod
222 Retourne l'étape à laquelle appartient self
223 Un objet de la catégorie etape doit retourner self pour indiquer que
224 l'étape a été trouvée
225 XXX fait double emploi avec self.etape ????
231 Méthode qui supprime toutes les références arrières afin que l'objet puisse
232 etre correctement détruit par le garbage collector
234 N_MCCOMPO.MCCOMPO.supprime(self)
237 if self.sd : self.sd.supprime()
241 Indique si l'étape est active (1) ou inactive (0)
245 def set_current_step(self):
247 Methode utilisee pour que l etape self se declare etape
248 courante. Utilise par les macros
250 #print "set_current_step ",self.nom
251 #traceback.print_stack(limit=3,file=sys.stdout)
252 cs= CONTEXT.get_current_step()
253 if self.parent != cs :
254 raise "L'étape courante %s devrait etre le parent de self : %s" % (cs,self)
256 CONTEXT.unset_current_step()
257 CONTEXT.set_current_step(self)
259 def reset_current_step(self):
261 Methode utilisee par l'etape self qui remet son etape parent comme
264 #print "reset_current_step ",self.nom
265 #traceback.print_stack(limit=3,file=sys.stdout)
266 cs= CONTEXT.get_current_step()
268 raise "L'étape courante %s devrait etre self : %s" % (cs,self)
270 CONTEXT.unset_current_step()
271 CONTEXT.set_current_step(self.parent)
273 def issubstep(self,etape):
275 Cette methode retourne un entier indiquant si etape est une
276 sous etape de self ou non
279 Une étape simple n'a pas de sous etape
283 def get_file(self,unite=None,fic_origine=''):
285 Retourne le nom du fichier associe a l unite logique unite (entier)
286 ainsi que le source contenu dans le fichier
288 if self.jdc : return self.jdc.get_file(unite=unite,fic_origine=fic_origine)
292 if os.path.exists("fort."+str(unite)):
293 file= "fort."+str(unite)
295 raise AsException("Impossible de trouver le fichier correspondant a l unite %s" % unite)
296 if not os.path.exists(file):
297 raise AsException("%s n'est pas un fichier existant" % unite)
299 text=string.replace(fproc.read(),'\r\n','\n')
301 linecache.cache[file]=0,0,string.split(text,'\n'),file
304 def accept(self,visitor):
306 Cette methode permet de parcourir l'arborescence des objets
307 en utilisant le pattern VISITEUR
309 visitor.visitETAPE(self)
311 def update_context(self,d):
313 Cette methode doit updater le contexte fournit par
314 l'appelant en argument (d) en fonction de sa definition
316 if type(self.definition.op_init) == types.FunctionType:
317 apply(self.definition.op_init,(self,d))
319 d[self.sd.nom]=self.sd
322 """ Méthode qui retourne une copie de self non enregistrée auprès du JDC
327 etape.state = 'modified'
332 for objet in self.mc_liste:
333 new_obj = objet.copy()
334 new_obj.reparent(etape)
335 etape.mc_liste.append(new_obj)
338 def copy_reuse(self,old_etape):
339 """ Méthode qui copie le reuse d'une autre étape.
341 if hasattr(old_etape,"reuse") :
342 self.reuse = old_etape.reuse
344 def copy_sdnom(self,old_etape):
345 """ Méthode qui copie le sdnom d'une autre étape.
347 if hasattr(old_etape,"sdnom") :
348 self.sdnom = old_etape.sdnom
350 def get_sd_utilisees(self):
352 Retourne la liste des concepts qui sont utilisés à l'intérieur d'une commande
353 ( comme valorisation d'un MCS)
356 for child in self.mc_liste:
357 l.extend(child.get_sd_utilisees())
360 def reparent(self,parent):
362 Cette methode sert a reinitialiser la parente de l'objet
365 self.jdc=parent.get_jdc_root()
367 for mocle in self.mc_liste: