Salome HOME
CCAR: Correction du probleme de consommation memoire excessive
[tools/eficas.git] / Editeur / compoformule.py
1 #@ MODIF compoformule Editeur  DATE 02/07/2001   AUTEUR D6BHHJP J.P.LEFEBVRE 
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
5 #              SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
6 #              REDISTRIBUTION OF THIS FILE.
7 # ======================================================================
8 """
9 Ce module contient les classes permettant de définir les objets graphiques
10 représentant un objet de type FORMULE, cad le panneau et l'item de l'arbre
11 d'EFICAS
12 """
13
14 # import modules Python
15 from Tkinter import *
16 import Pmw
17 import string
18 import tkMessageBox
19
20 # import modules EFICAS
21 import panels
22 import fontes
23 import compooper
24
25 Fonte_TITRE = fontes.standard_gras_souligne
26
27
28 class FORMULEPanel(panels.OngletPanel):
29   """
30   Classe servant à construire le panneau associé à un paramètre.
31   C'est au moyen de ce panneau que l'utilisateur peut accéder
32   aux nom et valeur du paramètre en vue éventuellement de les
33   modifier.
34   """
35
36   def init(self):
37     nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
38     nb.pack(fill = 'both', expand = 1)
39     self.nb=nb
40     nb.add('Formule', tab_text='Définition Formule')
41     nb.add('Commande', tab_text='Nouvelle Commande')
42     nb.add('Commentaire',tab_text='Paramètre/Commentaire')
43     self.makeFormulePage(nb.page("Formule"))
44     self.makeCommandePage(nb.page("Commande"))
45     self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
46     nb.tab('Formule').focus_set()
47     nb.setnaturalsize()
48     
49   def makeFormulePage(self,page):
50     """
51     Crée la page qui permet d'afficher et d'éditer le texte de la FORMULE
52     """
53     self.frame_valeur = Frame(page)
54     self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
55     # affichage du titre du panneau
56     self.titre = StringVar()
57     self.titre.set("FORMULE "+self.node.item.get_nom())
58     Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.,anchor='n')
59     # création des labels et entries associés aux nom, type retourné, arguments et corps de la FORMULE
60     Label(self.frame_valeur,text= 'Nom de la formule : ').place(relx=0.,rely=0.1)
61     self.entry_nom = Entry(self.frame_valeur)
62     Label(self.frame_valeur,text= 'Type retourné : ').place(relx=0.,rely=0.25)
63     self.option_menu_typ = Pmw.OptionMenu(self.frame_valeur,labelpos='w',
64                                           label_text='',
65                                           items = self.node.item.get_liste_types_autorises())
66     self.option_menu_typ.place(relx=0.33,rely=0.23)
67     Label(self.frame_valeur,text= 'Arguments : ').place(relx=0.,rely=0.40)
68     self.entry_arg = Entry(self.frame_valeur)
69     Label(self.frame_valeur,text= 'Expression : ').place(relx=0.,rely=0.55)
70     self.entry_exp = Entry(self.frame_valeur)
71     # binding sur les entries
72     self.entry_nom.bind("<Return>",self.verif_nom)
73     self.entry_arg.bind("<Return>",self.verif_arguments)
74     self.entry_exp.bind("<Return>",self.verif_corps)
75     # affichage des entries
76     self.entry_nom.place(relx=0.35,rely=0.10,relwidth=0.2)
77     self.entry_arg.place(relx=0.35,rely=0.40,relwidth=0.4)
78     self.entry_exp.place(relx=0.35,rely=0.55,relwidth=0.55)
79     # affichage d'une phrase d'aide
80     aide = """
81     Un retour de chariot dans une zone de saisie vous permet de vérifier si
82     la valeur que vous avez entrée est valide.
83     Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
84     valeurs seront effectivement prises en compte
85     """
86     Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.7,anchor='n')
87     # affichage des nom, type retourné, arguments et corps de la FORMULE
88     self.display_valeur()
89     # affichage des boutons
90     self.make_buttons()
91     # entry_nom prend le focus
92     self.entry_nom.focus()
93
94   def make_buttons(self):
95     """
96     Crée les boutons du panneau
97     """
98     self.bouton_sup.place_forget()
99     self.bouton_doc.place_forget()
100     self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
101     self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
102
103     self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
104     self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
105     self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
106
107   def change_valeur(self):
108     """
109     Stocke la nouvelle FORMULE décrite par l'utilisateur
110     """
111     if self.parent.modified == 'n' : self.parent.init_modif()
112     # on récupère les nouveaux nom, type retourné, arguments et corps de la FORMULE
113     new_nom = self.entry_nom.get()
114     new_typ = self.option_menu_typ.getcurselection()
115     new_arg = self.entry_arg.get()
116     new_exp = self.entry_exp.get()
117     # on essaie de les stocker
118     test,erreur = self.node.item.save_formule(new_nom,new_typ,new_arg,new_exp)
119     if test :
120         # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
121         self.node.update()
122         self.display_valeur()
123         self.parent.appli.affiche_infos("FORMULE %s modifiée" %self.node.item.get_nom())
124     else:
125         # la formule est incorrecte : on affiche les erreurs
126         tkMessageBox.showerror("Formule incorrecte",erreur)
127         self.parent.appli.affiche_infos("FORMULE %s non modifiée" %self.node.item.get_nom())
128     
129   def display_valeur(self):
130     """
131     Affiche dans self.widget_text de la valeur de l'objet FORMULE
132     (annule d'éventuelles modifications faite par l'utilisateur)
133     """
134     # on efface tout texte affiché dans les entries
135     self.entry_nom.delete(0,END)
136     self.entry_arg.delete(0,END)
137     self.entry_exp.delete(0,END)
138     # on rafraîchit le titre du panneau
139     self.titre.set('FORMULE '+self.node.item.get_nom())
140     # on insére les nouveaux nom, type retourné, arguments et corps de la FORMULE
141     nom = self.node.item.get_nom()
142     if nom != '':
143         self.entry_nom.insert(END,nom)
144     type = self.node.item.get_type()
145     if type :
146         self.option_menu_typ.invoke(type)
147     args = self.node.item.get_args()
148     if args:
149         self.entry_arg.insert(END,args)
150     corps = self.node.item.get_corps()
151     if corps :
152         self.entry_exp.insert(END,self.node.item.get_corps())
153
154   def verif_nom(self,event=None):
155         """
156         Lance la vérification du nom présent dans entry_nom
157         """
158         nom = self.entry_nom.get()\r
159         if nom == '':\r
160             test,erreur = 0,"Aucun nom fourni !"\r
161         else:
162             test,erreur = self.node.item.verif_nom(nom)
163         if not test:
164             tkMessageBox.showerror("Nom invalide",erreur)
165             self.entry_nom.focus()
166             self.entry_nom.selection_range(0,END)
167             self.parent.appli.affiche_infos("%s n'est pas un nom valide pour une FORMULE" %nom)
168         else:
169             self.parent.appli.affiche_infos("%s est un nom valide pour une FORMULE" %nom)
170             self.entry_arg.focus()
171
172   def verif_arguments(self,event=None):
173         """
174         Lance la vérification des arguments présents dans entry_arg
175         """
176         arguments = self.entry_arg.get()\r
177         if arguments == '' :\r
178             test,erreur = 0,"Aucun argument fourni"\r
179         else:
180             test,erreur = self.node.item.verif_arguments(arguments)
181         if not test:
182             tkMessageBox.showerror("Argument(s) invalide(s)",erreur)
183             self.entry_arg.focus()
184             self.entry_arg.selection_range(0,END)
185             self.parent.appli.affiche_infos("Argument(s) invalide(s) pour une FORMULE")
186         else:
187             self.parent.appli.affiche_infos("Argument(s) valide(s) pour une FORMULE")
188             self.entry_exp.focus()
189
190   def verif_corps(self,event=None):
191         """
192         Lance la vérification du corps de formule présent dans entry_exp
193         """
194         new_nom = self.entry_nom.get()
195         new_typ = self.option_menu_typ.getcurselection()
196         new_arg = self.entry_arg.get()
197         new_exp = self.entry_exp.get()
198         if new_exp == '':
199             test,erreur = 0,"Aucune expression fournie !"
200         else:
201             test,erreur = self.node.item.verif_formule((new_nom,new_typ,new_arg,new_exp))
202  
203         if not test:
204             tkMessageBox.showerror("Corps de FORMULE invalide",erreur)
205             self.entry_exp.focus()
206             self.entry_exp.selection_range(0,END)
207             self.parent.appli.affiche_infos("Corps de FORMULE invalide")
208         else:
209             self.parent.appli.affiche_infos("Corps de FORMULE valide")
210             
211 class FORMULETreeItem(compooper.EtapeTreeItem):
212     """
213     Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
214     qui représente la FORMULE
215     """
216     panel = FORMULEPanel
217
218     def init(self):
219       self.setfunction = self.set_valeur
220
221 # ---------------------------------------------------------------------------
222 #                   API de FORMULE pour l'arbre 
223 # ---------------------------------------------------------------------------
224     def GetSubList(self):
225       """
226       Retourne la liste des fils de self
227       On considère que FORMULE n'a pas de fils
228       --> modification par rapport à MACRO classique
229       """
230       # dans EFICAS on ne souhaite pas afficher les mots-clés fils de FORMULE
231       # de façon traditionnelle
232       return []
233
234     def GetIconName(self):
235       """
236       Retourne le nom de l'icône à afficher dans l'arbre
237       Ce nom dépend de la validité de l'objet
238       """
239       if self.object.isactif():
240         if self.object.isvalid():
241           return "ast-green-square"
242         else:
243           return "ast-red-square"
244       else:
245         return "ast-white-text"
246
247     def GetLabelText(self):
248       """ Retourne 3 valeurs :
249       - le texte à afficher dans le noeud représentant l'item
250       - la fonte dans laquelle afficher ce texte
251       - la couleur du texte
252       """
253       if self.object.isactif():
254         # None --> fonte et couleur par défaut
255         return self.labeltext,None,None
256       else:
257         return self.labeltext,fontes.standard_italique,None
258     
259 # ---------------------------------------------------------------------------
260 #       Méthodes permettant la modification et la lecture des attributs
261 #       du paramètre = API graphique de la FORMULE pour Panel et EFICAS
262 # ---------------------------------------------------------------------------
263
264     def get_nom(self):
265       """
266       Retourne le nom de la FORMULE
267       """
268       return self.object.get_nom()
269
270     def get_type(self):
271       """
272       Retourne le type de la valeur retournée par la FORMULE
273       """
274       return self.object.type_retourne
275
276     def get_args(self):
277       """
278       Retourne les arguments de la FORMULE
279       """
280       args = self.object.arguments
281       if args :
282           return self.object.arguments[1:-1] #on enlève les parenthèses ouvrante et fermante
283       else:
284           return None
285
286     def get_corps(self):
287       """
288       Retourne le corps de la FORMULE
289       """
290       return self.object.corps
291
292     def get_liste_types_autorises(self):
293       """
294          Retourne la liste des types autorises pour les valeurs de sortie 
295          d'une FORMULE
296       """
297       return self.object.l_types_autorises
298
299     def save_formule(self,new_nom,new_typ,new_arg,new_exp):
300       """
301       Vérifie si (new_nom,new_typ,new_arg,new_exp) définit bien une FORMULE 
302       licite :
303           - si oui, stocke ces paramètres comme nouveaux paramètres de la 
304             FORMULE courante et retourne 1
305           - si non, laisse les paramètres anciens de la FORMULE inchangés et 
306             retourne 0
307       """
308       test,erreur = self.object.verif_formule(formule=(new_nom,new_typ,new_arg,
309                                                        new_exp))
310       if test :
311           # la formule est bien correcte : on sauve les nouveaux paramètres
312           self.object.update(formule=(new_nom,new_typ,new_arg,new_exp))
313       return test,erreur
314
315 # ---------------------------------------------------------------------------
316 #          Accès aux méthodes de vérification de l'objet FORM_ETAPE
317 # ---------------------------------------------------------------------------
318
319     def verif_nom(self,nom):
320         """
321         Lance la vérification du nom passé en argument
322         """
323         return self.object.verif_nom(nom)
324
325     def verif_arguments(self,arguments):
326         """
327         Lance la vérification des arguments passés en argument
328         """
329         return self.object.verif_arguments('('+arguments+')')
330
331     def verif_formule(self,formule):
332         """
333         Lance la vérification de FORMULE passée en argument
334         """
335         return self.object.verif_formule(formule=formule)
336
337 import Accas
338 treeitem =FORMULETreeItem
339 objet = Accas.FORM_ETAPE