Salome HOME
PN : correction de bug ???
[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.12 2004/03/11 09:59:00 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   panel=MACROPanel
233
234   def IsExpandable(self):
235       return 1
236
237   def GetIconName(self):
238       """
239       Retourne le nom de l'icône à afficher dans l'arbre
240       Ce nom dépend de la validité de l'objet
241       """
242       if not self.object.isactif():
243         return "ast-white-square"
244       else:
245         if self.object.isvalid():
246           return "ast-green-square"
247         else:
248           return "ast-red-square"
249
250   def GetLabelText(self):
251       """ Retourne 3 valeurs :
252       - le texte à afficher dans le noeud représentant l'item
253       - la fonte dans laquelle afficher ce texte
254       - la couleur du texte
255       """
256       if self.object.isactif():
257         # None --> fonte et couleur par défaut
258         return self.labeltext,None,None
259       else:
260         return self.labeltext,fontes.standard_italique,None
261       
262   def get_objet(self,name) :
263       for v in self.object.mc_liste:
264           if v.nom == name : return v
265       return None
266       
267   def additem(self,name,pos):
268       if isinstance(name,Objecttreeitem.ObjectTreeItem) :
269           mcent = self.object.addentite(name.object,pos)
270       else :
271           mcent = self.object.addentite(name,pos)
272       self.expandable=1
273       if mcent == 0 :
274           # on ne peut ajouter l'élément de nom name
275           return 0
276       def setfunction(value, object=mcent):
277           object.setval(value)
278       item = self.make_objecttreeitem(self.appli,mcent.nom + " : ", mcent, setfunction)
279       return item
280
281   def suppitem(self,item) :
282       # item : item du MOCLE de l'ETAPE à supprimer
283       # item.object = MCSIMP, MCFACT, MCBLOC ou MCList 
284       if item.object.isoblig() :
285           self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
286           print "Impossible de supprimer un mot-clé obligatoire"
287           return 0
288       else :
289           self.object.suppentite(item.object)
290           message = "Mot-clé " + item.object.nom + " supprimé"
291           self.appli.affiche_infos(message)
292           return 1
293
294   def GetText(self):
295       try:
296           return self.object.get_sdname()
297       except:
298           return ''
299
300   def keys(self):
301       keys=self.object.mc_dict.keys()
302       return keys
303
304   def GetSubList(self):
305       sublist=[]
306       for obj in self.object.mc_liste:
307         def setfunction(value, object=obj):
308           object.setval(value)
309         item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
310         sublist.append(item)
311       return sublist
312
313   def isvalid(self):
314       return self.object.isvalid()
315
316   def iscopiable(self):
317       """
318       Retourne 1 si l'objet est copiable, 0 sinon
319       """
320       return 1
321
322   def isCommande(self):
323       """
324       Retourne 1 si l'objet pointé par self est une Commande, 0 sinon
325       """
326       return 1
327       
328   def verif_condition_bloc(self):
329       return self.object.verif_condition_bloc()
330
331   def get_noms_sd_oper_reentrant(self):
332       return self.object.get_noms_sd_oper_reentrant()
333
334 class INCLUDETreeItem(MACROTreeItem):
335   rmenu_specs=[("View","makeView")]
336
337   def makeView(self,appli):
338     nom=self.object.nom
339     if hasattr(self.object,'fichier_ini'):
340        if self.object.fichier_ini is None:
341           nom=nom+' '+"Fichier non défini"
342        else:
343           nom=nom+' '+self.object.fichier_ini
344     macrodisplay.makeMacroDisplay(appli,self.object,nom)
345
346 class INCLUDE_MATERIAUTreeItem(INCLUDETreeItem): pass
347 class POURSUITETreeItem(INCLUDETreeItem): pass
348
349 treeitem=MACROTreeItem
350 def treeitem(appli, labeltext, object, setfunction=None):
351    if object.nom == "INCLUDE_MATERIAU":
352       return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
353    elif object.nom == "INCLUDE":
354       return INCLUDETreeItem(appli, labeltext, object, setfunction)
355    elif object.nom == "POURSUITE":
356       return POURSUITETreeItem(appli, labeltext, object, setfunction)
357    else:
358       return MACROTreeItem(appli, labeltext, object, setfunction)
359
360 import Accas
361 objet=Accas.MACRO_ETAPE
362     
363 import macrodisplay