]> SALOME platform Git repositories - tools/eficas.git/blob - Editeur/compomacro.py
Salome HOME
PN gestion des touches fontion F1 à F4
[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.24 2005/11/03 09:03:48 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.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 not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
210        #L'include n'est pas initialise
211        self.object.build_include(None,"")
212     # On cree un nouvel onglet dans le bureau
213     appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
214                              label_onglet=None,
215                              JDCDISPLAY=macrodisplay.MACRODISPLAY)
216
217   def makeView(self,appli,node):
218     if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
219          showerror("Include vide","L'include doit etre correctement initialisé pour etre visualisé")
220          return
221     nom=self.object.nom
222     if hasattr(self.object,'fichier_ini'):
223        if self.object.fichier_ini is None:
224           nom=nom+' '+"Fichier non défini"
225        else:
226           nom=nom+' '+self.object.fichier_ini
227     macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
228
229 class INCLUDEPanel(MACROPanel):
230   def makeFichierPage(self,page):
231     """
232     Affiche la page d'onglet correspondant au changement du fichier INCLUDE
233     """
234     if not hasattr(self.node.item.object,'fichier_ini'):
235        titre = Tkinter.Label(page,text="L'INCLUDE n'a pas de fichier associé\nIl faut d'abord choisir un numero d'unité " )
236        titre.place(relx=0.5,rely=0.5,anchor='center')
237     else:
238        MACROPanel.makeFichierPage(self,page)
239
240 class INCLUDETreeItem(INCLUDETreeItemBase):
241    panel=INCLUDEPanel
242
243 class POURSUITETreeItem(INCLUDETreeItemBase): 
244   def makeEdit(self,appli,node):
245     if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
246        #La poursuite n'est pas initialisee
247        text="""DEBUT()
248 FIN()"""
249        self.object.build_poursuite(None,text)
250     # On cree un nouvel onglet dans le bureau
251     appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
252                              label_onglet=None,
253                              JDCDISPLAY=macrodisplay.MACRODISPLAY)
254
255   def makeView(self,appli,node):
256     if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
257          showerror("Poursuite vide","Une POURSUITE doit etre correctement initialisée pour etre visualisée")
258          return
259     nom=self.object.nom
260     if hasattr(self.object,'fichier_ini'):
261        if self.object.fichier_ini is None:
262           nom=nom+' '+"Fichier non défini"
263        else:
264           nom=nom+' '+self.object.fichier_ini
265     macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
266
267 class INCLUDE_MATERIAUTreeItem(INCLUDETreeItemBase):
268   rmenu_specs=[("View","makeView"),
269               ]
270   def iscopiable(self):
271       """
272       Retourne 1 si l'objet est copiable, 0 sinon
273       """
274       return 1
275
276
277 def treeitem(appli, labeltext, object, setfunction=None):
278    """ Factory qui retourne l'item adapté au type de macro : 
279        INCLUDE, POURSUITE, MACRO
280    """
281    if object.nom == "INCLUDE_MATERIAU":
282       return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
283    elif object.nom == "INCLUDE":
284       return INCLUDETreeItem(appli, labeltext, object, setfunction)
285    elif object.nom == "POURSUITE":
286       return POURSUITETreeItem(appli, labeltext, object, setfunction)
287    else:
288       return MACROTreeItem(appli, labeltext, object, setfunction)
289
290 import Accas
291 objet=Accas.MACRO_ETAPE
292     
293 import macrodisplay