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.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
68 # affichage du titre du panneau
69 self.titre = StringVar()
70 self.titre.set("FORMULE "+self.node.item.get_nom())
72 self.entry_nom = Entry(self.frame_valeur)
73 Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.,anchor='n')
74 # création des labels et entries associés aux nom, type retourné, arguments et corps de la FORMULE
76 Label(self.frame_valeur,text= 'Nom de la formule : ').place(relx=0.,rely=0.1)
77 Label(self.frame_valeur,text= 'Arguments : ').place(relx=0.,rely=0.40)
78 self.entry_arg = Entry(self.frame_valeur)
79 Label(self.frame_valeur,text= 'Expression : ').place(relx=0.,rely=0.65)
80 self.entry_exp = Entry(self.frame_valeur)
82 # binding sur les entries
83 self.entry_nom.bind("<Return>",self.verif_nom)
84 self.entry_arg.bind("<Return>",self.verif_arguments)
85 self.entry_exp.bind("<Return>",self.verif_corps)
86 # affichage des entries
87 self.entry_nom.place(relx=0.35,rely=0.10,relwidth=0.2)
88 self.entry_arg.place(relx=0.35,rely=0.40,relwidth=0.4)
90 # affichage d'une phrase d'aide pour les arguments
91 aide = """Entrer les arguments sous la forme
92 de VARIABLES séparées par des virgules (,)
94 Label(self.frame_valeur,text=aide, justify="l").place(relx=0.5,rely=0.47,anchor='n')
96 self.entry_exp.place(relx=0.35,rely=0.65,relwidth=0.60)
97 # affichage d'une phrase d'aide pour l'expression
98 aide = """Un retour de chariot dans une zone de saisie vous permet de vérifier si
99 la valeur que vous avez entrée est valide.
100 Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
101 valeurs seront effectivement prises en compte."""
102 Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.75,anchor='n')
104 # affichage des nom, type retourné, arguments et corps de la FORMULE
105 self.display_valeur()
106 # affichage des boutons
108 # entry_nom prend le focus
109 self.entry_nom.focus()
111 def make_buttons(self):
113 Crée les boutons du panneau
115 self.bouton_sup.place_forget()
116 self.bouton_doc.place_forget()
117 self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
118 self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
120 self.bouton_val.place(relx=0.15,rely=0.5,relheight=0.8,anchor='center')
121 self.bouton_ann.place(relx=0.40,rely=0.5,relheight=0.8,anchor='center')
122 self.bouton_sup.place(relx=0.65,rely=0.5,relheight=0.8,anchor='center')
123 self.bouton_doc.place(relx=0.90,rely=0.5,relheight=0.8,anchor='center')
125 def change_valeur(self):
127 Stocke la nouvelle FORMULE décrite par l'utilisateur
129 if self.parent.modified == 'n' : self.parent.init_modif()
130 # on récupère les nouveaux nom, type retourné, arguments et corps de la FORMULE
131 new_nom = self.entry_nom.get()
133 new_arg = self.entry_arg.get()
134 new_exp = self.entry_exp.get()
135 self.verif_arguments()
137 # on essaie de les stocker
138 test,erreur = self.node.item.save_formule(new_nom,new_typ,new_arg,new_exp)
140 # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
142 self.display_valeur()
143 self.parent.appli.affiche_infos("FORMULE %s modifiée" %self.node.item.get_nom())
145 # la formule est incorrecte : on affiche les erreurs
146 widgets.showerror("Formule incorrecte",erreur)
147 self.parent.appli.affiche_infos("FORMULE %s non modifiée" %self.node.item.get_nom())
149 def display_valeur(self):
151 Affiche dans self.widget_text de la valeur de l'objet FORMULE
152 (annule d'éventuelles modifications faite par l'utilisateur)
154 # on efface tout texte affiché dans les entries
155 self.entry_nom.delete(0,END)
156 self.entry_arg.delete(0,END)
157 self.entry_exp.delete(0,END)
158 # on rafraîchit le titre du panneau
159 self.titre.set('FORMULE '+self.node.item.get_nom())
160 # on insére les nouveaux nom, type retourné, arguments et corps de la FORMULE
161 nom = self.node.item.get_nom()
163 self.entry_nom.insert(END,nom)
164 args = self.node.item.get_args()
168 if texte_args != "" :
169 texte_args = texte_args +","
170 texte_args=texte_args + i
171 self.entry_arg.insert(END,texte_args)
172 corps = self.node.item.get_corps()
174 self.entry_exp.insert(END,self.node.item.get_corps())
176 def verif_nom(self,event=None):
178 Lance la vérification du nom présent dans entry_nom
180 nom = self.entry_nom.get()
182 test,erreur = 0,"Aucun nom fourni !"
184 test,erreur = self.node.item.verif_nom(nom)
186 widgets.showerror("Nom invalide",erreur)
187 self.entry_nom.focus()
188 self.entry_nom.selection_range(0,END)
189 self.parent.appli.affiche_infos("%s n'est pas un nom valide pour une FORMULE" %nom)
191 self.parent.appli.affiche_infos("%s est un nom valide pour une FORMULE" %nom)
192 self.entry_arg.focus()
194 def verif_arguments(self,event=None):
196 Lance la vérification des arguments présents dans entry_arg
198 arguments = self.entry_arg.get()
200 test,erreur = 0,"Aucun argument fourni"
202 test,erreur = self.node.item.verif_arguments(arguments)
204 widgets.showerror("Argument(s) invalide(s)",erreur)
205 self.entry_arg.focus()
206 self.entry_arg.selection_range(0,END)
207 self.parent.appli.affiche_infos("Argument(s) invalide(s) pour une FORMULE")
209 self.parent.appli.affiche_infos("Argument(s) valide(s) pour une FORMULE")
210 self.entry_exp.focus()
212 def verif_corps(self,event=None):
214 Lance la vérification du corps de formule présent dans entry_exp
216 new_nom = self.entry_nom.get()
218 new_arg = self.entry_arg.get()
219 new_exp = self.entry_exp.get()
221 test,erreur = 0,"Aucune expression fournie !"
223 test,erreur = self.node.item.verif_formule_python((new_nom,new_typ,new_arg,new_exp))
226 widgets.showerror("Corps de FORMULE invalide",erreur)
227 self.entry_exp.focus()
228 self.entry_exp.selection_range(0,END)
229 self.parent.appli.affiche_infos("Corps de FORMULE invalide")
231 self.parent.appli.affiche_infos("Corps de FORMULE valide")
233 class FORMULETreeItem(compooper.EtapeTreeItem):
235 Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
236 qui représente la FORMULE
241 self.setfunction = self.set_valeur
243 # ---------------------------------------------------------------------------
244 # API de FORMULE pour l'arbre
245 # ---------------------------------------------------------------------------
246 def GetSubList(self):
248 Retourne la liste des fils de self
249 On considère que FORMULE n'a pas de fils
250 --> modification par rapport à MACRO classique
252 # dans EFICAS on ne souhaite pas afficher les mots-clés fils de FORMULE
253 # de façon traditionnelle
256 def GetIconName(self):
258 Retourne le nom de l'icône à afficher dans l'arbre
259 Ce nom dépend de la validité de l'objet
261 if self.object.isactif():
262 self.object.state="modified"
263 if self.object.isvalid():
264 return "ast-green-square"
266 return "ast-red-square"
268 return "ast-white-text"
270 def GetLabelText(self):
271 """ Retourne 3 valeurs :
272 - le texte à afficher dans le noeud représentant l'item
273 - la fonte dans laquelle afficher ce texte
274 - la couleur du texte
276 if self.object.isactif():
277 # None --> fonte et couleur par défaut
278 return self.labeltext,None,None
280 return self.labeltext,fontes.standard_italique,None
282 # ---------------------------------------------------------------------------
283 # Méthodes permettant la modification et la lecture des attributs
284 # du paramètre = API graphique de la FORMULE pour Panel et EFICAS
285 # ---------------------------------------------------------------------------
289 Retourne le nom de la FORMULE
291 return self.object.get_nom()
295 Retourne le type de la valeur retournée par la FORMULE
297 return self.object.type_retourne
301 Retourne les arguments de la FORMULE
304 for mot in self.object.mc_liste:
305 if mot.nom == 'NOM_PARA':
309 if args[0] == "(" and args[-1] ==")":
311 # transforme en tuple si ce n est pas déjà le casa
313 args=string.split(args,',')
320 Retourne le corps de la FORMULE
323 for mot in self.object.mc_liste:
324 if mot.nom == 'VALE':
330 def get_liste_types_autorises(self):
332 Retourne la liste des types autorises pour les valeurs de sortie
335 return self.object.l_types_autorises
337 def save_formule(self,new_nom,new_typ,new_arg,new_exp):
339 Vérifie si (new_nom,new_typ,new_arg,new_exp) définit bien une FORMULE
341 - si oui, stocke ces paramètres comme nouveaux paramètres de la
342 FORMULE courante et retourne 1
343 - si non, laisse les paramètres anciens de la FORMULE inchangés et
346 test,erreur = self.object.verif_formule_python(formule=(new_nom,new_typ,new_arg,
349 # la formule est bien correcte : on sauve les nouveaux paramètres
350 test=self.object.update_formule_python(formule=(new_nom,new_typ,new_exp,new_arg))
353 # ---------------------------------------------------------------------------
354 # Accès aux méthodes de vérification de l'objet FORM_ETAPE
355 # ---------------------------------------------------------------------------
357 def verif_nom(self,nom):
359 Lance la vérification du nom passé en argument
361 return self.object.verif_nom(nom)
363 def verif_arguments(self,arguments):
365 Lance la vérification des arguments passés en argument
367 return self.object.verif_arguments('('+arguments+')')
369 def verif_formule(self,formule):
371 Lance la vérification de FORMULE passée en argument
373 return self.object.verif_formule(formule=formule)
376 def verif_formule_python(self,formule):
378 Lance la vérification de FORMULE passée en argument
380 return self.object.verif_formule_python(formule=formule)
383 treeitem =FORMULETreeItem
384 objet = Accas.FORM_ETAPE