Salome HOME
39196a235f254f78e3956c1d790865047395deda
[tools/eficas.git] / Extensions / jdc_include.py
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.
9 #
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.
14 #
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.
18 #
19 #
20 # ======================================================================
21
22 """
23    Ce module contient la classe JDC_INCLUDE qui sert a inclure
24    dans un jeu de commandes une partie de jeu de commandes
25    au moyen de la fonctionnalite INCLUDE ou INCLUDE_MATERIAU
26    Quand l'utilisateur veut inclure un fichier il faut versifier
27    que le jeu de commandes inclus est valide et compatible
28    avec le contexte avant et apres l'insertion
29 """
30 from Accas import JDC,ASSD,AsException,JDC_CATA
31 from Ihm import CONNECTOR
32
33 class JDC_POURSUITE(JDC):
34    def __init__(self,definition=None,procedure=None,cata=None,
35                      cata_ord_dico=None,parent=None,
36                      nom='SansNom',appli=None,context_ini=None,
37                      jdc_pere=None,etape_include=None,prefix_include=None,
38                      recorded_units=None,old_recorded_units=None,**args):
39
40       JDC.__init__(self, definition=definition,
41                          procedure=procedure,
42                          cata=cata,
43                          cata_ord_dico=cata_ord_dico,
44                          parent=parent,
45                          nom=nom,
46                          appli=appli,
47                          context_ini=context_ini,
48                          **args
49                          )
50       self.jdc_pere=jdc_pere
51       self.etape_include=etape_include
52       self.prefix_include=prefix_include
53       if recorded_units is not None:self.recorded_units=recorded_units
54       if old_recorded_units is not None:self.old_recorded_units=old_recorded_units
55
56    def NommerSdprod(self,sd,sdnom,restrict='non'):
57       """
58           Nomme la SD apres avoir verifie que le nommage est possible : nom
59           non utilise
60           Ajoute un prefixe s'il est specifie (INCLUDE_MATERIAU)
61           Si le nom est deja utilise, leve une exception
62           Met le concept créé dans le contexe global g_context
63       """
64       #print "NommerSdprod",sd,sdnom,restrict
65       if self.prefix_include:
66           if sdnom != self.prefix_include:sdnom=self.prefix_include+sdnom
67       o=self.sds_dict.get(sdnom,None)
68       if isinstance(o,ASSD):
69          raise AsException("Nom de concept deja defini : %s" % sdnom)
70
71       # On pourrait verifier que le jdc_pere apres l'etape etape_include
72       # ne contient pas deja un concept de ce nom
73       #if self.jdc_pere.get_sd_apres_etape_avec_detruire(sdnom,etape=self.etape_include):
74          # Il existe un concept apres self => impossible d'inserer
75       #   raise AsException("Nom de concept deja defini : %s" % sdnom)
76       # On a choisi de ne pas faire ce test ici mais de le faire en bloc
77       # si necessaire apres en appelant la methode verif_contexte
78
79       # ATTENTION : Il ne faut pas ajouter sd dans sds car il s y trouve deja.
80       # Ajoute a la creation (appel de reg_sd).
81       self.sds_dict[sdnom]=sd
82       sd.nom=sdnom
83
84       # En plus si restrict vaut 'non', on insere le concept dans le contexte du JDC
85       if restrict == 'non':
86          self.g_context[sdnom]=sd
87
88    def get_verif_contexte(self):
89       #print "get_verif_contexte"
90       j_context=self.get_contexte_avant(None)
91       self.verif_contexte(j_context)
92       return j_context
93
94    def force_contexte(self,contexte):
95       for nom_sd,sd in contexte.items():
96         if not isinstance(sd,ASSD):continue
97         autre_sd= self.jdc_pere.get_sd_apres_etape_avec_detruire(nom_sd,sd,
98                                                        etape=self.etape_include)
99         if autre_sd is None:continue
100         if sd is not autre_sd:
101            # Il existe un autre concept de meme nom produit par une etape apres self 
102            # on detruit ce concept pour pouvoir inserer les etapes du jdc_include
103            if sd.etape:
104               sd.etape.supprime_sdprod(sd)
105
106       return contexte
107
108    def verif_contexte(self,context):
109       """
110          Cette methode verifie si le contexte passé en argument (context)
111          peut etre inséré dans le jdc pere de l'include.
112          Elle verifie que les concepts contenus dans ce contexte n'entrent
113          pas en conflit avec les concepts produits dans le jdc pere
114          apres l'include.
115          Si le contexte ne peut pas etre inséré, la méthode leve une
116          exception sinon elle retourne le contexte inchangé
117       """
118       #print "verif_contexte"
119       for nom_sd,sd in context.items():
120         if not isinstance(sd,ASSD):continue
121         autre_sd= self.jdc_pere.get_sd_apres_etape_avec_detruire(nom_sd,sd,
122                                                        etape=self.etape_include)
123         if autre_sd is None:continue
124         if sd is not autre_sd:
125            # Il existe un concept produit par une etape apres self 
126            # => impossible d'inserer
127            raise Exception("Impossible d'inclure le fichier. Un concept de nom " +
128                            "%s existe déjà dans le jeu de commandes." % nom_sd)
129
130       return context
131
132    def get_liste_cmd(self):
133       """
134           Retourne la liste des commandes du catalogue
135       """
136       if self.jdc_pere is None:
137          return JDC.get_liste_cmd(self)
138       return self.jdc_pere.get_liste_cmd()
139
140    def get_groups(self):
141       """
142           Retourne la liste des commandes du catalogue par groupes
143       """
144       if self.jdc_pere is None:
145          return JDC.get_groups(self)
146       return self.jdc_pere.get_groups()
147
148    def init_modif(self):
149       """
150          Met l'état de l'étape à : modifié
151          Propage la modification au parent
152
153          Attention : init_modif doit etre appelé avant de réaliser une modification
154          La validité devra etre recalculée apres cette modification
155          mais par un appel à fin_modif pour préserver l'état modified
156          de tous les objets entre temps
157       """
158       #print "jdc_include.init_modif",self,self.etape_include
159       self.state = 'modified'
160       if self.etape_include:
161          self.etape_include.init_modif()
162
163    def fin_modif(self):
164       """
165           Méthode appelée une fois qu'une modification a été faite afin de
166           déclencher d'éventuels traitements post-modification
167           ex : INCLUDE et POURSUITE
168       """
169       #print "jdc_include.fin_modif",self,self.etape_include
170       CONNECTOR.Emit(self,"valid")
171       if self.etape_include:
172          self.etape_include.fin_modif()
173
174    def supprime(self):
175       """
176           On ne supprime rien pour un jdc auxiliaire d'include ou de poursuite
177       """
178       pass
179
180    def get_contexte_avant(self,etape):
181       """
182          Retourne le dictionnaire des concepts connus avant etape
183          On tient compte des concepts produits par le jdc pere
184          en reactualisant le contexte initial context_ini
185          On tient compte des commandes qui modifient le contexte
186          comme DETRUIRE ou les macros
187          Si etape == None, on retourne le contexte en fin de JDC
188       """
189       #print "jdc_include.get_contexte_avant",etape,etape and etape.nom
190       if self.etape_include:
191          new_context=self.etape_include.parent.get_contexte_avant(self.etape_include).copy()
192          self.context_ini=new_context
193       d= JDC.get_contexte_avant(self,etape)
194       return d
195
196    def reset_context(self):
197       #print "jdc_include.reset_context",self,self.nom
198       if self.etape_include:
199          self.etape_include.parent.reset_context()
200          new_context=self.etape_include.parent.get_contexte_avant(self.etape_include).copy()
201          self.context_ini=new_context
202       JDC.reset_context(self)
203
204    def get_sd_apres_etape(self,nom_sd,etape,avec='non'):
205       """
206            Cette méthode retourne la SD de nom nom_sd qui est éventuellement
207            définie apres etape
208            Si avec vaut 'non' exclut etape de la recherche
209       """
210       if self.etape_include:
211          sd=self.etape_include.parent.get_sd_apres_etape(nom_sd,self.etape_include,'non')
212          if sd:return sd
213       return JDC.get_sd_apres_etape(self,nom_sd,etape,avec)
214
215    def get_sd_apres_etape_avec_detruire(self,nom_sd,sd,etape,avec='non'):
216       """
217            On veut savoir ce que devient le concept sd de nom nom_sd apres etape.
218            Il peut etre detruit, remplacé ou conservé
219            Cette méthode retourne la SD sd de nom nom_sd qui est éventuellement
220            définie apres etape en tenant compte des concepts detruits
221            Si avec vaut 'non' exclut etape de la recherche
222       """
223       #print "jdc_include.get_sd_apres_etape_avec_detruire",nom_sd,sd,id(sd)
224       autre_sd=JDC.get_sd_apres_etape_avec_detruire(self,nom_sd,sd,etape,avec)
225       # si autre_sd vaut None le concept sd a ete detruit. On peut terminer
226       # la recherche en retournant None
227       # Si autre_sd ne vaut pas sd, le concept a ete redefini. On peut terminer
228       # la recherche en retournant le concept nouvellement defini
229       # Sinon, on poursuit la recherche dans les etapes du niveau superieur.
230       if autre_sd is None or autre_sd is not sd :return autre_sd
231       return self.etape_include.parent.get_sd_apres_etape_avec_detruire(nom_sd,sd,self.etape_include,'non')
232
233    def delete_concept(self,sd):
234       """
235           Fonction : Mettre a jour les etapes du JDC suite à la disparition du
236           concept sd
237           Seuls les mots cles simples MCSIMP font un traitement autre
238           que de transmettre aux fils
239       """
240       # Nettoyage des etapes de l'include
241       JDC.delete_concept(self,sd)
242       # Nettoyage des etapes du parent
243       if self.etape_include:
244          self.etape_include.parent.delete_concept_after_etape(self.etape_include,sd)
245
246    def delete_concept_after_etape(self,etape,sd):
247       """
248           Fonction : Mettre à jour les étapes du JDC qui sont après etape suite à
249           la disparition du concept sd
250       """
251       # Nettoyage des etapes de l'include
252       JDC.delete_concept_after_etape(self,etape,sd)
253       # Nettoyage des etapes du parent
254       if self.etape_include:
255          self.etape_include.parent.delete_concept_after_etape(self.etape_include,sd)
256
257    def update_concept_after_etape(self,etape,sd):
258       """
259           Fonction : mettre a jour les etapes du JDC suite a une modification
260           du concept sd (principalement renommage)
261       """
262       JDC.update_concept_after_etape(self,etape,sd)
263       if self.etape_include:
264          self.etape_include.parent.update_concept_after_etape(self.etape_include,sd)
265
266    def replace_concept_after_etape(self,etape,old_sd,sd):
267       """
268           Fonction : Mettre à jour les étapes du JDC qui sont après etape suite au
269           remplacement du concept old_sd par sd
270       """
271       # Nettoyage des etapes de l'include
272       JDC.replace_concept_after_etape(self,etape,old_sd,sd)
273       # Nettoyage des etapes du parent
274       if self.etape_include:
275          self.etape_include.parent.replace_concept_after_etape(self.etape_include,old_sd,sd)
276
277    def changefichier(self,fichier):
278       if self.etape_include:
279          self.etape_include.fichier_ini=fichier
280       self.fin_modif()
281
282    def control_context_apres(self,etape):
283       """
284          Cette méthode verifie que les etapes apres l'etape etape
285          ont bien des concepts produits acceptables (pas de conflit de
286          nom principalement)
287          Si des concepts produits ne sont pas acceptables ils sont supprimés.
288          Effectue les verifications sur les etapes du jdc mais aussi sur les
289          jdc parents s'ils existent.
290       """
291       #print "jdc_include.control_context_apres",self,etape
292       #Regularise les etapes du jdc apres l'etape etape
293       self.control_jdc_context_apres(etape)
294       if self.etape_include:
295          # il existe un jdc pere. On propage la regularisation
296          self.etape_include.parent.control_context_apres(self.etape_include)
297
298 class JDC_INCLUDE(JDC_POURSUITE):
299    def get_liste_cmd(self):
300       """
301           Retourne la liste des commandes du catalogue
302       """
303       if self.jdc_pere is None:
304          return JDC.get_liste_cmd(self)
305       return [e for e in self.jdc_pere.get_liste_cmd() if e not in ("DEBUT","POURSUITE","FIN") ]
306
307    def active_etapes(self):
308       for e in self.etapes:
309          e.active()
310
311 class JDC_CATA_INCLUDE(JDC_CATA):
312    class_instance=JDC_INCLUDE
313
314 class JDC_CATA_POURSUITE(JDC_CATA):
315    class_instance=JDC_POURSUITE
316
317 from Accas import AU_MOINS_UN,A_CLASSER
318
319 JdC_include=JDC_CATA_INCLUDE(code='ASTER', execmodul=None)
320
321 JdC_poursuite=JDC_CATA_POURSUITE(code='ASTER', execmodul=None,
322                                  regles = (AU_MOINS_UN('DEBUT','POURSUITE'),
323                                            AU_MOINS_UN('FIN'),
324                                            A_CLASSER(('DEBUT','POURSUITE'),'FIN')
325                                           )
326                                )
327
328