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
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 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 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,
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,
128 command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur_recolle(m,M))
129 bouton_annuler = Button(self.frame_boutons,
131 command = self.annule_modifs_valeur)
132 for but in (bouton_accepter,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)
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)
187 # et seulement d un tuple
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)
197 # c est la le cas normal
200 # on verifie la validite des valeurs sont correctes
201 valeur,validite=self.node.item.eval_valeur(saisie)
203 commentaire = "impossible d'évaluer : %s " %`doublevaleur_entree`
204 self.parent.appli.affiche_infos(commentaire)
207 # on verifie la validite de la liste
209 l1_valeurs = self.Liste_valeurs.get_liste()
210 for val in l1_valeurs :
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)
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)
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]))
233 l1_valeurs.insert(ligne,(valeur[0],valeur[1],valeur[2]))
235 if self.nb_valeurs==2:
236 l1_valeurs.append((valeur[0],valeur[1]))
238 l1_valeurs.append((valeur[0],valeur[1],valeur[2]))
240 while i < self.nb_valeurs :
241 self.set_valeur_texte(saisie[i])
243 self.Liste_valeurs.put_liste(l1_valeurs)
244 self.Liste_valeurs.affiche_liste()
247 def display_valeur(self,val=None):
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
254 valeur = self.node.item.object.getval()
257 if not valeur : return
263 affiche=affiche+separe+str(val)
266 self.entry.delete(0,END)
267 self.entry.insert(0,affiche)
269 self.entry.delete(0,END)
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 :")
280 f = open(nom_fichier, "rb")
281 selection_texte = f.read()
283 self.add_double_valeur_plusieurs_base = FenetreDeSelection(self,
286 titre="Sélection de valeurs",
287 texte=selection_texte,
288 cardinal = self.nb_valeurs)
290 traceback.print_exc()
291 showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)