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