Salome HOME
PN intégration des modifs faites pour Homard
[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
381   def SALOME_DONNEES_HOMARD_FICHIERS_NOM_MED_MAILLAGE_N(self):
382       entrychaine=salome.sg.getAllSelected()
383       if entrychaine != '':
384           self.entry2.delete(0,END)
385           try:
386               print salome.myStudy
387               SO = salome.myStudy.FindObjectID(entrychaine[0])
388           except:
389               boo = 0
390               SO = None
391
392           FileName=''
393           if SO != None:
394               myBuilder = salome.myStudy.NewBuilder()
395               boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeFileType")
396               if boo:
397                  val=FileAttr.Value()
398                  if (val !="FICHIERMED"):
399                      boo=0
400                      showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
401                  else:
402                      boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeExternalFileDef")
403               if boo :
404                 FileName=FileAttr.Value()
405               else:
406                  showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
407           if FileName != '' :
408               self.entry2.insert(0,FileName)
409               self.entry.delete(0,END)
410               self.entry.insert(0,FileName)
411               self.valid_valeur()
412
413
414   def SALOME_DONNEES_HOMARD_FICHIERS_NOM_MED_MAILLAGE_NP1(self):
415       self.SALOME_DONNEES_HOMARD_FICHIERS_NOM_MED_MAILLAGE_N()
416
417
418   def SALOME_LIRE_MAILLAGE_UNITE(self):
419
420       unite=self.node.item.get_valeur()
421       entrychaine=salome.sg.getAllSelected()
422       if entrychaine != '':
423           self.entry2.delete(0,END)
424
425           try:
426               print salome.myStudy
427               SO = salome.myStudy.FindObjectID(entrychaine[0])
428               print SO
429           except:
430               boo = 0
431               SO = None
432
433           if SO != None:
434               myBuilder = salome.myStudy.NewBuilder()
435               boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeComment")
436
437           FileName=''
438           if SO != None:
439               myBuilder = salome.myStudy.NewBuilder()
440               boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeFileType")
441               if boo:
442                  boo=0
443                  val=FileAttr.Value()
444                  if (val !="FICHIERMED"):
445                      showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
446                  else:
447                      boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeExternalFileDef")
448           if boo :
449               FileName=FileAttr.Value()
450           else:
451               showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
452
453           print "FileName = " , FileName
454           if FileName != '' :
455               print FileName
456               self.entry2.insert(0,FileName)
457               typefic='D'
458               SALOME_UNIQUE_BASE_Panel.dict_fichier_unite[unite]=typefic+FileName
459           else :
460               print "il faut afficher une Fenetre d impossibilit\xe9"
461               showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
462
463   def redistribue_selon_simp(self):
464       genea = self.node.item.get_genealogie()
465       commande="SALOME"
466       for i in range(0,len( genea )) :
467         commande=commande+"_"+ genea[i]
468       print SALOME_UNIQUE_BASE_Panel.__dict__[commande]
469       (SALOME_UNIQUE_BASE_Panel.__dict__[commande])(self)
470
471
472   makeValeurPage(self,page):
473       """
474       Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
475       de base cad entier, réel, string ou complexe
476       """
477       # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
478       # et de la liste des SD du bon type (constituant la liste des choix)
479       bulle_aide=self.get_bulle_aide()
480       aide=self.get_aide()
481       aide= justify_text(texte=aide)
482       liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
483       # Remplissage du panneau
484       self.frame_valeur = Frame(page)
485       self.frame_valeur.pack(fill='both',expand=1)
486       self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
487       self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
488       self.label = Label(self.frame_valeur,text='Valeur :')
489       self.label.place(relx=0.1,rely=0.5)
490       self.entry = Entry(self.frame_valeur,relief='sunken')
491       self.entry.place(relx=0.28,rely=0.5,relwidth=0.6)
492       self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
493
494       # PN : Ajout d'un bouton pour selectionner  à partir de Salome  
495       self.b = Button(self.frame_valeur,text='Relier selection',command=self.redistribue_selon_simp)
496       self.b.place(relx=0.05,rely=0.1)
497       unite=self.node.item.get_valeur()
498       self.entry2 = Entry(self.frame_valeur,relief='sunken')
499       self.entry2.place(relx=0.3,rely=0.1)
500       self.entry2.configure(width = 250)
501
502       if SALOME_UNIQUE_BASE_Panel.dict_fichier_unite.has_key(unite):
503          associe=SALOME_UNIQUE_BASE_Panel.dict_fichier_unite[unite][1:]
504          self.entry2.delete(0,END)
505          if associe != "" :
506              self.entry2.insert(0,associe)
507       else:
508          self.entry2.delete(0,END)
509
510       # aide associée au panneau
511       self.frame_valeur.update()
512       self.aide = Label(self.frame_valeur,
513                         text = aide,
514                         wraplength=int(self.frame_valeur.winfo_width()*0.8),
515                         justify='center')
516       self.aide.place(relx=0.5,rely=0.7,anchor='n')
517       # affichage de la valeur du MCS
518       self.display_valeur()
519
520 #---------------------------------------------------------------------------------------
521 # Correspondances entre les classes eficas et les classes salome_eficas 
522 #______________________________________________________________________________________
523 dict_classes_salome = { SHELLPanel : SALOME_SHELLPanel, 
524                           FONCTION_Panel       : SALOME_FONCTION_Panel,
525                           PLUSIEURS_INTO_Panel : SALOME_PLUSIEURS_INTO_Panel,
526                           PLUSIEURS_ASSD_Panel : SALOME_PLUSIEURS_ASSD_Panel,
527                           PLUSIEURS_BASE_Panel : SALOME_PLUSIEURS_BASE_Panel,
528                           UNIQUE_INTO_Panel :  SALOME_UNIQUE_INTO_Panel,
529                           UNIQUE_SDCO_Panel : SALOME_UNIQUE_SDCO_Panel,
530                           UNIQUE_ASSD_Panel : SALOME_UNIQUE_ASSD_Panel,
531                           UNIQUE_COMP_Panel : SALOME_UNIQUE_COMP_Panel,
532                           UNIQUE_BASE_Panel : SALOME_UNIQUE_BASE_Panel}
533
534 dict_geom_numgroupe = { }
535 dict_geom_numface = { }