]> SALOME platform Git repositories - tools/eficas.git/blob - Editeur/uniquesdcopanel.py
Salome HOME
PN : correction de bug mis en évidence par MACRO_PROJ_BASE
[tools/eficas.git] / Editeur / uniquesdcopanel.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 uniqueassdpanel import UNIQUE_ASSD_Panel
41
42
43 class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
44   """
45   Classe servant à définir le panneau correspondant à un mot-clé simple
46   qui attend une valeur unique de type dérivé d'ASSD ou non encore
47   existante (type CO(...) utilisé dans les macros uniquement)
48   """
49   def makeValeurPage(self,page):
50       """
51       Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une SD de type dérivé
52       d'ASSD
53       """
54       # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
55       # et de la liste des SD du bon type (constituant la liste des choix)
56       bulle_aide=self.get_bulle_aide()
57       aide=self.get_aide()
58       aide= justify_text(texte=aide)
59       liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
60       # Remplissage du panneau
61       self.frame_valeur = Frame(page)
62       self.frame_valeur.pack(fill='both',expand=1)
63       self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
64       self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
65       # affichage de la liste des SD existantes et du bon type
66       self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
67                                          items=liste_noms_sd,
68                                          labelpos='n',
69                                          label_text="Structures de données du type\n requis par l'objet courant :",
70                                          listbox_height = 6,
71                                          selectioncommand=self.select_valeur_from_list,
72                                          dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
73       self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
74       # affichage du bouton 'Nouveau concept'
75       self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ",
76                                  items = ('NON','OUI'),menubutton_width=10)
77       self.b_co.configure(command = lambda e,s=self : s.ask_new_concept())
78       self.b_co.place(relx=0.05,rely=0.6,anchor='w')
79       self.label_co = Label(self.frame_valeur,text='Nom du nouveau concept :')
80       self.entry_co = Entry(self.frame_valeur)
81       self.entry_co.bind('<Return>',self.valid_nom_concept_co)
82       # affichage du label de la structure de donnée choisie
83       self.l_resu = Label(self.frame_valeur,text='Structure de donnée choisie :')
84       self.valeur_choisie = StringVar()
85       self.label_valeur = Label(self.frame_valeur,textvariable=self.valeur_choisie)
86       self.frame_valeur.update()
87       self.aide = Label(self.frame_valeur,
88                         text = aide,
89                         wraplength=int(self.frame_valeur.winfo_width()*0.8),
90                         justify='center')
91       self.aide.place(relx=0.5,rely=0.85,anchor='n')
92       # affichage de la valeur courante
93       self.display_valeur()
94       
95   def get_bulle_aide(self):
96       """
97       Retourne la bulle d'aide du panneau
98       """
99       return """Double-cliquez sur la structure de donnée désirée
100       pour valoriser le mot-clé simple courant ou cliquez sur NOUVEAU CONCEPT pour
101       entrer le nom d'un concept non encore existant"""
102
103   def valid_valeur(self):
104       """
105       Teste si la valeur fournie par l'utilisateur est une valeur permise :
106       - si oui, l'enregistre
107       - si non, restaure l'ancienne valeur
108       """
109       if self.parent.modified == 'n' : self.parent.init_modif()
110       valeur = self.get_valeur()
111
112       self.erase_valeur()
113       anc_val = self.node.item.get_valeur()
114       test_CO=self.node.item.is_CO(anc_val)
115       #PN essai pour bug dans MACRO_PROJ_BASE 
116       valeur,validite=self.node.item.eval_valeur(valeur)
117       test = self.node.item.set_valeur(valeur)
118       if not test :
119           mess = "impossible d'évaluer : %s " %`valeur`
120           self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
121           return
122       #PN essai pour bug dans MACRO_PROJ_BASE 
123       #elif self.node.item.isvalid() :
124       elif validite: 
125           self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
126           if test_CO:
127              # il faut egalement propager la destruction de l'ancien concept
128              self.node.item.delete_valeur_co(valeur=anc_val)
129              # et on force le recalcul des concepts de sortie de l'etape
130              self.node.item.object.etape.get_type_produit(force=1)
131              # et le recalcul du contexte
132              self.node.item.object.etape.parent.reset_context()
133           self.node.parent.select()
134       else :
135           cr = self.node.item.get_cr()
136           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
137           self.reset_old_valeur(anc_val,mess=mess)
138           return
139       if self.node.item.get_position()=='global':
140           self.node.etape.verif_all()
141       elif self.node.item.get_position()=='global_jdc':
142           self.node.racine.verif_all()
143       else :
144           self.node.parent.verif()
145       self.node.update()
146
147   def valid_nom_concept_co(self,event=None):
148       """
149       Lit le nom donné par l'utilisateur au concept de type CO qui doit être
150       la valeur du MCS courant et stocke cette valeur
151       """
152       if self.parent.modified == 'n' : self.parent.init_modif()
153       anc_val = self.node.item.get_valeur()
154       nom_concept = self.entry_co.get()
155       test,mess=self.node.item.set_valeur_co(nom_concept)
156       if not test:
157           # On n'a pas pu créer le concept
158           self.parent.appli.affiche_infos(mess)
159           return
160       elif self.node.item.isvalid() :
161           self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
162           self.node.parent.select()
163       else :
164           cr = self.node.item.get_cr()
165           mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
166           self.reset_old_valeur(anc_val,mess=mess)
167           return
168       if self.node.item.get_position()=='global':
169           self.node.etape.verif_all()
170       elif self.node.item.get_position()=='global_jdc':
171           self.node.racine.verif_all()
172       else :
173           self.node.parent.verif()
174       if self.node.item.isvalid():
175           self.node.parent.select()
176       self.node.update()
177
178   def ask_new_concept(self):
179       """
180       Crée une entry dans le panneau d'un MCS qui attend un concept OU un CO() afin de
181       permettre à l'utilisateur de donner le nom du nouveau concept
182       """
183       new_concept = self.b_co.getcurselection()
184       if new_concept == 'OUI':
185           self.label_co.place(relx=0.05,rely=0.7)
186           self.entry_co.place(relx=0.45,rely=0.7,relwidth=0.25)
187           self.l_resu.place_forget()
188           self.label_valeur.place_forget()
189           self.entry_co.focus()
190       elif new_concept == 'NON':
191           # On est passe de OUI à NON, on supprime la valeur
192 # PN correction de bug (on passe de non a non et cela supprime la valeur)
193 # ajout du if de le ligne suivane
194           if self.node.item.is_CO():
195                 self.node.item.delete_valeur_co()
196                 self.record_valeur(name=None,mess="Suppression CO enregistrée")
197                 self.label_co.place_forget()
198                 self.entry_co.place_forget()
199                 self.l_resu.place(relx=0.05,rely=0.7)
200                 self.label_valeur.place(relx=0.45,rely=0.7)
201           
202   def display_valeur(self):
203       """
204       Affiche la valeur de l'objet pointé par self
205       """
206       valeur = self.node.item.get_valeur()
207       if valeur == None or valeur == '': 
208          self.valeur_choisie.set('')
209          return # pas de valeur à afficher ...
210       # il faut configurer le bouton si la valeur est un objet CO
211       # sinon afficher le nom du concept dans self.valeur_choisie
212       if self.node.item.is_CO():
213           self.b_co.invoke('OUI')
214           self.entry_co.insert(0,valeur.nom)
215       else:
216           self.valeur_choisie.set(valeur.nom)
217
218   def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
219       """
220       Enregistre  val comme valeur de self.node.item.object SANS faire de test de validité
221       """
222       if self.parent.modified == 'n' : self.parent.init_modif()
223       if name != None:
224           valeur =name
225       else :
226           self.entry_co.delete(0,END)
227           valeur= self.entry_co.get()
228       self.node.item.set_valeur_co(valeur)
229       self.parent.appli.affiche_infos(mess)
230       # On met a jour le display dans le panneau
231       self.display_valeur()
232       if self.node.item.get_position()=='global':
233           self.node.etape.verif_all()
234       elif self.node.item.get_position()=='global_jdc':
235           self.node.racine.verif_all()
236       else :
237           self.node.parent.verif()
238       if self.node.item.isvalid():
239           self.node.parent.select()
240       self.node.update()
241
242