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