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()
62 def makeFormulePage(self,page):
64 Crée la page qui permet d'afficher et d'éditer le texte de la FORMULE
66 self.frame_valeur = Frame(page)
67 self.frame_valeur.place(relwidth=0.95,relheight=0.95,relx=0.05,rely=0.05,anchor='nw')
68 #self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
69 # affichage du titre du panneau
70 self.titre = StringVar()
71 self.titre.set("FORMULE "+self.node.item.get_nom())
73 self.entry_nom = Entry(self.frame_valeur)
74 Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.,anchor='n')
75 # création des labels et entries associés aux nom, type retourné, arguments et corps de la FORMULE
77 Label(self.frame_valeur,text= 'Nom de la formule : ').place(relx=0.,rely=0.1)
78 Label(self.frame_valeur,text= 'Arguments : ').place(relx=0.,rely=0.40)
79 self.entry_arg = Entry(self.frame_valeur)
80 Label(self.frame_valeur,text= 'Expression : ').place(relx=0.,rely=0.65)
81 self.entry_exp = Entry(self.frame_valeur)
83 # binding sur les entries
84 self.entry_nom.bind("<Return>",self.verif_nom)
85 self.entry_nom.bind("<KP_Enter>",self.verif_nom)
86 self.entry_arg.bind("<Return>",self.verif_arguments)
87 self.entry_arg.bind("<KP_Enter>",self.verif_arguments)
88 self.entry_exp.bind("<Return>",self.verif_corps)
89 self.entry_exp.bind("<KP_Enter>",self.verif_corps)
90 # affichage des entries
91 self.entry_nom.place(relx=0.35,rely=0.10,relwidth=0.2)
92 self.entry_arg.place(relx=0.35,rely=0.40,relwidth=0.4)
94 # affichage d'une phrase d'aide pour les arguments
95 aide = """Entrer les arguments sous la forme
96 de VARIABLES séparées par des virgules (,)
98 Label(self.frame_valeur,text=aide, justify="l").place(relx=0.5,rely=0.47,anchor='n')
100 self.entry_exp.place(relx=0.35,rely=0.65,relwidth=0.60)
101 # affichage d'une phrase d'aide pour l'expression
102 aide = """Un retour de chariot dans une zone de saisie vous permet de vérifier si
103 la valeur que vous avez entrée est valide.
104 Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
105 valeurs seront effectivement prises en compte."""
106 Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.75,anchor='n')
108 # affichage des nom, type retourné, arguments et corps de la FORMULE
109 self.display_valeur()
110 # affichage des boutons
112 # entry_nom prend le focus
113 self.entry_nom.focus()
115 def make_buttons(self):
117 Crée les boutons du panneau
119 self.bouton_sup.place_forget()
120 self.bouton_doc.place_forget()
121 self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
122 self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
124 self.bouton_val.place(relx=0.15,rely=0.5,relheight=0.8,anchor='center')
125 self.bouton_ann.place(relx=0.40,rely=0.5,relheight=0.8,anchor='center')
126 self.bouton_sup.place(relx=0.65,rely=0.5,relheight=0.8,anchor='center')
127 self.bouton_doc.place(relx=0.90,rely=0.5,relheight=0.8,anchor='center')
129 def change_valeur(self):
131 Stocke la nouvelle FORMULE décrite par l'utilisateur
133 if self.parent.modified == 'n' : self.parent.init_modif()
134 # on récupère les nouveaux nom, type retourné, arguments et corps de la FORMULE
135 new_nom = self.entry_nom.get()
137 new_arg = self.entry_arg.get()
138 new_exp = self.entry_exp.get()
139 self.verif_arguments()
141 # on essaie de les stocker
142 test,erreur = self.node.item.save_formule(new_nom,new_typ,new_arg,new_exp)
144 # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
146 self.display_valeur()
147 self.parent.appli.affiche_infos("FORMULE %s modifiée" %self.node.item.get_nom())
149 # la formule est incorrecte : on affiche les erreurs
150 widgets.showerror("Formule incorrecte",erreur)
151 self.parent.appli.affiche_infos("FORMULE %s non modifiée" %self.node.item.get_nom())
153 def display_valeur(self):
155 Affiche dans self.widget_text de la valeur de l'objet FORMULE
156 (annule d'éventuelles modifications faite par l'utilisateur)
158 # on efface tout texte affiché dans les entries
159 self.entry_nom.delete(0,END)
160 self.entry_arg.delete(0,END)
161 self.entry_exp.delete(0,END)
162 # on rafraîchit le titre du panneau
163 self.titre.set('FORMULE '+self.node.item.get_nom())
164 # on insére les nouveaux nom, type retourné, arguments et corps de la FORMULE
165 nom = self.node.item.get_nom()
167 self.entry_nom.insert(END,nom)
168 args = self.node.item.get_args()
172 if texte_args != "" :
173 texte_args = texte_args +","
174 texte_args=texte_args + i
175 self.entry_arg.insert(END,texte_args)
176 corps = self.node.item.get_corps()
178 self.entry_exp.insert(END,self.node.item.get_corps())
180 def verif_nom(self,event=None):
182 Lance la vérification du nom présent dans entry_nom
184 nom = self.entry_nom.get()
186 test,erreur = 0,"Aucun nom fourni !"
188 test,erreur = self.node.item.verif_nom(nom)
190 widgets.showerror("Nom invalide",erreur)
191 self.entry_nom.focus()
192 self.entry_nom.selection_range(0,END)
193 self.parent.appli.affiche_infos("%s n'est pas un nom valide pour une FORMULE" %nom)
195 self.parent.appli.affiche_infos("%s est un nom valide pour une FORMULE" %nom)
196 self.entry_arg.focus()
198 def verif_arguments(self,event=None):
200 Lance la vérification des arguments présents dans entry_arg
202 arguments = self.entry_arg.get()
204 test,erreur = 0,"Aucun argument fourni"
206 test,erreur = self.node.item.verif_arguments(arguments)
208 widgets.showerror("Argument(s) invalide(s)",erreur)
209 self.entry_arg.focus()
210 self.entry_arg.selection_range(0,END)
211 self.parent.appli.affiche_infos("Argument(s) invalide(s) pour une FORMULE")
213 self.parent.appli.affiche_infos("Argument(s) valide(s) pour une FORMULE")
214 self.entry_exp.focus()
216 def verif_corps(self,event=None):
218 Lance la vérification du corps de formule présent dans entry_exp
220 new_nom = self.entry_nom.get()
222 new_arg = self.entry_arg.get()
223 new_exp = self.entry_exp.get()
225 test,erreur = 0,"Aucune expression fournie !"
227 test,erreur = self.node.item.verif_formule_python((new_nom,new_typ,new_arg,new_exp))
230 widgets.showerror("Corps de FORMULE invalide",erreur)
231 self.entry_exp.focus()
232 self.entry_exp.selection_range(0,END)
233 self.parent.appli.affiche_infos("Corps de FORMULE invalide")
235 self.parent.appli.affiche_infos("Corps de FORMULE valide")
237 class FORMULETreeItem(compooper.EtapeTreeItem):
239 Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
240 qui représente la FORMULE
245 self.setfunction = self.set_valeur
247 # ---------------------------------------------------------------------------
248 # API de FORMULE pour l'arbre
249 # ---------------------------------------------------------------------------
250 def GetSubList(self):
252 Retourne la liste des fils de self
253 On considère que FORMULE n'a pas de fils
254 --> modification par rapport à MACRO classique
256 # dans EFICAS on ne souhaite pas afficher les mots-clés fils de FORMULE
257 # de façon traditionnelle
260 def GetIconName(self):
262 Retourne le nom de l'icône à afficher dans l'arbre
263 Ce nom dépend de la validité de l'objet
265 if self.object.isactif():
266 self.object.state="modified"
267 if self.object.isvalid():
268 return "ast-green-square"
270 return "ast-red-square"
272 return "ast-white-text"
274 def GetLabelText(self):
275 """ Retourne 3 valeurs :
276 - le texte à afficher dans le noeud représentant l'item
277 - la fonte dans laquelle afficher ce texte
278 - la couleur du texte
280 if self.object.isactif():
281 # None --> fonte et couleur par défaut
282 return self.labeltext,None,None
284 return self.labeltext,fontes.standard_italique,None
286 # ---------------------------------------------------------------------------
287 # Méthodes permettant la modification et la lecture des attributs
288 # du paramètre = API graphique de la FORMULE pour Panel et EFICAS
289 # ---------------------------------------------------------------------------
293 Retourne le nom de la FORMULE
295 return self.object.get_nom()
299 Retourne le type de la valeur retournée par la FORMULE
301 return self.object.type_retourne
305 Retourne les arguments de la FORMULE
308 for mot in self.object.mc_liste:
309 if mot.nom == 'NOM_PARA':
313 if args[0] == "(" and args[-1] ==")":
315 # transforme en tuple si ce n est pas déjà le casa
317 args=string.split(args,',')
324 Retourne le corps de la FORMULE
327 for mot in self.object.mc_liste:
328 if mot.nom == 'VALE':
334 def get_liste_types_autorises(self):
336 Retourne la liste des types autorises pour les valeurs de sortie
339 return self.object.l_types_autorises
341 def save_formule(self,new_nom,new_typ,new_arg,new_exp):
343 Vérifie si (new_nom,new_typ,new_arg,new_exp) définit bien une FORMULE
345 - si oui, stocke ces paramètres comme nouveaux paramètres de la
346 FORMULE courante et retourne 1
347 - si non, laisse les paramètres anciens de la FORMULE inchangés et
350 test,erreur = self.object.verif_formule_python(formule=(new_nom,new_typ,new_arg,
353 # la formule est bien correcte : on sauve les nouveaux paramètres
354 test=self.object.update_formule_python(formule=(new_nom,new_typ,new_exp,new_arg))
357 # ---------------------------------------------------------------------------
358 # Accès aux méthodes de vérification de l'objet FORM_ETAPE
359 # ---------------------------------------------------------------------------
361 def verif_nom(self,nom):
363 Lance la vérification du nom passé en argument
365 return self.object.verif_nom(nom)
367 def verif_arguments(self,arguments):
369 Lance la vérification des arguments passés en argument
371 return self.object.verif_arguments('('+arguments+')')
373 def verif_formule(self,formule):
375 Lance la vérification de FORMULE passée en argument
377 return self.object.verif_formule(formule=formule)
380 def verif_formule_python(self,formule):
382 Lance la vérification de FORMULE passée en argument
384 return self.object.verif_formule_python(formule=formule)
387 treeitem =FORMULETreeItem
388 objet = Accas.FORM_ETAPE