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 showinfo
34 from widgets import askopenfilename
35 from widgets import ListeChoix
36 from widgets import FenetreDeSelection
37 from widgets import FenetreDeParametre
39 from Noyau.N_CR import justify_text
40 from Ihm.I_LASSD import LASSD
41 from Extensions.parametre import PARAMETRE
43 from utils import substract_list
44 from plusieurspanel import PLUSIEURS_Panel
45 from uniqueassdpanel import UNIQUE_ASSD_Panel
50 class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
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,...
57 def makeValeurPage(self,page):
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
62 print "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
64 print "A priori on ne doit plus passer dans cette methode "
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()
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.)
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)
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)")
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)
113 # Création d'un bouton "Importer ..." et d'un bouton "Paramatres" sur le panel.
114 #bouton_valeurs_fichier = Button(self.frame_choix,
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
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,
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,
146 # command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
147 #bouton_annuler = Button(self.frame_boutons,
149 # command = self.annule_modifs_valeur)
150 #for but in (bouton_accepter,bouton_annuler):
151 # but.pack(side='left',padx=4)
153 def affiche_parametre(self) :
154 if self.node.item.get_liste_param_possible() != [ ]:
156 for param in self.node.item.get_liste_param_possible():
157 txtparam=txtparam+repr(param)+"\n"
159 showerror("Aucun parametre ","Pas de parametre de ce type")
162 self.self.fenetreparam.destroy()
165 self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
167 def valid_valeur(self):
168 self.add_valeur_plusieurs_base()
170 def add_valeur_plusieurs_base(self,name=None):
174 valeur,validite,commentaire=self.get_valeur()
176 self.parent.appli.affiche_infos(commentaire)
180 if type(valeur) in (types.ListType,types.TupleType) :
182 while (indice < len(valeur)):
184 if self.node.item.wait_complex :
185 if (v== 'RI' or v == 'MP'):
187 t=tuple([v,valeur[indice+1],valeur[indice+2]])
192 commentaire = "Veuillez entrer le complexe sous forme aster ou sous forme python"
193 self.parent.appli.affiche_infos(commentaire)
195 else : # ce n'est pas un tuple à la mode aster
198 else: # on n'attend pas un complexe
202 atraiter.append(valeur)
204 for valeur in atraiter :
205 encorevalide=self.node.item.valide_item(valeur)
206 # qdsjfkllllllllllllllllll
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)
213 def select_in_file(self):
214 """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
215 nom_fichier = askopenfilename(title="Choix fichier :")
221 f = open(nom_fichier, "rb")
222 selection_texte = f.read()
224 self.ajout_valeurs = FenetreDeSelection(self,
227 titre="Sélection de valeurs",
228 texte=selection_texte)
230 traceback.print_exc()
231 showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
233 def get_bulle_aide(self):
235 Retourne l'aide associée au panneau courant
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
246 - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
247 depuis le dernier clic sur 'Valider'"""
251 Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
252 que saisit l'utilisateur
255 mc = self.node.item.get_definition()
256 d_aides = { 'TXM' : 'chaînes de caractères',
261 if not d_aides.has_key(type) : return 'Type de base inconnu'
263 commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min` + " est attendue"
265 commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
267 aideval=self.node.item.aide()
268 commentaire=commentaire +"\n"+aideval
271 def make_entry(self,frame,command,x=0.28,y=0.2):
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
276 print "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
278 print "A priori on ne doit plus passer dans cette methode "
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()
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())
305 def get_valeur(self):
307 Retourne la valeur saisie par l'utilisateur dans self.entry
310 if hasattr(self,'entry'):
311 # Traitement d'une entree unique
312 valeurentree = self.entry.get()
313 if (valeurentree == None or valeurentree ==""):
315 if (valeurentree[0] != "(") and (valeurentree.find(',') < len(valeurentree)):
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"
325 valeurs.append(vsimple)
327 commentaire = "impossible d'évaluer : %s " %`valeurentree`
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
336 # # Traitement d'une entree de type complexe
338 # valeur= (self.typ_cplx.get(),
339 # string.atof(self.entry1.get()),
340 # string.atof(self.entry2.get()))
343 # #traceback.print_exc()
344 # return None,0,"impossible d'évaluer la valeur d'entree"
346 def erase_valeur(self):
348 Efface la valeur donnée par l'utilisateur dans l'entry
350 if hasattr(self,'entry'):
351 self.entry.delete(0,END)
353 self.typ_cplx.set('RI')
354 self.entry1.delete(0,END)
355 self.entry2.delete(0,END)
358 def display_valeur(self,val=None):
360 Affiche la valeur passée en argument dans l'entry de saisie.
361 Par défaut affiche la valeur du mot-clé simple
364 valeur = self.node.item.object.getval()
367 if not valeur : return
369 if hasattr(self,'entry'):
370 # Traitement d'une entree unique
371 self.entry.delete(0,END)
372 self.entry.insert(0,str(valeur))
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)
382 class PLUSIEURS_BASE_OR_UNELISTE_Panel(PLUSIEURS_BASE_Panel,UNIQUE_ASSD_Panel):
384 def makeValeurPage(self,page):
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
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()
400 if isinstance(i,LASSD) :
401 affiche_entry=l_valeurs
404 # Il faut traiter ici pour avoir le choix entre une liste
405 # deja constituee (listr8aster) ou manuelle
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)
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)
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)
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)
433 # Création d'un bouton "Importer ..." et d'un bouton "Parametres" sur le panel.
434 bouton_valeurs_fichier = Button(self.frame_choix,
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
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,
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 :",
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)
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)
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)
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)
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)",
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)
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)
499 Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
500 saisies par l'utilisateur
502 commentaire="Ce motclef accepte soit un nom de liste déja définie soit une liste manuelle de valeurs"
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
512 def choose_valeur_from_list(self,command):
514 Affecte à valeur choisie la sélection courante dans la liste des choix proposés
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]
522 d["valeurentree"]=choix
523 apply(command,(self,),d)
527 def tri(self,liste_noms_sd):
529 d_types = { 'TXM' : type('A'),
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
538 typespossibles=self.node.item.object.definition.type
540 for t in typespossibles:
541 if t in d_types.keys() :
542 typecherche = d_types[t]
544 for liste in liste_noms_sd:
545 valeur,validite=self.node.item.eval_valeur(liste)
546 for mc in valeur.etape.mc_liste :
548 if type(mc.valeur) in (types.ListType,types.TupleType) :
549 typeliste=type(mc.valeur[0])
551 typeliste=type(mc.valeur)
552 if type(mc.valeur[0]) == typecherche:
553 listefinale.append(liste)
555 listefinale.append(liste)
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())