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 self.object.state="modified"
290 if self.object.isvalid():
291 return "ast-green-square"
293 return "ast-red-square"
295 return "ast-white-text"
297 def GetLabelText(self):
298 """ Retourne 3 valeurs :
299 - le texte à afficher dans le noeud représentant l'item
300 - la fonte dans laquelle afficher ce texte
301 - la couleur du texte
303 if self.object.isactif():
304 # None --> fonte et couleur par défaut
305 return self.labeltext,None,None
307 return self.labeltext,fontes.standard_italique,None
309 # ---------------------------------------------------------------------------
310 # Méthodes permettant la modification et la lecture des attributs
311 # du paramètre = API graphique de la FORMULE pour Panel et EFICAS
312 # ---------------------------------------------------------------------------
316 Retourne le nom de la FORMULE
318 return self.object.get_nom()
322 Retourne le type de la valeur retournée par la FORMULE
324 return self.object.type_retourne
328 Retourne les arguments de la FORMULE
331 for mot in self.object.mc_liste:
332 if mot.nom == 'NOM_PARA':
336 if args[0] == "(" and args[-1] ==")":
338 # transforme en tuple si ce n est pas déjà le casa
340 args=string.split(args,',')
347 Retourne le corps de la FORMULE
350 for mot in self.object.mc_liste:
351 if mot.nom == 'VALE':
357 def get_liste_types_autorises(self):
359 Retourne la liste des types autorises pour les valeurs de sortie
362 return self.object.l_types_autorises
364 def save_formule(self,new_nom,new_typ,new_arg,new_exp):
366 Vérifie si (new_nom,new_typ,new_arg,new_exp) définit bien une FORMULE
368 - si oui, stocke ces paramètres comme nouveaux paramètres de la
369 FORMULE courante et retourne 1
370 - si non, laisse les paramètres anciens de la FORMULE inchangés et
373 test,erreur = self.object.verif_formule_python(formule=(new_nom,new_typ,new_arg,
376 # la formule est bien correcte : on sauve les nouveaux paramètres
377 test=self.object.update_formule_python(formule=(new_nom,new_typ,new_exp,new_arg))
380 # ---------------------------------------------------------------------------
381 # Accès aux méthodes de vérification de l'objet FORM_ETAPE
382 # ---------------------------------------------------------------------------
384 def verif_nom(self,nom):
386 Lance la vérification du nom passé en argument
388 return self.object.verif_nom(nom)
390 def verif_arguments(self,arguments):
392 Lance la vérification des arguments passés en argument
394 return self.object.verif_arguments('('+arguments+')')
396 def verif_formule(self,formule):
398 Lance la vérification de FORMULE passée en argument
400 return self.object.verif_formule(formule=formule)
403 def verif_formule_python(self,formule):
405 Lance la vérification de FORMULE passée en argument
407 return self.object.verif_formule_python(formule=formule)
410 treeitem =FORMULETreeItem
411 objet = Accas.FORM_ETAPE