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 # ======================================================================
22 Ce module contient les classes permettant de définir les objets graphiques
23 représentant un objet de type FORMULE, cad le panneau et l'item de l'arbre
27 # import modules Python
32 # import modules EFICAS
38 Fonte_TITRE = fontes.standard_gras_souligne
41 class FORMULEPanel(panels.OngletPanel):
43 Classe servant à construire le panneau associé à un paramètre.
44 C'est au moyen de ce panneau que l'utilisateur peut accéder
45 aux nom et valeur du paramètre en vue éventuellement de les
50 nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
51 nb.pack(fill = 'both', expand = 1)
53 nb.add('Formule', tab_text='Définition Formule')
54 nb.add('Commande', tab_text='Nouvelle Commande')
55 nb.add('Commentaire',tab_text='Paramètre/Commentaire')
56 self.makeFormulePage(nb.page("Formule"))
57 self.makeCommandePage(nb.page("Commande"))
58 self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
59 nb.tab('Formule').focus_set()
64 def makeFormulePage(self,page):
66 Crée la page qui permet d'afficher et d'éditer le texte de la FORMULE
68 self.frame_valeur = Frame(page)
69 self.frame_valeur.pack(fill='both',expand=1)
70 #self.frame_valeur.place(relwidth=0.95,relheight=0.95,relx=0.05,rely=0.05,anchor='nw')
71 #self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
72 # affichage du titre du panneau
73 self.titre = StringVar()
74 self.titre.set("FORMULE "+self.node.item.get_nom())
76 self.entry_nom = Entry(self.frame_valeur)
77 #Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.,anchor='n')
78 Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).grid(row=0,columnspan=2,padx=5,pady=5)
79 # création des labels et entries associés aux nom, type retourné, arguments et corps de la FORMULE
81 #Label(self.frame_valeur,text= 'Nom de la formule : ').place(relx=0.,rely=0.1)
82 Label(self.frame_valeur,text= 'Nom de la formule : ').grid(row=1,sticky=W,padx=5,pady=5)
83 #Label(self.frame_valeur,text= 'Arguments : ').place(relx=0.,rely=0.40)
84 Label(self.frame_valeur,text= 'Arguments : ').grid(row=2,sticky=W,padx=5,pady=5)
85 self.entry_arg = Entry(self.frame_valeur)
86 #Label(self.frame_valeur,text= 'Expression : ').place(relx=0.,rely=0.65)
87 Label(self.frame_valeur,text= 'Expression : ').grid(row=4,sticky=W,padx=5,pady=5)
88 self.entry_exp = Entry(self.frame_valeur)
90 # binding sur les entries
91 self.entry_nom.bind("<Return>",self.verif_nom)
92 self.entry_nom.bind("<KP_Enter>",self.verif_nom)
93 self.entry_arg.bind("<Return>",self.verif_arguments)
94 self.entry_arg.bind("<KP_Enter>",self.verif_arguments)
95 self.entry_exp.bind("<Return>",self.verif_corps)
96 self.entry_exp.bind("<KP_Enter>",self.verif_corps)
97 # affichage des entries
98 #self.entry_nom.place(relx=0.35,rely=0.10,relwidth=0.2)
99 self.entry_nom.grid(row=1,column=1,sticky=W,padx=5,pady=5)
100 #self.entry_arg.place(relx=0.35,rely=0.40,relwidth=0.4)
101 self.entry_arg.grid(row=2,column=1,sticky=W,padx=5,pady=5)
103 # affichage d'une phrase d'aide pour les arguments
104 aide = """Entrer les arguments sous la forme
105 de VARIABLES séparées par des virgules (,)
107 #Label(self.frame_valeur,text=aide, justify="l").place(relx=0.5,rely=0.47,anchor='n')
108 Label(self.frame_valeur,text=aide, justify="l").grid(row=3,columnspan=2,padx=5,pady=5)
110 #self.entry_exp.place(relx=0.35,rely=0.65,relwidth=0.60)
111 self.entry_exp.grid(row=4,column=1,sticky=W,padx=5,pady=5)
112 # affichage d'une phrase d'aide pour l'expression
113 aide = """Un retour de chariot dans une zone de saisie vous permet de vérifier si
114 la valeur que vous avez entrée est valide.
115 Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
116 valeurs seront effectivement prises en compte."""
117 #Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.75,anchor='n')
118 Label(self.frame_valeur,text=aide).grid(row=5,columnspan=2,padx=5,pady=5)
119 self.frame_valeur.columnconfigure(1,weight=1)
121 # affichage des nom, type retourné, arguments et corps de la FORMULE
122 self.display_valeur()
123 # affichage des boutons
125 # entry_nom prend le focus
126 self.entry_nom.focus()
128 def make_buttons(self):
130 Crée les boutons du panneau
132 #self.bouton_sup.place_forget()
133 #self.bouton_doc.place_forget()
134 #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
135 #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
137 #self.bouton_val.place(relx=0.15,rely=0.5,relheight=0.8,anchor='center')
138 #self.bouton_ann.place(relx=0.40,rely=0.5,relheight=0.8,anchor='center')
139 #self.bouton_sup.place(relx=0.65,rely=0.5,relheight=0.8,anchor='center')
140 #self.bouton_doc.place(relx=0.90,rely=0.5,relheight=0.8,anchor='center')
142 self.bouton_sup.pack_forget()
143 self.bouton_doc.pack_forget()
144 self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
145 self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
147 self.bouton_val.pack(side='left',padx=5, pady=5)
148 self.bouton_ann.pack(side='left',padx=5, pady=5)
149 self.bouton_sup.pack(side='left',padx=5, pady=5)
150 self.bouton_doc.pack(side='right',padx=5, pady=5)
152 def change_valeur(self):
154 Stocke la nouvelle FORMULE décrite par l'utilisateur
156 if self.parent.modified == 'n' : self.parent.init_modif()
157 # on récupère les nouveaux nom, type retourné, arguments et corps de la FORMULE
158 new_nom = self.entry_nom.get()
160 new_arg = self.entry_arg.get()
161 new_exp = self.entry_exp.get()
162 self.verif_arguments()
164 # on essaie de les stocker
165 test,erreur = self.node.item.save_formule(new_nom,new_typ,new_arg,new_exp)
167 # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
169 self.display_valeur()
170 self.parent.appli.affiche_infos("FORMULE %s modifiée" %self.node.item.get_nom())
172 # la formule est incorrecte : on affiche les erreurs
173 widgets.showerror("Formule incorrecte",erreur)
174 self.parent.appli.affiche_infos("FORMULE %s non modifiée" %self.node.item.get_nom())
176 def display_valeur(self):
178 Affiche dans self.widget_text de la valeur de l'objet FORMULE
179 (annule d'éventuelles modifications faite par l'utilisateur)
181 # on efface tout texte affiché dans les entries
182 self.entry_nom.delete(0,END)
183 self.entry_arg.delete(0,END)
184 self.entry_exp.delete(0,END)
185 # on rafraîchit le titre du panneau
186 self.titre.set('FORMULE '+self.node.item.get_nom())
187 # on insére les nouveaux nom, type retourné, arguments et corps de la FORMULE
188 nom = self.node.item.get_nom()
190 self.entry_nom.insert(END,nom)
191 args = self.node.item.get_args()
195 if texte_args != "" :
196 texte_args = texte_args +","
197 texte_args=texte_args + i
198 self.entry_arg.insert(END,texte_args)
199 corps = self.node.item.get_corps()
201 self.entry_exp.insert(END,self.node.item.get_corps())
203 def verif_nom(self,event=None):
205 Lance la vérification du nom présent dans entry_nom
207 nom = self.entry_nom.get()
209 test,erreur = 0,"Aucun nom fourni !"
211 test,erreur = self.node.item.verif_nom(nom)
213 widgets.showerror("Nom invalide",erreur)
214 self.entry_nom.focus()
215 self.entry_nom.selection_range(0,END)
216 self.parent.appli.affiche_infos("%s n'est pas un nom valide pour une FORMULE" %nom)
218 self.parent.appli.affiche_infos("%s est un nom valide pour une FORMULE" %nom)
219 self.entry_arg.focus()
221 def verif_arguments(self,event=None):
223 Lance la vérification des arguments présents dans entry_arg
225 arguments = self.entry_arg.get()
227 test,erreur = 0,"Aucun argument fourni"
229 test,erreur = self.node.item.verif_arguments(arguments)
231 widgets.showerror("Argument(s) invalide(s)",erreur)
232 self.entry_arg.focus()
233 self.entry_arg.selection_range(0,END)
234 self.parent.appli.affiche_infos("Argument(s) invalide(s) pour une FORMULE")
236 self.parent.appli.affiche_infos("Argument(s) valide(s) pour une FORMULE")
237 self.entry_exp.focus()
239 def verif_corps(self,event=None):
241 Lance la vérification du corps de formule présent dans entry_exp
243 new_nom = self.entry_nom.get()
245 new_arg = self.entry_arg.get()
246 new_exp = self.entry_exp.get()
248 test,erreur = 0,"Aucune expression fournie !"
250 test,erreur = self.node.item.verif_formule_python((new_nom,new_typ,new_arg,new_exp))
253 widgets.showerror("Corps de FORMULE invalide",erreur)
254 self.entry_exp.focus()
255 self.entry_exp.selection_range(0,END)
256 self.parent.appli.affiche_infos("Corps de FORMULE invalide")
258 self.parent.appli.affiche_infos("Corps de FORMULE valide")
260 class FORMULETreeItem(compooper.EtapeTreeItem):
262 Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
263 qui représente la FORMULE
268 self.setfunction = self.set_valeur
270 # ---------------------------------------------------------------------------
271 # API de FORMULE pour l'arbre
272 # ---------------------------------------------------------------------------
273 def GetSubList(self):
275 Retourne la liste des fils de self
276 On considère que FORMULE n'a pas de fils
277 --> modification par rapport à MACRO classique
279 # dans EFICAS on ne souhaite pas afficher les mots-clés fils de FORMULE
280 # de façon traditionnelle
283 def GetIconName(self):
285 Retourne le nom de l'icône à afficher dans l'arbre
286 Ce nom dépend de la validité de l'objet
288 if self.object.isactif():
289 if self.object.isvalid():
290 return "ast-green-square"
292 return "ast-red-square"
294 return "ast-white-text"
296 def GetLabelText(self):
297 """ Retourne 3 valeurs :
298 - le texte à afficher dans le noeud représentant l'item
299 - la fonte dans laquelle afficher ce texte
300 - la couleur du texte
302 if self.object.isactif():
303 # None --> fonte et couleur par défaut
304 return self.labeltext,None,None
306 return self.labeltext,fontes.standard_italique,None
308 # ---------------------------------------------------------------------------
309 # Méthodes permettant la modification et la lecture des attributs
310 # du paramètre = API graphique de la FORMULE pour Panel et EFICAS
311 # ---------------------------------------------------------------------------
315 Retourne le nom de la FORMULE
317 return self.object.get_nom()
321 Retourne le type de la valeur retournée par la FORMULE
323 return self.object.type_retourne
327 Retourne les arguments de la FORMULE
330 for mot in self.object.mc_liste:
331 if mot.nom == 'NOM_PARA':
335 if args[0] == "(" and args[-1] ==")":
337 # transforme en tuple si ce n est pas déjà le casa
339 args=string.split(args,',')
346 Retourne le corps de la FORMULE
349 for mot in self.object.mc_liste:
350 if mot.nom == 'VALE':
356 def get_liste_types_autorises(self):
358 Retourne la liste des types autorises pour les valeurs de sortie
361 return self.object.l_types_autorises
363 def save_formule(self,new_nom,new_typ,new_arg,new_exp):
365 Vérifie si (new_nom,new_typ,new_arg,new_exp) définit bien une FORMULE
367 - si oui, stocke ces paramètres comme nouveaux paramètres de la
368 FORMULE courante et retourne 1
369 - si non, laisse les paramètres anciens de la FORMULE inchangés et
372 test,erreur = self.object.verif_formule_python(formule=(new_nom,new_typ,new_arg,
375 # la formule est bien correcte : on sauve les nouveaux paramètres
376 test=self.object.update_formule_python(formule=(new_nom,new_typ,new_exp,new_arg))
379 # ---------------------------------------------------------------------------
380 # Accès aux méthodes de vérification de l'objet FORM_ETAPE
381 # ---------------------------------------------------------------------------
383 def verif_nom(self,nom):
385 Lance la vérification du nom passé en argument
387 return self.object.verif_nom(nom)
389 def verif_arguments(self,arguments):
391 Lance la vérification des arguments passés en argument
393 return self.object.verif_arguments('('+arguments+')')
395 def verif_formule(self,formule):
397 Lance la vérification de FORMULE passée en argument
399 return self.object.verif_formule(formule=formule)
402 def verif_formule_python(self,formule):
404 Lance la vérification de FORMULE passée en argument
406 return self.object.verif_formule_python(formule=formule)
409 treeitem =FORMULETreeItem
410 objet = Accas.FORM_ETAPE