1 # -*- coding: utf-8 -*-
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 # ======================================================================
25 import traceback,types,string
30 from Noyau.N_ASSD import ASSD
33 # import rajoutés suite à l'ajout de Build_sd --> à résorber
34 import Noyau, Validation.V_MACRO_ETAPE
35 from Noyau import N_Exception
36 from Noyau.N_Exception import AsException
37 import Accas # attention aux imports circulaires
38 # fin import à résorber
40 class MACRO_ETAPE(I_ETAPE.ETAPE):
44 self.recorded_units={}
46 def get_sdprods(self,nom_sd):
48 Fonction : retourne le concept produit par l etape de nom nom_sd
49 s il existe sinon None
51 if self.sd and self.sd.nom == nom_sd :return self.sd
52 for co in self.sdprods:
53 if co.nom == nom_sd:return co
54 if type(self.definition.op_init) == types.FunctionType:
56 apply(self.definition.op_init,(self,d))
57 return d.get(nom_sd,None)
60 def get_contexte_jdc(self,fichier,text):
62 Interprète text comme un texte de jdc et retourne le contexte final.
64 Le contexte final est le dictionnaire des sd disponibles à la dernière étape.
65 Si text n'est pas un texte de jdc valide, retourne None
67 --> utilisée par ops.POURSUITE et INCLUDE
69 #print "get_contexte_jdc",self,self.nom
70 # On recupere l'etape courante
71 step=CONTEXT.get_current_step()
73 # on essaie de créer un objet JDC auxiliaire avec un contexte initial
74 # Attention get_contexte_avant retourne un dictionnaire qui contient
75 # le contexte courant. Ce dictionnaire est reactualise regulierement.
76 # Si on veut garder l'etat du contexte fige, il faut en faire une copie.
77 context_ini = self.parent.get_contexte_avant(self).copy()
78 #print "get_contexte_jdc",context_ini.keys()
80 # Indispensable avant de creer un nouveau JDC
81 CONTEXT.unset_current_step()
84 if hasattr(self,'prefix'):
85 prefix_include=self.prefix
86 # ATTENTION : le dictionnaire recorded_units sert à memoriser les unites des
87 # fichiers inclus. Il est preferable de garder le meme dictionnaire pendant
88 # tout le traitement et de ne pas le reinitialiser brutalement (utiliser
89 # clear plutot) si on ne veut pas perdre la memoire des unites.
90 # En principe si la memorisation est faite au bon moment il n'est pas necessaire
91 # de prendre cette precaution mais ce n'est pas vrai partout.
92 old_recorded_units=self.recorded_units.copy()
94 # on supprime l'ancien jdc_aux s'il existe
95 if hasattr(self,'jdc_aux') and self.jdc_aux:
96 self.jdc_aux.supprime_aux()
98 if fichier is None:fichier="SansNom"
100 # Il faut convertir le texte inclus en fonction du format
101 # sauf les INCLUDE_MATERIAU
102 if self.nom != "INCLUDE_MATERIAU":
103 format=self.jdc.appli.format_fichier.get()
104 if convert.plugins.has_key(format):
105 # Le convertisseur existe on l'utilise
106 p=convert.plugins[format]()
108 text=p.convert('exec',self)
110 j=self.JdC_aux( procedure=text, nom=fichier,
111 appli=self.jdc.appli,
113 cata_ord_dico=self.jdc.cata_ordonne_dico,
114 context_ini = context_ini,
115 jdc_pere=self.jdc,etape_include=self,
116 prefix_include=prefix_include,
117 recorded_units=self.recorded_units,
118 old_recorded_units=old_recorded_units,**args)
121 # On récupère les étapes internes (pour validation)
125 traceback.print_exc()
126 # On retablit l'etape courante step
127 CONTEXT.unset_current_step()
128 CONTEXT.set_current_step(step)
131 if not j.cr.estvide():
132 # Erreurs dans l'INCLUDE. On garde la memoire du fichier
133 # mais on n'insere pas les concepts
134 # On retablit l'etape courante step
135 CONTEXT.unset_current_step()
136 CONTEXT.set_current_step(step)
137 raise Exception("Impossible de relire le fichier\n"+str(j.cr))
140 # L'INCLUDE n'est pas valide.
141 # on produit un rapport d'erreurs
143 # On retablit l'etape courante step
144 CONTEXT.unset_current_step()
145 CONTEXT.set_current_step(step)
146 raise Exception("Le fichier include contient des erreurs\n"+str(cr))
148 # Si aucune erreur rencontrée
149 # On recupere le contexte de l'include verifie
151 j_context=j.get_verif_contexte()
152 #print j_context.keys()
153 #print j.g_context.keys()
155 # On retablit l'etape courante step
156 CONTEXT.unset_current_step()
157 CONTEXT.set_current_step(step)
160 # On remplit le dictionnaire des concepts produits inclus
161 # en retirant les concepts présents dans le contexte initial
162 # On ajoute egalement le concept produit dans le sds_dict du parent
163 # sans verification car on est sur (verification integrée) que
164 # le nommage est possible
165 self.g_context.clear()
166 for k,v in j_context.items():
167 if not context_ini.has_key(k) or context_ini[k] != v:
169 self.parent.sds_dict[k]=v
172 # On recupere le contexte courant
173 self.current_context=j.current_context
174 self.index_etape_courante=j.index_etape_courante
177 # On retablit l'etape courante step
178 CONTEXT.unset_current_step()
179 CONTEXT.set_current_step(step)
183 def reevalue_sd_jdc(self):
185 Avec la liste des SD qui ont été supprimées, propage la
186 disparition de ces SD dans toutes les étapes et descendants
188 #print "reevalue_sd_jdc"
189 l_sd_supp,l_sd_repl = self.diff_contextes()
191 self.parent.delete_concept_after_etape(self,sd)
192 for old_sd,sd in l_sd_repl:
193 self.parent.replace_concept_after_etape(self,old_sd,sd)
195 def diff_contextes(self):
197 Réalise la différence entre les 2 contextes
198 old_contexte_fichier_init et contexte_fichier_init
199 cad retourne la liste des sd qui ont disparu ou ne derivent pas
200 de la meme classe et des sd qui ont ete remplacees
202 if not hasattr(self,'old_contexte_fichier_init'):return [],[]
205 for old_key in self.old_contexte_fichier_init.keys():
206 if not self.contexte_fichier_init.has_key(old_key):
207 if isinstance(self.old_contexte_fichier_init[old_key],ASSD):
208 l_sd_suppressed.append(self.old_contexte_fichier_init[old_key])
210 if isinstance(self.old_contexte_fichier_init[old_key],ASSD):
211 # Un concept de meme nom existe
212 old_class=self.old_contexte_fichier_init[old_key].__class__
213 if not isinstance(self.contexte_fichier_init[old_key],old_class):
214 # S'il n'est pas d'une classe derivee, on le supprime
215 l_sd_suppressed.append(self.old_contexte_fichier_init[old_key])
217 l_sd_replaced.append((self.old_contexte_fichier_init[old_key],self.contexte_fichier_init[old_key]))
218 return l_sd_suppressed,l_sd_replaced
220 def control_sdprods(self,d):
222 Cette methode doit verifier que les concepts produits par la
223 commande ne sont pas incompatibles avec le contexte fourni (d).
224 Si c'est le cas, le concept produit doit etre supprime
225 Si la macro a elle meme des etapes, elle doit propager
226 le traitement (voir methode control_jdc_context_apres de I_JDC)
228 #print "I_MACRO_ETAPE.control_sdprods",d.keys(),self.nom,self.sd and self.sd.nom
230 if d.has_key(self.sd.nom):
231 # Le concept est deja defini
232 if self.reuse and self.reuse is d[self.sd.nom]:
233 # Le concept est reutilise : situation normale
236 # Redefinition du concept, on l'annule
237 #XXX on pourrait simplement annuler son nom pour conserver les objets
238 # l'utilisateur n'aurait alors qu'a renommer le concept (faisable??)
241 self.sd=self.reuse=self.sdnom=None
242 self.parent.delete_concept_after_etape(self,sd)
245 # On verifie les concepts a droite du signe =
247 sdprods=self.sdprods[:]
250 if d.has_key(co.nom) and co is not d[co.nom] :
251 #nettoie les mots cles de l'étape qui ont comme valeur co
252 self.delete_concept(co)
253 #supprime les references a co dans les etapes suivantes
254 self.parent.delete_concept_after_etape(self,co)
256 self.sdprods.append(co)
259 for e in self.etapes:
263 def supprime_sdprod(self,sd):
265 Supprime le concept produit sd s'il est produit par l'etape
267 if sd in self.sdprods:
269 self.parent.del_sdprod(sd)
270 self.sdprods.remove(sd)
272 self.parent.delete_concept(sd)
275 if sd is not self.sd :return
276 if self.sd is not None :
278 self.parent.del_sdprod(sd)
281 self.parent.delete_concept(sd)
283 def supprime_sdprods(self):
285 Fonction: Lors de la destruction de la macro-etape, detruit tous les concepts produits
286 Un opérateur n a qu un concept produit
287 Une procedure n'en a aucun
288 Une macro en a en général plus d'un
290 #print "supprime_sdprods"
291 if self.reuse is not self.sd :
292 # l'étape n'est pas réentrante
293 # le concept retourné par l'étape est à supprimer car il était
296 self.parent.del_sdprod(self.sd)
297 self.parent.delete_concept(self.sd)
298 # On détruit les concepts à droite du signe =
299 for co in self.sdprods:
300 self.parent.del_sdprod(co)
301 self.parent.delete_concept(co)
302 # Si la macro a des etapes et des concepts inclus, on les detruit
303 for nom_sd,co in self.g_context.items():
304 if not isinstance(co,ASSD):continue
305 self.parent.del_sdprod(co)
306 self.parent.delete_concept(co)
307 # On met g_context à blanc
312 if hasattr(self,"jdc_aux") and self.jdc_aux:
313 # La macro a un jdc auxiliaire inclus. On demande sa fermeture
316 def reset_context(self):
317 if hasattr(self,"jdc_aux") and self.jdc_aux:
318 # La macro a un jdc auxiliaire inclus. On demande la reinitialisation du contexte
319 self.jdc_aux.reset_context()
321 def update_concept(self,sd):
322 I_ETAPE.ETAPE.update_concept(self,sd)
323 for etape in self.etapes:
324 etape.update_concept(sd)
326 def delete_concept(self,sd):
328 Fonction : Mettre a jour les mots cles de l etape et eventuellement
329 le concept produit si reuse suite à la disparition du concept sd
330 Seuls les mots cles simples MCSIMP font un traitement autre
331 que de transmettre aux fils
333 #print "delete_concept",sd
334 I_ETAPE.ETAPE.delete_concept(self,sd)
335 for etape in self.etapes:
336 etape.delete_concept(sd)
338 def replace_concept(self,old_sd,sd):
340 Fonction : Mettre a jour les mots cles de l etape et le concept produit si reuse
341 suite au remplacement du concept old_sd par sd
343 #print "replace_concept",old_sd,sd
344 I_ETAPE.ETAPE.replace_concept(self,old_sd,sd)
345 for etape in self.etapes:
346 etape.replace_concept(old_sd,sd)
348 def change_fichier_init(self,new_fic,text):
350 Tente de changer le fichier include. Le precedent include est conservé
353 #print "change_fichier_init",new_fic
354 if not hasattr(self,'fichier_ini'):
355 self.fichier_ini=None
356 self.fichier_text=None
357 self.fichier_err="Le fichier n'est pas defini"
358 self.contexte_fichier_init={}
359 self.recorded_units={}
361 self.fichier_unite="PasDefini"
362 import Extensions.jdc_include
363 self.JdC_aux=Extensions.jdc_include.JdC_include
365 self.old_fic = self.fichier_ini
366 self.old_text = self.fichier_text
367 self.old_err = self.fichier_err
368 self.old_context=self.contexte_fichier_init
369 self.old_units=self.recorded_units
370 self.old_etapes=self.etapes
371 self.old_jdc_aux=self.jdc_aux
373 self.fichier_ini = new_fic
374 self.fichier_text=text
377 self.make_contexte_include(new_fic,text)
379 l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
380 self.fichier_err=string.join(l)
383 # L'evaluation de text dans un JDC auxiliaire s'est bien passé
384 # on peut poursuivre le traitement
386 self.state="undetermined"
387 self.fichier_err=None
388 # On enregistre la modification de fichier
390 # Le contexte du parent doit etre reinitialise car les concepts produits ont changé
391 self.parent.reset_context()
393 # Si des concepts ont disparu lors du changement de fichier, on demande leur suppression
394 self.old_contexte_fichier_init=self.old_context
395 self.reevalue_sd_jdc()
399 self.old_jdc_aux.close()
401 def restore_fichier_init(self):
403 Restaure le fichier init enregistre dans old_xxx
405 self.fichier_ini=self.old_fic
406 self.fichier_text=self.old_text
407 self.fichier_err=self.old_err
408 self.contexte_fichier_init=self.old_context
409 self.recorded_units=self.old_units
410 self.etapes=self.old_etapes
411 self.jdc_aux=self.old_jdc_aux
413 def force_fichier_init(self):
415 Force le remplacement du fichier init meme si le remplacant est en erreur
417 # Reinitialisation complete du compte-rendu d'erreurs
418 self.jdc_aux.cr=self.jdc_aux.CR()
419 # On remplit le dictionnaire des concepts produits inclus
420 # en retirant les concepts présents dans le contexte initial
421 # On ajoute egalement le concept produit dans le sds_dict du parent
422 # sans verification car on est sur (verification integrée) que
423 # le nommage est possible
424 j_context=self.jdc_aux.get_contexte_avant(None)
425 self.g_context.clear()
426 context_ini=self.jdc_aux.context_ini
427 for k,v in j_context.items():
428 if not context_ini.has_key(k) or context_ini[k] != v:
430 self.parent.sds_dict[k]=v
431 # On recupere le contexte courant
432 self.current_context=self.jdc_aux.current_context
433 self.index_etape_courante=self.jdc_aux.index_etape_courante
434 self.contexte_fichier_init = j_context
435 self.fichier_err = None
437 # On enregistre la modification de fichier
439 self.state="undetermined"
441 # Le contexte du parent doit etre reinitialise car les concepts produits ont changé
442 self.parent.reset_context()
444 # On remplace les anciens concepts par les nouveaux (y compris ajouts
445 # et suppression) et on propage les modifications aux etapes precedentes et suivantes
446 # reevalue_sd_jdc construit la liste des differences entre les contextes contexte_fichier_init
447 # et old_contexte_fichier_init et effectue les destructions et remplacements de concept
449 self.old_contexte_fichier_init=self.old_context
450 self.reevalue_sd_jdc()
453 self.old_jdc_aux.close()
455 self.jdc_aux.force_contexte(self.g_context)
457 def build_include(self,fichier,text):
458 import Extensions.jdc_include
459 self.JdC_aux=Extensions.jdc_include.JdC_include
460 # un include partage la table des unites avec son parent (jdc)
461 self.recorded_units=self.parent.recorded_units
462 self.build_jdcaux(fichier,text)
464 def build_poursuite(self,fichier,text):
465 import Extensions.jdc_include
466 self.JdC_aux=Extensions.jdc_include.JdC_poursuite
467 # une poursuite a sa propre table d'unites
468 self.recorded_units={}
469 self.build_jdcaux(fichier,text)
471 def build_jdcaux(self,fichier,text):
473 Cree un jdc auxiliaire initialise avec text.
474 Initialise le nom du fichier associé avec fichier
475 N'enregistre pas d'association unite <-> fichier
477 self.fichier_ini = fichier
478 self.fichier_text= text
479 self.fichier_unite=None
480 self.fichier_err = None
482 contexte = self.get_contexte_jdc(fichier,text)
483 if contexte is None :
484 # Impossible de construire le jdc auxiliaire (sortie par None)
485 # On simule une sortie par exception
486 raise Exception("Impossible de construire le jeu de commandes correspondant au fichier")
488 # La construction du jdc auxiliaire est allée au bout
489 self.contexte_fichier_init = contexte
493 # Impossible de construire le jdc auxiliaire (sortie par exception)
494 l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
496 self.jdc.appli.affiche_alerte("Erreur lors de l'evaluation du fichier inclus",
497 message="Ce fichier ne sera pas pris en compte\n"+string.join(l)
502 self.fichier_err = string.join(l)
503 self.contexte_fichier_init={}
508 def make_contexte_include(self,fichier,text):
510 Cette méthode sert à créer un contexte en interprétant un texte source Python.
512 #print "make_contexte_include",fichier
513 # on récupère le contexte d'un nouveau jdc dans lequel on interprete text
514 contexte = self.get_contexte_jdc(fichier,text)
515 if contexte == None :
516 raise Exception("Impossible de construire le jeu de commandes correspondant au fichier")
518 # Pour les macros de type include : INCLUDE, INCLUDE_MATERIAU et POURSUITE
519 # l'attribut g_context est un dictionnaire qui contient les concepts produits par inclusion
520 # l'attribut contexte_fichier_init est un dictionnaire qui contient les concepts produits
521 # en sortie de macro. g_context est obtenu en retirant de contexte_fichier_init les concepts
522 # existants en debut de macro contenus dans context_ini (dans get_contexte_jdc)
523 # g_context est utilisé pour avoir les concepts produits par la macro
524 # contexte_fichier_init est utilisé pour avoir les concepts supprimés par la macro
525 self.contexte_fichier_init = contexte
527 def reevalue_fichier_init_OBSOLETE(self):
528 """Recalcule les concepts produits par le fichier enregistre"""
529 #print "reevalue_fichier_init"
530 old_context=self.contexte_fichier_init
532 self.make_contexte_include(self.fichier_ini ,self.fichier_text)
534 l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
535 self.fichier_err = string.join(l)
539 self.old_contexte_fichier_init=old_context
540 self.contexte_fichier_init={}
541 self.reevalue_sd_jdc()
544 # L'evaluation s'est bien passee
545 self.fichier_err = None
546 self.old_contexte_fichier_init=old_context
547 self.reevalue_sd_jdc()
549 def update_fichier_init(self,unite):
550 """Reevalue le fichier init sans demander (dans la mesure du possible) a l'utilisateur
551 les noms des fichiers
552 Ceci suppose que les relations entre unites et noms ont été memorisees préalablement
553 L'include a été initialisé précédemment. Le jdc auxiliaire existe.
555 #print "update_fichier_init",unite,self.fichier_unite
556 self.old_contexte_fichier_init=self.contexte_fichier_init
557 old_fichier_ini=self.fichier_ini
558 if not hasattr(self,"jdc_aux"):self.jdc_aux=None
559 old_jdc_aux=self.jdc_aux
561 #print "update_fichier_init",self,self.parent,self.parent.recorded_units
563 if self.fichier_unite is None:
564 # L'unité n'était pas définie précédemment. On ne change que l'unite
565 #print "update_fichier_init","pas de changement dans include"
566 self.fichier_unite=unite
568 elif unite == self.fichier_unite :
569 # L'unité n'a pas changé
570 #print "update_fichier_init","pas de changement dans include 3"
572 elif unite != self.fichier_unite :
573 # L'unité était définie précédemment. On remplace l'include
575 f,text=self.get_file_memo(unite=unite,fic_origine=self.parent.nom)
577 # Le fichier associé n'a pas pu etre defini
578 # on change l'unite associée mais pas l'include
579 #print "update_fichier_init","pas de changement dans include 2"
580 self.fichier_unite=unite
584 self.fichier_text=text
585 self.fichier_unite=unite
586 #print "update_fichier_init",self.recorded_units
588 #print "update_fichier_init",self.fichier_ini,self.fichier_text,self.fichier_unite
590 if old_fichier_ini == self.fichier_ini:
591 # Le fichier inclus n'a pas changé. On ne recrée pas le contexte
592 # mais on enregistre le changement d'association unite <-> fichier
593 #print "update_fichier_init.fichier inchange",self.jdc_aux.context_ini
594 self.parent.record_unit(unite,self)
598 self.fichier_err=None
599 self.make_contexte_include(self.fichier_ini,self.fichier_text)
600 # Les 3 attributs fichier_ini fichier_text recorded_units doivent etre corrects
601 # avant d'appeler change_unit
603 # Erreurs lors de l'evaluation de text dans un JDC auxiliaire
604 l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
605 # On conserve la memoire du nouveau fichier
606 # mais on n'utilise pas les concepts crees par ce fichier
607 # on met l'etape en erreur : fichier_err=string.join(l)
608 self.fichier_err=string.join(l)
612 self.contexte_fichier_init={}
616 self.parent.record_unit(unite,self)
617 # Le contexte du parent doit etre reinitialise car les concepts
618 # produits ont changé
619 self.parent.reset_context()
620 # Si des concepts ont disparu lors du changement de fichier, on
621 # demande leur suppression
622 self.reevalue_sd_jdc()
623 #print "update_fichier_init",self.jdc_aux.context_ini.keys()
625 def record_unite(self):
626 #print "record_unite",self.nom
627 if self.nom == "POURSUITE":
628 self.parent.record_unit(None,self)
630 if hasattr(self,'fichier_unite') :
631 self.parent.record_unit(self.fichier_unite,self)
633 def get_file_memo(self,unite=None,fic_origine=''):
634 """Retourne le nom du fichier et le source correspondant a l'unite unite
635 Initialise en plus recorded_units
637 #print "get_file_memo",unite,fic_origine,self,self.parent
638 #print self.parent.recorded_units
640 # On est dans le cas d'une poursuite. On ne reutilise aucune unite de parent
643 # On est dans le cas d'un include. On reutilise toutes les unites de parent
644 units=self.parent.recorded_units
646 if self.parent.recorded_units.has_key(unite):
647 f,text,units=self.parent.recorded_units[unite]
649 f,text=self.jdc.get_file(unite=unite,fic_origine=fic_origine)
653 self.recorded_units=units
654 if f is None and self.jdc.appli:
655 self.jdc.appli.affiche_alerte("Erreur lors de l'evaluation du fichier inclus",
656 message="Ce fichier ne sera pas pris en compte\n"+"Le fichier associé n'est pas défini")
659 def update_context(self,d):
661 Met à jour le contexte contenu dans le dictionnaire d
662 Une MACRO_ETAPE peut ajouter plusieurs concepts dans le contexte
663 Une fonction enregistree dans op_init peut egalement modifier le contexte
665 #print "update_context",self,self.nom,d.keys()
666 if hasattr(self,"jdc_aux") and self.jdc_aux:
667 #ATTENTION: update_context NE DOIT PAS appeler reset_context
668 # car il appelle directement ou indirectement update_context
669 # equivalent a reset_context. Evite les recursions
670 self.jdc_aux.context_ini=d.copy()
671 self.jdc_aux.current_context={}
672 self.jdc_aux.index_etape_courante=0
673 #ATTENTION: il ne faut pas utiliser self.jdc_aux.get_contexte_avant
674 #car cet appel conduit a des remontées multiples incohérentes dans le
676 #get_context_avant appelle update_context qui NE DOIT PAS appeler get_contexte_avant
677 #On n'a besoin que d'un update local connaissant
678 # le contexte amont : d qui sert a reinitialiser self.context_ini
679 for e in self.etapes:
683 if type(self.definition.op_init) == types.FunctionType:
684 apply(self.definition.op_init,(self,d))
685 if self.sd != None:d[self.sd.nom]=self.sd
686 for co in self.sdprods:
688 #print "update_context.fin",d.keys()
690 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
692 etape=Noyau.N_MACRO_ETAPE.MACRO_ETAPE.copy(self)
693 if hasattr(etape,"etapes") :etape.etapes=[]
694 if hasattr(etape,"jdc_aux") :
696 del etape.fichier_ini
700 #print "supprime",self
701 if hasattr(self,"jdc_aux") and self.jdc_aux:
702 self.jdc_aux.supprime_aux()
704 Noyau.N_MACRO_ETAPE.MACRO_ETAPE.supprime(self)
705 # self.contexte_fichier_init={}
706 # self.old_contexte_fichier_init={}
708 # self.current_context={}
712 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
713 def get_file(self,unite=None,fic_origine=''):
714 """Retourne le nom du fichier et le source correspondant a l'unite unite
717 f,text=self.jdc.get_file(unite=unite,fic_origine=fic_origine)
722 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
723 def make_include(self,unite=None):
725 Inclut un fichier dont l'unite logique est unite
726 Cette methode est appelee par la fonction sd_prod de la macro INCLUDE
727 Si l'INCLUDE est invalide, la methode doit produire une exception
728 Sinon on retourne None. Les concepts produits par l'INCLUDE sont
729 pris en compte par le JDC parent lors du calcul du contexte (appel de ???)
731 #print "make_include",unite
732 # On supprime l'attribut unite qui bloque l'evaluation du source de l'INCLUDE
733 # car on ne s'appuie pas sur lui dans EFICAS mais sur l'attribut fichier_ini
735 # Si unite n'a pas de valeur, l'etape est forcement invalide. On peut retourner None
736 if not unite : return
738 if not hasattr(self,'fichier_ini') :
739 # Si le fichier n'est pas defini on le demande
740 f,text=self.get_file_memo(unite=unite,fic_origine=self.parent.nom)
741 # On memorise le fichier retourne
743 self.fichier_text = text
744 self.contexte_fichier_init={}
745 self.fichier_unite=unite
746 self.fichier_err=None
748 import Extensions.jdc_include
750 traceback.print_exc()
752 self.JdC_aux=Extensions.jdc_include.JdC_include
754 #print "make_include",self.fichier_ini,self.fichier_text
755 if f is None and not text:
756 self.fichier_err="Le fichier INCLUDE n est pas defini"
757 self.parent.record_unit(unite,self)
758 raise Exception(self.fichier_err)
761 self.make_contexte_include(self.fichier_ini ,self.fichier_text)
762 self.parent.record_unit(unite,self)
763 #print "make_include.context_ini",self.jdc_aux.context_ini
765 l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
767 self.jdc.appli.affiche_alerte("Erreur lors de l'evaluation du fichier inclus",
768 message="Le contenu de ce fichier ne sera pas pris en compte\n"+string.join(l)
770 self.parent.record_unit(unite,self)
774 self.fichier_err = string.join(l)
775 self.contexte_fichier_init={}
779 # Si le fichier est deja defini on ne reevalue pas le fichier
780 # et on leve une exception si une erreur a été enregistrée
781 self.update_fichier_init(unite)
782 self.fichier_unite=unite
783 if self.fichier_err is not None: raise Exception(self.fichier_err)
786 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
787 def make_contexte(self,fichier,text):
789 Cette méthode sert à créer un contexte pour INCLUDE_MATERIAU
790 en interprétant un texte source Python
791 Elle est appelee par la fonction sd_prd d'INCLUDE_MATERIAU
793 #print "make_contexte",fichier
794 # On supprime l'attribut mat qui bloque l'evaluation du source de l'INCLUDE_MATERIAU
795 # car on ne s'appuie pas sur lui dans EFICAS mais sur l'attribut fichier_ini
796 if hasattr(self,'mat'):del self.mat
797 if not hasattr(self,'fichier_ini') or self.fichier_ini != fichier or self.fichier_mater != self.nom_mater:
798 # le fichier est nouveau ou change
799 self.fichier_ini =fichier
800 self.fichier_unite =fichier
801 self.fichier_mater=self.nom_mater
802 self.fichier_text=text
803 self.fichier_err=None
804 self.contexte_fichier_init={}
805 # On specifie la classe a utiliser pour le JDC auxiliaire
807 import Extensions.jdc_include
808 self.JdC_aux=Extensions.jdc_include.JdC_include
810 traceback.print_exc()
813 self.make_contexte_include(self.fichier_ini ,self.fichier_text)
815 l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
816 self.fichier_err = string.join(l)
820 self.contexte_fichier_init={}
823 # le fichier est le meme on ne le reevalue pas
824 # et on leve une exception si une erreur a été enregistrée
825 if self.fichier_err is not None: raise Exception(self.fichier_err)
827 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
828 def update_sdprod(self,cr='non'):
829 # Cette methode peut etre appelee dans EFICAS avec des mots cles de
830 # la commande modifies. Ceci peut conduire a la construction ou
831 # a la reconstruction d'etapes dans le cas d'INCLUDE ou d'INCLUDE_MATERIAU
832 # Il faut donc positionner le current_step avant l'appel
833 CONTEXT.unset_current_step()
834 CONTEXT.set_current_step(self)
835 valid=Validation.V_MACRO_ETAPE.MACRO_ETAPE.update_sdprod(self,cr=cr)
836 CONTEXT.unset_current_step()
839 #ATTENTION SURCHARGE: cette methode surcharge celle de Noyau a garder en synchro
840 def Build_sd(self,nom):
842 Methode de Noyau surchargee pour poursuivre malgre tout
843 si une erreur se produit pendant la creation du concept produit
846 sd=Noyau.N_MACRO_ETAPE.MACRO_ETAPE.Build_sd(self,nom)
847 except AsException,e:
848 # Une erreur s'est produite lors de la construction du concept
849 # Comme on est dans EFICAS, on essaie de poursuivre quand meme
850 # Si on poursuit, on a le choix entre deux possibilités :
851 # 1. on annule la sd associée à self
852 # 2. on la conserve mais il faut la retourner
853 # On choisit de l'annuler
854 # En plus il faut rendre coherents sdnom et sd.nom
857 self.state="unchanged"
862 #ATTENTION SURCHARGE: cette methode surcharge celle de Noyau a garder en synchro
863 def make_poursuite(self):
864 """ Cette methode est appelée par la fonction sd_prod de la macro POURSUITE
866 #print "make_poursuite"
867 if not hasattr(self,'fichier_ini') :
868 # Si le fichier n'est pas defini on le demande
869 f,text=self.get_file_memo(fic_origine=self.parent.nom)
870 # On memorise le fichier retourne
872 self.fichier_unite = None
873 self.fichier_text = text
874 self.fichier_err=None
876 import Extensions.jdc_include
878 traceback.print_exc()
880 self.JdC_aux=Extensions.jdc_include.JdC_poursuite
881 self.contexte_fichier_init={}
882 #print "make_poursuite",self.fichier_ini,self.fichier_text
885 self.fichier_err="Le fichier POURSUITE n'est pas defini"
887 self.parent.record_unit(None,self)
888 raise Exception(self.fichier_err)
891 self.make_contexte_include(self.fichier_ini,self.fichier_text)
892 self.parent.record_unit(None,self)
894 l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
896 self.jdc.appli.affiche_alerte("Erreur lors de l'evaluation du fichier poursuite",
897 message="Ce fichier ne sera pas pris en compte\n"+string.join(l)
899 self.parent.record_unit(None,self)
903 self.fichier_err = string.join(l)
904 self.contexte_fichier_init={}
908 # Si le fichier est deja defini on ne reevalue pas le fichier
909 # et on leve une exception si une erreur a été enregistrée
910 self.update_fichier_init(None)
911 if self.fichier_err is not None: raise Exception(self.fichier_err)