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 # ======================================================================
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
30 from Accas import JDC,ASSD,AsException,JDC_CATA
31 from Ihm import CONNECTOR
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):
40 JDC.__init__(self, definition=definition,
43 cata_ord_dico=cata_ord_dico,
47 context_ini=context_ini,
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
56 def NommerSdprod(self,sd,sdnom,restrict='non'):
58 Nomme la SD apres avoir verifie que le nommage est possible : nom
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
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)
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
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
84 # En plus si restrict vaut 'non', on insere le concept dans le contexte du JDC
86 self.g_context[sdnom]=sd
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)
94 def force_contexte(self,contexte):
95 for nom_sd,sd in contexte.items():
96 if not isinstance(sd,ASSD):continue
97 if self.jdc_pere.get_sd_apres_etape_avec_detruire(nom_sd,sd,
98 etape=self.etape_include):
99 # Il existe un autre concept de meme nom produit par une etape apres self
100 # on detruit ce concept pour pouvoir inserer les etapes du jdc_include
101 #print "force_contexte",sd.etape,sd.nom,sd.etape.nom
103 sd.etape.supprime_sdprod(sd)
107 def verif_contexte(self,context):
109 Cette methode verifie si le contexte passé en argument (context)
110 peut etre inséré dans le jdc pere de l'include.
111 Elle verifie que les concepts contenus dans ce contexte n'entrent
112 pas en conflit avec les concepts produits dans le jdc pere
114 Si le contexte ne peut pas etre inséré, la méthode leve une
115 exception sinon elle retourne le contexte inchangé
117 #print "verif_contexte"
118 for nom_sd,sd in context.items():
119 if not isinstance(sd,ASSD):continue
120 autre_sd= self.jdc_pere.get_sd_apres_etape_avec_detruire(nom_sd,sd,
121 etape=self.etape_include)
122 if sd and sd is not autre_sd:
123 # Il existe un concept produit par une etape apres self
124 # => impossible d'inserer
125 raise Exception("Impossible d'inclure le fichier. Un concept de nom " +
126 "%s existe déjà dans le jeu de commandes." % nom_sd)
130 def get_liste_cmd(self):
132 Retourne la liste des commandes du catalogue
134 return self.jdc_pere.get_liste_cmd()
136 def get_groups(self):
138 Retourne la liste des commandes du catalogue par groupes
140 return self.jdc_pere.get_groups()
142 def init_modif(self):
144 Met l'état de l'étape à : modifié
145 Propage la modification au parent
147 Attention : init_modif doit etre appelé avant de réaliser une modification
148 La validité devra etre recalculée apres cette modification
149 mais par un appel à fin_modif pour préserver l'état modified
150 de tous les objets entre temps
152 #print "jdc_include.init_modif",self,self.etape_include
153 self.state = 'modified'
154 self.etape_include.init_modif()
158 Méthode appelée une fois qu'une modification a été faite afin de
159 déclencher d'éventuels traitements post-modification
160 ex : INCLUDE et POURSUITE
162 #print "jdc_include.fin_modif",self,self.etape_include
164 # Mise a jour du contexte en fin d'include
165 # On suppose que toutes les modifications sont valides
166 # On recupere le contexte final dans j_context
167 j_context=self.get_contexte_avant(None) #get_verif_contexte ???
168 # On remplit le dictionnaire des concepts produits de l'etape macro INCLUDE
169 # sans y mettre les concepts présents dans le contexte initial (context_ini)
170 # On ajoute egalement les concepts produits dans le sds_dict du parent
171 # sans verification car on est sur (verification integrée) que
172 # le nommage est possible
173 self.etape_include.g_context.clear()
174 for k,v in j_context.items():
175 if not self.context_ini.has_key(k) or self.context_ini[k] != v:
176 self.etape_include.g_context[k]=v
177 self.etape_include.parent.sds_dict[k]=v
179 CONNECTOR.Emit(self,"valid")
180 self.etape_include.fin_modif()
181 #print "jdc_include.fin_modif.context_ini",self.context_ini
185 On ne supprime rien pour un jdc auxiliaire d'include ou de poursuite
189 def get_contexte_avant(self,etape):
191 Retourne le dictionnaire des concepts connus avant etape
192 On tient compte des concepts produits par le jdc pere
193 en reactualisant le contexte initial context_ini
194 On tient compte des commandes qui modifient le contexte
195 comme DETRUIRE ou les macros
196 Si etape == None, on retourne le contexte en fin de JDC
198 self.context_ini = self.etape_include.parent.get_contexte_avant(self.etape_include).copy()
199 return JDC.get_contexte_avant(self,etape)
201 #def get_sd_avant_etape(self,nom_sd,etape):
202 #sd=self.etape_include.parent.get_sd_avant_etape(nom_sd,self.etape_include)
204 #return JDC.get_sd_avant_etape(self,nom_sd,etape)
206 #def get_sd_avant_du_bon_type(self,etape,types_permis):
208 # Retourne la liste des concepts avant etape d'un type acceptable
210 #l1=self.etape_include.parent.get_sd_avant_du_bon_type(self.etape_include,types_permis)
211 #l2=JDC.get_sd_avant_du_bon_type(self,etape,types_permis)
214 def get_sd_apres_etape(self,nom_sd,etape,avec='non'):
216 Cette méthode retourne la SD de nom nom_sd qui est éventuellement
218 Si avec vaut 'non' exclut etape de la recherche
220 sd=self.etape_include.parent.get_sd_apres_etape(nom_sd,self.etape_include,'non')
222 return JDC.get_sd_apres_etape(self,nom_sd,etape,avec)
224 def get_sd_apres_etape_avec_detruire(self,nom_sd,sd,etape,avec='non'):
226 On veut savoir ce que devient le concept sd de nom nom_sd apres etape.
227 Il peut etre detruit, remplacé ou conservé
228 Cette méthode retourne la SD sd de nom nom_sd qui est éventuellement
229 définie apres etape en tenant compte des concepts detruits
230 Si avec vaut 'non' exclut etape de la recherche
232 #print "jdc_include.get_sd_apres_etape_avec_detruire",nom_sd,sd,id(sd)
233 autre_sd=JDC.get_sd_apres_etape_avec_detruire(self,nom_sd,sd,etape,avec)
234 #print autre_sd,id(autre_sd)
235 # si autre_sd vaut None le concept sd a ete detruit. On peut terminer
236 # la recherche en retournant None
237 # Si autre_sd ne vaut pas sd, le concept a ete redefini. On peut terminer
238 # la recherche en retournant le concept nouvellement defini
239 # Sinon, on poursuit la recherche dans les etapes du niveau superieur.
240 if autre_sd is None or autre_sd is not sd :return autre_sd
241 return self.etape_include.parent.get_sd_apres_etape_avec_detruire(nom_sd,sd,self.etape_include,'non')
243 def delete_concept(self,sd):
245 Fonction : Mettre a jour les etapes du JDC suite à la disparition du
247 Seuls les mots cles simples MCSIMP font un traitement autre
248 que de transmettre aux fils
250 # Nettoyage des etapes de l'include
251 JDC.delete_concept(self,sd)
252 # Nettoyage des etapes du parent
253 self.etape_include.parent.delete_concept_after_etape(self.etape_include,sd)
255 def delete_concept_after_etape(self,etape,sd):
257 Fonction : Mettre à jour les étapes du JDC qui sont après etape suite à
258 la disparition du concept sd
260 # Nettoyage des etapes de l'include
261 JDC.delete_concept_after_etape(self,etape,sd)
262 # Nettoyage des etapes du parent
263 self.etape_include.parent.delete_concept_after_etape(self.etape_include,sd)
265 def replace_concept_after_etape(self,etape,old_sd,sd):
267 Fonction : Mettre à jour les étapes du JDC qui sont après etape suite au
268 remplacement du concept old_sd par sd
270 # Nettoyage des etapes de l'include
271 JDC.replace_concept_after_etape(self,etape,old_sd,sd)
272 # Nettoyage des etapes du parent
273 self.etape_include.parent.replace_concept_after_etape(self.etape_include,old_sd,sd)
275 class JDC_INCLUDE(JDC_POURSUITE):
276 def active_etapes(self):
277 for e in self.etapes:
280 class JDC_CATA_INCLUDE(JDC_CATA):
281 class_instance=JDC_INCLUDE
283 class JDC_CATA_POURSUITE(JDC_CATA):
284 class_instance=JDC_POURSUITE
286 from Accas import AU_MOINS_UN,A_CLASSER
288 JdC_include=JDC_CATA_INCLUDE(code='ASTER', execmodul=None)
290 JdC_poursuite=JDC_CATA_POURSUITE(code='ASTER', execmodul=None,
291 regles = (AU_MOINS_UN('DEBUT','POURSUITE'),
293 A_CLASSER(('DEBUT','POURSUITE'),'FIN')