Salome HOME
PN bug notation scientifique
[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       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