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