]> SALOME platform Git repositories - tools/eficas.git/blob - InterfaceTK/compoformule.py
Salome HOME
CCAR: merge de la version 1.14 dans la branche principale
[tools/eficas.git] / InterfaceTK / compoformule.py
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.
9 #
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.
14 #
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.
18 #
19 #
20 # ======================================================================
21 """
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
24 d'EFICAS
25 """
26
27 # import modules Python
28 from Tkinter import *
29 import Pmw
30 import string
31
32 # import modules EFICAS
33 import widgets
34 import panels
35 import fontes
36 import compooper
37
38 Fonte_TITRE = fontes.standard_gras_souligne
39
40
41 class FORMULEPanel(panels.OngletPanel):
42   """
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
46   modifier.
47   """
48
49   def init(self):
50     nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
51     nb.pack(fill = 'both', expand = 1)
52     self.nb=nb
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()
60     self.enlevebind()
61     self.creebind()
62     nb.setnaturalsize()
63     
64   def makeFormulePage(self,page):
65     """
66     Crée la page qui permet d'afficher et d'éditer le texte de la FORMULE
67     """
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())
75
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
80     
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)
89
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)
102
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 (,)
106 Exemple X,Y,Z """
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)
109
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)
120
121     # affichage des nom, type retourné, arguments et corps de la FORMULE
122     self.display_valeur()
123     # affichage des boutons
124     self.make_buttons()
125     # entry_nom prend le focus
126     self.entry_nom.focus()
127
128   def make_buttons(self):
129     """
130     Crée les boutons du panneau
131     """
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)
136
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')
141
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)
146
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)
151
152   def change_valeur(self):
153     """
154     Stocke la nouvelle FORMULE décrite par l'utilisateur
155     """
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()
159     new_typ="REEL" 
160     new_arg = self.entry_arg.get()
161     new_exp = self.entry_exp.get()
162     self.verif_arguments()
163     self.verif_corps()
164     # on essaie de les stocker
165     test,erreur = self.node.item.save_formule(new_nom,new_typ,new_arg,new_exp)
166     if test :
167         # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
168         self.node.update()
169         self.display_valeur()
170         self.parent.appli.affiche_infos("FORMULE %s modifiée" %self.node.item.get_nom())
171     else:
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())
175     
176   def display_valeur(self):
177     """
178     Affiche dans self.widget_text de la valeur de l'objet FORMULE
179     (annule d'éventuelles modifications faite par l'utilisateur)
180     """
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()
189     if nom != '':
190         self.entry_nom.insert(END,nom)
191     args = self.node.item.get_args()
192     if args:
193         texte_args=""
194         for i in 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()
200     if corps :
201         self.entry_exp.insert(END,self.node.item.get_corps())
202
203   def verif_nom(self,event=None):
204         """
205         Lance la vérification du nom présent dans entry_nom
206         """
207         nom = self.entry_nom.get()
208         if nom == '':
209             test,erreur = 0,"Aucun nom fourni !"
210         else:
211             test,erreur = self.node.item.verif_nom(nom)
212         if not test:
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)
217         else:
218             self.parent.appli.affiche_infos("%s est un nom valide pour une FORMULE" %nom)
219             self.entry_arg.focus()
220
221   def verif_arguments(self,event=None):
222         """
223         Lance la vérification des arguments présents dans entry_arg
224         """
225         arguments = self.entry_arg.get()
226         if arguments == '' :
227             test,erreur = 0,"Aucun argument fourni"
228         else:
229             test,erreur = self.node.item.verif_arguments(arguments)
230         if not test:
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")
235         else:
236             self.parent.appli.affiche_infos("Argument(s) valide(s) pour une FORMULE")
237             self.entry_exp.focus()
238
239   def verif_corps(self,event=None):
240         """
241         Lance la vérification du corps de formule présent dans entry_exp
242         """
243         new_nom = self.entry_nom.get()
244         new_typ="REEL"
245         new_arg = self.entry_arg.get()
246         new_exp = self.entry_exp.get()
247         if new_exp == '':
248             test,erreur = 0,"Aucune expression fournie !"
249         else:
250             test,erreur = self.node.item.verif_formule_python((new_nom,new_typ,new_arg,new_exp))
251  
252         if not test:
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")
257         else:
258             self.parent.appli.affiche_infos("Corps de FORMULE valide")
259             
260 class FORMULETreeItem(compooper.EtapeTreeItem):
261     """
262     Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
263     qui représente la FORMULE
264     """
265     panel = FORMULEPanel
266
267     def init(self):
268       self.setfunction = self.set_valeur
269
270 # ---------------------------------------------------------------------------
271 #                   API de FORMULE pour l'arbre 
272 # ---------------------------------------------------------------------------
273     def GetSubList(self):
274       """
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
278       """
279       # dans EFICAS on ne souhaite pas afficher les mots-clés fils de FORMULE
280       # de façon traditionnelle
281       return []
282
283     def GetIconName(self):
284       """
285       Retourne le nom de l'icône à afficher dans l'arbre
286       Ce nom dépend de la validité de l'objet
287       """
288       if self.object.isactif():
289         if self.object.isvalid():
290           return "ast-green-square"
291         else:
292           return "ast-red-square"
293       else:
294         return "ast-white-text"
295
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
301       """
302       if self.object.isactif():
303         # None --> fonte et couleur par défaut
304         return self.labeltext,None,None
305       else:
306         return self.labeltext,fontes.standard_italique,None
307     
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 # ---------------------------------------------------------------------------
312
313     def get_nom(self):
314       """
315       Retourne le nom de la FORMULE
316       """
317       return self.object.get_nom()
318
319     def get_type(self):
320       """
321       Retourne le type de la valeur retournée par la FORMULE
322       """
323       return self.object.type_retourne
324
325     def get_args(self):
326       """
327       Retourne les arguments de la FORMULE
328       """
329       args=""
330       for mot in self.object.mc_liste:
331           if mot.nom == 'NOM_PARA':
332              args=mot.valeur
333              break
334       if args :
335           if args[0] == "(" and args[-1] ==")":
336              args=args[1:-1]
337           # transforme en tuple si ce n est pas déjà le casa
338           try :
339              args=string.split(args,',')
340           except :
341              pass
342       return args
343
344     def get_corps(self):
345       """
346       Retourne le corps de la FORMULE
347       """
348       corps=""
349       for mot in self.object.mc_liste:
350           if mot.nom == 'VALE':
351              corps=mot.valeur
352              break
353       return corps
354
355
356     def get_liste_types_autorises(self):
357       """
358          Retourne la liste des types autorises pour les valeurs de sortie 
359          d'une FORMULE
360       """
361       return self.object.l_types_autorises
362
363     def save_formule(self,new_nom,new_typ,new_arg,new_exp):
364       """
365       Vérifie si (new_nom,new_typ,new_arg,new_exp) définit bien une FORMULE 
366       licite :
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 
370             retourne 0
371       """
372       test,erreur = self.object.verif_formule_python(formule=(new_nom,new_typ,new_arg,
373                                                        new_exp))
374       if test :
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))
377       return test,erreur
378
379 # ---------------------------------------------------------------------------
380 #          Accès aux méthodes de vérification de l'objet FORM_ETAPE
381 # ---------------------------------------------------------------------------
382
383     def verif_nom(self,nom):
384         """
385         Lance la vérification du nom passé en argument
386         """
387         return self.object.verif_nom(nom)
388
389     def verif_arguments(self,arguments):
390         """
391         Lance la vérification des arguments passés en argument
392         """
393         return self.object.verif_arguments('('+arguments+')')
394
395     def verif_formule(self,formule):
396         """
397         Lance la vérification de FORMULE passée en argument
398         """
399         return self.object.verif_formule(formule=formule)
400
401
402     def verif_formule_python(self,formule):
403         """
404         Lance la vérification de FORMULE passée en argument
405         """
406         return self.object.verif_formule_python(formule=formule)
407
408 import Accas
409 treeitem =FORMULETreeItem
410 objet = Accas.FORM_ETAPE