Salome HOME
*** empty log message ***
[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 from widgets import askopenfilename
36 from widgets import showinfo
37
38 from Noyau.N_CR import justify_text
39 from 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.3,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       bouton_add = Button(self.frame_boutons_fleches,
109                           image = images.get_image('arrow_left'),
110                           command = self.add_double_valeur_plusieurs_base)
111       bouton_sup = Button(self.frame_boutons_fleches,
112                           image = images.get_image('arrow_right'),
113                           command = self.sup_valeur_sans_into)
114       bouton_add.place(relx=0.3,rely=0.35)
115       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       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       bouton_annuler = Button(self.frame_boutons,
130                               text = 'Annuler',
131                               command = self.annule_modifs_valeur)
132       for but in (bouton_accepter,bouton_annuler):
133           but.pack(side='left',padx=5)
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       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       self.Liste_valeurs.put_liste(l1_valeurs)
240
241
242   def display_valeur(self,val=None):
243       """
244       Affiche la valeur passée en argument dans l'entry de saisie.
245       Par défaut affiche la valeur du mot-clé simple
246       Doit être redéfinie pour un pb avec les parametres dans un tuple
247       """
248       if not val :
249           valeur = self.node.item.object.getval()
250       else:
251           valeur = val
252       if not valeur : return
253
254       try:
255         affiche="("
256         separe=""
257         for val in valeur:
258             affiche=affiche+separe+str(val)
259             separe=","
260         affiche=affiche+")"
261         self.entry.delete(0,END)
262         self.entry.insert(0,affiche)
263       except :
264         self.entry.delete(0,END)
265
266 # Surcharge de select in file pour prendre en compte la saisie de tuple
267   def select_in_file(self):
268       """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
269       nom_fichier = askopenfilename(title="Choix fichier :")
270
271       if not nom_fichier:
272           return
273
274       try:
275           f = open(nom_fichier, "rb")
276           selection_texte = f.read()
277           f.close()
278           self.add_double_valeur_plusieurs_base = FenetreDeSelection(self,
279                                                   self.node.item,
280                                                   self.parent.appli,
281                                                   titre="Sélection de valeurs",
282                                                   texte=selection_texte,
283                                                   cardinal = self.nb_valeurs)
284       except:
285           traceback.print_exc()
286           showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
287