Salome HOME
PN : pour visualisation des geométries + correction de bug
[tools/eficas.git] / Editeur / plusieursassdpanel.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 ListeChoix
34 from widgets import FenetreDeSelection
35
36 from Noyau.N_CR import justify_text
37 from utils import substract_list
38
39 # Import des panels
40 from plusieurspanel import PLUSIEURS_Panel 
41
42 class PLUSIEURS_ASSD_Panel(PLUSIEURS_Panel):
43   """
44   Classe définissant le panel associé aux mots-clés qui demandent
45   à l'utilisateur de donner une liste de valeurs qui ne sont pas
46   à choisir dans une liste discrètes et qui sont de type dérivé d'ASSD
47   """
48   def makeValeurPage(self,page):
49       """
50       Génère la page de saisie de plusieurs noms de SD parmi un ensemble discret
51       de SD possibles, cad d'un type cohérent avec les types attendus par le mot-clé simple
52       """
53       # On récupère la bulle d'aide du panneau, l'objet, l'aide, min et max (cardinalité de la liste),
54       # la liste des valeurs déjà affectées à l'objet courant et la liste des SD du bon type
55       bulle_aide=self.get_bulle_aide()
56       self.ajout_valeurs=None
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       l_choix=self.node.item.get_sd_avant_du_bon_type()
63       l_choix.sort()
64       # remplissage du panneau
65       self.frame_valeurs = Frame(page)
66       self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
67       self.frame_boutons_fleches = Frame(page)
68       self.frame_boutons_fleches.place(relx=0.4,rely=0.,relwidth=0.2,relheight=0.7)
69       self.frame_choix = Frame(page)
70       self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
71       self.frame_boutons = Frame(page)
72       self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=0.3,relheight=0.1)
73       liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
74                                  ("<Button-3>",self.deselectValeur),
75                                  ("<Double-Button-1>",self.sup_valeur_sans_into))
76       liste_commandes_choix = (("<Button-1>",self.selectChoix),
77                                ("<Button-3>",self.deselectChoix),
78       #                         ("<Double-Button-1>",self.add_valeur_sans_into))
79                                ("<Double-Button-1>",self.add_eval_valeur_sans_into))
80       self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
81                                       titre="Valeur(s) actuelle(s)")
82       self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,liste_commandes = liste_commandes_choix,
83                                     titre= "Valeurs possibles")
84       bouton_add = Button(self.frame_boutons_fleches,
85                           #text="<--",
86                           image = images.get_image('arrow_left'),
87       #                    command = self.add_valeur_sans_into)
88                           command = self.add_eval_valeur_sans_into)
89       bouton_sup = Button(self.frame_boutons_fleches,
90                           #text="-->",
91                           image = images.get_image('arrow_right'),
92                           command = self.sup_valeur_sans_into)
93       bouton_accepter = Button(self.frame_boutons,
94                                text='Valider',
95                                command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
96       bouton_annuler = Button(self.frame_boutons,
97                               text = 'Annuler',
98                               command = self.annule_modifs_valeur)
99       bouton_add.place(relx=0.3,rely=0.35)
100       bouton_sup.place(relx=0.3,rely=0.65)
101       for but in (bouton_accepter,bouton_annuler):
102           but.pack(side='left',padx=5)
103       self.Liste_valeurs.affiche_liste()
104       if len(l_valeurs) > 0 :
105           liste_marque=l_valeurs[-1]
106           self.Liste_valeurs.surligne(liste_marque)
107       self.Liste_choix.affiche_liste()
108       for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
109           fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
110           fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
111   
112   def add_eval_valeur_sans_into(self,valeurentree=None):
113       if valeurentree == None:
114          valeurentree = self.get_valeur()
115       valeur,validite=self.node.item.eval_valeur(valeurentree)
116       if not validite :
117          commentaire = "impossible d'évaluer : %s " %`valeurentree`
118          self.parent.appli.affiche_infos(commentaire)
119          return
120       self.add_valeur_sans_into(valeur)
121
122   def get_bulle_aide(self):
123       """
124       Retourne la bulle d'aide associée au panneau
125       """
126       return """Un clic sur une valeur des deux listes la sélectionne.
127       - Un clic sur la flèche gauche stocke la valeur possible sélectionnée
128       dans la liste des valeurs que vous voulez affecter au mot-clé simple
129       - Un clic sur la flèche droite déstocke la valeur du mot-clé simple
130       sélectionnée (elle apparaît alors à nouveau comme choix possible
131       dans la liste des choix à droite)
132       - Cliquez sur 'Valider' pour affecter la liste des valeurs sélectionnées
133       au mot-clé simple courant
134       - Cliquez sur 'Annuler' pour restaurer la valeur du mot-clé simple
135       avant toute modification depuis le dernier 'Valider'"""
136
137   def get_aide(self):
138       """
139       Retourne la phrase d'aide indiquant de quel type doivent être les
140       valeurs que doit entrer l'utilisateur
141       """
142       commentaire=""
143       mc = self.node.item.get_definition()
144       type = mc.type[0].__name__  
145       if len(mc.type)>1 :
146           for typ in mc.type[1:] :
147               type = type + ' ou '+typ.__name__
148       if mc.min == mc.max:
149         commentaire="Une liste de "+`mc.min`+" objets de type "+type+" est attendue"
150       else :
151         commentaire="Une liste d'objets de type "+type+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
152       aideval=self.node.item.aide()
153       commentaire=commentaire +"\n"+ aideval
154       return commentaire
155
156     
157   def sup_valeur(self,name=None):
158       """
159       Supprime la valeur selectionnée de la liste des valeurs et la rajoute
160       à la liste des choix possibles
161       """
162       liste_valeurs = self.Liste_valeurs.get_liste()
163       liste_valeurs.remove(self.selected_valeur)
164       liste_choix = self.node.item.get_definition().into
165       liste_choix = substract_list(liste_choix,liste_valeurs)
166       self.Liste_valeurs.put_liste(liste_valeurs)
167       self.Liste_choix.put_liste(liste_choix)
168       self.selected_valeur = None      
169     
170   def erase_valeur(self):
171       pass
172
173   def get_valeur(self):
174       """
175       Retourne la valeur sélectionnée dans la liste des choix
176       """
177       return self.selected_choix
178
179   def display_valeur(self,val=None):
180       """
181          Affiche la valeur passée en argument dans l'entry de saisie.
182          Par défaut affiche la valeur du mot-clé simple
183       """
184       # Il n'y a pas d'entry pour ce type de panneau
185       return
186
187