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
32 from widgets import ListeChoix
33 from widgets import FenetreDeSelection
34 from widgets import askopenfilename
35 from widgets import showinfo
37 from Noyau.N_CR import justify_text
38 from Editeur.utils import substract_list
39 from plusieursbasepanel import PLUSIEURS_BASE_Panel
42 class FONCTION_Panel(PLUSIEURS_BASE_Panel):
43 def makeValeurPage(self,page):
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
48 genea=self.node.item.get_genealogie()
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)
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.)
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)
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)")
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)
99 # Création d'un bouton "Importer ..." sur le panel.
100 bouton_valeurs_fichier = Button(self.frame_choix,
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
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,
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,
127 command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur_recolle(m,M))
128 self.bouton_annuler = Button(self.frame_boutons,
130 command = self.annule_modifs_valeur)
131 for but in (self.bouton_accepter,self.bouton_annuler):
132 but.pack(side='left',padx=4)
135 def afficheValeurListe(self,name):
136 self.display_valeur(name)
138 def decoupeListeValeurs(self,liste):
139 #decoupe la liste des valeurs en n ( les x puis les y)
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) :
147 t=(liste[i*nb], liste[i*nb+1])
149 t=(liste[i*nb], liste[i*nb+1], liste[i*nb+2])
154 def accepte_modifs_valeur_recolle(self,min,max):
156 l1_valeurs = self.Liste_valeurs.get_liste()
157 for val in l1_valeurs :
159 l_valeurs.append(item)
160 self.accepte_modifs_valeur(min,max,l_valeurs)
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()
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]
176 if (self.nb_valeurs==3):
177 val3=doublevaleur_entree.split(',')[2]
178 saisie=(val1,val2,val3)
179 self.entry.delete(0,END)
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)