]> SALOME platform Git repositories - tools/eficas.git/blob - Editeur/compomacro.py
Salome HOME
CCAR: creation V1_13a1 a partir de la branche Liv-V1_12
[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.25.10.1 2006/11/15 17:59:30 cchris 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.enlevebind()
73     self.creebind()
74     self.affiche()
75
76   def makeFichierPage(self,page):
77     """
78     Affiche la page d'onglet correspondant au changement du fichier
79     dont a besoin la macro
80     """
81     titre = Tkinter.Label(page,text="La commande %s requiert un fichier " %self.node.item.get_nom())
82     titre.place(relx=0.5,rely=0.2,anchor='center')
83     frameMain=Tkinter.Frame(page)
84     frameMain.place(relx=0.5,rely=0.4,anchor='center',relwidth=1.)
85     Tkinter.Label(frameMain,text="Fichier :").pack(side='left',padx=5)
86     self.entry = Tkinter.Entry(frameMain,relief='sunken',bg='white')
87     self.entry.pack(side='left',padx=5,fill='x',expand=1)
88     frameButtons=Tkinter.Frame(page)
89     but1=Tkinter.Button(frameButtons,text='Valider',command = self.change_fichier_init)
90     but2=Tkinter.Button(frameButtons,text='Browse',command = self.browse_fichier_init)
91     but3=Tkinter.Button(frameButtons,text='Annuler',command = self.annule_fichier_init)
92     but1.grid(row=0,column=0,padx=5,pady=5)
93     but2.grid(row=0,column=1,padx=5,pady=5)
94     but3.grid(row=0,column=2,padx=5,pady=5)
95     frameButtons.place(relx=0.5,rely=0.6,anchor='center')
96
97     if hasattr(self.node.item.object,'fichier_ini'):
98       if self.node.item.object.fichier_ini :
99         self.entry.insert(0,self.node.item.object.fichier_ini)
100     self.entry.focus()
101
102   def convert_file(self,file):
103      """
104          Methode pour convertir le fichier file dans le format courant
105      """
106      format=self.parent.appli.format_fichier.get()
107      if convert.plugins.has_key(format):
108          # Le convertisseur existe on l'utilise
109          p=convert.plugins[format]()
110          p.readfile(file)
111          text=p.convert('execnoparseur')
112          if not p.cr.estvide():
113             self.parent.appli.affiche_infos("Erreur à la conversion")
114             Fenetre(self,
115                     titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
116                     texte = str(p.cr))
117             return None
118          return text
119      else:
120          # Il n'existe pas c'est une erreur
121          self.parent.appli.affiche_infos("Type de fichier non reconnu")
122          showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
123          return None
124
125   def change_fichier_init(self,event=None):
126     """ 
127         Effectue le changement de fichier d'initialisation s'il est valide 
128     """
129     new_fic = self.entry.get()
130     if not os.path.isfile(new_fic) :
131       showinfo("Fichier introuvable","Le fichier que vous avez saisi\n"+
132                "n'est pas un nom de fichier valide !")
133       self.parent.appli.affiche_infos("Fichier introuvable")
134       return
135     # On convertit le fichier
136     text=self.convert_file(new_fic)
137     # Si probleme a la lecture-conversion on arrete le traitement
138     if not text:
139        return
140
141     try:
142       self.node.item.object.change_fichier_init(new_fic,text)
143       self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
144     except:
145       # Erreurs lors de l'evaluation de text dans un JDC auxiliaire
146       self.parent.appli.affiche_infos("Fichier invalide")
147       l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
148       f=FenetreYesNo(self.parent.appli,titre="Fichier invalide : voulez vous retablir l ancien fichier ?",
149                              texte="Erreur dans l'interprétation du nouveau fichier ...\n\n"+string.join(l),
150                              yes="Retablir",no="Changer")
151       f.wait()
152       reponse=f.result
153       if reponse:
154          # On retablit l'ancien fichier
155          self.entry.delete(0,Tkinter.END)
156          self.node.item.object.restore_fichier_init()
157          self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré")
158          fic=self.node.item.object.fichier_ini
159          if fic:
160              self.entry.insert(0,fic)
161       else:
162          self.node.item.object.force_fichier_init()
163          self.parent.appli.affiche_infos("Fichier invalide ... Nouveau fichier mémorisé")
164
165   def annule_fichier_init(self,event=None):
166     """ Restaure dans self.entry le nom de fichier_init"""
167     self.entry.delete(0,Tkinter.END)
168     if self.node.item.object.fichier_ini:
169        self.entry.insert(0,self.node.item.object.fichier_ini)
170
171   def browse_fichier_init(self,event=None):
172     """ 
173          Propose à l'utilisateur une Bsf et retourne le fichier 
174          sélectionné dans self.entry 
175     """
176     file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
177     if file :
178       self.entry.delete(0,Tkinter.END)
179       self.entry.insert(0,file)
180     
181   def update_panel(self):
182     if hasattr(self,"entry"):
183        self.annule_fichier_init()
184     
185 class MACROTreeItem(compooper.EtapeTreeItem):
186   """ Cette classe hérite d'une grande partie des comportements
187       de la classe compooper.EtapeTreeItem
188   """
189   panel=MACROPanel
190
191 class INCLUDETreeItemBase(MACROTreeItem):
192   rmenu_specs=[("View","makeView"),
193                ("Edit","makeEdit"),
194               ]
195
196   def __init__(self,appli, labeltext, object, setfunction):
197     MACROTreeItem.__init__(self,appli, labeltext, object, setfunction)
198
199   def iscopiable(self):
200       """
201       Retourne 1 si l'objet est copiable, 0 sinon
202       """
203       return 0
204
205   def makeEdit(self,appli,node):
206     #print "makeEdit",self.object,self.object.nom
207     #print "makeEdit",self.object.jdc_aux,self.object.jdc_aux.nom
208     #print "makeEdit",self.object.jdc_aux.context_ini
209     if self.object.text_converted == 0:
210         # Le texte du fichier inclus n'a pas pu etre converti par le module convert
211         msg="Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n"
212         msg=msg+self.object.text_error
213         Fenetre(self,titre="Include non editable",texte=msg,wrap='none')
214         return
215
216     if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
217        #L'include n'est pas initialise
218        self.object.build_include(None,"")
219
220     # On cree un nouvel onglet dans le bureau
221     appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
222                              label_onglet=None,
223                              JDCDISPLAY=macrodisplay.MACRODISPLAY)
224
225   def makeView(self,appli,node):
226     if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
227          showerror("Include vide",
228                  "L'include doit etre correctement initialisé pour etre visualisé")
229          return
230
231     nom=self.object.nom
232     if hasattr(self.object,'fichier_ini'):
233        if self.object.fichier_ini is None:
234           nom=nom+' '+"Fichier non défini"
235        else:
236           nom=nom+' '+self.object.fichier_ini
237     macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
238
239 class INCLUDEPanel(MACROPanel):
240   def makeFichierPage(self,page):
241     """
242     Affiche la page d'onglet correspondant au changement du fichier INCLUDE
243     """
244     if not hasattr(self.node.item.object,'fichier_ini'):
245        titre = Tkinter.Label(page,text="L'INCLUDE n'a pas de fichier associé\nIl faut d'abord choisir un numero d'unité " )
246        titre.place(relx=0.5,rely=0.5,anchor='center')
247     else:
248        MACROPanel.makeFichierPage(self,page)
249
250 class INCLUDETreeItem(INCLUDETreeItemBase):
251    panel=INCLUDEPanel
252
253 class POURSUITETreeItem(INCLUDETreeItemBase): 
254   def makeEdit(self,appli,node):
255     if self.object.text_converted == 0:
256         # Le texte du fichier inclus n'a pas pu etre converti par le module convert
257         msg="Le fichier de commande n'a pas pu etre converti pour etre editable par Eficas\n\n"
258         msg=msg+self.object.text_error
259         Fenetre(self,titre="Poursuite non editable",texte=msg,wrap='none')
260         return
261
262     if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
263        #La poursuite n'est pas initialisee
264        text="""DEBUT()
265 FIN()"""
266        self.object.build_poursuite(None,text)
267
268     # On cree un nouvel onglet dans le bureau
269     appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
270                              label_onglet=None,
271                              JDCDISPLAY=macrodisplay.MACRODISPLAY)
272
273   def makeView(self,appli,node):
274     if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
275          showerror("Poursuite vide","Une POURSUITE doit etre correctement initialisée pour etre visualisée")
276          return
277     nom=self.object.nom
278     if hasattr(self.object,'fichier_ini'):
279        if self.object.fichier_ini is None:
280           nom=nom+' '+"Fichier non défini"
281        else:
282           nom=nom+' '+self.object.fichier_ini
283     macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
284
285 class INCLUDE_MATERIAUTreeItem(INCLUDETreeItemBase):
286   rmenu_specs=[("View","makeView"),
287               ]
288   def iscopiable(self):
289       """
290       Retourne 1 si l'objet est copiable, 0 sinon
291       """
292       return 1
293
294
295 def treeitem(appli, labeltext, object, setfunction=None):
296    """ Factory qui retourne l'item adapté au type de macro : 
297        INCLUDE, POURSUITE, MACRO
298    """
299    if object.nom == "INCLUDE_MATERIAU":
300       return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
301    elif object.nom == "INCLUDE":
302       return INCLUDETreeItem(appli, labeltext, object, setfunction)
303    elif object.nom == "POURSUITE":
304       return POURSUITETreeItem(appli, labeltext, object, setfunction)
305    else:
306       return MACROTreeItem(appli, labeltext, object, setfunction)
307
308 import Accas
309 objet=Accas.MACRO_ETAPE
310     
311 import macrodisplay