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