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