Salome HOME
ajout pour accepter les accents sous python 2.3
[tools/eficas.git] / Editeur / fonctionpanel.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 # Modules Python
22 import string,types,os
23 from Tkinter import *
24 import Pmw
25 from copy import copy,deepcopy
26 import traceback
27
28 # Modules Eficas
29 import Objecttreeitem
30 import prefs
31 import panels
32 import images
33 from widgets import ListeChoix
34 from widgets import FenetreDeSelection
35
36 from Noyau.N_CR import justify_text
37 from utils import substract_list
38 from plusieursbasepanel import PLUSIEURS_BASE_Panel
39
40
41 class FONCTION_Panel(PLUSIEURS_BASE_Panel):
42   def makeValeurPage(self,page):
43       """
44       Crée la page de saisie d'une liste de valeurs à priori quelconques,
45       cad qui ne sont  pas à choisir dans une liste prédéfinie
46       """
47       genea=self.node.item.get_genealogie()
48       if "VALE" in genea:
49         self.nb_valeurs=2
50       if "VALE_C" in genea:
51         self.nb_valeurs=3
52       # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
53       # et la liste des valeurs déjà affectées à l'objet courant
54       bulle_aide=self.get_bulle_aide()
55       objet_mc = self.node.item.get_definition()
56       aide = self.get_aide()
57       aide = justify_text(texte=aide)
58       min,max = self.node.item.GetMinMax()
59       l_valeurs = self.node.item.GetListeValeurs()
60       l2_valeurs=self.decoupeListeValeurs(l_valeurs)
61
62       # création des frames globales
63       self.frame1 = Frame(page,relief='groove',bd=2)
64       self.frame2 = Frame(page)
65       self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
66       self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
67       self.frame_right = Frame(self.frame1)
68       self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
69
70       # création des frames internes
71       self.frame_valeurs = Frame(self.frame1)
72       self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
73       self.frame_boutons_fleches = Frame(self.frame_right)
74       self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
75       self.frame_choix = Frame(self.frame_right)
76       self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.5)
77       self.frame_aide = Frame(self.frame_right)
78       self.frame_aide.place(relx=0.1,rely=0.7,relwidth=0.8,relheight=0.3)
79       self.frame_boutons = Frame(self.frame2)
80       self.frame_boutons.place(relx=0.35,rely=0.,relwidth=0.3,relheight=1.)
81       for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
82                  self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
83           fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
84           fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
85
86       # création des objets dans les frames
87       liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
88                                  ("<Button-3>",self.deselectValeur),
89                                  ("<Double-Button-1>",self.afficheValeurListe))
90       self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l2_valeurs,liste_commandes = liste_commandes_valeurs,
91                                       titre="Valeur(s) actuelle(s)")
92
93       # Création de l'entry ou de la liste des SD
94       self.label = Label(self.frame_choix,text="Valeur :")
95       self.make_entry(frame = self.frame_choix,command = self.add_double_valeur_plusieurs_base)
96       self.label.place(relx=0.05,rely=0.5)
97
98       # Création d'un bouton "Importer ..." sur le panel.
99       bouton_valeurs_fichier = Button(self.frame_choix,
100                                       text="Importer ...",
101                                       command=self.select_in_file)
102       bouton_valeurs_fichier.place(relx=0.28,rely=0.7,relwidth=0.6)
103       self.ajout_valeurs = None
104
105       # boutons Ajouter et Supprimer
106       bouton_add = Button(self.frame_boutons_fleches,
107                           image = images.get_image('arrow_left'),
108                           command = self.add_double_valeur_plusieurs_base)
109       bouton_sup = Button(self.frame_boutons_fleches,
110                           image = images.get_image('arrow_right'),
111                           command = self.sup_valeur_sans_into)
112       bouton_add.place(relx=0.3,rely=0.35)
113       bouton_sup.place(relx=0.3,rely=0.65)
114       # affichage de l'aide
115       self.frame_aide.update()
116       self.aide = Label(self.frame_aide,
117                         text = aide,
118                         justify='center',
119                         anchor='center',
120                         wraplength=int(self.frame_aide.winfo_width()*0.8))
121       self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
122       self.Liste_valeurs.affiche_liste()
123       # boutons Accepter et Annuler
124       bouton_accepter = Button(self.frame_boutons,
125                                text='Valider',
126                                command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur_recolle(m,M))
127       bouton_annuler = Button(self.frame_boutons,
128                               text = 'Annuler',
129                               command = self.annule_modifs_valeur)
130       for but in (bouton_accepter,bouton_annuler):
131           but.pack(side='left',padx=5)
132
133
134   def afficheValeurListe(self,name):
135       self.display_valeur(name)
136
137   def decoupeListeValeurs(self,liste):
138       #decoupe la liste des valeurs en n ( les x puis les y)
139       nb=self.nb_valeurs
140       l_valeurs=[]
141       for i in range(len(liste)/nb) :
142           if (nb==2):
143               t=(liste[i*nb], liste[i*nb+1])
144           else:
145               t=(liste[i*nb], liste[i*nb+1], liste[i*nb+2])
146           l_valeurs.append(t)
147       return l_valeurs
148
149
150   def accepte_modifs_valeur_recolle(self,min,max):
151       l_valeurs=[]
152       l1_valeurs = self.Liste_valeurs.get_liste()
153       for val in l1_valeurs :
154           for item in val :
155              l_valeurs.append(item) 
156       self.accepte_modifs_valeur(min,max,l_valeurs)
157
158
159   def add_double_valeur_plusieurs_base(self):
160       # on verifie qu'il s agit bien d un tuple
161       # on enleve les parentheses eventuelles
162       #doublevaleur_entree,validite,commentaire=self.get_valeur_double()
163       doublevaleur_entree= self.entry.get()
164       try:
165         if doublevaleur_entree[0]=='(' :
166            doublevaleur_entree=doublevaleur_entree[1:-1]
167         if doublevaleur_entree[-1]==')' :
168            doublevaleur_entree=doublevaleur_entree[0:-2]
169         val1=doublevaleur_entree.split(',')[0] 
170         val2=doublevaleur_entree.split(',')[1] 
171         saisie=(val1,val2)
172         if (self.nb_valeurs==3):
173             val3=doublevaleur_entree.split(',')[2] 
174             saisie=(val1,val2,val3)
175       except :
176         commentaire = "%s n est pas un tuple de la forme (x,y)" %`doublevaleur_entree`
177         if (self.nb_valeurs==3):
178             commentaire = "%s n est pas un tuple de la forme (x,y,z)" %`doublevaleur_entree`
179         self.parent.appli.affiche_infos(commentaire)
180         return
181
182       # et seulement d un tuple
183       try:
184         val=doublevaleur_entree.split(',')[self.nb_valeurs]
185         commentaire = "%s n est pas un tuple de la forme (x,y)" %`doublevaleur_entree`
186         if (self.nb_valeurs==3):
187             commentaire = "%s n est pas un tuple de la forme (x,y,z)" %`doublevaleur_entree`
188         self.parent.appli.affiche_infos(commentaire)
189         self.parent.appli.affiche_infos(commentaire)
190         return
191       except :
192         # c est la le cas normal
193         pass
194
195       # on verifie la validite des valeurs sont correctes
196       valeur,validite=self.node.item.eval_valeur(saisie)
197       if not validite :
198         commentaire = "impossible d'évaluer : %s " %`doublevaleur_entree`
199         self.parent.appli.affiche_infos(commentaire)
200         return
201
202       # on verifie la validite de la liste
203       liste=[]
204       l1_valeurs = self.Liste_valeurs.get_liste()
205       for val in l1_valeurs :
206           for item in val :
207              liste.append(item) 
208       validite_liste=self.node.item.valide_liste_partielle(valeur[0],liste)
209       if not validite_liste:
210         commentaire = "impossible d'ajouter %s a la liste " %`doublevaleur_entree`
211         self.parent.appli.affiche_infos(commentaire)
212         return
213       # liste a deja ete modifiee par l appel precedent a valide_liste_partielle 
214       # et contient deja valeur[0]
215       validite_liste=self.node.item.valide_liste_partielle(valeur[1],liste)
216       if not validite_liste:
217         commentaire = "impossible d'ajouter %s a la liste " %`doublevaleur_entree`
218         self.parent.appli.affiche_infos(commentaire)
219         return
220      
221       # si une valeur est selectionnee on insere apres 
222       # sinon on ajoute la valeur à la fin
223       if (self.Liste_valeurs.selection != None):
224          ligne=self.Liste_valeurs.cherche_selected_item()
225          if self.nb_valeurs==2:
226             l1_valeurs.insert(ligne,(valeur[0],valeur[1]))
227          else :
228             l1_valeurs.insert(ligne,(valeur[0],valeur[1],valeur[2]))
229       else :
230          if self.nb_valeurs==2:
231             l1_valeurs.append((valeur[0],valeur[1]))
232          else :
233             l1_valeurs.append((valeur[0],valeur[1],valeur[2]))
234       self.Liste_valeurs.put_liste(l1_valeurs)
235
236
237   def display_valeur(self,val=None):
238       """
239       Affiche la valeur passée en argument dans l'entry de saisie.
240       Par défaut affiche la valeur du mot-clé simple
241       Doit être redéfinie pour un pb avec les parametres dans un tuple
242       """
243       if not val :
244           valeur = self.node.item.object.getval()
245       else:
246           valeur = val
247       if not valeur : return
248
249       try:
250         affiche="("
251         separe=""
252         for val in valeur:
253             print str(val)
254             affiche=affiche+separe+str(val)
255             separe=","
256         affiche=affiche+")"
257         self.entry.delete(0,END)
258         self.entry.insert(0,affiche)
259       except :
260         self.entry.delete(0,END)
261