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