1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2021 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
23 from __future__ import absolute_import
24 from __future__ import print_function
27 import traceback,types
30 from Extensions.i18n import tr
31 from Extensions.eficas_exception import EficasException
32 from Ihm import I_ETAPE
33 from Ihm import I_ENTITE
34 from Ihm import I_OBJECT
36 from Noyau.N_ASSD import ASSD
37 from Noyau import N__F
38 from Extensions import param2
40 # import rajoutes suite a l'ajout de buildSd --> a resorber
41 import Noyau, Validation.V_MACRO_ETAPE
42 from Noyau import N_Exception
43 from Noyau.N_Exception import AsException
44 import Accas # attention aux imports circulaires
45 # fin import a resorber
47 class MACRO_ETAPE(I_ETAPE.ETAPE):
51 #indique si le jeu de commande inclus a pu etre analyse par convert
52 #pour etre editable (0=NON, 1=OUI)
55 self.recorded_units={}
57 def getSdprods(self,nom_sd):
59 Fonction : retourne le concept produit par l etape de nom nom_sd
60 s il existe sinon None
62 if self.sd and self.sd.nom == nom_sd :return self.sd
63 for co in self.sdprods:
64 if co.nom == nom_sd:return co
65 if type(self.definition.op_init) == types.FunctionType:
67 self.definition.op_init(*(self,d))
68 return d.get(nom_sd,None)
71 def getContexteJdc(self,fichier,text,doitEtreValide=1):
73 Interprete text comme un texte de jdc et retourne le contexte final.
75 Le contexte final est le dictionnaire des sd disponibles a la derniere etape.
76 Si text n'est pas un texte de jdc valide, retourne None
78 --> utilisee par ops.POURSUITE et INCLUDE
80 #print ("getContexteJdc",self,self.nom, text)
81 # On recupere l'etape courante
82 step=CONTEXT.getCurrentStep()
83 self.text_included_converted=0
86 # on essaie de creer un objet JDC auxiliaire avec un contexte initial
87 # Attention getContexteAvant retourne un dictionnaire qui contient
88 # le contexte courant. Ce dictionnaire est reactualise regulierement.
89 # Si on veut garder l'etat du contexte fige, il faut en faire une copie.
90 context_ini = self.parent.getContexteAvant(self).copy()
92 # Indispensable avant de creer un nouveau JDC
93 CONTEXT.unsetCurrentStep()
96 if hasattr(self,'prefix'):
97 prefix_include=self.prefix
98 # ATTENTION : le dictionnaire recorded_units sert a memoriser les unites des
99 # fichiers inclus. Il est preferable de garder le meme dictionnaire pendant
100 # tout le traitement et de ne pas le reinitialiser brutalement (utiliser
101 # clear plutot) si on ne veut pas perdre la memoire des unites.
102 # En principe si la memorisation est faite au bon moment il n'est pas necessaire
103 # de prendre cette precaution mais ce n'est pas vrai partout.
104 old_recorded_units=self.recorded_units.copy()
106 # on supprime l'ancien jdc_aux s'il existe
107 if hasattr(self,'jdc_aux') and self.jdc_aux:
108 self.jdc_aux.supprime_aux()
110 if fichier is None:fichier="SansNom"
112 # Il faut convertir le texte inclus en fonction du format
113 # sauf les INCLUDE_MATERIAU
114 self.text_converted=0
116 if self.nom != "INCLUDE_MATERIAU":
117 format=self.jdc.appliEficas.format_fichier
118 #on force a python pour Carmel
119 if format=="CARMEL3D" : format="python"
121 if format in convert.plugins :
122 # Le convertisseur existe on l'utilise
123 p=convert.plugins[format]()
125 text=p.convert('exec',self.jdc.appliEficas)
126 #Si le fichier ne peut pas etre converti, le cr n'est pas vide
127 #et le texte est retourne tel que
128 if not p.cr.estvide():
129 self.text_converted=0
130 self.text_error=str(p.cr)
132 self.text_converted=1
135 if hasattr(self,'sd') and self.sd != None : context_ini[self.sd.nom]=self.sd
136 j=self.JdC_aux( procedure=text, nom=fichier,
137 appliEficas=self.jdc.appliEficas,
139 cata_ord_dico=self.jdc.cata_ordonne_dico,
140 context_ini = context_ini,
141 jdc_pere=self.jdc,etape_include=self,
142 prefix_include=prefix_include,
143 recorded_units=self.recorded_units,
144 old_recorded_units=old_recorded_units,**args)
147 if not j.cr.estvide(): self.text_included_converted=0
148 else : self.text_included_converted=1
149 self.text_included_error=str(j.cr)
150 # On recupere les etapes internes (pour validation)
153 self.jdc.jdcDict=self.jdc_aux
157 traceback.print_exc()
158 # On retablit l'etape courante step
159 CONTEXT.unsetCurrentStep()
160 CONTEXT.setCurrentStep(step)
164 if not j.cr.estvide() and doitEtreValide:
165 # Erreurs dans l'INCLUDE. On garde la memoire du fichier
166 # mais on n'insere pas les concepts
167 # On retablit l'etape courante step
169 #print ("valid ",j.isValid())
170 CONTEXT.unsetCurrentStep()
171 CONTEXT.setCurrentStep(step)
172 raise EficasException(tr("Impossible de relire le fichier %s \n ")+ str(j.cr))
175 if not j.isValid() and doitEtreValide:
176 # L'INCLUDE n'est pas valide.
177 # on produit un rapport d'erreurs
180 # On retablit l'etape courante step
181 CONTEXT.unsetCurrentStep()
182 CONTEXT.setCurrentStep(step)
183 self.jdc.cr.fatal("Le fichier include contient des erreurs ")
184 raise EficasException(tr("Le fichier include contient des erreurs "))
187 # Si aucune erreur rencontree
188 # ou qu on accepte un jdc incomplet
189 # On recupere le contexte de l'include verifie
191 j_context=j.getVerifContexte()
192 #print j_context.keys()
193 #print j.g_context.keys()
195 # On retablit l'etape courante step
196 CONTEXT.unsetCurrentStep()
197 CONTEXT.setCurrentStep(step)
198 raise EficasException(" ")
200 # Si on est arrive ici, le texte du fichier inclus (INCLUDE, POURSUITE, ...)
201 # est valide et inserable dans le JDC
203 # On remplit le dictionnaire des concepts produits inclus
204 # en retirant les concepts presents dans le contexte initial
205 # On ajoute egalement le concept produit dans le sdsDict du parent
206 # sans verification car on est sur (verification integree) que
207 # le nommage est possible
208 self.g_context.clear()
209 for k,v in j_context.items():
210 if (not k in context_ini) or (context_ini[k] != v):
212 self.parent.sdsDict[k]=v
214 #Ce traitement n'est realise que dans les cas suivants:
215 # - si convert n'a pas pu convertir le jeu de commandes
216 # - et ce n'est pas un INCLUDE_MATERIAU
217 #On collecte les variables Python qui ne sont pas dans le contexte initial
218 #et dans le contexte valide et on en fait un pseudo-parametre (Variable)
219 if self.text_converted == 0 and self.nom != "INCLUDE_MATERIAU":
220 for k,v in j.g_context.items():
221 if k in context_ini:continue
222 if k in j_context:continue
223 if isinstance(v,ASSD):continue
224 if isinstance(v,I_ENTITE.ENTITE):continue
225 if isinstance(v,I_OBJECT.OBJECT):continue
226 if callable(v):continue
227 self.g_context[k]=param2.Variable(k,v)
229 # On recupere le contexte courant
230 self.currentContext=j.currentContext
231 self.index_etape_courante=j.index_etape_courante
234 # On retablit l'etape courante step
235 CONTEXT.unsetCurrentStep()
236 CONTEXT.setCurrentStep(step)
240 def reevalueSdJdc(self):
242 Avec la liste des SD qui ont ete supprimees, propage la
243 disparition de ces SD dans toutes les etapes et descendants
245 #print "reevalueSdJdc"
246 l_sd_supp,l_sd_repl = self.diffContextes()
248 self.parent.deleteConceptAfterEtape(self,sd)
249 for old_sd,sd in l_sd_repl:
250 self.parent.replaceConceptAfterEtape(self,old_sd,sd)
252 def diffContextes(self):
254 Realise la difference entre les 2 contextes
255 old_contexte_fichier_init et contexte_fichier_init
256 cad retourne la liste des sd qui ont disparu ou ne derivent pas
257 de la meme classe et des sd qui ont ete remplacees
259 if not hasattr(self,'old_contexte_fichier_init'):return [],[]
262 for old_key in self.old_contexte_fichier_init:
263 if not old_key in self.contexte_fichier_init:
264 if isinstance(self.old_contexte_fichier_init[old_key],ASSD):
265 l_sd_suppressed.append(self.old_contexte_fichier_init[old_key])
267 if isinstance(self.old_contexte_fichier_init[old_key],ASSD):
268 # Un concept de meme nom existe
269 old_class=self.old_contexte_fichier_init[old_key].__class__
270 if not isinstance(self.contexte_fichier_init[old_key],old_class):
271 # S'il n'est pas d'une classe derivee, on le supprime
272 l_sd_suppressed.append(self.old_contexte_fichier_init[old_key])
274 l_sd_replaced.append((self.old_contexte_fichier_init[old_key],self.contexte_fichier_init[old_key]))
275 return l_sd_suppressed,l_sd_replaced
277 def controlSdprods(self,d):
279 Cette methode doit verifier que les concepts produits par la
280 commande ne sont pas incompatibles avec le contexte fourni (d).
281 Si c'est le cas, le concept produit doit etre supprime
282 Si la macro a elle meme des etapes, elle doit propager
283 le traitement (voir methode controlJdcContextApres de I_JDC)
285 #print ("I_MACRO_ETAPE.controlSdprods",d.keys(),self,self.nom,self.sd and self.sd.nom)
288 # Le concept est deja defini
289 if self.reuse and self.reuse is d[self.sd.nom]:
290 # Le concept est reutilise : situation normale
293 # Redefinition du concept, on l'annule
294 #XXX on pourrait simplement annuler son nom pour conserver les objets
295 # l'utilisateur n'aurait alors qu'a renommer le concept (faisable??)
298 self.sd=self.reuse=self.sdnom=None
299 self.parent.deleteConceptAfterEtape(self,sd)
302 # On verifie les concepts a droite du signe =
304 sdprods=self.sdprods[:]
307 if co.nom in d and co is not d[co.nom] :
308 #nettoie les mots cles de l'etape qui ont comme valeur co
309 self.deleteConcept(co)
310 #supprime les references a co dans les etapes suivantes
311 self.parent.deleteConceptAfterEtape(self,co)
313 self.sdprods.append(co)
316 for e in self.etapes:
320 def supprimeSdprod(self,sd):
322 Supprime le concept produit sd s'il est produit par l'etape
324 #print ('supprimeSdprod de MACRO_ETAPE')
325 if sd in self.sdprods:
327 self.parent.delSdprod(sd)
328 self.sdprods.remove(sd)
330 self.parent.deleteConcept(sd)
333 if sd is not self.sd :return
334 if self.sd is not None :
336 self.parent.delSdprod(sd)
339 self.parent.deleteConcept(sd)
341 def supprimeSdProds(self):
343 Fonction: Lors de la destruction de la macro-etape, detruit tous les concepts produits
344 Un operateur n a qu un concept produit
345 Une procedure n'en a aucun
346 Une macro en a en general plus d'un
348 #print "supprimeSdProds"
349 if self.reuse is not self.sd :
350 # l'etape n'est pas reentrante
351 # le concept retourne par l'etape est a supprimer car il etait
354 self.parent.delSdprod(self.sd)
355 self.parent.deleteConcept(self.sd)
356 # On detruit les concepts a droite du signe =
357 for co in self.sdprods:
358 self.parent.delSdprod(co)
359 self.parent.deleteConcept(co)
360 # Si la macro a des etapes et des concepts inclus, on les detruit
361 for nom_sd,co in self.g_context.items():
362 if not isinstance(co,ASSD):continue
363 self.parent.delSdprod(co)
364 self.parent.deleteConcept(co)
365 # On met g_context a blanc
370 if hasattr(self,"jdc_aux") and self.jdc_aux:
371 # La macro a un jdc auxiliaire inclus. On demande sa fermeture
374 def resetContext(self):
375 if hasattr(self,"jdc_aux") and self.jdc_aux:
376 # La macro a un jdc auxiliaire inclus. On demande la reinitialisation du contexte
377 self.jdc_aux.resetContext()
379 def updateConcept(self,sd):
380 I_ETAPE.ETAPE.updateConcept(self,sd)
381 for etape in self.etapes:
382 etape.updateConcept(sd)
384 def deleteConcept(self,sd):
386 Fonction : Mettre a jour les mots cles de l etape et eventuellement
387 le concept produit si reuse suite a la disparition du concept sd
388 Seuls les mots cles simples MCSIMP font un traitement autre
389 que de transmettre aux fils
391 #print "deleteConcept",sd
392 I_ETAPE.ETAPE.deleteConcept(self,sd)
393 for etape in self.etapes:
394 etape.deleteConcept(sd)
396 def replaceConcept(self,old_sd,sd):
398 Fonction : Mettre a jour les mots cles de l etape et le concept produit si reuse
399 suite au remplacement du concept old_sd par sd
401 #print "replaceConcept",old_sd,sd
402 I_ETAPE.ETAPE.replaceConcept(self,old_sd,sd)
403 for etape in self.etapes:
404 etape.replaceConcept(old_sd,sd)
406 def changeFichierInit(self,new_fic,text):
408 Tente de changer le fichier include. Le precedent include est conserve
411 if not hasattr(self,'fichier_ini'):
412 self.fichier_ini=None
413 self.fichier_text=None
414 self.fichier_err="Le fichier n'est pas defini"
415 self.contexte_fichier_init={}
416 self.recorded_units={}
418 self.fichier_unite="PasDefini"
419 import Extensions.jdc_include
420 self.JdC_aux=Extensions.jdc_include.JdC_include
422 self.old_fic = self.fichier_ini
423 self.old_text = self.fichier_text
424 self.old_err = self.fichier_err
425 self.old_context=self.contexte_fichier_init
426 self.old_units=self.recorded_units
427 self.old_etapes=self.etapes
428 self.old_jdc_aux=self.jdc_aux
430 self.fichier_ini = new_fic
431 self.fichier_text=text
434 self.makeContexteInclude(new_fic,text)
436 l=traceback.format_exception_only(tr("Fichier invalide %s", sys.exc_info()[1]))
437 self.fichier_err=''.join(l)
438 raise EficasException(self.fichier_err)
440 # L'evaluation de text dans un JDC auxiliaire s'est bien passe
441 # on peut poursuivre le traitement
443 self.state="undetermined"
444 self.fichier_err=None
445 # On enregistre la modification de fichier
447 # Le contexte du parent doit etre reinitialise car les concepts produits ont change
448 self.parent.resetContext()
450 # Si des concepts ont disparu lors du changement de fichier, on demande leur suppression
451 self.old_contexte_fichier_init=self.old_context
456 self.old_jdc_aux.close()
458 def restoreFichierInit(self):
460 Restaure le fichier init enregistre dans old_xxx
462 self.fichier_ini=self.old_fic
463 self.fichier_text=self.old_text
464 self.fichier_err=self.old_err
465 self.contexte_fichier_init=self.old_context
466 self.recorded_units=self.old_units
467 self.etapes=self.old_etapes
468 self.jdc_aux=self.old_jdc_aux
470 def forceFichierInit(self):
472 Force le remplacement du fichier init meme si le remplacant est en erreur
474 # Reinitialisation complete du compte-rendu d'erreurs
475 self.jdc_aux.cr=self.jdc_aux.CR()
476 # On remplit le dictionnaire des concepts produits inclus
477 # en retirant les concepts presents dans le contexte initial
478 # On ajoute egalement le concept produit dans le sdsDict du parent
479 # sans verification car on est sur (verification integree) que
480 # le nommage est possible
481 j_context=self.jdc_aux.getContexteAvant(None)
482 self.g_context.clear()
483 context_ini=self.jdc_aux.context_ini
484 for k,v in j_context.items():
485 if not k in context_ini or context_ini[k] != v:
487 self.parent.sdsDict[k]=v
488 # On recupere le contexte courant
489 self.currentContext=self.jdc_aux.currentContext
490 self.index_etape_courante=self.jdc_aux.index_etape_courante
491 self.contexte_fichier_init = j_context
492 self.fichier_err = None
494 # On enregistre la modification de fichier
496 self.state="undetermined"
498 # Le contexte du parent doit etre reinitialise car les concepts produits ont change
499 self.parent.resetContext()
501 # On remplace les anciens concepts par les nouveaux (y compris ajouts
502 # et suppression) et on propage les modifications aux etapes precedentes et suivantes
503 # reevalueSdJdc construit la liste des differences entre les contextes contexte_fichier_init
504 # et old_contexte_fichier_init et effectue les destructions et remplacements de concept
506 self.old_contexte_fichier_init=self.old_context
510 self.old_jdc_aux.close()
512 self.jdc_aux.forceContexte(self.g_context)
514 def buildInclude(self,fichier,text):
515 import Extensions.jdc_include
516 self.JdC_aux=Extensions.jdc_include.JdC_include
517 # un include partage la table des unites avec son parent (jdc)
518 self.recorded_units=self.parent.recorded_units
519 self.buildJdcaux(fichier,text)
521 def buildPoursuite(self,fichier,text):
522 import Extensions.jdc_include
523 self.JdC_aux=Extensions.jdc_include.JdC_poursuite
524 # une poursuite a sa propre table d'unites
525 self.recorded_units={}
526 self.buildJdcaux(fichier,text)
529 def buildIncludeInclude(self,text):
530 import Extensions.jdc_include
531 self.JdC_aux=Extensions.jdc_include.JdC_include
532 # un include partage la table des unites avec son parent (jdc)
535 def buildIncludeEtape(self,text,doitEtreValide = 0):
536 import Extensions.jdc_include
537 self.JdC_aux=Extensions.jdc_include.JdC_include
538 # un include partage la table des unites avec son parent (jdc)
539 #self.buildJdcauxInclude(text)
540 # Attention fonctionne pour import_Zone de MT
541 # a adapter eventuellement
544 contexte = self.getContexteJdc(None,text,doitEtreValide)
545 except EficasException:
548 for e in self.etapes:
553 index=self.jdc.etapes.index(self)
554 self.jdc.etapes=self.jdc.etapes[:index+1]+self.etapes+self.jdc.etapes[index+1:]
558 self.jdc.resetContext()
560 CONTEXT.unsetCurrentStep()
564 def buildJdcauxInclude(self,text):
567 contexte = self.getContexteJdc(None,text)
568 except EficasException:
570 index=self.jdc.etapes.index(self)
571 for e in self.etapes:
573 self.jdc.etapes=self.jdc.etapes[:index+1]+self.etapes+self.jdc.etapes[index+1:]
577 CONTEXT.unsetCurrentStep()
579 def buildJdcaux(self,fichier,text):
581 Cree un jdc auxiliaire initialise avec text.
582 Initialise le nom du fichier associe avec fichier
583 N'enregistre pas d'association unite <-> fichier
585 self.fichier_ini = fichier
586 self.fichier_text= text
587 self.fichier_unite=None
588 self.fichier_err = None
590 contexte = self.getContexteJdc(fichier,text)
591 if contexte is None :
592 # Impossible de construire le jdc auxiliaire (sortie par None)
593 # On simule une sortie par exception
594 raise EficasException(tr("Impossible de construire le jeu de commandes correspondant au fichier"))
596 # La construction du jdc auxiliaire est allee au bout
597 self.contexte_fichier_init = contexte
601 # Impossible de construire le jdc auxiliaire (sortie par exception)
602 l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
603 if self.jdc.editor is not None:
604 self.jdc.editor.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
605 message= tr("Ce fichier ne sera pas pris en compte\n %s",''.join(l)))
610 self.fichier_err = ''.join(l)
611 self.contexte_fichier_init={}
614 raise EficasException(" ")
616 def makeContexteInclude(self,fichier,text):
618 Cette methode sert a craer un contexte en interpratant un texte source Python.
620 #print ("makeContexteInclude",fichier)
621 # on recupere le contexte d'un nouveau jdc dans lequel on interprete text
622 contexte = self.getContexteJdc(fichier,text)
624 if contexte == None :
625 raise EficasException("Impossible de construire le jeu de commandes correspondant au fichier")
627 # Pour les macros de type include : INCLUDE, INCLUDE_MATERIAU et POURSUITE
628 # l'attribut g_context est un dictionnaire qui contient les concepts produits par inclusion
629 # l'attribut contexte_fichier_init est un dictionnaire qui contient les concepts produits
630 # en sortie de macro. g_context est obtenu en retirant de contexte_fichier_init les concepts
631 # existants en debut de macro contenus dans context_ini (dans getContexteJdc)
632 # g_context est utilise pour avoir les concepts produits par la macro
633 # contexte_fichier_init est utilise pour avoir les concepts supprimes par la macro
634 self.contexte_fichier_init = contexte
635 #print ("fin makeContexteInclude",fichier)
637 def reevalueFichierInitObsolete(self):
638 """Recalcule les concepts produits par le fichier enregistre"""
639 #print "reevalue_fichier_init"
640 old_context=self.contexte_fichier_init
642 self.makeContexteInclude(self.fichier_ini ,self.fichier_text)
644 l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
645 self.fichier_err = ''.join(l)
649 self.old_contexte_fichier_init=old_context
650 self.contexte_fichier_init={}
654 # L'evaluation s'est bien passee
655 self.fichier_err = None
656 self.old_contexte_fichier_init=old_context
659 def updateFichierInit(self,unite):
660 """Reevalue le fichier init sans demander (dans la mesure du possible) a l'utilisateur
661 les noms des fichiers
662 Ceci suppose que les relations entre unites et noms ont ete memorisees prealablement
663 L'include a ete initialise precedemment. Le jdc auxiliaire existe.
665 #print "updateFichierInit",unite,self.fichier_unite
666 self.old_contexte_fichier_init=self.contexte_fichier_init
667 old_fichier_ini=self.fichier_ini
668 if not hasattr(self,"jdc_aux"):self.jdc_aux=None
669 old_jdc_aux=self.jdc_aux
671 #print "updateFichierInit",self,self.parent,self.parent.recorded_units
673 if self.fichier_unite is None:
674 # L'unite n'etait pas definie precedemment. On ne change que l'unite
675 #print "updateFichierInit","pas de changement dans include"
676 self.fichier_unite=unite
678 elif unite == self.fichier_unite :
679 # L'unite n'a pas change
680 #print "updateFichierInit","pas de changement dans include 3"
682 elif unite != self.fichier_unite :
683 # L'unite etait definie precedemment. On remplace l'include
685 f,text=self.getFileMemo(unite=unite,fic_origine=self.parent.nom)
687 # Le fichier associe n'a pas pu etre defini
688 # on change l'unite associee mais pas l'include
689 #print "updateFichierInit","pas de changement dans include 2"
690 self.fichier_unite=unite
694 self.fichier_text=text
695 self.fichier_unite=unite
696 #print "updateFichierInit",self.recorded_units
698 #print "updateFichierInit",self.fichier_ini,self.fichier_text,self.fichier_unite
700 if old_fichier_ini == self.fichier_ini:
701 # Le fichier inclus n'a pas change. On ne recree pas le contexte
702 # mais on enregistre le changement d'association unite <-> fichier
703 #print "updateFichierInit.fichier inchange",self.jdc_aux.context_ini
704 self.parent.recordUnit(unite,self)
708 self.fichier_err=None
709 self.makeContexteInclude(self.fichier_ini,self.fichier_text)
710 # Les 3 attributs fichier_ini fichier_text recorded_units doivent etre corrects
711 # avant d'appeler changeUnit
713 # Erreurs lors de l'evaluation de text dans un JDC auxiliaire
714 l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
715 # On conserve la memoire du nouveau fichier
716 # mais on n'utilise pas les concepts crees par ce fichier
717 # on met l'etape en erreur : fichier_err=''.join(l)
718 self.fichier_err=''.join(l)
722 self.contexte_fichier_init={}
726 self.parent.recordUnit(unite,self)
727 # Le contexte du parent doit etre reinitialise car les concepts
728 # produits ont change
729 self.parent.resetContext()
730 # Si des concepts ont disparu lors du changement de fichier, on
731 # demande leur suppression
733 #print "updateFichierInit",self.jdc_aux.context_ini.keys()
735 def recordUnite(self):
736 #print "recordUnite",self.nom
737 if self.nom == "POURSUITE":
738 self.parent.recordUnit(None,self)
740 if hasattr(self,'fichier_unite') :
741 self.parent.recordUnit(self.fichier_unite,self)
743 def getFileMemo(self, unite=None, fname=None, fic_origine=''):
744 """Retourne le nom du fichier et le source correspondant a l'unite unite
745 Initialise en plus recorded_units
747 #print "getFileMemo",unite,fic_origine,self,self.parent
748 #print self.parent.recorded_units
750 # On est dans le cas d'une poursuite. On ne reutilise aucune unite de parent
753 # On est dans le cas d'un include. On reutilise toutes les unites de parent
754 units=self.parent.recorded_units
756 if unite in self.parent.recorded_units:
757 f,text,units=self.parent.recorded_units[unite]
760 if not osp.exists(fname):
761 raise AsException(fname + tr(" n'est pas un fichier existant"))
763 text = open(fname, 'r').read()
765 f,text=self.jdc.getFile(unite=unite, fic_origine=fic_origine)
769 self.recorded_units=units
770 if f is None and self.jdc.editor:
771 self.jdc.editor.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
772 message= tr("Ce fichier ne sera pas pris en compte\nLe fichier associe n'est pas defini"))
775 def updateContext(self,d):
777 Met a jour le contexte contenu dans le dictionnaire d
778 Une MACRO_ETAPE peut ajouter plusieurs concepts dans le contexte
779 Une fonction enregistree dans op_init peut egalement modifier le contexte
781 #print ("updateContext",self,self.nom,d.keys())
782 if hasattr(self,"jdc_aux") and self.jdc_aux:
783 #ATTENTION: updateContext NE DOIT PAS appeler resetContext
784 # car il appelle directement ou indirectement updateContext
785 # equivalent a resetContext. Evite les recursions
786 self.jdc_aux.context_ini=d.copy()
787 self.jdc_aux.currentContext={}
788 self.jdc_aux.index_etape_courante=0
789 #ATTENTION: il ne faut pas utiliser self.jdc_aux.getContexteAvant
790 #car cet appel conduit a des remontees multiples incoherentes dans le
792 #get_context_avant appelle updateContext qui NE DOIT PAS appeler getContexteAvant
793 #On n'a besoin que d'un update local connaissant
794 # le contexte amont : d qui sert a reinitialiser self.context_ini
795 for e in self.etapes:
799 if type(self.definition.op_init) == types.FunctionType:
800 self.definition.op_init(*(self,d))
801 if self.sd != None :d[self.sd.nom]=self.sd
802 for co in self.sdprods:
804 #print "updateContext.fin",d.keys()
806 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
808 etape=Noyau.N_MACRO_ETAPE.MACRO_ETAPE.copy(self)
809 if hasattr(etape,"etapes") :etape.etapes=[]
810 if hasattr(etape,"jdc_aux") :
812 del etape.fichier_ini
816 #print "supprime",self
817 if hasattr(self,"jdc_aux") and self.jdc_aux:
818 self.jdc_aux.supprime_aux()
820 Noyau.N_MACRO_ETAPE.MACRO_ETAPE.supprime(self)
822 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
823 def getFile(self,unite=None,fic_origine=''):
824 """Retourne le nom du fichier et le source correspondant a l'unite unite
827 f,text=self.jdc.getFile(unite=unite,fic_origine=fic_origine)
833 def makeInclude3(self,fichier=None):
834 self.makeIncludeCarmel(fichier)
837 def makeIncludeCND(self,fichier=None):
839 if fichier==None : return
840 if hasattr(self,'fichier_ini') : print((self.fichier_ini))
841 if hasattr(self,'fichier_ini') : return
842 self.fichier_ini=fichier
843 from acquiertGroupes import getGroupes
844 erreur,listeGroupes=getGroupes(fichier)
845 if erreur != "" : print ("a traiter")
850 for groupe in listeGroupes :
851 if groupe[0:8]=='CURRENT_': texteSources +=groupe[8:]+"=SOURCE();\n"
852 if groupe[0:5]=='COND_': texteCond +=groupe[5:]+"=CONDUCTEUR();\n"
853 if groupe[0:7]=='NOCOND_': texteNoCond +=groupe[7:]+"=NOCOND();\n"
854 #if groupe[0:5]=='VCUT_': texteVcut +=groupe[5:]+"=VCUT();\n"
855 if groupe[0:5]=='VCUT_': texteVcut +='V_'+groupe[5:]+"=VCUT();\n"
856 texte=texteSources+texteCond+texteNoCond+texteVcut
858 self.buildIncludeInclude(texte)
859 if CONTEXT.getCurrentStep()==None : CONTEXT.setCurrentStep(self)
862 def makeIncludeCarmel(self,fichier=None):
864 #print "je suis dans makeIncludeCarmel"
866 if hasattr(self,'fichier_ini') : return
868 if hasattr(self,'old_context_fichier_init' ):
870 for concept in self.old_context_fichier_init.values():
871 self.jdc.deleteConcept(concept)
873 fichier=str(self.jdc.appliEficas.getFile_dictDonnees())
874 if fichier == str("") :
875 self.fichier_ini="badfile"
877 self.fichier_err=tr("Le fichier n est pas defini")
878 self.parent.recordUnit(999,self)
880 MCFils=self.getChild('FileName')
881 MCFils.setValeur(None)
884 raise EficasException(self.fichier_err)
885 self.fichier_ini = fichier
886 f=open(self.fichier_ini,'r')
887 self.fichier_text=f.read()
890 self.contexte_fichier_init={}
891 self.fichier_unite=999
892 self.fichier_err=None
896 import Extensions.jdc_include
897 self.JdC_aux=Extensions.jdc_include.JdC_include
900 traceback.print_exc()
901 self.makeIncl2Except()
902 raise EficasException(" ")
906 self.makeContexteInclude(self.fichier_ini ,self.fichier_text)
907 self.old_context_fichier_init=self.contexte_fichier_init
908 self.parent.recordUnit(unite,self)
910 MCFils=self.getChild('FileName')
911 #MCFils.setValeur(fichier)
912 #on appelle pas setValeur qui modifie le contexte ce qui fout le bazar
913 #pas de modification de bloc
914 MCFils.valeur=fichier
920 self.makeIncl2Except()
921 # Cette P*** de ligne suivante ne fonctionne que pour Aster
922 # si quelqu un a une idee merci de m en parler
923 #CONTEXT.setCurrentStep(self)
925 def makeInclude2(self,fichier=None):
927 # gestion de l unicite SVP
930 if hasattr(self,'fichier_ini') : return
932 if hasattr(self,'old_context_fichier_init' ):
934 for concept in self.old_context_fichier_init.values():
935 self.jdc.deleteConcept(concept)
938 fichier=str(self.jdc.appliEficas.getFileVariable())
939 if fichier == str("") :
940 self.fichier_ini="badfile"
942 self.fichier_err=tr("Le fichier n est pas defini")
943 self.parent.recordUnit(999,self)
945 MCFils=self.getChild('FileName')
946 MCFils.setValeur(None)
949 raise EficasException(self.fichier_err)
951 self.fichier_ini = fichier
952 self.fichier_text = ""
953 self.contexte_fichier_init={}
954 self.fichier_unite=999
955 self.fichier_err=None
958 from openturns import WrapperFile
959 monWrapper=WrapperFile(fichier)
960 data=monWrapper.getWrapperData()
961 maVariableListe=data.getVariableList()
962 nbVariables=maVariableListe.getSize()
963 for i in range(nbVariables) :
964 nom=maVariableListe[i].id_
965 type=maVariableListe[i].type_
967 #ligneTexte="%s=DETERMINISTICVARIABLE(N='%s',T='out',R=%d);\n" % (nom, nom, i)
969 nbVariableOut=nbVariableOut+1
971 ligneTexte="%s=DETERMINISTICVARIABLE(N='%s',T='in',R=%d);\n" % (nom, nom, i)
972 self.fichier_text = self.fichier_text + ligneTexte
974 self.makeIncl2Except()
975 raise EficasException(" ")
977 if nbVariableOut != 1 :
978 self.makeIncl2Except(mess=tr("le fichier doit contenir une unique variable de sortie"))
979 raise EficasException(" ")
982 import Extensions.jdc_include
983 self.JdC_aux=Extensions.jdc_include.JdC_include
985 traceback.print_exc()
986 self.makeIncl2Except()
987 raise EficasException(" ")
990 self.makeContexteInclude(self.fichier_ini ,self.fichier_text)
991 self.old_context_fichier_init=self.contexte_fichier_init
992 self.parent.recordUnit(unite,self)
994 MCFils=self.getChild('FileName')
995 MCFils.setValeur(fichier)
999 self.makeIncl2Except()
1001 # recalcul validite pour la matrice eventuelle
1003 for e in self.jdc.etapes:
1004 if e.nom == "VARIABLE" :
1007 mc=e.getChild('ModelVariable')
1011 if e.nom == "CORRELATION" :
1014 mc=e.getChild('Matrix')
1016 mcFeuille=mc.getChild('CorrelationMatrix')
1017 mcFeuille.state="modified"
1022 def makeIncl2Except(self,mess=None):
1023 l=traceback.format_exception_only(tr("Fichier invalide"),sys.exc_info()[1])
1024 if self.jdc.editor is not None:
1026 self.jdc.editor.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
1027 message= tr("Le contenu de ce fichier ne sera pas pris en compte\n %s",\
1031 self.jdc.editor.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
1033 #self.parent.recordUnit(unite,self)
1037 self.fichier_err = ''.join(l)
1038 self.contexte_fichier_init={}
1040 MCFils=self.getChild('FileName')
1041 MCFils.setValeur(None)
1046 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
1047 #def makeInclude(self, unite=None, fname=None):
1048 def makeInclude(self, unite=None, fname=None):
1050 Inclut un fichier dont l'unite logique est unite
1051 Cette methode est appelee par la fonction sd_prod de la macro INCLUDE
1052 Si l'INCLUDE est invalide, la methode doit produire une exception
1053 Sinon on retourne None. Les concepts produits par l'INCLUDE sont
1054 pris en compte par le JDC parent lors du calcul du contexte (appel de ???)
1056 # On supprime l'attribut unite qui bloque l'evaluation du source de l'INCLUDE
1057 # car on ne s'appuie pas sur lui dans EFICAS mais sur l'attribut fichier_ini
1058 # Si unite n'a pas de valeur, l'etape est forcement invalide. On peut retourner None
1059 #if not unite and not fname:
1061 # 2020 on supprime unite
1062 # attention cependant c est utilise pour poursuite
1064 if not fname : return
1066 if not hasattr(self,'fichier_ini') :
1067 # Si le fichier n'est pas defini on le demande
1068 f,text=self.getFileMemo(unite=unite, fname=fname, fic_origine=self.parent.nom)
1069 # On memorise le fichier retourne
1070 self.fichier_ini = f
1071 self.fichier_text = text
1072 self.contexte_fichier_init={}
1073 self.fichier_unite=unite
1074 self.fichier_err=None
1076 import Extensions.jdc_include
1078 traceback.print_exc()
1079 raise EficasException("pb import Extensions")
1080 self.JdC_aux=Extensions.jdc_include.JdC_include
1082 #print "makeInclude",self.fichier_ini,self.fichier_text
1083 if f is None and not text:
1084 self.fichier_err=tr("Le fichier INCLUDE n est pas defini")
1085 self.parent.recordUnit(unite,self)
1086 raise EficasException(self.fichier_err)
1089 self.makeContexteInclude(self.fichier_ini ,self.fichier_text)
1090 self.parent.recordUnit(unite,self)
1092 l=traceback.format_exception_only(tr("Fichier invalide %s",sys.exc_info()[1]))
1094 self.jdc.editor.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
1095 message=tr("Le contenu de ce fichier ne sera pas pris en compte\n"+''.join(l)))
1096 self.parent.recordUnit(unite,self)
1100 self.fichier_err = ''.join(l)
1101 self.contexte_fichier_init={}
1102 raise EficasException(" ")
1105 # Si le fichier est deja defini on ne reevalue pas le fichier
1106 # et on leve une exception si une erreur a ete enregistree
1107 self.updateFichierInit(unite)
1108 self.fichier_unite=unite
1109 if self.fichier_err is not None: raise EficasException(self.fichier_err)
1110 #print ('self.g_context', self.g_context)
1113 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
1114 def makeContexte(self,fichier,text):
1116 Cette methode sert a creer un contexte pour INCLUDE_MATERIAU
1117 en interpretant un texte source Python
1118 Elle est appelee par la fonction sd_prod d'INCLUDE_MATERIAU
1120 #print "makeContexte",fichier
1121 # On supprime l'attribut mat qui bloque l'evaluation du source de l'INCLUDE_MATERIAU
1122 # car on ne s'appuie pas sur lui dans EFICAS mais sur l'attribut fichier_ini
1123 if hasattr(self,'mat'):del self.mat
1124 if not hasattr(self,'fichier_ini') or self.fichier_ini != fichier or self.fichier_mater != self.nom_mater:
1125 # le fichier est nouveau ou change
1126 self.fichier_ini =fichier
1127 self.fichier_unite =fichier
1128 self.fichier_mater=self.nom_mater
1129 self.fichier_text=text
1130 self.fichier_err=None
1131 self.contexte_fichier_init={}
1132 # On specifie la classe a utiliser pour le JDC auxiliaire
1134 import Extensions.jdc_include
1135 self.JdC_aux=Extensions.jdc_include.JdC_include
1137 raise EficasException(" ")
1139 self.makeContexteInclude(self.fichier_ini ,self.fichier_text)
1140 if not self.nom_mater in self.g_context :
1141 #Pour permettre de lire un jeu de commandes avec des INCLUDE_MATERIAU errones
1142 self.g_context[self.nom_mater]=None
1143 if self.parent: self.parent.g_context[self.nom_mater]=None
1145 l=traceback.format_exception_only(tr("Fichier invalide %s",sys.exc_info()[1]))
1146 self.fichier_err = ''.join(l)
1148 #Pour permettre de lire un jeu de commandes avec des INCLUDE_MATERIAU errones
1150 self.parent.g_context[self.nom_mater]=None
1151 self.g_context[self.nom_mater]=None
1155 self.contexte_fichier_init={}
1156 raise EficasException(" ")
1158 # le fichier est le meme on ne le reevalue pas
1159 # et on leve une exception si une erreur a ete enregistree
1160 if self.fichier_err is not None: raise EficasException(self.fichier_err)
1162 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
1163 def updateSdprod(self,cr='non'):
1164 # Cette methode peut etre appelee dans EFICAS avec des mots cles de
1165 # la commande modifies. Ceci peut conduire a la construction ou
1166 # a la reconstruction d'etapes dans le cas d'INCLUDE ou d'INCLUDE_MATERIAU
1167 # Il faut donc positionner le current_step avant l'appel
1168 CONTEXT.unsetCurrentStep()
1169 CONTEXT.setCurrentStep(self)
1170 valid=Validation.V_MACRO_ETAPE.MACRO_ETAPE.updateSdprod(self,cr=cr)
1171 CONTEXT.unsetCurrentStep()
1174 #ATTENTION SURCHARGE: cette methode surcharge celle de Noyau a garder en synchro
1175 def buildSd(self,nom):
1177 Methode de Noyau surchargee pour poursuivre malgre tout
1178 si une erreur se produit pendant la creation du concept produit
1181 sd=Noyau.N_MACRO_ETAPE.MACRO_ETAPE.buildSd(self,nom)
1184 #except AsException,e:
1185 # Une erreur s'est produite lors de la construction du concept
1186 # Comme on est dans EFICAS, on essaie de poursuivre quand meme
1187 # Si on poursuit, on a le choix entre deux possibilites :
1188 # 1. on annule la sd associee a self
1189 # 2. on la conserve mais il faut la retourner
1190 # On choisit de l'annuler
1191 # En plus il faut rendre coherents sdnom et sd.nom
1194 self.state="unchanged"
1199 #ATTENTION SURCHARGE: cette methode surcharge celle de Noyau a garder en synchro
1200 def makePoursuite(self):
1201 """ Cette methode est appelee par la fonction sd_prod de la macro POURSUITE
1203 #print "makePoursuite"
1204 if not hasattr(self,'fichier_ini') :
1205 # Si le fichier n'est pas defini on le demande
1206 f,text=self.getFileMemo(fic_origine=self.parent.nom)
1207 # On memorise le fichier retourne
1208 self.fichier_ini = f
1209 self.fichier_unite = None
1210 self.fichier_text = text
1211 self.fichier_err=None
1213 import Extensions.jdc_include
1215 traceback.print_exc()
1216 raise EficasException(" ")
1217 self.JdC_aux=Extensions.jdc_include.JdC_poursuite
1218 self.contexte_fichier_init={}
1219 #print "makePoursuite",self.fichier_ini,self.fichier_text
1222 self.fichier_err="Le fichier POURSUITE n'est pas defini"
1224 self.parent.recordUnit(None,self)
1225 raise EficasException(self.fichier_err)
1228 self.makeContexteInclude(self.fichier_ini,self.fichier_text)
1229 self.parent.recordUnit(None,self)
1231 l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
1233 self.jdc.editor.afficheAlerte(tr("Erreur lors de l'evaluation du fichier poursuite"),
1234 message=tr("Ce fichier ne sera pas pris en compte\n %s",''.join(l)))
1235 self.parent.recordUnit(None,self)
1239 self.fichier_err = ''.join(l)
1240 self.contexte_fichier_init={}
1241 raise EficasException(" ")
1244 # Si le fichier est deja defini on ne reevalue pas le fichier
1245 # et on leve une exception si une erreur a ete enregistree
1246 self.updateFichierInit(None)
1247 if self.fichier_err is not None: raise EficasException(self.fichier_err)