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.20 2005/05/24 10:34:16 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 self.entry.insert(0,self.node.item.object.fichier_ini)
169 def browse_fichier_init(self,event=None):
171 Propose à l'utilisateur une Bsf et retourne le fichier
172 sélectionné dans self.entry
174 file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
176 self.entry.delete(0,Tkinter.END)
177 self.entry.insert(0,file)
180 class MACROTreeItem(compooper.EtapeTreeItem):
181 """ Cette classe hérite d'une grande partie des comportements
182 de la classe compooper.EtapeTreeItem
186 class INCLUDETreeItemBase(MACROTreeItem):
187 rmenu_specs=[("View","makeView"),
191 def __init__(self,appli, labeltext, object, setfunction):
192 MACROTreeItem.__init__(self,appli, labeltext, object, setfunction)
194 def iscopiable(self):
196 Retourne 1 si l'objet est copiable, 0 sinon
200 def makeEdit(self,appli,node):
201 #print "makeEdit",self.object,self.object.nom
202 #print "makeEdit",self.object.jdc_aux,self.object.jdc_aux.nom
203 #print "makeEdit",self.object.jdc_aux.context_ini
204 if self.object.jdc_aux is None:
205 showerror("Include vide","L'include doit etre correctement initialisé avant d'etre édité")
207 self.parent_node=node
208 # On cree un nouvel onglet dans le bureau
209 appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
211 JDCDISPLAY=macrodisplay.MACRODISPLAY)
212 self.myjdc=appli.bureau.JDCDisplay_courant
213 self.myjdc.fichier=self.object.fichier_ini
216 #print "onClose",self
217 self.appli.bureau.closeJDCDISPLAY(self.myjdc)
219 def makeView(self,appli,node):
220 if self.object.jdc_aux is None:
221 showerror("Include vide","L'include doit etre correctement initialisé avant d'etre édité")
224 if hasattr(self.object,'fichier_ini'):
225 if self.object.fichier_ini is None:
226 nom=nom+' '+"Fichier non défini"
228 nom=nom+' '+self.object.fichier_ini
229 macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
230 CONNECTOR.Connect(self.object.jdc_aux,"close",self.onCloseView,(macdisp,))
232 def onCloseView(self,macdisp):
233 #print "onCloseView",self,macdisp
236 class INCLUDEPanel(MACROPanel):
237 def makeFichierPage(self,page):
239 Affiche la page d'onglet correspondant au changement du fichier INCLUDE
241 if self.node.item["UNITE"] is None:
242 # Le numero de l'INCLUDE n'est pas defini
243 titre = Tkinter.Label(page,text="Le numero de l'INCLUDE doit etre defini avec le mot cle UNITE" )
244 titre.place(relx=0.5,rely=0.5,anchor='center')
246 MACROPanel.makeFichierPage(self,page)
248 class INCLUDETreeItem(INCLUDETreeItemBase):
251 class POURSUITETreeItem(INCLUDETreeItemBase): pass
253 class INCLUDE_MATERIAUTreeItem(INCLUDETreeItemBase):
254 rmenu_specs=[("View","makeView"),
256 def iscopiable(self):
258 Retourne 1 si l'objet est copiable, 0 sinon
263 def treeitem(appli, labeltext, object, setfunction=None):
264 """ Factory qui retourne l'item adapté au type de macro :
265 INCLUDE, POURSUITE, MACRO
267 if object.nom == "INCLUDE_MATERIAU":
268 return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
269 elif object.nom == "INCLUDE":
270 return INCLUDETreeItem(appli, labeltext, object, setfunction)
271 elif object.nom == "POURSUITE":
272 return POURSUITETreeItem(appli, labeltext, object, setfunction)
274 return MACROTreeItem(appli, labeltext, object, setfunction)
277 objet=Accas.MACRO_ETAPE