Salome HOME
PN : print enleve
[tools/eficas.git] / Editeur / panelsSalome.py
1 print "Import de panelsSalome"
2
3 from Tkinter import *
4 from widgets import ListeChoix
5 from widgets import showerror
6
7 from fonctionpanel      import FONCTION_Panel
8 from shellpanel         import SHELLPanel
9 from plusieursintopanel import PLUSIEURS_INTO_Panel
10 from plusieursassdpanel import PLUSIEURS_ASSD_Panel
11 from plusieursbasepanel import PLUSIEURS_BASE_Panel
12 from uniquesdcopanel    import UNIQUE_SDCO_Panel
13 from uniqueassdpanel    import UNIQUE_ASSD_Panel
14 from uniqueintopanel    import UNIQUE_INTO_Panel
15 from uniquecomppanel    import UNIQUE_COMP_Panel
16 from uniquebasepanel    import UNIQUE_BASE_Panel
17
18 from Noyau.N_CR import justify_text
19
20 import traceback
21 import SalomePyQt
22 import salome
23 import images
24 import SMESH_utils
25 sgQt=SalomePyQt.SalomePyQt()
26
27
28
29 # 2 types de commandes vont etre particularisees dans Salome
30 #
31 # - un cas general : 
32 # Toutes les commandes possedant GROUP_NO ou GROUP_MA
33 # seront surchargees d office
34 # pour cela on va utiliser le dictionnaire dict_classes_salome
35 # qui va permettre de changer la classe de la commande
36 # ainsi si un panel en dehors de salome a pour classe PLUSIEURS_BASE_Panel
37 # la classe de ce panel devient alors SALOME_PLUSIEURS_BASE_Panel
38 # (pour cela voir composimp)
39
40 # des commandes "autres" ne pouvant pas etre identifiées par leur nom 
41 # il suffit de creer dans la classe SALOME de la commande
42 # une fonction portant son nom 
43 # Exemple de particularisation d un panel :
44 # Supposons que l on veuille particulariser la commande
45 #       - LIRE_MAILLAGE_UNITE 
46 # le panel initial a pour classe UNIQUE_BASE_Panel
47 # il suffit d'ajouter dans la classe derivée SALOME_UNIQUE_BASE_Panel
48 # une fonction  SALOME_LIRE_MAILLAGE_UNITE
49 # la classe de ce panel devient alors SALOME_UNIQUE_BASE_Panel
50 # on peut surcharger les methodes nécessaires (affichage par exemple)  
51
52
53 class SALOME_SHELLPanel (SHELLPanel):
54         ""
55
56 class SALOME_FONCTION_Panel (FONCTION_Panel):
57         ""
58
59 class SALOME_PLUSIEURS_INTO_Panel (PLUSIEURS_INTO_Panel):
60         ""
61
62 class SALOME_PLUSIEURS_ASSD_Panel (PLUSIEURS_ASSD_Panel):
63         ""
64
65 class SALOME_UNIQUE_INTO_Panel (UNIQUE_INTO_Panel):
66         ""
67
68 class SALOME_UNIQUE_SDCO_Panel (UNIQUE_SDCO_Panel):
69         ""
70
71 class SALOME_UNIQUE_ASSD_Panel (UNIQUE_ASSD_Panel):
72         ""
73
74 class SALOME_UNIQUE_COMP_Panel (UNIQUE_COMP_Panel):
75         ""
76
77 # ------------------------------------------------------------------------------#
78 # classe SALOME_PLUSIEURS_BASE_Panel
79 #
80 # Commandes modifiées  :  
81 #       - AFFE_CHAR_MECA_DDL_IMPO_GROUP_NO
82 # Methodes surchargées :  
83 #       - makeValeurPage(self,page)
84 #
85 # ------------------------------------------------------------------------------#
86
87 class SALOME_PLUSIEURS_BASE_Panel(PLUSIEURS_BASE_Panel):
88
89
90   def convertit_group_no_from_salome(self,liste_in):
91       newr=[]
92       try:
93           print liste_in
94           for entree in liste_in :
95                travail=[]
96                travail.append(entree)
97                entryname_list=SMESH_utils.entryToName(salome.myStudy,travail)
98                entreeName=entryname_list[0]
99                if dict_geom_numgroupe.has_key(entreeName):
100                    r=dict_geom_numgroupe[entreeName]
101                else:
102                    r=SMESH_utils.getAsterGroupNo(salome.myStudy,travail)
103                    dict_geom_numgroupe[entreeName]=r
104                for i in r :
105                    newr.append(i)
106       except:
107            print "pas de groupe de noeuds associé"
108            showerror("Pas de groupe associé","Cet Objet ne peut pas être défini comme un ensemble de groupe de noeuds")
109       return newr
110
111   def convertit_group_maille_from_salome(self,liste_in):
112       newr=[]
113       try:
114           print liste_in
115           for entree in liste_in :
116                travail=[]
117                travail.append(entree)
118                entryname_list=SMESH_utils.entryToName(salome.myStudy,travail)
119                entreeName=entryname_list[0]
120                if dict_geom_numgroupe.has_key(entreeName):
121                    r=dict_geom_numgroupe[entreeName]
122                else:
123                    r=SMESH_utils.getAsterGroupMa(salome.myStudy,travail)
124                    dict_geom_numgroupe[entreeName]=r
125                for i in r :
126                    newr.append(i)
127       except:
128            print "pas de groupe de maille associé"
129            showerror("Pas de groupe associé","Cet Objet ne peut pas être défini comme un ensemble de groupe de maille")
130       return newr
131
132   def convertit_entrees_en_valeurs(self,entrychaine):
133       if SALOME_PLUSIEURS_BASE_Panel.__dict__.has_key(self.clef_fonction):
134            valeur=apply(SALOME_PLUSIEURS_BASE_Panel.__dict__[self.clef_fonction],(self,entrychaine))
135       else :
136            if self.clef_fonction.find("GROUP_NO") != -1 :
137                valeur=self.convertit_group_no_from_salome(entrychaine)
138            else :
139                if self.clef_fonction.find("GROUP_MA") != -1 :
140                    valeur=self.convertit_group_maille_from_salome(entrychaine)
141                else :
142                     print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
143                     print "Pb pas de fonction de conversion de la valeur Salome en valeur Aster"
144                     print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
145                     valeur=[]
146       print "VALEUR", valeur
147       return valeur
148
149   def sup_valeur_from_salome(self,name=None):
150       """
151       Méthode qui sert à retirer de la liste des valeurs la valeur sélectionnée
152       """
153       liste_valeurs = self.Liste_valeurs.get_liste()
154       liste_valeurs_salome=self.Liste_valeurs_salome.get_liste()
155       entrychaine=salome.sg.getAllSelected()
156
157       try:
158           valeur = self.convertit_entrees_en_valeurs(entrychaine)
159           for i in valeur :
160             if i in liste_valeurs :
161                 liste_valeurs.remove(i)
162                 print "enleve" , i
163       except:
164           # la valeur sélectionnée n'est pas dans la liste
165           pass
166
167       entryname_list=SMESH_utils.entryToName(salome.myStudy,entrychaine)
168       print  entryname_list
169       self.entrygroupe.delete(0,END)
170       self.sortie.delete(0,END)
171       for entryname in entryname_list:
172           try:
173              liste_valeurs_salome.remove(entryname)
174           except:
175              print "la valeur ", entryname, "n est pas dans la liste"
176           entryname=entryname + " "
177           self.sortie.insert(0,entryname)
178       self.selected_valeur = None
179       self.Liste_valeurs.put_liste(liste_valeurs)
180       self.Liste_valeurs_salome.put_liste(liste_valeurs_salome)
181       self.recalcule()
182
183   def recalcule(self):
184       liste_valeurs_salome=self.Liste_valeurs_salome.get_liste()
185       groups={}
186       liste_valeurs = self.Liste_valeurs.get_liste()
187       for valeur in liste_valeurs_salome:
188           r=dict_geom_numgroupe[valeur]
189           for i in r :
190               if i not in liste_valeurs :
191                   liste_valeurs.append(i)
192       self.Liste_valeurs.put_liste(liste_valeurs)
193
194   def add_valeur_from_salome(self,name=None):
195        entrychaine=salome.sg.getAllSelected()
196        self.sortie.delete(0,END)
197        self.entrygroupe.delete(0,END)
198        if entrychaine != '':
199           entryname_list=SMESH_utils.entryToName(salome.myStudy,entrychaine)
200           touteslesvaleurs = self.convertit_entrees_en_valeurs(entrychaine)
201          
202           valeur=[]
203           liste_valeurs  = self.Liste_valeurs.get_liste()
204           for i in touteslesvaleurs:
205               if i not in liste_valeurs:
206                  valeur.append(i)
207               
208           print valeur
209           if valeur==[]:
210              entryname_list=[]
211
212           liste_valeurs_salome = self.Liste_valeurs_salome.get_liste()
213           for entryname in entryname_list:
214               if entryname not in liste_valeurs_salome: 
215                  liste_valeurs_salome.append(entryname)
216               entryname=entryname + " "
217               self.entrygroupe.insert(0,entryname)
218           self.Liste_valeurs_salome.put_liste(liste_valeurs_salome)
219
220           if self.node.item.wait_reel():
221              print "wait_reel()"
222              valeur = self.traite_reel(valeur)
223           if self.node.item.wait_geom():
224              print "wait_geom()"
225              val,test1 = valeur,1
226           else:
227              print "else wait"
228              val,test1 = self.node.item.object.eval_valeur(valeur)
229
230           if test1 :
231              test2 = self.node.item.object.verif_type(val)
232              if test2 :
233                  liste_valeurs = self.Liste_valeurs.get_liste()
234                  if len(liste_valeurs) >= max :
235                      self.parent.appli.affiche_infos("La liste a déjà atteint le nombre maximum d'éléments, ajout refusé")
236                      self.erase_valeur()
237                      return
238                  if type(val) == type([]):
239                    for groupe in val:
240                      liste_valeurs.append(groupe)
241                  else:
242                    liste_valeurs.append(val)
243                  self.Liste_valeurs.put_liste(liste_valeurs)
244                  self.parent.appli.affiche_infos("Nouvelle valeur acceptée")
245              else:
246                  self.parent.appli.affiche_infos("Valeur incorrecte : ajout à la liste refusé")
247           else:
248              print "impossible d'évaluer %s" %val
249              self.parent.appli.affiche_infos("Valeur incorrecte : ajout à la liste refusé")
250
251    
252   def makeValeurPage(self,page):
253       """
254       Crée la page de saisie d'une liste de valeurs à priori quelconques,
255       cad qui ne sont  pas à choisir dans une liste prédéfinie
256       """
257       # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
258       # et la liste des valeurs déjà affectées à l'objet courant
259       bulle_aide=self.get_bulle_aide()
260       objet_mc = self.node.item.get_definition()
261       aide = self.get_aide()
262       aide = justify_text(texte=aide)
263       min,max = self.node.item.GetMinMax()
264       self.clef_fonction=  self.node.item.clef_fonction
265       l_valeurs = self.node.item.GetListeValeurs()
266
267       self.frame1 = Frame(page,relief='groove',bd=2)
268       self.frame2 = Frame(page)
269       self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
270       self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
271       self.frame_right = Frame(self.frame1)
272       self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
273
274       # création des frames internes
275       self.frame_valeurs = Frame(self.frame1)
276       self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
277
278       self.frame_boutons_fleches = Frame(self.frame_right)
279       self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.3)
280       self.frame_choix = Frame(self.frame_right)
281       self.frame_choix.place(relx=0.2,rely=0.1,relwidth=0.85,relheight=0.9)
282       self.frame_valeurs_salome = Frame(self.frame_right)
283       self.frame_valeurs_salome.place(relx=0.02,rely=0.7,relwidth=0.9,relheight=0.3)
284
285       self.frame_boutons = Frame(self.frame2)
286       self.frame_boutons.place(relx=0.1,rely=0.,relwidth=0.5,relheight=1.)
287       self.frame_aide = Frame(self.frame2)
288       self.frame_aide.place(relx=0.6,rely=0.,relwidth=0.5,relheight=1)
289
290       for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
291                  self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
292             fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
293             fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
294
295       # création des objets dans les frames
296       liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
297                                  ("<Button-3>",self.deselectValeur),
298                                  ("<Double-Button-1>",self.sup_valeur_sans_into))
299       self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,
300                                       liste_commandes = liste_commandes_valeurs,
301                                       titre="Valeur(s) actuelle(s)")
302
303       self.label = Label(self.frame_choix,text="Valeur :")
304       self.label.place(relx=0.05,rely=0.4)
305     # PN : pour ajouter les validators
306       self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
307
308       bouton_valeurs_fichier = Button(self.frame_choix,
309                                       text="Importer ...",
310                                       command=self.select_in_file)
311       bouton_valeurs_fichier.place(relx=0.28,rely=0.55,relwidth=0.6)
312
313       self.ajout_valeurs = None
314       self.b = Button(self.frame_choix,text='ajouter  selection',command=self.add_valeur_from_salome)
315
316       self.b.place(relx=0.05,rely=0.05)
317       self.entrygroupe = Entry(self.frame_choix,relief='sunken')
318       self.entrygroupe.place(relx=0.50,rely=0.05)
319
320       self.a = Button(self.frame_choix,text='enlever selection',command=self.sup_valeur_from_salome)
321       self.a.place(relx=0.05,rely=0.2)
322       self.sortie = Entry(self.frame_choix,relief='sunken')
323       self.sortie.place(relx=0.50,rely=0.2)
324
325       l_salome_valeurs=self.node.item.get_salome_valeurs()
326       self.Liste_valeurs_salome=ListeChoix(self,self.frame_valeurs_salome,l_salome_valeurs,
327                                         liste_commandes = liste_commandes_valeurs,
328                                         titre="Valeur(s) Salome actuelle(s) ")
329       self.Liste_valeurs_salome.affiche_liste()
330
331
332       # boutons Ajouter et Supprimer
333       bouton_add = Button(self.frame_boutons_fleches,
334                           image = images.get_image('arrow_left'),
335                           command = self.add_valeur_plusieurs_base)
336       bouton_sup = Button(self.frame_boutons_fleches,
337                           image = images.get_image('arrow_right'),
338                           command = self.sup_valeur_sans_into)
339       bouton_add.place(relx=0.3,rely=0.35)
340       bouton_sup.place(relx=0.3,rely=0.65)
341
342       # affichage de l'aide
343       self.frame_aide.update()
344       self.aide = Label(self.frame_aide, text = aide,
345                         justify='center', anchor='center',
346                         wraplength=int(self.frame_aide.winfo_width()*0.8))
347       self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
348       self.Liste_valeurs.affiche_liste()
349
350       # boutons Accepter et Annuler
351       bouton_accepter = Button(self.frame_boutons,
352                                text='Valider',
353                                command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
354       bouton_annuler = Button(self.frame_boutons,
355                               text = 'Annuler',
356                               command = self.annule_modifs_valeur)
357       for but in (bouton_accepter,bouton_annuler):
358           but.pack(side='left',padx=5)
359
360
361
362 # ------------------------------------------------------------------------------#
363 # classe SALOME_UNIQUE_BASE_Panel
364 #
365 # Commandes modifiées  :  
366 #       - LIRE_MAILLAGE_UNITE 
367 # Methodes surchargées :  
368 #       - makeValeurPage(self,page)
369 #
370 # ------------------------------------------------------------------------------#
371
372 class SALOME_UNIQUE_BASE_Panel(UNIQUE_BASE_Panel):
373
374 # ce dictionnaire va servir lors de la sortie d efficas
375 # a creer le fichier qui sera integre au config.txt
376 # pour relier une unite logique et un nom de fichier
377
378   dict_fichier_unite={}
379
380   def SALOME_LIRE_MAILLAGE_UNITE(self):
381
382       unite=self.node.item.get_valeur()
383       entrychaine=salome.sg.getAllSelected()
384       if entrychaine != '':
385           self.entry2.delete(0,END)
386
387           try:
388               print salome.myStudy
389               SO = salome.myStudy.FindObjectID(entrychaine[0])
390               print SO
391           except:
392               boo = 0
393               SO = None
394
395           if SO != None:
396               myBuilder = salome.myStudy.NewBuilder()
397               boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeComment")
398
399           if boo == 0 :
400              FileName=''
401              print "a"
402           else :
403              Comment=FileAttr.Value()
404              print Comment
405              if Comment.find("FICHIERMED")== -1 :
406                 FileName=''
407              else :
408                 FileName=Comment[10:]
409
410
411           print "FileName = " , FileName
412           if FileName != '' :
413               print FileName
414               self.entry2.insert(0,FileName)
415               typefic='D'
416               SALOME_UNIQUE_BASE_Panel.dict_fichier_unite[unite]=typefic+FileName
417           else :
418               print "il faut afficher une Fenetre d impossibilité"
419               showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associé")
420
421   def makeValeurPage(self,page):
422       """
423       Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
424       de base cad entier, réel, string ou complexe
425       """
426       # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
427       # et de la liste des SD du bon type (constituant la liste des choix)
428       bulle_aide=self.get_bulle_aide()
429       aide=self.get_aide()
430       aide= justify_text(texte=aide)
431       liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
432       # Remplissage du panneau
433       self.frame_valeur = Frame(page)
434       self.frame_valeur.pack(fill='both',expand=1)
435       self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
436       self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
437       self.label = Label(self.frame_valeur,text='Valeur :')
438       self.label.place(relx=0.1,rely=0.5)
439       self.entry = Entry(self.frame_valeur,relief='sunken')
440       self.entry.place(relx=0.28,rely=0.5,relwidth=0.6)
441       self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
442
443       # PN : Ajout d'un bouton pour selectionner  à partir de Salome  
444       self.b = Button(self.frame_valeur,text='Relier a selection',command=self.SALOME_LIRE_MAILLAGE_UNITE)
445       self.b.place(relx=0.1,rely=0.1)
446       unite=self.node.item.get_valeur()
447       self.entry2 = Entry(self.frame_valeur,relief='sunken')
448       self.entry2.place(relx=0.3,rely=0.1)
449       self.entry2.configure(width = 250)
450
451       if SALOME_UNIQUE_BASE_Panel.dict_fichier_unite.has_key(unite):
452          associe=SALOME_UNIQUE_BASE_Panel.dict_fichier_unite[unite][1:]
453          self.entry2.delete(0,END)
454          if associe != "" :
455              self.entry2.insert(0,associe)
456       else:
457          self.entry2.delete(0,END)
458
459       # aide associée au panneau
460       self.frame_valeur.update()
461       self.aide = Label(self.frame_valeur,
462                         text = aide,
463                         wraplength=int(self.frame_valeur.winfo_width()*0.8),
464                         justify='center')
465       self.aide.place(relx=0.5,rely=0.7,anchor='n')
466       # affichage de la valeur du MCS
467       self.display_valeur()
468
469 #---------------------------------------------------------------------------------------
470 # Correspondances entre les classes eficas et les classes salome_eficas 
471 #______________________________________________________________________________________
472 dict_classes_salome = { SHELLPanel : SALOME_SHELLPanel, 
473                           FONCTION_Panel       : SALOME_FONCTION_Panel,
474                           PLUSIEURS_INTO_Panel : SALOME_PLUSIEURS_INTO_Panel,
475                           PLUSIEURS_ASSD_Panel : SALOME_PLUSIEURS_ASSD_Panel,
476                           PLUSIEURS_BASE_Panel : SALOME_PLUSIEURS_BASE_Panel,
477                           UNIQUE_INTO_Panel :  SALOME_UNIQUE_INTO_Panel,
478                           UNIQUE_SDCO_Panel : SALOME_UNIQUE_SDCO_Panel,
479                           UNIQUE_ASSD_Panel : SALOME_UNIQUE_ASSD_Panel,
480                           UNIQUE_COMP_Panel : SALOME_UNIQUE_COMP_Panel,
481                           UNIQUE_BASE_Panel : SALOME_UNIQUE_BASE_Panel}
482
483 dict_geom_numgroupe = { }
484 dict_geom_numface = { }