Salome HOME
CCAR: Modified Files:
[tools/eficas.git] / Ihm / I_MACRO_ETAPE.py
1 """
2 """
3 # Modules Python
4 import traceback,types,string
5
6 # Modules Eficas
7 import I_ETAPE
8 from Noyau.N_ASSD import ASSD
9
10 class MACRO_ETAPE(I_ETAPE.ETAPE):
11
12   def __init__(self):
13       I_ETAPE.ETAPE.__init__(self)
14       # XXX CCAR : ne suis pas certain que typret doive etre 
15       # initialise à None (a verifier)
16       self.typret=None
17
18   def get_sdprods(self,nom_sd):
19     """ 
20          Fonction : retourne le concept produit par l etape de nom nom_sd
21                     s il existe sinon None
22     """
23     if self.sd:
24       if self.sd.nom == nom_sd:
25          return self.sd
26     for co in self.sdprods:
27       if co.nom==nom_sd:return co
28     return None
29
30   def make_contexte(self,fichier,text):    
31     """
32         Cette méthode sert à créer un contexte en interprétant un texte source
33         Python
34     """
35     # on récupère le contexte d'un nouveau jdc dans lequel on interprete text
36     contexte = self.get_contexte_jdc(fichier,text)
37     if contexte == None :
38       raise Exception("Impossible de relire le fichier")
39     else:
40       self.g_context = contexte
41       if hasattr(self,'contexte_fichier_init'):
42         self.old_contexte_fichier_init = self.contexte_fichier_init
43       self.contexte_fichier_init = contexte
44       # XXX la validité ne doit pas etre forcée à 1. Que faut-il faire exactement ???
45       self.init_modif()
46       #self.valid = 1
47       #self.state = 'unchanged'
48
49   def get_contexte_jdc(self,fichier,text):
50     """ 
51          Interprète text comme un texte de jdc et retourne le 
52          contexte final
53          cad le dictionnaire des sd disponibles à la dernière étape
54          Si text n'est pas un texte de jdc valide, retourne None
55          --> utilisée par ops.POURSUITE et INCLUDE
56     """
57     try:
58        # on essaie de créer un objet JDC...
59        context_ini = self.parent.get_contexte_avant(self)
60
61        CONTEXT.unset_current_step()
62        j=self.jdc.definition(procedure=text,cata=self.jdc.cata,
63                              nom=fichier,
64                              context_ini = context_ini,
65                              appli=self.jdc.appli)
66        j.analyse()
67        # XXX en passant par un jdc auxiliaire, on risque de rendre les etapes inactives
68        # on les force dans l'etat actif
69        for etape in j.etapes:
70           etape.active()
71     except:
72        traceback.print_exc()
73        return None
74     CONTEXT.set_current_step(self)
75     if not j.cr.estvide():
76         raise Exception("Impossible de relire le fichier\n"+str(j.cr))
77
78     #XXX la validité d'un source inclus n'est pas identique à celle d'un JDC complet
79     #    impossible de la tester en dehors du JDC d'accueil
80     #cr=j.report()
81     #if not cr.estvide():
82     #    raise Exception("Le fichier contient des erreurs\n"+str(j.cr))
83     j_context=j.get_contexte_avant(None)
84     # XXX j.g_context doit donner le meme résultat
85     # On retourne le contexte apres la derniere etape
86     # XXX j.supprime() ???
87     self.verif_contexte(j_context)
88     # Le contexte est acceptable. On récupère les étapes internes (pour validation)
89     self.etapes=j.etapes
90     return j_context
91
92   def verif_contexte(self,context):
93      """
94          On verifie que le contexte context peut etre inséré dans le jeu
95          de commandes à la position de self
96      """
97      for nom_sd,sd in context.items():
98         if not isinstance(sd,ASSD):continue
99         if self.parent.get_sd_apres_etape(nom_sd,etape=self):
100            # Il existe un concept apres self => impossible d'inserer
101            raise Exception("Impossible d'inclure le fichier. Un concept de nom " + 
102                            "%s existe déjà dans le jeu de commandes." % nom_sd)
103
104   def reevalue_sd_jdc(self):
105      """
106          Avec la liste des SD qui ont été supprimées, propage la 
107          disparition de ces SD dans totues les étapes et descendants
108      """
109      l_sd = self.diff_contextes()
110      if len(l_sd) == 0 : return
111      for sd in l_sd:
112         self.jdc.delete_concept(sd)
113
114   def diff_contextes(self):
115      """ 
116          Réalise la différence entre les 2 contextes 
117          old_contexte_fichier_init et contexte_fichier_init
118          cad retourne la liste des sd qui ont disparu 
119      """
120      if not hasattr(self,'old_contexte_fichier_init'):return []
121      l_sd_suppressed = []
122      for old_key in self.old_contexte_fichier_init.keys():
123        if not self.contexte_fichier_init.has_key(old_key):
124          if isinstance(self.old_contexte_fichier_init[old_key],ASSD):
125            l_sd_suppressed.append(self.old_contexte_fichier_init[old_key])
126      return l_sd_suppressed
127       
128   def supprime_sdprods(self):
129       """
130           Fonction:
131             Lors d'une destruction d'etape, detruit tous les concepts produits
132             Un opérateur n a qu un concept produit
133             Une procedure n'en a aucun
134             Une macro en a en général plus d'un
135       """
136       if not self.is_reentrant() :
137          # l'étape n'est pas réentrante
138          # le concept retourné par l'étape est à supprimer car il était
139          # créé par l'étape
140          if self.sd != None :
141             self.parent.del_sdprod(self.sd)
142             self.parent.delete_concept(self.sd)
143       # On détruit les concepts à droite du signe =
144       for co in self.sdprods:
145          self.parent.del_sdprod(co)
146          self.parent.delete_concept(co)
147       # Si la macro a des etapes et des concepts inclus, on les detruit
148       for nom_sd,co in self.g_context.items():
149          if not isinstance(co,ASSD):continue
150          print "Delete: ",self.nom,co.nom
151          self.parent.del_sdprod(co)
152          self.parent.delete_concept(co)
153       # On met g_context à blanc
154       self.g_context={}
155