Salome HOME
PN
[tools/eficas.git] / Editeur / compoparameval.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 PARAMETRE_EVAL, 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 Objecttreeitem
35 import panels
36 import fontes
37
38
39 Fonte_PARAMETRE = fontes.standard_italique
40 Fonte_TITRE = fontes.standard_gras_souligne
41
42
43 class PARAM_EVALPanel(panels.OngletPanel):
44   """
45   Classe servant à construire le panneau associé à un paramètre.
46   C'est au moyen de ce panneau que l'utilisateur peut accéder
47   aux nom et valeur du paramètre en vue éventuellement de les
48   modifier.
49   """
50
51   def init(self):
52     """
53     Initialise les frame des panneaux contextuels relatifs à un PARAMETRE
54     """
55     nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
56     nb.pack(fill = 'both', expand = 1)
57     self.nb=nb
58     nb.add('Parametre', tab_text='Paramètre EVAL')
59     nb.add('Commande', tab_text='Nouvelle Commande')
60     nb.add('Commentaire',tab_text='Paramètre/Commentaire')
61     self.makeParametrePage(nb.page("Parametre"))
62     self.makeCommandePage(nb.page("Commande"))
63     self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
64     nb.tab('Parametre').focus_set()
65     nb.setnaturalsize()
66     self.make_buttons()
67     
68   def makeParametrePage(self,page):
69     """
70     Crée la page qui permet d'afficher et d'éditer le texte du PARAMETRE
71     """
72     self.frame_valeur = Frame(page)
73     self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
74     # affichage du titre du panneau
75     self.titre = StringVar()
76     self.titre.set("PARAMETRE EVAL "+self.node.item.get_nom())
77     Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.1,anchor='n')
78     # création des labels et entries associés aux nom et valeur du paramètre
79     Label(self.frame_valeur,text= 'Nom du paramètre : ').place(relx=0.,rely=0.3)
80     self.entry_nom = Entry(self.frame_valeur)
81     Label(self.frame_valeur,text= 'Valeur du paramètre : ').place(relx=0.,rely=0.5)
82     self.entry_val = Entry(self.frame_valeur)
83     # binding sur entry_nom
84     self.entry_nom.bind("<Return>",lambda e,s=self : s.verif_nom())
85     self.entry_val.bind("<Return>",lambda e,s=self : s.verif_eval())
86     self.entry_nom.bind("<KP_Enter>",lambda e,s=self : s.verif_nom())
87     self.entry_val.bind("<KP_Enter>",lambda e,s=self : s.verif_eval())
88     # affichage des entries
89     self.entry_nom.place(relx=0.35,rely=0.3,relwidth=0.3)
90     self.entry_val.place(relx=0.35,rely=0.5,relwidth=0.5)
91     # affichage d'une phrase d'aide
92     aide = """
93     Un retour de chariot dans une zone de saisie vous permet de vérifier si
94     la valeur que vous avez entrée est valide.
95     Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
96     valeurs seront effectivement prises en compte
97     """
98     Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.65,anchor='n')
99     # affichage des nom et valeur du paramètre
100     self.display_valeur()
101     self.entry_nom.focus()
102
103   def make_buttons(self):
104     """
105     Crée les boutons du panneau
106     """
107     self.bouton_sup.place_forget()
108     self.bouton_doc.place_forget()
109     self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
110     self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
111     self.bouton_val.bind("<Return>",lambda e,s=self : s.bouton_val.invoke())
112     self.bouton_val.bind("<KP_Enter>",lambda e,s=self : s.bouton_val.invoke())
113     self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
114     self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
115     self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
116
117   def change_valeur(self):
118     """
119     Stocke la nouvelle valeur donnée par l'utilisateur comme valeur du PARAMETRE
120     """
121     if self.parent.modified == 'n' : self.parent.init_modif()
122     new_nom = self.entry_nom.get()
123     new_val = self.entry_val.get()
124     #self.node.item.set_nom(new_nom)
125     #self.node.item.set_valeur(new_val)
126     #self.node.update()
127     #self.display_valeur()
128     # on essaie de stocker les noms et valeurs
129     test,erreur = self.node.item.save_parametre_eval(new_nom,new_val)
130     if test :
131         # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
132         self.node.update()
133         self.display_valeur()
134         self.parent.appli.affiche_infos("Expression EVAL %s modifiée" %self.node.item.get_nom())
135     else:
136         # la formule est incorrecte : on affiche les erreurs
137         widgets.showerror("Expression EVAL incorrecte",erreur)
138         self.parent.appli.affiche_infos("Expression EVAL %s non modifiée" %self.node.item.get_nom())
139     
140   def display_valeur(self):
141     """
142     Affiche dans self.widget_text la valeur de l'objet PARAMETRE
143     (annule d'éventuelles modifications faite par l'utilisateur)
144     """
145     self.entry_nom.delete(0,END)
146     self.entry_val.delete(0,END)
147     self.titre.set('PARAMETRE '+self.node.item.get_nom())
148     self.entry_nom.insert(END,self.node.item.get_nom())
149     self.entry_val.insert(END,self.node.item.get_valeur())
150
151   def verif_nom(self):
152     """
153     Lance la vérification du nom donné par l'utilisateur dans entry_nom
154     """
155     nom = self.entry_nom.get()
156     test,erreur = self.node.item.verif_nom(nom)
157     if not test :
158         widgets.showerror("Nom invalide",erreur)
159         self.entry_nom.focus()
160         self.entry_nom.selection_range(0,END)
161         self.parent.appli.affiche_infos("Nom du paramètre refusé")
162     else:
163         self.parent.appli.affiche_infos("Nom du paramètre accepté")
164         
165   def verif_eval(self,event=None):
166     """
167     Lance la vérification de l'expression EVAL présente dans entry_val
168     """
169     exp_eval = self.entry_val.get()
170     test,erreur = self.node.item.verif_eval(exp_eval)
171     if not test:
172         widgets.showerror("Expression EVAL invalide",erreur)
173         self.entry_val.focus()
174         self.entry_val.selection_range(0,END)
175         self.parent.appli.affiche_infos("Expression EVAL refusée")
176     else:
177         self.parent.appli.affiche_infos("Expression EVAL acceptée")
178
179 class PARAM_EVALTreeItem(Objecttreeitem.ObjectTreeItem):
180     """
181     Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
182     qui représente le PARAMETRE
183     """
184     panel = PARAM_EVALPanel
185
186     def init(self):
187       self.setfunction = self.set_valeur
188
189 # ---------------------------------------------------------------------------
190 #                   API du PARAMETRE pour l'arbre 
191 # ---------------------------------------------------------------------------
192
193     def GetIconName(self):
194       """
195       Retourne le nom de l'icône associée au noeud qui porte self,
196       dépendant de la validité de l'objet
197       NB : un PARAMETRE est toujours valide ...
198       """
199       if self.isactif():
200           if self.isvalid():
201               return "ast-green-square"
202           else:
203               return "ast-red-square"
204       else:
205           return "ast-white-square"
206
207     def GetLabelText(self):
208         """ Retourne 3 valeurs :
209         - le texte à afficher dans le noeud représentant l'item
210         - la fonte dans laquelle afficher ce texte
211         - la couleur du texte
212         """
213         return 'EVAL',Fonte_PARAMETRE,None
214
215     def GetText(self):
216       """
217       Retourne le texte à afficher après le nom de la commande (ici après 'paramètre')
218       Ce texte est tronqué à 25 caractères
219       """
220       texte = repr(self.object)
221       texte = string.split(texte,'\n')[0]
222       if len(texte) < 25 :
223           return texte
224       else :
225           return texte[0:24]+'...'
226
227     def GetSubList(self):
228       """
229       Retourne la liste des fils de self
230       """
231       return []
232     
233 # ---------------------------------------------------------------------------
234 #       Méthodes permettant la modification et la lecture des attributs
235 #       du paramètre = API graphique du PARAMETRE pour Panel et EFICAS
236 # ---------------------------------------------------------------------------
237
238     def isvalid(self):
239       """
240       Indique si l'objet pointé par self est valide
241       """
242       return self.object.isvalid()
243     
244     def get_valeur(self):
245       """
246       Retourne une chaîne représentant la valeur de l'objet PARAMETRE
247       cad de l'objet class_eval.EVAL
248       """
249       return self.object.get_valeur() or ''
250
251     def get_nom(self):
252       """
253       Retourne le nom du paramètre
254       """
255       return self.object.get_nom()
256
257     def set_valeur(self,new_valeur):
258       """
259       Affecte new_valeur à l'objet PARAMETRE_EVAL
260       """
261       # on construit le texte de la nouvelle valeur
262       new_valeur = 'EVAL("""'+new_valeur+'""")'
263       # on affecte la nouvelle valeur à self.object
264       self.object.set_valeur(new_valeur)
265
266     def set_nom(self,new_nom):
267       """
268       Renomme le paramètre
269       """
270       self.object.set_nom(new_nom)
271
272     def get_fr(self):
273       """
274       Retourne le fr associé au paramètre, cad la bulle d'aide pour EFICAS
275       """
276       return "Définition d'un paramètre de type EVAL"
277
278     def verif_nom(self,nom):
279       """
280       Lance la vérification de validité du nom passé en argument
281       """
282       return self.object.verif_nom(nom = nom)
283
284     def verif_eval(self,valeur):
285       """
286       Lance la vérification de validité de l'expression EVAL passée en argument
287       """
288       return self.object.verif_eval(exp_eval = valeur)
289
290     def save_parametre_eval(self,new_nom,new_val):
291       """
292       Vérifie si (new_nom,new_val) définit bien un EVAL licite :
293           - si oui, stocke ces paramètres comme nouveaux paramètres de l'EVAL courant et retourne 1
294           - si non, laisse les paramètres anciens de EVAL inchangés et retourne 0
295       """
296       test,erreur = self.object.verif_parametre_eval(param=(new_nom,new_val))
297       if test :
298           # la formule est bien correcte : on sauve les nouveaux paramètres
299           self.object.update(param=(new_nom,new_val))
300       return test,erreur
301       
302 import Extensions.parametre_eval
303 treeitem =PARAM_EVALTreeItem
304 objet = Extensions.parametre_eval.PARAMETRE_EVAL