]> SALOME platform Git repositories - tools/eficas.git/blob - Ihm/I_MACRO_ETAPE.py
Salome HOME
chgt Copyrigth
[tools/eficas.git] / Ihm / I_MACRO_ETAPE.py
1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2021   EDF R&D
3 #
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.
8 #
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.
13 #
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
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 """
21 """
22 # Modules Python
23 from __future__ import absolute_import
24 from __future__ import print_function
25 import sys
26 import os.path as osp
27 import traceback,types
28
29 # Modules Eficas
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
35 import Noyau
36 from Noyau.N_ASSD import ASSD
37 from Noyau import N__F
38 from Extensions import param2
39
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
46
47 class MACRO_ETAPE(I_ETAPE.ETAPE):
48
49   def __init__(self):
50       self.typret=None
51       #indique si le jeu de commande inclus a pu etre analyse par convert
52       #pour etre editable (0=NON, 1=OUI)
53       self.text_converted=1
54       self.text_error=""
55       self.recorded_units={}
56
57   def getSdprods(self,nom_sd):
58     """ 
59          Fonction : retourne le concept produit par l etape de nom nom_sd
60          s il existe sinon None
61     """
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:
66       d={}
67       self.definition.op_init(*(self,d))
68       return d.get(nom_sd,None)
69     return None
70
71   def getContexteJdc(self,fichier,text,doitEtreValide=1):
72     """ 
73          Interprete text comme un texte de jdc et retourne le contexte final.
74
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
77          ou leve une exception
78          --> utilisee par ops.POURSUITE et INCLUDE
79     """
80     #print ("getContexteJdc",self,self.nom, text)
81     # On recupere l'etape courante
82     step=CONTEXT.getCurrentStep()
83     self.text_included_converted=0
84     try:
85     #if 1 :
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()
91
92        # Indispensable avant de creer un nouveau JDC
93        CONTEXT.unsetCurrentStep()
94        args=self.jdc.args
95        prefix_include=None
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()
105
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()
109
110        if fichier is None:fichier="SansNom"
111
112        # Il faut convertir le texte inclus en fonction du format
113        # sauf les INCLUDE_MATERIAU
114        self.text_converted=0
115        self.text_error=""
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"
120           import convert
121           if format in convert.plugins :
122               # Le convertisseur existe on l'utilise
123               p=convert.plugins[format]()
124               p.text=text
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)
131               else:
132                   self.text_converted=1
133
134
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,
138                                 cata=self.jdc.cata,
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)
145
146        j.analyse()
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)
151        self.etapes=j.etapes
152        self.jdc_aux=j
153        self.jdc.jdcDict=self.jdc_aux
154
155     except:
156     #else :
157        traceback.print_exc()
158        # On retablit l'etape courante step
159        CONTEXT.unsetCurrentStep()
160        CONTEXT.setCurrentStep(step)
161        return None
162
163      
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
168        #print (j.cr)
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))
173
174
175     if not j.isValid() and doitEtreValide:
176        # L'INCLUDE n'est pas valide.
177        # on produit un rapport d'erreurs
178        cr=j.report()
179        #print ('cr', cr)
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 "))
185
186
187     # Si aucune erreur rencontree
188     # ou qu on accepte un jdc incomplet
189     # On recupere le contexte de l'include verifie
190     try:
191        j_context=j.getVerifContexte()
192        #print j_context.keys()
193        #print j.g_context.keys()
194     except:
195        # On retablit l'etape courante step
196        CONTEXT.unsetCurrentStep()
197        CONTEXT.setCurrentStep(step)
198        raise EficasException(" ")
199
200     # Si on est arrive ici, le texte du fichier inclus (INCLUDE, POURSUITE, ...)
201     # est valide et inserable dans le JDC
202
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):
211            self.g_context[k]=v
212            self.parent.sdsDict[k]=v
213
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)
228
229     # On recupere le contexte courant
230     self.currentContext=j.currentContext
231     self.index_etape_courante=j.index_etape_courante
232     self.jdc_aux=j
233
234     # On retablit l'etape courante step
235     CONTEXT.unsetCurrentStep()
236     CONTEXT.setCurrentStep(step)
237
238     return j_context
239
240   def reevalueSdJdc(self):
241      """
242          Avec la liste des SD qui ont ete supprimees, propage la 
243          disparition de ces SD dans toutes les etapes et descendants
244      """
245      #print "reevalueSdJdc"
246      l_sd_supp,l_sd_repl = self.diffContextes()
247      for sd in l_sd_supp:
248         self.parent.deleteConceptAfterEtape(self,sd)
249      for old_sd,sd in l_sd_repl:
250         self.parent.replaceConceptAfterEtape(self,old_sd,sd)
251
252   def diffContextes(self):
253      """ 
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
258      """
259      if not hasattr(self,'old_contexte_fichier_init'):return [],[]
260      l_sd_suppressed = []
261      l_sd_replaced = []
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])
266        else:
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])
273             else:
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
276       
277   def controlSdprods(self,d):
278       """
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)
284       """
285       #print ("I_MACRO_ETAPE.controlSdprods",d.keys(),self,self.nom,self.sd and self.sd.nom)
286       if self.sd:
287         if self.sd.nom in d:
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
291               pass
292            else:
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??)
296               self.initModif()
297               sd=self.sd
298               self.sd=self.reuse=self.sdnom=None
299               self.parent.deleteConceptAfterEtape(self,sd)
300               self.finModif()
301
302       # On verifie les concepts a droite du signe =
303       self.initModif()
304       sdprods=self.sdprods[:]
305       self.sdprods=[]
306       for co in 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)
312         else:
313            self.sdprods.append(co)
314       self.finModif()
315        
316       for e in self.etapes:
317           e.controlSdprods(d)
318           e.updateContext(d)
319
320   def supprimeSdprod(self,sd):
321       """
322          Supprime le concept produit sd s'il est produit par l'etape
323       """
324       #print ('supprimeSdprod de MACRO_ETAPE')
325       if sd in self.sdprods:
326          self.initModif()
327          self.parent.delSdprod(sd)
328          self.sdprods.remove(sd)
329          self.finModif()
330          self.parent.deleteConcept(sd)
331          return
332
333       if sd is not self.sd :return
334       if self.sd is not None :
335          self.initModif()
336          self.parent.delSdprod(sd)
337          self.sd=None
338          self.finModif()
339          self.parent.deleteConcept(sd)
340
341   def supprimeSdProds(self):
342       """
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
347       """
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
352          # cree par l'etape
353          if self.sd != None :
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
366       self.g_context={}
367
368   def close(self):
369       #print "close",self
370       if hasattr(self,"jdc_aux") and self.jdc_aux:
371          # La macro a un jdc auxiliaire inclus. On demande sa fermeture
372          self.jdc_aux.close()
373
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()
378
379   def updateConcept(self,sd):
380       I_ETAPE.ETAPE.updateConcept(self,sd)
381       for etape in self.etapes:
382           etape.updateConcept(sd)
383
384   def deleteConcept(self,sd):
385       """
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
390       """
391       #print "deleteConcept",sd
392       I_ETAPE.ETAPE.deleteConcept(self,sd)
393       for etape in self.etapes:
394          etape.deleteConcept(sd)
395
396   def replaceConcept(self,old_sd,sd):
397       """
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
400       """
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)
405          
406   def changeFichierInit(self,new_fic,text):
407     """
408        Tente de changer le fichier include. Le precedent include est conserve
409        dans old_xxx
410     """
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={}
417        self.jdc_aux=None
418        self.fichier_unite="PasDefini"
419        import Extensions.jdc_include
420        self.JdC_aux=Extensions.jdc_include.JdC_include
421
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
429
430     self.fichier_ini = new_fic
431     self.fichier_text=text
432
433     try:
434        self.makeContexteInclude(new_fic,text)
435     except:
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)
439
440     # L'evaluation de text dans un JDC auxiliaire s'est bien passe
441     # on peut poursuivre le traitement
442     self.initModif()
443     self.state="undetermined"
444     self.fichier_err=None
445     # On enregistre la modification de fichier
446     self.recordUnite()
447     # Le contexte du parent doit etre reinitialise car les concepts produits ont change
448     self.parent.resetContext()
449
450     # Si des concepts ont disparu lors du changement de fichier, on demande leur suppression
451     self.old_contexte_fichier_init=self.old_context
452     self.reevalueSdJdc()
453
454     self.finModif()
455     if self.old_jdc_aux:
456        self.old_jdc_aux.close()
457
458   def restoreFichierInit(self):
459     """
460        Restaure le fichier init enregistre dans old_xxx
461     """
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
469
470   def forceFichierInit(self):
471     """
472        Force le remplacement du fichier init meme si le remplacant est en erreur
473     """
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:
486            self.g_context[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
493
494     # On enregistre la modification de fichier
495     self.initModif()
496     self.state="undetermined"
497     self.recordUnite()
498     # Le contexte du parent doit etre reinitialise car les concepts produits ont change
499     self.parent.resetContext()
500
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
505     # necessaires
506     self.old_contexte_fichier_init=self.old_context
507     self.reevalueSdJdc()
508     self.finModif()
509     if self.old_jdc_aux:
510        self.old_jdc_aux.close()
511
512     self.jdc_aux.forceContexte(self.g_context)
513
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)
520
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)
527        
528
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)
533
534
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
542     try :
543     #if 1 :
544        contexte = self.getContexteJdc(None,text,doitEtreValide)
545     except EficasException: 
546        return 0
547      
548     for e in self.etapes: 
549         e.niveau=self.niveau
550         e.parent=self.parent
551         e.state='change'
552
553     index=self.jdc.etapes.index(self)
554     self.jdc.etapes=self.jdc.etapes[:index+1]+self.etapes+self.jdc.etapes[index+1:]
555
556     self.g_context={}
557     self.etapes=[]
558     self.jdc.resetContext()
559     self.jdc_aux=None
560     CONTEXT.unsetCurrentStep()
561     return 1
562
563
564   def buildJdcauxInclude(self,text):
565        
566        try :
567          contexte = self.getContexteJdc(None,text)
568        except EficasException:
569          pass
570        index=self.jdc.etapes.index(self)
571        for e in self.etapes:
572            e.niveau=self.niveau
573        self.jdc.etapes=self.jdc.etapes[:index+1]+self.etapes+self.jdc.etapes[index+1:]
574        self.g_context={}
575        self.etapes=[]
576        self.jdc_aux=None
577        CONTEXT.unsetCurrentStep()
578
579   def buildJdcaux(self,fichier,text):
580     """
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
584     """
585     self.fichier_ini = fichier
586     self.fichier_text= text
587     self.fichier_unite=None
588     self.fichier_err = None
589     try:
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"))
595        else:
596           # La construction du jdc auxiliaire est allee au bout
597           self.contexte_fichier_init = contexte
598        self.initModif()
599        self.finModif()
600     except:
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)))
606
607        self.g_context={}
608        self.etapes=[]
609        self.jdc_aux=None
610        self.fichier_err = ''.join(l)
611        self.contexte_fichier_init={}
612        self.initModif()
613        self.finModif()
614        raise EficasException(" ")
615
616   def makeContexteInclude(self,fichier,text):
617     """
618         Cette methode sert a craer un contexte en interpratant un texte source Python.
619     """
620     #print ("makeContexteInclude",fichier)
621     # on recupere le contexte d'un nouveau jdc dans lequel on interprete text
622     contexte = self.getContexteJdc(fichier,text)
623     #print (contexte)
624     if contexte == None :
625       raise EficasException("Impossible de construire le jeu de commandes correspondant au fichier")
626     else:
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)
636
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
641       try:
642          self.makeContexteInclude(self.fichier_ini ,self.fichier_text)
643       except:
644          l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
645          self.fichier_err = ''.join(l)
646          self.g_context={}
647          self.etapes=[]
648          self.jdc_aux=None
649          self.old_contexte_fichier_init=old_context
650          self.contexte_fichier_init={}
651          self.reevalueSdJdc()
652          return
653
654       # L'evaluation s'est bien passee
655       self.fichier_err = None
656       self.old_contexte_fichier_init=old_context
657       self.reevalueSdJdc()
658
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.
664       """
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
670
671       #print "updateFichierInit",self,self.parent,self.parent.recorded_units
672
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
677          return
678       elif unite == self.fichier_unite :
679          # L'unite n'a pas change
680          #print "updateFichierInit","pas de changement dans include 3"
681          return
682       elif unite != self.fichier_unite :
683          # L'unite etait definie precedemment. On remplace l'include 
684          #
685          f,text=self.getFileMemo(unite=unite,fic_origine=self.parent.nom)
686          if f is None:
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
691             return
692          else:
693             self.fichier_ini = f
694             self.fichier_text=text
695             self.fichier_unite=unite
696          #print "updateFichierInit",self.recorded_units
697
698       #print "updateFichierInit",self.fichier_ini,self.fichier_text,self.fichier_unite
699
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)
705          return
706
707       try:
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
712       except:
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)
719         self.g_context={}
720         self.etapes=[]
721         self.jdc_aux=None
722         self.contexte_fichier_init={}
723
724       if old_jdc_aux:
725          old_jdc_aux.close()
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
732       self.reevalueSdJdc()
733       #print "updateFichierInit",self.jdc_aux.context_ini.keys()
734
735   def recordUnite(self):
736       #print "recordUnite",self.nom
737       if self.nom == "POURSUITE":
738          self.parent.recordUnit(None,self)
739       else:
740          if hasattr(self,'fichier_unite') : 
741             self.parent.recordUnit(self.fichier_unite,self)
742
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
746       """
747       #print "getFileMemo",unite,fic_origine,self,self.parent
748       #print self.parent.recorded_units
749       if unite is None:
750          # On est dans le cas d'une poursuite. On ne reutilise aucune unite de parent
751          units={}
752       else:
753          # On est dans le cas d'un include. On reutilise toutes les unites de parent
754          units=self.parent.recorded_units
755
756       if unite in self.parent.recorded_units:
757          f,text,units=self.parent.recorded_units[unite]
758       elif self.jdc :
759          if fname:
760              if not osp.exists(fname):
761                 raise AsException(fname + tr(" n'est pas un fichier existant"))
762              f = fname
763              text = open(fname, 'r').read()
764          else:
765              f,text=self.jdc.getFile(unite=unite, fic_origine=fic_origine)
766       else:
767          f,text=None,None
768
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"))
773       return f,text
774
775   def updateContext(self,d):
776       """
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
780       """
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
791             # ou les parents. 
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:
796                 e.updateContext(d)
797             return
798
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:
803         d[co.nom]=co
804       #print "updateContext.fin",d.keys()
805
806 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
807   def copy(self):
808       etape=Noyau.N_MACRO_ETAPE.MACRO_ETAPE.copy(self)
809       if hasattr(etape,"etapes") :etape.etapes=[]
810       if hasattr(etape,"jdc_aux") : 
811          etape.jdc_aux=None
812          del etape.fichier_ini
813       return etape
814
815   def supprime(self):
816       #print "supprime",self
817       if hasattr(self,"jdc_aux") and self.jdc_aux:
818          self.jdc_aux.supprime_aux()
819          self.jdc_aux=None
820       Noyau.N_MACRO_ETAPE.MACRO_ETAPE.supprime(self)
821
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
825       """
826       if self.jdc :
827          f,text=self.jdc.getFile(unite=unite,fic_origine=fic_origine)
828       else:
829          f,text=None,None
830       return f,text
831
832
833   def makeInclude3(self,fichier=None):
834       self.makeIncludeCarmel(fichier)
835
836
837   def makeIncludeCND(self,fichier=None):
838       unite=999
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")
846       texteSources=""
847       texteCond=""
848       texteNoCond=""
849       texteVcut=""
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
857       #print (texte)
858       self.buildIncludeInclude(texte)
859       if CONTEXT.getCurrentStep()==None : CONTEXT.setCurrentStep(self)
860       reevalue=0
861
862   def makeIncludeCarmel(self,fichier=None):
863   # Pour Carmel
864       #print "je suis dans makeIncludeCarmel"
865       unite=999
866       if hasattr(self,'fichier_ini') : return
867       reevalue=0
868       if hasattr(self,'old_context_fichier_init' ):
869          reevalue=1
870          for concept in self.old_context_fichier_init.values():
871              self.jdc.deleteConcept(concept)
872       if fichier == None :
873          fichier=str(self.jdc.appliEficas.getFile_dictDonnees())
874          if fichier  == str("") : 
875            self.fichier_ini="badfile"
876            self.fichier_text=""
877            self.fichier_err=tr("Le fichier n est pas defini")
878            self.parent.recordUnit(999,self)
879            try :
880               MCFils=self.getChild('FileName')
881               MCFils.setValeur(None)
882            except :
883               pass
884            raise EficasException(self.fichier_err)
885       self.fichier_ini  = fichier
886       f=open(self.fichier_ini,'r')
887       self.fichier_text=f.read()
888       f.close()
889
890       self.contexte_fichier_init={}
891       self.fichier_unite=999
892       self.fichier_err=None
893
894       try:
895       #if 1 :
896          import Extensions.jdc_include
897          self.JdC_aux=Extensions.jdc_include.JdC_include
898       except:
899       #else:
900          traceback.print_exc()
901          self.makeIncl2Except()
902          raise EficasException(" ")
903
904       try:
905       #if 1 :
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)
909          try :
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
915             MCFils.val=fichier
916          except :
917             pass
918       except:
919       #else:
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)
924
925   def makeInclude2(self,fichier=None):
926   # Pour OT
927       # gestion de l unicite SVP
928       unite=999
929
930       if hasattr(self,'fichier_ini') : return
931       reevalue=0
932       if hasattr(self,'old_context_fichier_init' ):
933          reevalue=1
934          for concept in self.old_context_fichier_init.values():
935              self.jdc.deleteConcept(concept)
936
937       if fichier == None :
938          fichier=str(self.jdc.appliEficas.getFileVariable())
939          if fichier  == str("") : 
940            self.fichier_ini="badfile"
941            self.fichier_text=""
942            self.fichier_err=tr("Le fichier n est pas defini")
943            self.parent.recordUnit(999,self)
944            try :
945               MCFils=self.getChild('FileName')
946               MCFils.setValeur(None)
947            except :
948               pass
949            raise EficasException(self.fichier_err)
950
951       self.fichier_ini  = fichier
952       self.fichier_text = ""
953       self.contexte_fichier_init={}
954       self.fichier_unite=999
955       self.fichier_err=None
956       nbVariableOut=0
957       try :
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_
966              if type :
967                #ligneTexte="%s=DETERMINISTICVARIABLE(N='%s',T='out',R=%d);\n" % (nom, nom, i)
968                ligneTexte=""
969                nbVariableOut=nbVariableOut+1
970              else :
971                ligneTexte="%s=DETERMINISTICVARIABLE(N='%s',T='in',R=%d);\n" % (nom, nom, i)
972              self.fichier_text = self.fichier_text + ligneTexte
973       except:
974          self.makeIncl2Except()
975          raise EficasException(" ")
976
977       if nbVariableOut != 1 :
978          self.makeIncl2Except(mess=tr("le fichier doit contenir une unique variable de sortie"))
979          raise EficasException(" ")
980
981       try:
982          import Extensions.jdc_include
983          self.JdC_aux=Extensions.jdc_include.JdC_include
984       except:
985          traceback.print_exc()
986          self.makeIncl2Except()
987          raise EficasException(" ")
988       
989       try:
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)
993          try :
994             MCFils=self.getChild('FileName')
995             MCFils.setValeur(fichier)
996          except :
997             pass
998       except:
999          self.makeIncl2Except()
1000
1001       # recalcul validite pour la matrice eventuelle
1002       if reevalue :
1003          for e in self.jdc.etapes:
1004            if e.nom == "VARIABLE" :
1005               e.state="modified"
1006               try :
1007                  mc=e.getChild('ModelVariable') 
1008                  mc.state="modified"
1009               except :
1010                  pass
1011            if e.nom == "CORRELATION" :
1012               e.state="modified"
1013               try :
1014                  mc=e.getChild('Matrix') 
1015                  mc.state="modified"
1016                  mcFeuille=mc.getChild('CorrelationMatrix')
1017                  mcFeuille.state="modified"
1018               except :
1019                  pass
1020               e.isValid()
1021
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:
1025              if mess == 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",\
1028                                                                    ''.join(l)))
1029
1030              else :
1031                      self.jdc.editor.afficheAlerte(tr("Erreur lors de l'evaluation du fichier inclus"),
1032                                             message=tr(mess))
1033          #self.parent.recordUnit(unite,self)
1034          self.g_context={}
1035          self.etapes=[]
1036          self.jdc_aux=None
1037          self.fichier_err = ''.join(l)
1038          self.contexte_fichier_init={}
1039          try :
1040             MCFils=self.getChild('FileName')
1041             MCFils.setValeur(None)
1042          except :
1043             pass
1044
1045
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):
1049       """
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 ???)
1055       """
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:
1060       #    return
1061       # 2020 on supprime unite
1062       #      attention cependant c est utilise pour poursuite
1063       #      PNPN a revoir
1064       if not fname : return 
1065
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
1075          try:
1076            import Extensions.jdc_include
1077          except:
1078            traceback.print_exc()
1079            raise EficasException("pb import Extensions")
1080          self.JdC_aux=Extensions.jdc_include.JdC_include
1081
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)
1087
1088          try:
1089            self.makeContexteInclude(self.fichier_ini ,self.fichier_text)
1090            self.parent.recordUnit(unite,self)
1091          except:
1092            l=traceback.format_exception_only(tr("Fichier invalide %s",sys.exc_info()[1]))
1093            if self.jdc.editor:
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)
1097            self.g_context={}
1098            self.etapes=[]
1099            self.jdc_aux=None
1100            self.fichier_err = ''.join(l)
1101            self.contexte_fichier_init={}
1102            raise EficasException(" ")
1103
1104       else:
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)
1111         
1112
1113 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
1114   def makeContexte(self,fichier,text):
1115     """
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
1119     """
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
1133        try:
1134          import Extensions.jdc_include
1135          self.JdC_aux=Extensions.jdc_include.JdC_include
1136        except:
1137          raise EficasException(" ")
1138        try:
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
1144        except:
1145           l=traceback.format_exception_only(tr("Fichier invalide %s",sys.exc_info()[1]))
1146           self.fichier_err = ''.join(l)
1147           self.g_context={}
1148           #Pour permettre de lire un jeu de commandes avec des INCLUDE_MATERIAU errones
1149           if self.parent:
1150               self.parent.g_context[self.nom_mater]=None
1151           self.g_context[self.nom_mater]=None
1152           #-------------
1153           self.etapes=[]
1154           self.jdc_aux=None
1155           self.contexte_fichier_init={}
1156           raise EficasException(" ")
1157     else:
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)
1161
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()
1172      return valid
1173
1174 #ATTENTION SURCHARGE: cette methode surcharge celle de Noyau a garder en synchro 
1175   def buildSd(self,nom):
1176       """
1177            Methode de Noyau surchargee pour poursuivre malgre tout
1178            si une erreur se produit pendant la creation du concept produit
1179       """
1180       try:
1181          sd=Noyau.N_MACRO_ETAPE.MACRO_ETAPE.buildSd(self,nom)
1182       except :
1183       #   return None
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
1192          self.sd=None
1193          self.sdnom=None
1194          self.state="unchanged"
1195          self.valid=0
1196
1197       return self.sd
1198
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
1202       """
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
1212          try:
1213            import Extensions.jdc_include
1214          except:
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
1220
1221          if f is None:
1222              self.fichier_err="Le fichier POURSUITE n'est pas defini"
1223              self.jdc_aux=None
1224              self.parent.recordUnit(None,self)
1225              raise EficasException(self.fichier_err)
1226
1227          try:
1228            self.makeContexteInclude(self.fichier_ini,self.fichier_text)
1229            self.parent.recordUnit(None,self)
1230          except:
1231            l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
1232            if self.jdc.editor:
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)
1236            self.g_context={}
1237            self.etapes=[]
1238            self.jdc_aux=None
1239            self.fichier_err = ''.join(l)
1240            self.contexte_fichier_init={}
1241            raise EficasException(" ")
1242
1243       else:
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)