Salome HOME
PN : pour afficher correctement les arguments de la formule nouvelle.
[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.13 2004/09/10 15:51:49 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.fichier_ini = new_fic
200     self.node.item.object.fichier_text=text
201     self.node.item.object.fichier_err=None
202     # On enregistre la modification de fichier
203     self.node.item.object.record_unite()  
204     # Le contexte du parent doit etre reinitialise car les concepts produits ont changé
205     self.node.item.object.parent.reset_context()
206
207     # Si des concepts ont disparu lors du changement de fichier, on demande leur suppression
208     self.node.item.object.old_contexte_fichier_init=old_context
209     self.node.item.object.reevalue_sd_jdc()
210
211     self.node.item.object.fin_modif()
212     self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
213     self.node.update()
214
215   def annule_fichier_init(self,event=None):
216     """ Restaure dans self.entry le nom de fichier_init"""
217     self.entry.delete(0,Tkinter.END)
218     self.entry.insert(0,self.node.item.object.fichier_ini)
219
220   def browse_fichier_init(self,event=None):
221     """ 
222          Propose à l'utilisateur une Bsf et retourne le fichier 
223          sélectionné dans self.entry 
224     """
225     file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
226     if file :
227       self.entry.delete(0,Tkinter.END)
228       self.entry.insert(0,file)
229     
230     
231 class MACROTreeItem(compooper.EtapeTreeItem):
232   """ Cette classe hérite d'une grande partie des comportements
233       de la classe compooper.EtapeTreeItem
234   """
235   panel=MACROPanel
236
237 class INCLUDETreeItem(MACROTreeItem):
238   rmenu_specs=[("View","makeView")]
239
240   def makeView(self,appli):
241     nom=self.object.nom
242     if hasattr(self.object,'fichier_ini'):
243        if self.object.fichier_ini is None:
244           nom=nom+' '+"Fichier non défini"
245        else:
246           nom=nom+' '+self.object.fichier_ini
247     macrodisplay.makeMacroDisplay(appli,self.object,nom)
248
249 class INCLUDE_MATERIAUTreeItem(INCLUDETreeItem): pass
250 class POURSUITETreeItem(INCLUDETreeItem): pass
251
252 def treeitem(appli, labeltext, object, setfunction=None):
253    """ Factory qui retourne l'item adapté au type de macro : 
254        INCLUDE, POURSUITE, MACRO
255    """
256    if object.nom == "INCLUDE_MATERIAU":
257       return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
258    elif object.nom == "INCLUDE":
259       return INCLUDETreeItem(appli, labeltext, object, setfunction)
260    elif object.nom == "POURSUITE":
261       return POURSUITETreeItem(appli, labeltext, object, setfunction)
262    else:
263       return MACROTreeItem(appli, labeltext, object, setfunction)
264
265 import Accas
266 objet=Accas.MACRO_ETAPE
267     
268 import macrodisplay