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.
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.
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.
20 # ======================================================================
34 from widgets import askopenfilename
35 from widgets import Fenetre,FenetreYesNo
36 from widgets import showinfo,showerror
37 from Ihm import CONNECTOR
40 __version__="$Name: $"
41 __Id__="$Id: compomacro.py,v 1.22 2005/06/10 13:47:49 eficas Exp $"
44 class MACROPanel(panels.OngletPanel):
46 nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
47 nb.pack(fill = 'both', expand = 1)
49 nb.add('Mocles', tab_text='Ajouter mots-clés')
50 typsd=self.node.item.object.get_type_produit()
51 ficini = self.node.item.wait_fichier_init()
53 nb.add('Concept', tab_text='Nommer concept')
55 nb.add('Fichierinit',tab_text = 'Fichier %s' %self.node.item.get_nom())
56 nb.add('Commande', tab_text='Nouvelle Commande')
57 nb.add('Commentaire',tab_text='Paramètre/Commentaire')
58 panneau=Pmw.PanedWidget(nb.page("Mocles"),
60 panneau.add('left',min=0.4,max=0.6,size=0.5)
61 panneau.add('right',min=0.4,max=0.6,size=0.5)
62 panneau.pack(expand=1,fill='both')
63 self.makeCommandePage(nb.page("Commande"))
65 self.makeConceptPage(nb.page("Concept"))
67 self.makeFichierPage(nb.page('Fichierinit'))
68 self.makeMoclesPage(panneau.pane('left'))
69 self.makeReglesPage(panneau.pane('right'))
70 self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
71 nb.tab('Mocles').focus_set()
75 def makeFichierPage(self,page):
77 Affiche la page d'onglet correspondant au changement du fichier
78 dont a besoin la macro
80 titre = Tkinter.Label(page,text="La commande %s requiert un fichier " %self.node.item.get_nom())
81 titre.place(relx=0.5,rely=0.2,anchor='center')
82 frameMain=Tkinter.Frame(page)
83 frameMain.place(relx=0.5,rely=0.4,anchor='center',relwidth=1.)
84 Tkinter.Label(frameMain,text="Fichier :").pack(side='left',padx=5)
85 self.entry = Tkinter.Entry(frameMain,relief='sunken',bg='white')
86 self.entry.pack(side='left',padx=5,fill='x',expand=1)
87 frameButtons=Tkinter.Frame(page)
88 but1=Tkinter.Button(frameButtons,text='Valider',command = self.change_fichier_init)
89 but2=Tkinter.Button(frameButtons,text='Browse',command = self.browse_fichier_init)
90 but3=Tkinter.Button(frameButtons,text='Annuler',command = self.annule_fichier_init)
91 but1.grid(row=0,column=0,padx=5,pady=5)
92 but2.grid(row=0,column=1,padx=5,pady=5)
93 but3.grid(row=0,column=2,padx=5,pady=5)
94 frameButtons.place(relx=0.5,rely=0.6,anchor='center')
96 if hasattr(self.node.item.object,'fichier_ini'):
97 if self.node.item.object.fichier_ini :
98 self.entry.insert(0,self.node.item.object.fichier_ini)
101 def convert_file(self,file):
103 Methode pour convertir le fichier file dans le format courant
105 format=self.parent.appli.format_fichier.get()
106 if convert.plugins.has_key(format):
107 # Le convertisseur existe on l'utilise
108 p=convert.plugins[format]()
110 text=p.convert('execnoparseur')
111 if not p.cr.estvide():
112 self.parent.appli.affiche_infos("Erreur à la conversion")
114 titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
119 # Il n'existe pas c'est une erreur
120 self.parent.appli.affiche_infos("Type de fichier non reconnu")
121 showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
124 def change_fichier_init(self,event=None):
126 Effectue le changement de fichier d'initialisation s'il est valide
128 new_fic = self.entry.get()
129 if not os.path.isfile(new_fic) :
130 showinfo("Fichier introuvable","Le fichier que vous avez saisi\n"+
131 "n'est pas un nom de fichier valide !")
132 self.parent.appli.affiche_infos("Fichier introuvable")
134 # On convertit le fichier
135 text=self.convert_file(new_fic)
136 # Si probleme a la lecture-conversion on arrete le traitement
141 self.node.item.object.change_fichier_init(new_fic,text)
142 self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
144 # Erreurs lors de l'evaluation de text dans un JDC auxiliaire
145 self.parent.appli.affiche_infos("Fichier invalide")
146 l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
147 f=FenetreYesNo(self.parent.appli,titre="Fichier invalide : voulez vous retablir l ancien fichier ?",
148 texte="Erreur dans l'interprétation du nouveau fichier ...\n\n"+string.join(l),
149 yes="Retablir",no="Changer")
153 # On retablit l'ancien fichier
154 self.entry.delete(0,Tkinter.END)
155 self.node.item.object.restore_fichier_init()
156 self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré")
157 fic=self.node.item.object.fichier_ini
159 self.entry.insert(0,fic)
161 self.node.item.object.force_fichier_init()
162 self.parent.appli.affiche_infos("Fichier invalide ... Nouveau fichier mémorisé")
164 def annule_fichier_init(self,event=None):
165 """ Restaure dans self.entry le nom de fichier_init"""
166 self.entry.delete(0,Tkinter.END)
167 if self.node.item.object.fichier_ini:
168 self.entry.insert(0,self.node.item.object.fichier_ini)
170 def browse_fichier_init(self,event=None):
172 Propose à l'utilisateur une Bsf et retourne le fichier
173 sélectionné dans self.entry
175 file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
177 self.entry.delete(0,Tkinter.END)
178 self.entry.insert(0,file)
180 def update_panel(self):
181 if hasattr(self,"entry"):
182 self.annule_fichier_init()
184 class MACROTreeItem(compooper.EtapeTreeItem):
185 """ Cette classe hérite d'une grande partie des comportements
186 de la classe compooper.EtapeTreeItem
190 class INCLUDETreeItemBase(MACROTreeItem):
191 rmenu_specs=[("View","makeView"),
195 def __init__(self,appli, labeltext, object, setfunction):
196 MACROTreeItem.__init__(self,appli, labeltext, object, setfunction)
198 def iscopiable(self):
200 Retourne 1 si l'objet est copiable, 0 sinon
204 def makeEdit(self,appli,node):
205 #print "makeEdit",self.object,self.object.nom
206 #print "makeEdit",self.object.jdc_aux,self.object.jdc_aux.nom
207 #print "makeEdit",self.object.jdc_aux.context_ini
208 if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
209 #L'include n'est pas initialise
210 self.object.build_include(None,"")
211 self.parent_node=node
212 # On cree un nouvel onglet dans le bureau
213 appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
215 JDCDISPLAY=macrodisplay.MACRODISPLAY)
216 self.myjdc=appli.bureau.JDCDisplay_courant
217 self.myjdc.fichier=self.object.fichier_ini
220 #print "onClose",self
221 self.appli.bureau.closeJDCDISPLAY(self.myjdc)
223 def makeView(self,appli,node):
224 if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
225 showerror("Include vide","L'include doit etre correctement initialisé pour etre visualisé")
228 if hasattr(self.object,'fichier_ini'):
229 if self.object.fichier_ini is None:
230 nom=nom+' '+"Fichier non défini"
232 nom=nom+' '+self.object.fichier_ini
233 macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
234 CONNECTOR.Connect(self.object.jdc_aux,"close",self.onCloseView,(macdisp,))
236 def onCloseView(self,macdisp):
237 #print "onCloseView",self,macdisp
240 class INCLUDEPanel(MACROPanel):
241 def makeFichierPage(self,page):
243 Affiche la page d'onglet correspondant au changement du fichier INCLUDE
245 if not hasattr(self.node.item.object,'fichier_ini'):
246 titre = Tkinter.Label(page,text="L'INCLUDE n'a pas de fichier associé\nIl faut d'abord choisir un numero d'unité " )
247 titre.place(relx=0.5,rely=0.5,anchor='center')
249 MACROPanel.makeFichierPage(self,page)
251 class INCLUDETreeItem(INCLUDETreeItemBase):
254 class POURSUITETreeItem(INCLUDETreeItemBase):
255 def makeEdit(self,appli,node):
256 if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
257 #La poursuite n'est pas initialisee
260 self.object.build_poursuite(None,text)
261 self.parent_node=node
262 # On cree un nouvel onglet dans le bureau
263 appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
265 JDCDISPLAY=macrodisplay.MACRODISPLAY)
266 self.myjdc=appli.bureau.JDCDisplay_courant
267 self.myjdc.fichier=self.object.fichier_ini
269 def makeView(self,appli,node):
270 if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
271 showerror("Poursuite vide","Une POURSUITE doit etre correctement initialisée pour etre visualisée")
274 if hasattr(self.object,'fichier_ini'):
275 if self.object.fichier_ini is None:
276 nom=nom+' '+"Fichier non défini"
278 nom=nom+' '+self.object.fichier_ini
279 macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
280 CONNECTOR.Connect(self.object.jdc_aux,"close",self.onCloseView,(macdisp,))
282 class INCLUDE_MATERIAUTreeItem(INCLUDETreeItemBase):
283 rmenu_specs=[("View","makeView"),
285 def iscopiable(self):
287 Retourne 1 si l'objet est copiable, 0 sinon
292 def treeitem(appli, labeltext, object, setfunction=None):
293 """ Factory qui retourne l'item adapté au type de macro :
294 INCLUDE, POURSUITE, MACRO
296 if object.nom == "INCLUDE_MATERIAU":
297 return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
298 elif object.nom == "INCLUDE":
299 return INCLUDETreeItem(appli, labeltext, object, setfunction)
300 elif object.nom == "POURSUITE":
301 return POURSUITETreeItem(appli, labeltext, object, setfunction)
303 return MACROTreeItem(appli, labeltext, object, setfunction)
306 objet=Accas.MACRO_ETAPE