1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2017 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 Ce module contient la classe JDC_INCLUDE qui sert a inclure
23 dans un jeu de commandes une partie de jeu de commandes
24 au moyen de la fonctionnalite INCLUDE ou INCLUDE_MATERIAU
25 Quand l'utilisateur veut inclure un fichier il faut versifier
26 que le jeu de commandes inclus est valide et compatible
27 avec le contexte avant et apres l'insertion
29 from __future__ import absolute_import
31 from Accas import JDC,ASSD,AsException,JDC_CATA
32 from Ihm import CONNECTOR
34 class JDC_POURSUITE(JDC):
35 def __init__(self,definition=None,procedure=None,cata=None,
36 cata_ord_dico=None,parent=None,
37 nom='SansNom',appli=None,context_ini=None,
38 jdc_pere=None,etape_include=None,prefix_include=None,
39 recorded_units=None,old_recorded_units=None,**args):
41 JDC.__init__(self, definition=definition,
44 cata_ord_dico=cata_ord_dico,
48 context_ini=context_ini,
51 self.jdc_pere=jdc_pere
52 self.etape_include=etape_include
53 self.prefix_include=prefix_include
54 if recorded_units is not None:self.recorded_units=recorded_units
55 if old_recorded_units is not None:self.old_recorded_units=old_recorded_units
57 def o_register(self,sd):
58 return self.jdc_pere.o_register(sd)
60 def NommerSdprod(self,sd,sdnom,restrict='non'):
62 Nomme la SD apres avoir verifie que le nommage est possible : nom
64 Ajoute un prefixe s'il est specifie (INCLUDE_MATERIAU)
65 Si le nom est deja utilise, leve une exception
66 Met le concept cree dans le contexe global g_context
68 #print "NommerSdprod",sd,sdnom,restrict
69 if self.prefix_include:
70 if sdnom != self.prefix_include:sdnom=self.prefix_include+sdnom
72 if sdnom != '' and sdnom[0] == '_':
73 # Si le nom du concept commence par le caractere _ on lui attribue
74 # un identificateur automatique comme dans JEVEUX (voir gcncon)
76 # nom commencant par __ : il s'agit de concepts qui seront detruits
77 # nom commencant par _ : il s'agit de concepts intermediaires qui seront gardes
78 # ATTENTION : il faut traiter differemment les concepts dont le nom
79 # commence par _ mais qui sont des concepts nommes automatiquement par
80 # une eventuelle sous macro.
81 if sdnom[1] in string.digits:
82 # Ce concept provient probablement d'une sous macro (cas improbable)
86 #cas d'un concept a ne pas conserver apres execution de la commande
93 o=self.sds_dict.get(sdnom,None)
94 if isinstance(o,ASSD):
95 raise AsException(tr("Nom de concept deja defini : %s" ,sdnom))
97 # On pourrait verifier que le jdc_pere apres l'etape etape_include
98 # ne contient pas deja un concept de ce nom
99 #if self.jdc_pere.get_sd_apres_etape_avec_detruire(sdnom,etape=self.etape_include):
100 # Il existe un concept apres self => impossible d'inserer
101 # raise AsException("Nom de concept deja defini : %s" % sdnom)
102 # On a choisi de ne pas faire ce test ici mais de le faire en bloc
103 # si necessaire apres en appelant la methode verif_contexte
105 # ATTENTION : Il ne faut pas ajouter sd dans sds car il s y trouve deja.
106 # Ajoute a la creation (appel de reg_sd).
107 self.sds_dict[sdnom]=sd
110 # En plus si restrict vaut 'non', on insere le concept dans le contexte du JDC
111 if restrict == 'non':
112 self.g_context[sdnom]=sd
114 def get_verif_contexte(self):
115 #print "get_verif_contexte"
116 j_context=self.get_contexte_avant(None)
117 self.verif_contexte(j_context)
120 def force_contexte(self,contexte):
121 for nom_sd,sd in list(contexte.items()):
122 if not isinstance(sd,ASSD):continue
123 autre_sd= self.jdc_pere.get_sd_apres_etape_avec_detruire(nom_sd,sd,
124 etape=self.etape_include)
125 if autre_sd is None:continue
126 if sd is not autre_sd:
127 # Il existe un autre concept de meme nom produit par une etape apres self
128 # on detruit ce concept pour pouvoir inserer les etapes du jdc_include
130 sd.etape.supprime_sdprod(sd)
134 def verif_contexte(self,context):
136 Cette methode verifie si le contexte passe en argument (context)
137 peut etre insere dans le jdc pere de l'include.
138 Elle verifie que les concepts contenus dans ce contexte n'entrent
139 pas en conflit avec les concepts produits dans le jdc pere
141 Si le contexte ne peut pas etre insere, la methode leve une
142 exception sinon elle retourne le contexte inchange
144 #print "verif_contexte"
145 for nom_sd,sd in list(context.items()):
146 if not isinstance(sd,ASSD):continue
147 autre_sd= self.jdc_pere.get_sd_apres_etape_avec_detruire(nom_sd,sd,
148 etape=self.etape_include)
149 if autre_sd is None:continue
150 if sd is not autre_sd:
151 # Il existe un concept produit par une etape apres self
152 # => impossible d'inserer
153 raise Exception("Impossible d'inclure le fichier. Un concept de nom " +
154 "%s existe deja dans le jeu de commandes." % nom_sd)
158 def get_liste_cmd(self):
160 Retourne la liste des commandes du catalogue
162 if self.jdc_pere is None:
163 return JDC.get_liste_cmd(self)
164 return self.jdc_pere.get_liste_cmd()
166 def get_groups(self):
168 Retourne la liste des commandes du catalogue par groupes
170 if self.jdc_pere is None:
171 return JDC.get_groups(self)
172 return self.jdc_pere.get_groups()
174 def init_modif(self):
176 Met l'etat de l'etape a : modifie
177 Propage la modification au parent
179 Attention : init_modif doit etre appele avant de realiser une modification
180 La validite devra etre recalculee apres cette modification
181 mais par un appel a fin_modif pour preserver l'etat modified
182 de tous les objets entre temps
184 #print "jdc_include.init_modif",self,self.etape_include
185 self.state = 'modified'
186 if self.etape_include:
187 self.etape_include.init_modif()
191 Methode appelee une fois qu'une modification a ete faite afin de
192 declencher d'eventuels traitements post-modification
193 ex : INCLUDE et POURSUITE
195 #print "jdc_include.fin_modif",self,self.etape_include
196 CONNECTOR.Emit(self,"valid")
197 if self.etape_include:
198 self.etape_include.fin_modif()
202 On ne supprime rien directement pour un jdc auxiliaire d'include ou de poursuite
203 Utiliser supprime_aux
207 def supprime_aux(self):
208 #print "supprime_aux",self
211 self.etape_include=None
212 # self.cata_ordonne_dico={}
214 # self.context_ini={}
215 # self.procedure=None
217 def get_contexte_avant(self,etape):
219 Retourne le dictionnaire des concepts connus avant etape
220 On tient compte des concepts produits par le jdc pere
221 en reactualisant le contexte initial context_ini
222 On tient compte des commandes qui modifient le contexte
223 comme DETRUIRE ou les macros
224 Si etape == None, on retourne le contexte en fin de JDC
226 #print "jdc_include.get_contexte_avant",etape,etape and etape.nom
227 if self.etape_include:
228 new_context=self.etape_include.parent.get_contexte_avant(self.etape_include).copy()
229 self.context_ini=new_context
230 d= JDC.get_contexte_avant(self,etape)
233 def reset_context(self):
234 #print "jdc_include.reset_context",self,self.nom
235 if self.etape_include:
236 self.etape_include.parent.reset_context()
237 new_context=self.etape_include.parent.get_contexte_avant(self.etape_include).copy()
238 self.context_ini=new_context
239 JDC.reset_context(self)
241 def get_sd_apres_etape(self,nom_sd,etape,avec='non'):
243 Cette methode retourne la SD de nom nom_sd qui est eventuellement
245 Si avec vaut 'non' exclut etape de la recherche
247 if self.etape_include:
248 sd=self.etape_include.parent.get_sd_apres_etape(nom_sd,self.etape_include,'non')
250 return JDC.get_sd_apres_etape(self,nom_sd,etape,avec)
252 def get_sd_apres_etape_avec_detruire(self,nom_sd,sd,etape,avec='non'):
254 On veut savoir ce que devient le concept sd de nom nom_sd apres etape.
255 Il peut etre detruit, remplace ou conserve
256 Cette methode retourne la SD sd de nom nom_sd qui est eventuellement
257 definie apres etape en tenant compte des concepts detruits
258 Si avec vaut 'non' exclut etape de la recherche
260 #print "jdc_include.get_sd_apres_etape_avec_detruire",nom_sd,sd,id(sd)
261 autre_sd=JDC.get_sd_apres_etape_avec_detruire(self,nom_sd,sd,etape,avec)
262 # si autre_sd vaut None le concept sd a ete detruit. On peut terminer
263 # la recherche en retournant None
264 # Si autre_sd ne vaut pas sd, le concept a ete redefini. On peut terminer
265 # la recherche en retournant le concept nouvellement defini
266 # Sinon, on poursuit la recherche dans les etapes du niveau superieur.
267 if autre_sd is None or autre_sd is not sd :return autre_sd
268 return self.etape_include.parent.get_sd_apres_etape_avec_detruire(nom_sd,sd,self.etape_include,'non')
270 def delete_concept(self,sd):
272 Fonction : Mettre a jour les etapes du JDC suite a la disparition du
274 Seuls les mots cles simples MCSIMP font un traitement autre
275 que de transmettre aux fils
277 # Nettoyage des etapes de l'include
278 JDC.delete_concept(self,sd)
279 # Nettoyage des etapes du parent
280 if self.etape_include:
281 self.etape_include.parent.delete_concept_after_etape(self.etape_include,sd)
283 def delete_concept_after_etape(self,etape,sd):
285 Fonction : Mettre a jour les etapes du JDC qui sont apres etape suite a
286 la disparition du concept sd
288 # Nettoyage des etapes de l'include
289 JDC.delete_concept_after_etape(self,etape,sd)
290 # Nettoyage des etapes du parent
291 if self.etape_include:
292 self.etape_include.parent.delete_concept_after_etape(self.etape_include,sd)
294 def update_concept_after_etape(self,etape,sd):
296 Fonction : mettre a jour les etapes du JDC suite a une modification
297 du concept sd (principalement renommage)
299 JDC.update_concept_after_etape(self,etape,sd)
300 if self.etape_include:
301 self.etape_include.parent.update_concept_after_etape(self.etape_include,sd)
303 def replace_concept_after_etape(self,etape,old_sd,sd):
305 Fonction : Mettre a jour les etapes du JDC qui sont apres etape suite au
306 remplacement du concept old_sd par sd
308 # Nettoyage des etapes de l'include
309 JDC.replace_concept_after_etape(self,etape,old_sd,sd)
310 # Nettoyage des etapes du parent
311 if self.etape_include:
312 self.etape_include.parent.replace_concept_after_etape(self.etape_include,old_sd,sd)
314 def changefichier(self,fichier):
315 if self.etape_include:
316 self.etape_include.fichier_ini=fichier
319 def control_context_apres(self,etape):
321 Cette methode verifie que les etapes apres l'etape etape
322 ont bien des concepts produits acceptables (pas de conflit de
324 Si des concepts produits ne sont pas acceptables ils sont supprimes.
325 Effectue les verifications sur les etapes du jdc mais aussi sur les
326 jdc parents s'ils existent.
328 #print "jdc_include.control_context_apres",self,etape
329 #Regularise les etapes du jdc apres l'etape etape
330 self.control_jdc_context_apres(etape)
331 if self.etape_include:
332 #print "CONTROL_INCLUDE:",self.etape_include,self.etape_include.nom
333 # il existe un jdc pere. On propage la regularisation
334 self.etape_include.parent.control_context_apres(self.etape_include)
336 class JDC_INCLUDE(JDC_POURSUITE):
337 def get_liste_cmd(self):
339 Retourne la liste des commandes du catalogue
341 if self.jdc_pere is None:
342 return JDC.get_liste_cmd(self)
343 return [e for e in self.jdc_pere.get_liste_cmd() if e not in ("DEBUT","POURSUITE","FIN") ]
345 def active_etapes(self):
346 for e in self.etapes:
349 class JDC_CATA_INCLUDE(JDC_CATA):
350 class_instance=JDC_INCLUDE
352 class JDC_CATA_POURSUITE(JDC_CATA):
353 class_instance=JDC_POURSUITE
355 from Accas import AU_MOINS_UN,A_CLASSER
359 JdC_include=JDC_CATA_INCLUDE(code=c, execmodul=None)
361 JdC_poursuite=JDC_CATA_POURSUITE(code='ASTER', execmodul=None,
362 regles = (AU_MOINS_UN('DEBUT','POURSUITE'),
364 A_CLASSER(('DEBUT','POURSUITE'),'FIN')