]> SALOME platform Git repositories - tools/eficas.git/blob - Editeur/plusieursbasepanel.py
Salome HOME
pour tenir compte de LASSD
[tools/eficas.git] / Editeur / plusieursbasepanel.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 showinfo
34 from widgets import askopenfilename
35 from widgets import ListeChoix
36 from widgets import FenetreDeSelection
37 from widgets import FenetreDeParametre
38
39 from Noyau.N_CR import justify_text
40 from Ihm.I_LASSD import LASSD
41 from Extensions.parametre import PARAMETRE
42
43 from utils import substract_list
44 from plusieurspanel import PLUSIEURS_Panel
45 from uniqueassdpanel import UNIQUE_ASSD_Panel
46
47 import fontes
48 import math
49
50 class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
51   """
52   Classe définissant le panel associé aux mots-clés qui demandent
53   à l'utilisateur de donner une liste de valeurs qui ne sont pas
54   à choisir dans une liste discrètes et qui sont de type de base :
55   entier, réel, string,...
56   """
57   def makeValeurPage(self,page):
58       """
59       Crée la page de saisie d'une liste de valeurs à priori quelconques,
60       cad qui ne sont  pas à choisir dans une liste prédéfinie
61       """
62       print "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
63       print "                                                  "
64       print "A priori on ne doit plus passer dans cette methode "
65       print "                                                  "
66       print "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
67       # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
68       # et la liste des valeurs déjà affectées à l'objet courant
69       #bulle_aide=self.get_bulle_aide()
70       #objet_mc = self.node.item.get_definition()
71       #aide = self.get_aide()
72       #aide = justify_text(texte=aide)
73       #min,max = self.node.item.GetMinMax()
74       #l_valeurs = self.node.item.GetListeValeurs()
75
76       # création des frames globales
77       #self.frame1 = Frame(page,relief='groove',bd=2)
78       #self.frame2 = Frame(page)
79       #self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
80       #self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
81       #self.frame_right = Frame(self.frame1)
82       #self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
83
84       # création des frames internes
85       #self.frame_valeurs = Frame(self.frame1)
86       #self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
87       #self.frame_boutons_fleches = Frame(self.frame_right)
88       #self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
89       #self.frame_choix = Frame(self.frame_right)
90       #self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.8)
91       #self.frame_aide = Frame(self.frame_right)
92       #self.frame_aide.place(relx=0.1,rely=0.8,relwidth=0.8,relheight=0.2)
93       #self.frame_boutons = Frame(self.frame2)
94       #self.frame_boutons.place(relx=0.35,rely=0.,relwidth=0.3,relheight=1.)
95       #for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
96       #           self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
97       #    fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
98       #    fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
99
100       # création des objets dans les frames
101       #liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
102       #                           ("<Button-3>",self.deselectValeur),
103       #                           ("<Double-Button-1>",self.sup_valeur_sans_into))
104       #self.Liste_valeurs=ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
105       #                                titre="Valeur(s) actuelle(s)")
106
107       # Création de l'entry ou de la liste des SD
108       # PN : pour ajouter les validators
109       #self.label = Label(self.frame_choix,text="Valeur :")
110       #self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
111       #self.label.place(relx=0.05,rely=0.2)
112
113       # Création d'un bouton "Importer ..." et d'un bouton "Paramatres" sur le panel.
114       #bouton_valeurs_fichier = Button(self.frame_choix,
115       #                                text="Importer",
116       #                                command=self.select_in_file)
117       #bouton_valeurs_fichier.place(relx=0.28,rely=0.4,relwidth=0.6)
118       #bouton_parametres = Button(self.frame_choix, text="Parametres", command=self.affiche_parametre)
119       #bouton_parametres.place(relx=0.28,rely=0.6,relwidth=0.6)
120       #self.ajout_valeurs = None
121
122       # boutons Ajouter et Supprimer
123       #bouton_add = Button(self.frame_boutons_fleches,
124       #                    image = images.get_image('arrow_left'),
125       #                    command = self.add_valeur_plusieurs_base)
126       #bouton_sup = Button(self.frame_boutons_fleches,
127       #                    image = images.get_image('arrow_right'),
128       #                    command = self.sup_valeur_sans_into)
129       #bouton_add.place(relx=0.3,rely=0.35)
130       #bouton_sup.place(relx=0.3,rely=0.65)
131       ## affichage de l'aide
132       #self.frame_aide.update()
133       #self.aide = Label(self.frame_aide,
134       #                  text = aide,
135       #                  justify='center',
136       #                  anchor='center',
137       #                 wraplength=int(self.frame_aide.winfo_width()*0.8))
138       #self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
139       #self.Liste_valeurs.affiche_liste()
140       #if len(l_valeurs) > 0 :
141       #    liste_marque=l_valeurs[-1]
142       #    self.Liste_valeurs.surligne(liste_marque)
143       # boutons Accepter et Annuler
144       #bouton_accepter = Button(self.frame_boutons,
145       #                         text='Valider',
146       #                         command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
147       #bouton_annuler = Button(self.frame_boutons,
148       #                        text = 'Annuler',
149       #                        command = self.annule_modifs_valeur)
150       #for but in (bouton_accepter,bouton_annuler):
151       #    but.pack(side='left',padx=4)
152
153   def affiche_parametre(self) :
154       if self.node.item.get_liste_param_possible() != [ ]:
155          txtparam=""
156          for param in self.node.item.get_liste_param_possible():
157             txtparam=txtparam+repr(param)+"\n"
158          if txtparam=="":
159             showerror("Aucun parametre ","Pas de parametre de ce type")
160          else :
161             try :
162                 self.self.fenetreparam.destroy()
163             except:
164                 pass
165             self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
166
167   def valid_valeur(self):
168       self.add_valeur_plusieurs_base()
169
170   def add_valeur_plusieurs_base(self,name=None):
171       if name != None :
172          valeur = name
173       else:
174          valeur,validite,commentaire=self.get_valeur()
175          if not validite :
176             self.parent.appli.affiche_infos(commentaire)
177             return
178
179       atraiter=[]
180       if type(valeur)  in (types.ListType,types.TupleType) :
181          indice = 0
182          while (indice < len(valeur)):
183             v=valeur[indice]
184             if self.node.item.wait_complex :
185                if (v== 'RI' or v == 'MP'):
186                   try :
187                      t=tuple([v,valeur[indice+1],valeur[indice+2]])
188                      atraiter.append(t)
189                      indice=indice+3
190                   except :
191                      validite=0
192                      commentaire = "Veuillez entrer le complexe sous forme aster ou sous forme python"
193                      self.parent.appli.affiche_infos(commentaire)
194                      return
195                else :     # ce n'est pas un tuple à la mode aster
196                   atraiter.append(v)
197                   indice = indice + 1
198             else:  # on n'attend pas un complexe
199               atraiter.append(v)
200               indice=indice+1
201       else:
202          atraiter.append(valeur)
203          
204       for valeur in atraiter :
205          encorevalide=self.node.item.valide_item(valeur)
206          # qdsjfkllllllllllllllllll
207          if encorevalide :
208             listecourante=self.Liste_valeurs.get_liste()
209             encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
210             if not encorevalide : encorevalide = -1
211          self.add_valeur_sans_into(valeur,encorevalide)
212     
213   def select_in_file(self):
214       """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
215       nom_fichier = askopenfilename(title="Choix fichier :")
216
217       if not nom_fichier:
218           return
219
220       try:
221           f = open(nom_fichier, "rb")
222           selection_texte = f.read()
223           f.close()
224           self.ajout_valeurs = FenetreDeSelection(self, 
225                                                   self.node.item,
226                                                   self.parent.appli,
227                                                   titre="Sélection de valeurs",
228                                                   texte=selection_texte)
229       except:
230           traceback.print_exc()
231           showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
232           
233   def get_bulle_aide(self):
234       """
235       Retourne l'aide associée au panneau courant
236       """
237       return """Taper dans la boîte de saisie de droite la valeur que
238       vous voulez affecter au mot-clé simple.
239       - Cliquez sur la flèche gauche ou pressez <Return> pour la faire glisser
240       dans la liste des valeurs que vous voulez affecter au mot-clé simple
241       - Un clic sur une valeur de la liste la sélectionne
242       - Un clic sur la flèche droite ou un double-clic retire la valeur
243       sélectionnée de la liste
244       - Cliquez sur 'Valider' pour que la nouvelle valeur désirée soit affectée
245       au mot-clé simple
246       - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
247       depuis le dernier clic sur 'Valider'"""
248
249   def get_aide(self):
250       """
251       Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
252       que saisit l'utilisateur
253       """
254       commentaire=""
255       mc = self.node.item.get_definition()
256       d_aides = { 'TXM' : 'chaînes de caractères',
257                   'R'   : 'réels',
258                   'I'   : 'entiers',
259                   'C'   : 'complexes'}
260       type = mc.type[0]
261       if not d_aides.has_key(type) : return 'Type de base inconnu'
262       if mc.min == mc.max:
263           commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min`  + " est attendue"
264       else :
265           commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
266
267       aideval=self.node.item.aide()
268       commentaire=commentaire +"\n"+aideval
269       return commentaire
270
271   def make_entry(self,frame,command,x=0.28,y=0.2):
272       """
273       Crée l'entry de saisie de la valeur souhaitée : distingue le
274       cas d'un complexe attendu, d'une autre valeur quelconque
275       """
276       print "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
277       print "                                                  "
278       print "A priori on ne doit plus passer dans cette methode "
279       print "                                                  "
280       print "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
281       #if self.node.item.wait_complex():
282       #    self.typ_cplx=StringVar()
283       #    self.typ_cplx.set('RI')
284       #    rb1 = Radiobutton(frame, text='RI',variable=self.typ_cplx,value='RI')
285       #    rb2 = Radiobutton(frame, text='MP',variable=self.typ_cplx,value='MP')
286       #    self.entry1 = Pmw.EntryField(frame,validate='real')
287       #    self.entry2 = Pmw.EntryField(frame,validate='real')
288       #    rb1.place(relx=0.05,rely = 0.4)
289       #    rb2.place(relx=0.05,rely = 0.6)
290       #    self.entry1.component('entry').bind("<Return>",lambda e,s=self:s.entry2.component('entry').focus)
291       #    self.entry2.component('entry').bind("<Return>",lambda e,c=command:c())
292       #    self.entry1.component('entry').bind("<KP_Enter>",lambda e,s=self:s.entry2.component('entry').focus)
293       #    self.entry2.component('entry').bind("<KP_Enter>",lambda e,c=command:c())
294       #    self.entry1.place(relx=0.27,rely = 0.5,relwidth=0.35)
295       #    self.entry2.place(relx=0.65,rely = 0.5,relwidth=0.35)
296       #    self.entry1.focus()
297       #else:
298       #    self.entry = Entry(frame,relief='sunken')
299       #    self.entry.place(relx=0.28,rely=0.2,relwidth=0.6)
300       #    self.entry.place(relx=0.28,rely=y,relwidth=0.6)
301       #    self.entry.bind("<Return>",lambda e,c=command:c())
302       #    self.entry.bind("<KP_Enter>",lambda e,c=command:c())
303       #    self.entry.focus()
304
305   def get_valeur(self):
306       """
307       Retourne la valeur saisie par l'utilisateur dans self.entry
308       """
309       commentaire = ""
310       if hasattr(self,'entry'):
311          # Traitement d'une entree unique
312          valeurentree = self.entry.get()
313          if (valeurentree == None or valeurentree ==""):
314             return None,0,""
315          if (valeurentree[0] != "(") and (valeurentree.find(',') < len(valeurentree)):
316             valeurs=[]
317             for v in valeurentree.split(','):
318               vsimple,validite=self.node.item.eval_valeur(v)
319               # Pn If ajoute  pour le panneau "double"
320               if isinstance(vsimple,LASSD) : 
321                  commentaire = "impossible de mélanger reels et liste prédéfinie"
322                  validite = 0
323                  break 
324               if validite :
325                  valeurs.append(vsimple)
326               else:
327                  commentaire = "impossible d'évaluer : %s " %`valeurentree`
328                  break
329             valeur=valeurs
330          else: 
331             valeur,validite=self.node.item.eval_valeur(valeurentree)
332          if not validite and commentaire == "":
333             commentaire = "impossible d'évaluer : %s " %`valeurentree`
334          return valeur,validite,commentaire
335       #else:
336       #   # Traitement d'une entree de type complexe
337       #   try:
338       #      valeur= (self.typ_cplx.get(),
339       #               string.atof(self.entry1.get()),
340       #               string.atof(self.entry2.get()))
341       #      return valeur,1,""
342       #   except:
343       #      #traceback.print_exc()
344       #      return None,0,"impossible d'évaluer la valeur d'entree"
345
346   def erase_valeur(self):
347       """
348       Efface la valeur donnée par l'utilisateur dans l'entry
349       """
350       if hasattr(self,'entry'):
351          self.entry.delete(0,END)
352       else:
353          self.typ_cplx.set('RI')
354          self.entry1.delete(0,END)
355          self.entry2.delete(0,END)
356
357         
358   def display_valeur(self,val=None):
359       """
360       Affiche la valeur passée en argument dans l'entry de saisie.
361       Par défaut affiche la valeur du mot-clé simple
362       """
363       if not val :
364           valeur = self.node.item.object.getval()
365       else:
366           valeur = val
367       if not valeur : return
368
369       if hasattr(self,'entry'):
370          # Traitement d'une entree unique
371          self.entry.delete(0,END)
372          self.entry.insert(0,str(valeur))
373       else:
374          # Traitement d'une entree de type complexe
375          typ_cplx,x1,x2=valeur
376          self.entry1.delete(0,END)
377          self.entry2.delete(0,END)
378          self.typ_cplx.set(typ_cplx)
379          self.entry1.setentry(x1)
380          self.entry2.setentry(x2)
381
382 class PLUSIEURS_BASE_OR_UNELISTE_Panel(PLUSIEURS_BASE_Panel,UNIQUE_ASSD_Panel):
383
384   def makeValeurPage(self,page):
385       """
386       Crée la page de saisie d'une liste de valeurs à priori quelconques,
387       cad qui ne sont  pas à choisir dans une liste prédéfinie
388       """
389       # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
390       # et la liste des valeurs déjà affectées à l'objet courant
391       bulle_aide=self.get_bulle_aide()
392       objet_mc = self.node.item.get_definition()
393       aide = self.get_aide()
394       aide = justify_text(texte=aide)
395       aide2 = self.get_aide2()
396       aide2 = justify_text(texte=aide2)
397       min,max = self.node.item.GetMinMax()
398       l_valeurs = self.node.item.GetListeValeurs()
399       for i in l_valeurs:
400          if isinstance(i,LASSD) :
401             affiche_entry=l_valeurs
402             l_valeurs=()
403
404       # Il faut traiter ici pour avoir le choix entre une liste
405       # deja constituee (listr8aster) ou manuelle
406
407       # création des frames globales
408       self.frame1 = Frame(page,relief='groove',bd=2)
409       self.frame2 = Frame(page)
410       self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.9)
411       self.frame2.place(relx=0.,rely=0.9,relwidth=1,relheight=0.1)
412
413       # création des frames internes dans frame1
414       self.frame_valeurs = Frame(self.frame1)
415       self.frame_valeurs.place(relx=0.02,rely=0.55,relwidth=0.35,relheight=0.45)
416       self.frame_haut = Frame(self.frame1)
417       self.frame_haut.place(relx=0.02,rely=0.02,relwidth=0.98,relheight=0.45)
418       self.frame_bas = Frame(self.frame1)
419       self.frame_bas.place(relx=0.37,rely=0.55,relwidth=0.63,relheight=0.45)
420
421       # création des frames internes dans frame_right
422       self.frame_fleches = Frame(self.frame_bas)
423       self.frame_fleches.place(relx=0.,rely=0.4,relwidth=0.2,relheight=0.5)
424       self.frame_choix = Frame(self.frame_bas)
425       self.frame_choix.place(relx=0.2,rely=0.1,relwidth=0.75,relheight=1)
426
427       # affichage de l'aide
428       self.aide = Label(self.frame_haut, text = aide, justify='center', anchor='center',)
429       self.aide.place(relx=0.72,rely=0.25,anchor='center',relwidth=1)
430       self.aide2 = Label(self.frame2, text = aide2,)
431       self.aide2.place(relx=0.4,rely=0.01,relwidth=0.6)
432
433       # Création d'un bouton "Importer ..." et d'un bouton "Parametres" sur le panel.
434       bouton_valeurs_fichier = Button(self.frame_choix,
435                                       text="Importer",
436                                       command=self.select_in_file)
437       bouton_valeurs_fichier.place(relx=0.28,rely=0.0,relwidth=0.6)
438       bouton_parametres = Button(self.frame_choix, text="Parametres", command=self.affiche_parametre)
439       bouton_parametres.place(relx=0.28,rely=0.25,relwidth=0.6)
440       self.ajout_valeurs = None
441
442
443       # Création de la liste des SD
444       liste_noms_sd = self.node.item.get_sd_avant_du_bon_type_pour_type_de_base()
445       liste_noms_sd = self.tri(liste_noms_sd)
446       self.listbox = Pmw.ScrolledListBox(self.frame_haut,
447                         items=liste_noms_sd,
448                 labelpos='n',
449                 #label_text="Structures de données du type\n requis parl'objet courant :",
450                 label_text="Listes du type\n requis parl'objet courant :",
451                 listbox_height = 6,
452                 dblclickcommand=lambda s=self,c=UNIQUE_ASSD_Panel.valid_valeur : s.choose_valeur_from_list(c))
453       self.listbox.place(relx=0.00,rely=0.00,relwidth=0.4)
454
455       # On eneleve le label pour gagner de la place 
456       #self.label = Label(self.frame_choix,text="Valeur :")
457       #self.label.place(relx=0.05,rely=0.85)
458       self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base,x=0.28,y=0.55)
459       
460       # boutons Ajouter et Supprimer
461       bouton_add = Button(self.frame_fleches, image = images.get_image('arrow_left'),
462                           command = self.add_valeur_plusieurs_base)
463       bouton_sup = Button(self.frame_fleches, image = images.get_image('arrow_right'),
464                           command = self.sup_valeur_sans_into)
465       bouton_add.place(relx=0.2,rely=0.25)
466       bouton_sup.place(relx=0.2,rely=0.70)
467
468
469       # boutons Accepter et Annuler dans frame2
470       bouton_accepter = Button(self.frame2, text='Valider',
471                                command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
472       bouton_annuler = Button(self.frame2, text = 'Annuler',
473                               command = self.annule_modifs_valeur)
474       for but in (bouton_accepter,bouton_annuler):
475           but.pack(side='left',padx=4)
476
477       # création des objets dans les frames
478       liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
479                                  ("<Button-3>",self.deselectValeur),
480                                  ("<Double-Button-1>",self.sup_valeur_sans_into))
481       self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,
482                                       liste_commandes = liste_commandes_valeurs,
483                                       titre="Valeur(s) non-prédéfinies(s)",
484                                       fonte_titre=None
485                                       )
486
487       for fram in (self.frame1,self.frame2,self.frame_bas,self.frame_haut,self.frame_valeurs,
488                  self.frame_fleches,self.frame_choix):
489           fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide: s.parent.appli.affiche_aide(e,a))
490           fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
491
492       self.Liste_valeurs.affiche_liste()
493       if len(l_valeurs) > 0 :
494           liste_marque=l_valeurs[-1]
495           self.Liste_valeurs.surligne(liste_marque)
496       
497   def get_aide(self):
498       """
499       Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
500       saisies par l'utilisateur
501       """
502       commentaire="Ce motclef accepte soit un nom de liste déja définie soit une liste manuelle de valeurs"
503       return commentaire
504
505   def get_aide2(self):
506       min,max = self.node.item.GetMinMax()
507       aideval=self.node.item.aide()
508       commentaire="min : " + str(min) + ", max : " + str(max)
509       aideval=commentaire + aideval
510       return aideval
511
512   def choose_valeur_from_list(self,command):
513       """
514       Affecte à valeur choisie la sélection courante dans la liste des choix proposés
515       Exécute command
516       """
517       self.Liste_valeurs.liste=[]
518       self.Liste_valeurs.affiche_liste()
519       if len(self.listbox.get()) == 0 : return
520       choix = self.listbox.getcurselection()[0]
521       d={}
522       d["valeurentree"]=choix
523       apply(command,(self,),d)
524      
525
526
527   def tri(self,liste_noms_sd):
528       a=(3+8j)
529       d_types = { 'TXM' : type('A'),
530                   'R'   : type(3.),
531                   'I'   : type(0),
532                   'C'   : type(a)}
533
534       # On enelve seulement ceux qu'on peut
535       # Sur certaines listes, il est possible qu'on ne 
536       # sache pas déterminer le type
537       listefinale=[]
538       typespossibles=self.node.item.object.definition.type
539       typecherche = None
540       for t in typespossibles:
541           if t in d_types.keys() :
542              typecherche = d_types[t]
543              break
544       for liste in liste_noms_sd:
545           valeur,validite=self.node.item.eval_valeur(liste)
546           for mc in valeur.etape.mc_liste :
547               try :
548                  if type(mc.valeur)  in (types.ListType,types.TupleType) :
549                     typeliste=type(mc.valeur[0])
550                  else :
551                     typeliste=type(mc.valeur)
552                  if type(mc.valeur[0]) == typecherche:
553                     listefinale.append(liste)
554               except:
555                  listefinale.append(liste)
556       return listefinale
557
558   def make_entry(self,frame,command,x=0.28,y=0.2):
559       self.entry = Entry(frame,relief='sunken')
560       self.entry.place(relx=0.28,rely=y,relwidth=0.6)
561       self.entry.bind("<Return>",lambda e,c=command:c())
562       self.entry.bind("<KP_Enter>",lambda e,c=command:c())
563       self.entry.focus()