Salome HOME
CCAR correction dans la prise en compte des fichiers poursuites multiples (emboites).
[tools/eficas.git] / Editeur / compomacro.py
1 # -*- coding: utf-8 -*-
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
9 #
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 #
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
18 #
19 #
20 # ======================================================================
21 # Modules Python
22 import os,sys,string
23 import types
24 import Tkinter
25 import Pmw
26 import traceback
27
28 # Modules Eficas
29 import Objecttreeitem
30 import panels
31 import fontes
32 import compooper
33 import convert
34 from widgets import askopenfilename
35 from widgets import Fenetre,FenetreYesNo
36 from widgets import showinfo,showerror
37
38 #
39 __version__="$Name:  $"
40 __Id__="$Id: compomacro.py,v 1.14 2004/09/20 09:24:14 eficas Exp $"
41 #
42
43 class MACROPanel(panels.OngletPanel):
44   def init(self):
45     nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
46     nb.pack(fill = 'both', expand = 1)
47     self.nb=nb
48     nb.add('Mocles', tab_text='Ajouter mots-clés')
49     typsd=self.node.item.object.get_type_produit()
50     ficini = self.node.item.wait_fichier_init()
51     if typsd != None:
52       nb.add('Concept', tab_text='Nommer concept')
53     if ficini == 1:
54       nb.add('Fichierinit',tab_text = 'Fichier %s' %self.node.item.get_nom())
55     nb.add('Commande', tab_text='Nouvelle Commande')
56     nb.add('Commentaire',tab_text='Paramètre/Commentaire')
57     panneau=Pmw.PanedWidget(nb.page("Mocles"),
58                             orient='horizontal')
59     panneau.add('left',min=0.4,max=0.6,size=0.5)
60     panneau.add('right',min=0.4,max=0.6,size=0.5)
61     panneau.pack(expand=1,fill='both')
62     self.makeCommandePage(nb.page("Commande"))
63     if typsd != None:
64       self.makeConceptPage(nb.page("Concept"))
65     if ficini == 1 :
66       self.makeFichierPage(nb.page('Fichierinit'))
67     self.makeMoclesPage(panneau.pane('left'))
68     self.makeReglesPage(panneau.pane('right'))
69     self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
70     nb.tab('Mocles').focus_set()
71     nb.setnaturalsize()
72     self.affiche()
73
74   def makeFichierPage(self,page):
75     """
76     Affiche la page d'onglet correspondant au changement du fichier
77     dont a besoin la macro
78     """
79     titre = Tkinter.Label(page,text="La commande %s requiert un fichier " %self.node.item.get_nom())
80     titre.place(relx=0.5,rely=0.3,anchor='center')
81     Tkinter.Label(page,text="Fichier :").place(relx=0.1,rely=0.5,relwidth=0.2)
82     self.entry = Tkinter.Entry(page,relief='sunken',bg='white')
83     self.entry.place(relx=0.35,rely=0.5,relwidth=0.55)
84     Tkinter.Button(page,text='Valider',command = self.change_fichier_init).place(relx=0.3,rely=0.8)
85     Tkinter.Button(page,text='Browse',command = self.browse_fichier_init).place(relx=0.5,rely=0.8)
86     Tkinter.Button(page,text='Annuler',command = self.annule_fichier_init).place(relx=0.7,rely=0.8)
87     if hasattr(self.node.item.object,'fichier_ini'):
88       if self.node.item.object.fichier_ini :
89         self.entry.insert(0,self.node.item.object.fichier_ini)
90     self.entry.focus()
91
92   def convert_file(self,file):
93      """
94          Methode pour convertir le fichier file dans le format courant
95      """
96      format=self.parent.appli.format_fichier.get()
97      if convert.plugins.has_key(format):
98          # Le convertisseur existe on l'utilise
99          p=convert.plugins[format]()
100          p.readfile(file)
101          text=p.convert('execnoparseur')
102          if not p.cr.estvide():
103             self.parent.appli.affiche_infos("Erreur à la conversion")
104             Fenetre(self,
105                     titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
106                     texte = str(p.cr))
107             return None
108          return text
109      else:
110          # Il n'existe pas c'est une erreur
111          self.parent.appli.affiche_infos("Type de fichier non reconnu")
112          showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
113          return None
114
115   def change_fichier_init(self,event=None):
116     """ 
117         Effectue le changement de fichier d'initialisation s'il est valide 
118     """
119     if not hasattr(self.node.item.object,'fichier_ini'):
120        self.node.item.object.fichier_ini=None
121        self.node.item.object.fichier_text=None
122        self.node.item.object.fichier_err="Le fichier n'est pas defini"
123        self.node.item.object.contexte_fichier_init={}
124        self.node.item.object.recorded_units={}
125        self.node.item.object.fichier_unite="PasDefini"
126        import Extensions.jdc_include
127        self.node.item.object.JdC_aux=Extensions.jdc_include.JdC_include
128
129     old_fic = self.node.item.object.fichier_ini
130     old_text = self.node.item.object.fichier_text
131     old_err = self.node.item.object.fichier_err
132     old_context=self.node.item.object.contexte_fichier_init
133     old_units=self.node.item.object.recorded_units
134     old_etapes=self.node.item.object.etapes
135
136     new_fic = self.entry.get()
137     if not os.path.isfile(new_fic) :
138       showinfo("Fichier introuvable","Le fichier que vous avez saisi\n"+
139                "n'est pas un nom de fichier valide !")
140       self.parent.appli.affiche_infos("Fichier introuvable")
141       return
142     # On convertit le fichier
143     text=self.convert_file(new_fic)
144     # Si probleme a la lecture-conversion on arrete le traitement
145     if not text:
146        return
147     self.node.item.object.recorded_units={}
148
149     try:
150       self.node.item.object.make_contexte_include(new_fic,text)
151     except:
152       # Erreurs lors de l'evaluation de text dans un JDC auxiliaire
153       self.parent.appli.affiche_infos("Fichier invalide")
154       l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
155       f=FenetreYesNo(self.parent.appli,titre="Fichier invalide : voulez vous retablir l ancien fichier ?",
156                              texte="Erreur dans l'interprétation du nouveau fichier ...\n\n"+string.join(l),
157                              yes="Retablir",no="Changer")
158       f.wait()
159       reponse=f.result
160       if reponse:
161          # On retablit l'ancien fichier
162          self.entry.delete(0,Tkinter.END)
163          self.node.item.object.fichier_ini=old_fic
164          self.node.item.object.fichier_text=old_text
165          self.node.item.object.fichier_err=old_err
166          self.node.item.object.contexte_fichier_init=old_context
167          self.node.item.object.recorded_units=old_units
168          self.node.item.object.etapes=old_etapes
169          self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré")
170          if old_fic:
171              self.entry.insert(0,self.node.item.object.fichier_ini)
172       else:
173          # On conserve la memoire du nouveau fichier
174          # mais on n'utilise pas les concepts crees par ce fichier
175          # on met l'etape en erreur : fichier_err=string.join(l)
176          self.node.item.object.init_modif()
177          self.node.item.object.fichier_ini=new_fic
178          self.node.item.object.fichier_text=text
179          self.node.item.object.fichier_err=string.join(l)
180          # On enregistre la modification de fichier
181          self.node.item.object.record_unite()  
182          #self.node.item.object.etapes=[]
183          self.node.item.object.g_context={}
184          # Le contexte du parent doit etre reinitialise car les concepts produits ont changé
185          self.node.item.object.parent.reset_context()
186
187          self.node.item.object.old_contexte_fichier_init=old_context
188          self.node.item.object.contexte_fichier_init={}
189          self.node.item.object.reevalue_sd_jdc()
190
191          self.node.item.object.fin_modif()
192          self.parent.appli.affiche_infos("Fichier invalide ... Nouveau fichier mémorisé")
193          self.node.update()
194       return
195
196     # L'evaluation de text dans un JDC auxiliaire s'est bien passé
197     # on peut poursuivre le traitement
198     self.node.item.object.init_modif() 
199     self.node.item.object.state="undetermined"
200     self.node.item.object.fichier_ini = new_fic
201     self.node.item.object.fichier_text=text
202     self.node.item.object.fichier_err=None
203     # On enregistre la modification de fichier
204     self.node.item.object.record_unite()  
205     # Le contexte du parent doit etre reinitialise car les concepts produits ont changé
206     self.node.item.object.parent.reset_context()
207
208     # Si des concepts ont disparu lors du changement de fichier, on demande leur suppression
209     self.node.item.object.old_contexte_fichier_init=old_context
210     self.node.item.object.reevalue_sd_jdc()
211
212     self.node.item.object.fin_modif()
213     self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
214     self.node.update()
215
216   def annule_fichier_init(self,event=None):
217     """ Restaure dans self.entry le nom de fichier_init"""
218     self.entry.delete(0,Tkinter.END)
219     self.entry.insert(0,self.node.item.object.fichier_ini)
220
221   def browse_fichier_init(self,event=None):
222     """ 
223          Propose à l'utilisateur une Bsf et retourne le fichier 
224          sélectionné dans self.entry 
225     """
226     file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
227     if file :
228       self.entry.delete(0,Tkinter.END)
229       self.entry.insert(0,file)
230     
231     
232 class MACROTreeItem(compooper.EtapeTreeItem):
233   """ Cette classe hérite d'une grande partie des comportements
234       de la classe compooper.EtapeTreeItem
235   """
236   panel=MACROPanel
237
238 class INCLUDETreeItem(MACROTreeItem):
239   rmenu_specs=[("View","makeView")]
240
241   def makeView(self,appli):
242     nom=self.object.nom
243     if hasattr(self.object,'fichier_ini'):
244        if self.object.fichier_ini is None:
245           nom=nom+' '+"Fichier non défini"
246        else:
247           nom=nom+' '+self.object.fichier_ini
248     macrodisplay.makeMacroDisplay(appli,self.object,nom)
249
250 class INCLUDE_MATERIAUTreeItem(INCLUDETreeItem): pass
251 class POURSUITETreeItem(INCLUDETreeItem): pass
252
253 def treeitem(appli, labeltext, object, setfunction=None):
254    """ Factory qui retourne l'item adapté au type de macro : 
255        INCLUDE, POURSUITE, MACRO
256    """
257    if object.nom == "INCLUDE_MATERIAU":
258       return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
259    elif object.nom == "INCLUDE":
260       return INCLUDETreeItem(appli, labeltext, object, setfunction)
261    elif object.nom == "POURSUITE":
262       return POURSUITETreeItem(appli, labeltext, object, setfunction)
263    else:
264       return MACROTreeItem(appli, labeltext, object, setfunction)
265
266 import Accas
267 objet=Accas.MACRO_ETAPE
268     
269 import macrodisplay