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.
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.
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.
20 # ======================================================================
22 import string,types,os
25 from copy import copy,deepcopy
29 from Editeur import Objecttreeitem
33 from widgets import ListeChoix
34 from widgets import FenetreDeSelection
35 from widgets import askopenfilename
36 from widgets import showinfo
38 from Noyau.N_CR import justify_text
39 from Editeur.utils import substract_list
40 from plusieursbasepanel import PLUSIEURS_BASE_Panel
43 class FONCTION_Panel(PLUSIEURS_BASE_Panel):
44 def makeValeurPage(self,page):
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
49 genea=self.node.item.get_genealogie()
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)
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.)
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)
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)")
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)
100 # Création d'un bouton "Importer ..." sur le panel.
101 bouton_valeurs_fichier = Button(self.frame_choix,
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
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,
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,
128 command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur_recolle(m,M))
129 self.bouton_annuler = Button(self.frame_boutons,
131 command = self.annule_modifs_valeur)
132 for but in (self.bouton_accepter,self.bouton_annuler):
133 but.pack(side='left',padx=4)
136 def afficheValeurListe(self,name):
137 self.display_valeur(name)
139 def decoupeListeValeurs(self,liste):
140 #decoupe la liste des valeurs en n ( les x puis les y)
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) :
148 t=(liste[i*nb], liste[i*nb+1])
150 t=(liste[i*nb], liste[i*nb+1], liste[i*nb+2])
155 def accepte_modifs_valeur_recolle(self,min,max):
157 l1_valeurs = self.Liste_valeurs.get_liste()
158 for val in l1_valeurs :
160 l_valeurs.append(item)
161 self.accepte_modifs_valeur(min,max,l_valeurs)
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()
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]
177 if (self.nb_valeurs==3):
178 val3=doublevaleur_entree.split(',')[2]
179 saisie=(val1,val2,val3)
180 self.entry.delete(0,END)
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)
188 # et seulement d un tuple
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)
198 # c est la le cas normal
201 # on verifie la validite des valeurs sont correctes
202 valeur,validite=self.node.item.eval_valeur(saisie)
204 commentaire = "impossible d'évaluer : %s " %`doublevaleur_entree`
205 self.parent.appli.affiche_infos(commentaire)
208 # on verifie la validite de la liste
210 l1_valeurs = self.Liste_valeurs.get_liste()
211 for val in l1_valeurs :
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)
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)
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]))
234 l1_valeurs.insert(ligne,(valeur[0],valeur[1],valeur[2]))
236 if self.nb_valeurs==2:
237 l1_valeurs.append((valeur[0],valeur[1]))
239 l1_valeurs.append((valeur[0],valeur[1],valeur[2]))
241 while i < self.nb_valeurs :
242 self.set_valeur_texte(saisie[i])
244 self.Liste_valeurs.put_liste(l1_valeurs)
245 self.Liste_valeurs.affiche_liste()
248 def display_valeur(self,val=None):
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
255 valeur = self.node.item.object.getval()
258 if not valeur : return
264 affiche=affiche+separe+str(val)
267 self.entry.delete(0,END)
268 self.entry.insert(0,affiche)
270 self.entry.delete(0,END)
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 :")
281 f = open(nom_fichier, "rb")
282 selection_texte = f.read()
284 self.add_double_valeur_plusieurs_base = FenetreDeSelection(self,
287 titre="Sélection de valeurs",
288 texte=selection_texte,
289 cardinal = self.nb_valeurs)
291 traceback.print_exc()
292 showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)