]> SALOME platform Git repositories - tools/eficas.git/blob - Editeur/compoformule.py
Salome HOME
CCAR: creation V1_13a1 a partir de la branche Liv-V1_12
[tools/eficas.git] / Editeur / 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         self.object.state="modified"
290         if self.object.isvalid():
291           return "ast-green-square"
292         else:
293           return "ast-red-square"
294       else:
295         return "ast-white-text"
296
297     def GetLabelText(self):
298       """ Retourne 3 valeurs :
299       - le texte à afficher dans le noeud représentant l'item
300       - la fonte dans laquelle afficher ce texte
301       - la couleur du texte
302       """
303       if self.object.isactif():
304         # None --> fonte et couleur par défaut
305         return self.labeltext,None,None
306       else:
307         return self.labeltext,fontes.standard_italique,None
308     
309 # ---------------------------------------------------------------------------
310 #       Méthodes permettant la modification et la lecture des attributs
311 #       du paramètre = API graphique de la FORMULE pour Panel et EFICAS
312 # ---------------------------------------------------------------------------
313
314     def get_nom(self):
315       """
316       Retourne le nom de la FORMULE
317       """
318       return self.object.get_nom()
319
320     def get_type(self):
321       """
322       Retourne le type de la valeur retournée par la FORMULE
323       """
324       return self.object.type_retourne
325
326     def get_args(self):
327       """
328       Retourne les arguments de la FORMULE
329       """
330       args=""
331       for mot in self.object.mc_liste:
332           if mot.nom == 'NOM_PARA':
333              args=mot.valeur
334              break
335       if args :
336           if args[0] == "(" and args[-1] ==")":
337              args=args[1:-1]
338           # transforme en tuple si ce n est pas déjà le casa
339           try :
340              args=string.split(args,',')
341           except :
342              pass
343       return args
344
345     def get_corps(self):
346       """
347       Retourne le corps de la FORMULE
348       """
349       corps=""
350       for mot in self.object.mc_liste:
351           if mot.nom == 'VALE':
352              corps=mot.valeur
353              break
354       return corps
355
356
357     def get_liste_types_autorises(self):
358       """
359          Retourne la liste des types autorises pour les valeurs de sortie 
360          d'une FORMULE
361       """
362       return self.object.l_types_autorises
363
364     def save_formule(self,new_nom,new_typ,new_arg,new_exp):
365       """
366       Vérifie si (new_nom,new_typ,new_arg,new_exp) définit bien une FORMULE 
367       licite :
368           - si oui, stocke ces paramètres comme nouveaux paramètres de la 
369             FORMULE courante et retourne 1
370           - si non, laisse les paramètres anciens de la FORMULE inchangés et 
371             retourne 0
372       """
373       test,erreur = self.object.verif_formule_python(formule=(new_nom,new_typ,new_arg,
374                                                        new_exp))
375       if test :
376           # la formule est bien correcte : on sauve les nouveaux paramètres
377           test=self.object.update_formule_python(formule=(new_nom,new_typ,new_exp,new_arg))
378       return test,erreur
379
380 # ---------------------------------------------------------------------------
381 #          Accès aux méthodes de vérification de l'objet FORM_ETAPE
382 # ---------------------------------------------------------------------------
383
384     def verif_nom(self,nom):
385         """
386         Lance la vérification du nom passé en argument
387         """
388         return self.object.verif_nom(nom)
389
390     def verif_arguments(self,arguments):
391         """
392         Lance la vérification des arguments passés en argument
393         """
394         return self.object.verif_arguments('('+arguments+')')
395
396     def verif_formule(self,formule):
397         """
398         Lance la vérification de FORMULE passée en argument
399         """
400         return self.object.verif_formule(formule=formule)
401
402
403     def verif_formule_python(self,formule):
404         """
405         Lance la vérification de FORMULE passée en argument
406         """
407         return self.object.verif_formule_python(formule=formule)
408
409 import Accas
410 treeitem =FORMULETreeItem
411 objet = Accas.FORM_ETAPE