Salome HOME
PN : print enleve
[tools/eficas.git] / Editeur / compomacro.py
1 #            CONFIGURATION MANAGEMENT OF EDF VERSION
2 # ======================================================================
3 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
4 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
5 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
6 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
7 # (AT YOUR OPTION) ANY LATER VERSION.
8 #
9 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
10 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
11 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
12 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
13 #
14 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
15 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
16 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
17 #
18 #
19 # ======================================================================
20 # Modules Python
21 import os,sys,string
22 import types
23 import Tkinter
24 import Pmw
25 import traceback
26
27 # Modules Eficas
28 import Objecttreeitem
29 import panels
30 import fontes
31 import compooper
32 import convert
33 from widgets import askopenfilename
34 from widgets import Fenetre,FenetreYesNo
35 from widgets import showinfo,showerror
36
37 #
38 __version__="$Name:  $"
39 __Id__="$Id: compomacro.py,v 1.11.2.1 2004/03/01 11:14:09 eficas Exp $"
40 #
41
42 class MACROPanel(panels.OngletPanel):
43   def init(self):
44     nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
45     nb.pack(fill = 'both', expand = 1)
46     self.nb=nb
47     nb.add('Mocles', tab_text='Ajouter mots-clés')
48     typsd=self.node.item.object.get_type_produit()
49     ficini = self.node.item.wait_fichier_init()
50     if typsd != None:
51       nb.add('Concept', tab_text='Nommer concept')
52     if ficini == 1:
53       nb.add('Fichierinit',tab_text = 'Fichier %s' %self.node.item.get_nom())
54     nb.add('Commande', tab_text='Nouvelle Commande')
55     nb.add('Commentaire',tab_text='Paramètre/Commentaire')
56     panneau=Pmw.PanedWidget(nb.page("Mocles"),
57                             orient='horizontal')
58     panneau.add('left',min=0.4,max=0.6,size=0.5)
59     panneau.add('right',min=0.4,max=0.6,size=0.5)
60     panneau.pack(expand=1,fill='both')
61     self.makeCommandePage(nb.page("Commande"))
62     if typsd != None:
63       self.makeConceptPage(nb.page("Concept"))
64     if ficini == 1 :
65       self.makeFichierPage(nb.page('Fichierinit'))
66     self.makeMoclesPage(panneau.pane('left'))
67     self.makeReglesPage(panneau.pane('right'))
68     self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
69     nb.tab('Mocles').focus_set()
70     nb.setnaturalsize()
71     self.affiche()
72
73   def makeFichierPage(self,page):
74     """
75     Affiche la page d'onglet correspondant au changement du fichier
76     dont a besoin la macro
77     """
78     titre = Tkinter.Label(page,text="La commande %s requiert un fichier " %self.node.item.get_nom())
79     titre.place(relx=0.5,rely=0.3,anchor='center')
80     Tkinter.Label(page,text="Fichier :").place(relx=0.1,rely=0.5,relwidth=0.2)
81     self.entry = Tkinter.Entry(page,relief='sunken',bg='white')
82     self.entry.place(relx=0.35,rely=0.5,relwidth=0.55)
83     Tkinter.Button(page,text='Valider',command = self.change_fichier_init).place(relx=0.3,rely=0.8)
84     Tkinter.Button(page,text='Browse',command = self.browse_fichier_init).place(relx=0.5,rely=0.8)
85     Tkinter.Button(page,text='Annuler',command = self.annule_fichier_init).place(relx=0.7,rely=0.8)
86     if hasattr(self.node.item.object,'fichier_ini'):
87       if self.node.item.object.fichier_ini :
88         self.entry.insert(0,self.node.item.object.fichier_ini)
89     self.entry.focus()
90
91   def convert_file(self,file):
92      """
93          Methode pour convertir le fichier file dans le format courant
94      """
95      format=self.parent.appli.format_fichier.get()
96      if convert.plugins.has_key(format):
97          # Le convertisseur existe on l'utilise
98          p=convert.plugins[format]()
99          p.readfile(file)
100          text=p.convert('execnoparseur')
101          if not p.cr.estvide():
102             self.parent.appli.affiche_infos("Erreur à la conversion")
103             Fenetre(self,
104                     titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
105                     texte = str(p.cr))
106             return None
107          return text
108      else:
109          # Il n'existe pas c'est une erreur
110          self.parent.appli.affiche_infos("Type de fichier non reconnu")
111          showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
112          return None
113
114   def change_fichier_init(self,event=None):
115     """ 
116         Effectue le changement de fichier d'initialisation s'il est valide 
117     """
118     if not hasattr(self.node.item.object,'fichier_ini'):
119        self.node.item.object.fichier_ini=None
120        self.node.item.object.fichier_text=None
121        self.node.item.object.fichier_err="Le fichier n'est pas defini"
122        self.node.item.object.contexte_fichier_init={}
123        self.node.item.object.recorded_units={}
124        self.node.item.object.fichier_unite="PasDefini"
125        import Extensions.jdc_include
126        self.node.item.object.JdC_aux=Extensions.jdc_include.JdC_include
127
128     old_fic = self.node.item.object.fichier_ini
129     old_text = self.node.item.object.fichier_text
130     old_err = self.node.item.object.fichier_err
131     old_context=self.node.item.object.contexte_fichier_init
132     old_units=self.node.item.object.recorded_units
133     old_etapes=self.node.item.object.etapes
134
135     new_fic = self.entry.get()
136     if not os.path.isfile(new_fic) :
137       showinfo("Fichier introuvable","Le fichier que vous avez saisi\n"+
138                "n'est pas un nom de fichier valide !")
139       self.parent.appli.affiche_infos("Fichier introuvable")
140       return
141     # On convertit le fichier
142     text=self.convert_file(new_fic)
143     # Si probleme a la lecture-conversion on arrete le traitement
144     if not text:
145        return
146     self.node.item.object.recorded_units={}
147
148     try:
149       self.node.item.object.make_contexte_include(new_fic,text)
150     except:
151       # Erreurs lors de l'evaluation de text dans un JDC auxiliaire
152       self.parent.appli.affiche_infos("Fichier invalide")
153       l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
154       f=FenetreYesNo(self.parent.appli,titre="Fichier invalide : voulez vous retablir l ancien fichier ?",
155                              texte="Erreur dans l'interprétation du nouveau fichier ...\n\n"+string.join(l),
156                              yes="Retablir",no="Changer")
157       f.wait()
158       reponse=f.result
159       if reponse:
160          # On retablit l'ancien fichier
161          self.entry.delete(0,Tkinter.END)
162          self.node.item.object.fichier_ini=old_fic
163          self.node.item.object.fichier_text=old_text
164          self.node.item.object.fichier_err=old_err
165          self.node.item.object.contexte_fichier_init=old_context
166          self.node.item.object.recorded_units=old_units
167          self.node.item.object.etapes=old_etapes
168          self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré")
169          if old_fic:
170              self.entry.insert(0,self.node.item.object.fichier_ini)
171       else:
172          # On conserve la memoire du nouveau fichier
173          # mais on n'utilise pas les concepts crees par ce fichier
174          # on met l'etape en erreur : fichier_err=string.join(l)
175          self.node.item.object.init_modif()
176          self.node.item.object.fichier_ini=new_fic
177          self.node.item.object.fichier_text=text
178          self.node.item.object.fichier_err=string.join(l)
179          # On enregistre la modification de fichier
180          self.node.item.object.record_unite()  
181          #self.node.item.object.etapes=[]
182          self.node.item.object.g_context={}
183          # Le contexte du parent doit etre reinitialise car les concepts produits ont changé
184          self.node.item.object.parent.reset_context()
185
186          self.node.item.object.old_contexte_fichier_init=old_context
187          self.node.item.object.contexte_fichier_init={}
188          self.node.item.object.reevalue_sd_jdc()
189
190          self.node.item.object.fin_modif()
191          self.parent.appli.affiche_infos("Fichier invalide ... Nouveau fichier mémorisé")
192          self.node.update()
193       return
194
195     # L'evaluation de text dans un JDC auxiliaire s'est bien passé
196     # on peut poursuivre le traitement
197     self.node.item.object.init_modif() 
198     self.node.item.object.fichier_ini = new_fic
199     self.node.item.object.fichier_text=text
200     self.node.item.object.fichier_err=None
201     # On enregistre la modification de fichier
202     self.node.item.object.record_unite()  
203     # Le contexte du parent doit etre reinitialise car les concepts produits ont changé
204     self.node.item.object.parent.reset_context()
205
206     # Si des concepts ont disparu lors du changement de fichier, on demande leur suppression
207     self.node.item.object.old_contexte_fichier_init=old_context
208     self.node.item.object.reevalue_sd_jdc()
209
210     self.node.item.object.fin_modif()
211     self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
212     self.node.update()
213
214   def annule_fichier_init(self,event=None):
215     """ Restaure dans self.entry le nom de fichier_init"""
216     self.entry.delete(0,Tkinter.END)
217     self.entry.insert(0,self.node.item.object.fichier_ini)
218
219   def browse_fichier_init(self,event=None):
220     """ 
221          Propose à l'utilisateur une Bsf et retourne le fichier 
222          sélectionné dans self.entry 
223     """
224     file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
225     if file :
226       self.entry.delete(0,Tkinter.END)
227       self.entry.insert(0,file)
228     
229     
230 class MACROTreeItem(compooper.EtapeTreeItem):
231   panel=MACROPanel
232
233   def IsExpandable(self):
234       return 1
235
236   def GetIconName(self):
237       """
238       Retourne le nom de l'icône à afficher dans l'arbre
239       Ce nom dépend de la validité de l'objet
240       """
241       if not self.object.isactif():
242         return "ast-white-square"
243       else:
244         if self.object.isvalid():
245           return "ast-green-square"
246         else:
247           return "ast-red-square"
248
249   def GetLabelText(self):
250       """ Retourne 3 valeurs :
251       - le texte à afficher dans le noeud représentant l'item
252       - la fonte dans laquelle afficher ce texte
253       - la couleur du texte
254       """
255       if self.object.isactif():
256         # None --> fonte et couleur par défaut
257         return self.labeltext,None,None
258       else:
259         return self.labeltext,fontes.standard_italique,None
260       
261   def get_objet(self,name) :
262       for v in self.object.mc_liste:
263           if v.nom == name : return v
264       return None
265       
266   def additem(self,name,pos):
267       if isinstance(name,Objecttreeitem.ObjectTreeItem) :
268           mcent = self.object.addentite(name.object,pos)
269       else :
270           mcent = self.object.addentite(name,pos)
271       self.expandable=1
272       if mcent == 0 :
273           # on ne peut ajouter l'élément de nom name
274           return 0
275       def setfunction(value, object=mcent):
276           object.setval(value)
277       item = self.make_objecttreeitem(self.appli,mcent.nom + " : ", mcent, setfunction)
278       return item
279
280   def suppitem(self,item) :
281       # item : item du MOCLE de l'ETAPE à supprimer
282       # item.object = MCSIMP, MCFACT, MCBLOC ou MCList 
283       if item.object.isoblig() :
284           self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
285           print "Impossible de supprimer un mot-clé obligatoire"
286           return 0
287       else :
288           self.object.suppentite(item.object)
289           message = "Mot-clé " + item.object.nom + " supprimé"
290           self.appli.affiche_infos(message)
291           return 1
292
293   def GetText(self):
294       try:
295           return self.object.get_sdname()
296       except:
297           return ''
298
299   def keys(self):
300       keys=self.object.mc_dict.keys()
301       return keys
302
303   def GetSubList(self):
304       sublist=[]
305       for obj in self.object.mc_liste:
306         def setfunction(value, object=obj):
307           object.setval(value)
308         item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
309         sublist.append(item)
310       return sublist
311
312   def isvalid(self):
313       return self.object.isvalid()
314
315   def iscopiable(self):
316       """
317       Retourne 1 si l'objet est copiable, 0 sinon
318       """
319       return 1
320
321   def isCommande(self):
322       """
323       Retourne 1 si l'objet pointé par self est une Commande, 0 sinon
324       """
325       return 1
326       
327   def verif_condition_bloc(self):
328       return self.object.verif_condition_bloc()
329
330   def get_noms_sd_oper_reentrant(self):
331       return self.object.get_noms_sd_oper_reentrant()
332
333 class INCLUDETreeItem(MACROTreeItem):
334   rmenu_specs=[("View","makeView")]
335
336   def makeView(self,appli):
337     nom=self.object.nom
338     if hasattr(self.object,'fichier_ini'):
339        if self.object.fichier_ini is None:
340           nom=nom+' '+"Fichier non défini"
341        else:
342           nom=nom+' '+self.object.fichier_ini
343     macrodisplay.makeMacroDisplay(appli,self.object,nom)
344
345 class INCLUDE_MATERIAUTreeItem(INCLUDETreeItem): pass
346 class POURSUITETreeItem(INCLUDETreeItem): pass
347
348 treeitem=MACROTreeItem
349 def treeitem(appli, labeltext, object, setfunction=None):
350    if object.nom == "INCLUDE_MATERIAU":
351       return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
352    elif object.nom == "INCLUDE":
353       return INCLUDETreeItem(appli, labeltext, object, setfunction)
354    elif object.nom == "POURSUITE":
355       return POURSUITETreeItem(appli, labeltext, object, setfunction)
356    else:
357       return MACROTreeItem(appli, labeltext, object, setfunction)
358
359 import Accas
360 objet=Accas.MACRO_ETAPE
361     
362 import macrodisplay