1 # -*- coding: utf-8 -*-
2 print "Import de panelsSalome"
5 from widgets import ListeChoix
6 from widgets import showerror
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 from uniqueassdpanel import UNIQUE_ASSD_Panel_Reel
20 from Noyau.N_CR import justify_text
27 sgQt=SalomePyQt.SalomePyQt()
31 # 2 types de commandes vont etre particularisees dans Salome
34 # Toutes les commandes possedant GROUP_NO ou GROUP_MA
35 # seront surchargees d office
36 # pour cela on va utiliser le dictionnaire dict_classes_salome
37 # qui va permettre de changer la classe de la commande
38 # ainsi si un panel en dehors de salome a pour classe PLUSIEURS_BASE_Panel
39 # la classe de ce panel devient alors SALOME_PLUSIEURS_BASE_Panel
40 # (pour cela voir composimp)
42 # des commandes "autres" ne pouvant pas etre identifiées par leur nom
43 # il suffit de creer dans la classe SALOME de la commande
44 # une fonction portant son nom
45 # Exemple de particularisation d un panel :
46 # Supposons que l on veuille particulariser la commande
47 # - LIRE_MAILLAGE_UNITE
48 # le panel initial a pour classe UNIQUE_BASE_Panel
49 # il suffit d'ajouter dans la classe derivée SALOME_UNIQUE_BASE_Panel
50 # une fonction SALOME_LIRE_MAILLAGE_UNITE
51 # la classe de ce panel devient alors SALOME_UNIQUE_BASE_Panel
52 # on peut surcharger les methodes nécessaires (affichage par exemple)
55 class SALOME_SHELLPanel (SHELLPanel):
58 class SALOME_FONCTION_Panel (FONCTION_Panel):
61 class SALOME_PLUSIEURS_INTO_Panel (PLUSIEURS_INTO_Panel):
64 class SALOME_PLUSIEURS_ASSD_Panel (PLUSIEURS_ASSD_Panel):
67 class SALOME_UNIQUE_INTO_Panel (UNIQUE_INTO_Panel):
70 class SALOME_UNIQUE_SDCO_Panel (UNIQUE_SDCO_Panel):
73 class SALOME_UNIQUE_ASSD_Panel (UNIQUE_ASSD_Panel):
76 class SALOME_UNIQUE_COMP_Panel (UNIQUE_COMP_Panel):
79 class SALOME_UNIQUE_ASSD_Panel_Reel (UNIQUE_ASSD_Panel_Reel):
82 # ------------------------------------------------------------------------------#
83 # classe SALOME_PLUSIEURS_BASE_Panel
85 # Commandes modifiées :
86 # - AFFE_CHAR_MECA_DDL_IMPO_GROUP_NO
87 # Methodes surchargées :
88 # - makeValeurPage(self,page)
90 # ------------------------------------------------------------------------------#
92 class SALOME_PLUSIEURS_BASE_Panel(PLUSIEURS_BASE_Panel):
95 def convertit_group_no_from_salome(self,liste_in):
99 for entree in liste_in :
101 travail.append(entree)
102 entryname_list=SMESH_utils.entryToName(salome.myStudy,travail)
103 entreeName=entryname_list[0]
104 if dict_geom_numgroupe.has_key(entreeName):
105 r=dict_geom_numgroupe[entreeName]
107 r=SMESH_utils.getAsterGroupNo(salome.myStudy,travail)
108 dict_geom_numgroupe[entreeName]=r
113 print "pas de groupe de noeuds associé"
114 showerror("Pas de groupe associé","Cet Objet ne peut pas être défini comme un ensemble de groupe de noeuds")
117 def convertit_group_maille_from_salome(self,liste_in):
122 for entree in liste_in :
124 travail.append(entree)
125 entryname_list=SMESH_utils.entryToName(salome.myStudy,travail)
126 entreeName=entryname_list[0]
127 if dict_geom_numgroupe.has_key(entreeName):
128 r=dict_geom_numgroupe[entreeName]
130 r=SMESH_utils.getAsterGroupMa(salome.myStudy,travail)
131 dict_geom_numgroupe[entreeName]=r
137 print "pas de groupe de maille associé"
138 showerror("Pas de groupe associé","Cet Objet ne peut pas être défini comme un ensemble de groupe de maille")
141 def convertit_entrees_en_valeurs(self,entrychaine):
142 if SALOME_PLUSIEURS_BASE_Panel.__dict__.has_key(self.clef_fonction):
143 valeur=apply(SALOME_PLUSIEURS_BASE_Panel.__dict__[self.clef_fonction],(self,entrychaine))
145 if (self.clef_fonction.find("GROUP_NO") != -1) and (self.clef_fonction.find("GROUP_MA") != -1) :
146 if (self.clef_fonction.find("GROUP_NO") < self.clef_fonction.find("GROUP_MA")) :
147 valeur=self.convertit_group_maille_from_salome(entrychaine)
149 valeur=self.convertit_group_no_from_salome(entrychaine)
150 elif self.clef_fonction.find("GROUP_NO") != -1 :
151 valeur=self.convertit_group_no_from_salome(entrychaine)
153 if self.clef_fonction.find("GROUP_MA") != -1 :
154 valeur=self.convertit_group_maille_from_salome(entrychaine)
156 print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
157 print "Pb pas de fonction de conversion de la valeur Salome en valeur Aster"
158 print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
160 print "VALEUR", valeur
163 def sup_valeur_from_salome(self,name=None):
165 Méthode qui sert à retirer de la liste des valeurs la valeur sélectionnée
167 liste_valeurs = self.Liste_valeurs.get_liste()
168 liste_valeurs_salome=self.Liste_valeurs_salome.get_liste()
169 entrychaine=salome.sg.getAllSelected()
172 valeur = self.convertit_entrees_en_valeurs(entrychaine)
174 if i in liste_valeurs :
175 liste_valeurs.remove(i)
178 # la valeur sélectionnée n'est pas dans la liste
181 entryname_list=SMESH_utils.entryToName(salome.myStudy,entrychaine)
182 self.entrygroupe.delete(0,END)
183 self.sortie.delete(0,END)
184 for entryname in entryname_list:
186 liste_valeurs_salome.remove(entryname)
188 print "la valeur ", entryname, "n est pas dans la liste"
189 entryname=entryname + " "
190 self.sortie.insert(0,entryname)
191 self.selected_valeur = None
192 self.Liste_valeurs.put_liste(liste_valeurs)
193 self.Liste_valeurs_salome.put_liste(liste_valeurs_salome)
196 def visu_in_salome(self):
197 liste_valeurs = self.Liste_valeurs.get_liste()
198 entryname_list=SMESH_utils.VisuGroupe(salome.myStudy,liste_valeurs)
200 def visu3D_in_salome(self):
201 liste_valeurs = self.Liste_valeurs.get_liste()
202 entryname_list=SMESH_utils.VisuGroupe(salome.myStudy,liste_valeurs)
205 liste_valeurs_salome=self.Liste_valeurs_salome.get_liste()
207 liste_valeurs = self.Liste_valeurs.get_liste()
208 for valeur in liste_valeurs_salome:
209 r=dict_geom_numgroupe[valeur]
211 if i not in liste_valeurs :
212 liste_valeurs.append(i)
213 self.Liste_valeurs.put_liste(liste_valeurs)
215 def add_valeur_from_salome(self,name=None):
216 entrychaine=salome.sg.getAllSelected()
217 self.sortie.delete(0,END)
218 self.entrygroupe.delete(0,END)
219 if entrychaine != '':
220 entryname_list=SMESH_utils.entryToName(salome.myStudy,entrychaine)
221 touteslesvaleurs = self.convertit_entrees_en_valeurs(entrychaine)
224 liste_valeurs = self.Liste_valeurs.get_liste()
225 for i in touteslesvaleurs:
226 if i not in liste_valeurs:
232 liste_valeurs_salome = self.Liste_valeurs_salome.get_liste()
233 for entryname in entryname_list:
234 if entryname not in liste_valeurs_salome:
235 liste_valeurs_salome.append(entryname)
236 entryname=entryname + " "
237 self.entrygroupe.insert(0,entryname)
238 self.Liste_valeurs_salome.put_liste(liste_valeurs_salome)
240 if self.node.item.wait_reel():
242 valeur = self.traite_reel(valeur)
243 if self.node.item.wait_geom():
248 val,test1 = self.node.item.object.eval_valeur(valeur)
251 test2 = self.node.item.object.verif_type(val)
253 liste_valeurs = self.Liste_valeurs.get_liste()
254 if len(liste_valeurs) >= max :
255 self.parent.appli.affiche_infos("La liste a déjà atteint le nombre maximum d'éléments, ajout refusé")
258 if type(val) == type([]):
260 liste_valeurs.append(groupe)
262 liste_valeurs.append(val)
263 self.Liste_valeurs.put_liste(liste_valeurs)
264 self.parent.appli.affiche_infos("Nouvelle valeur acceptée")
266 self.parent.appli.affiche_infos("Valeur incorrecte : ajout à la liste refusé")
268 print "impossible d'évaluer %s" %val
269 self.parent.appli.affiche_infos("Valeur incorrecte : ajout à la liste refusé")
272 def makeValeurPage(self,page):
274 Crée la page de saisie d'une liste de valeurs à priori quelconques,
275 cad qui ne sont pas à choisir dans une liste prédéfinie
277 # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
278 # et la liste des valeurs déjà affectées à l'objet courant
279 bulle_aide=self.get_bulle_aide()
280 objet_mc = self.node.item.get_definition()
281 aide = self.get_aide()
282 aide = justify_text(texte=aide)
283 min,max = self.node.item.GetMinMax()
284 self.clef_fonction= self.node.item.clef_fonction
285 l_valeurs = self.node.item.GetListeValeurs()
287 self.frame1 = Frame(page,relief='groove',bd=2)
288 self.frame2 = Frame(page)
289 self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
290 self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
291 self.frame_right = Frame(self.frame1)
292 self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
294 # création des frames internes
295 self.frame_valeurs = Frame(self.frame1)
296 self.frame_valeurs.place(relx=0.0,rely=0.0,relwidth=0.35,relheight=0.95)
298 self.frame_choix = Frame(self.frame_right)
299 self.frame_choix.place(relx=0.0,rely=0.0,relwidth=1,relheight=0.9)
300 self.frame_valeurs_salome = Frame(self.frame_right)
301 self.frame_valeurs_salome.place(relx=0.02,rely=0.7,relwidth=0.9,relheight=0.3)
303 self.frame_boutons = Frame(self.frame2)
304 self.frame_boutons.place(relx=0.1,rely=0.,relwidth=0.5,relheight=1.)
305 self.frame_aide = Frame(self.frame2)
306 self.frame_aide.place(relx=0.6,rely=0.,relwidth=0.5,relheight=1)
308 for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
309 self.frame_choix,self.frame_aide,self.frame_boutons):
310 fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
311 fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
313 # création des objets dans les frames
314 liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
315 ("<Button-3>",self.deselectValeur),
316 ("<Double-Button-1>",self.sup_valeur_sans_into))
317 self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,
318 liste_commandes = liste_commandes_valeurs,
319 titre="Valeur(s) actuelle(s)")
321 # PN : pour ajouter les validators
322 self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base,y=0.55)
324 bouton_valeurs_fichier = Button(self.frame_choix,
326 command=self.select_in_file)
327 bouton_valeurs_fichier.place(relx=0.28,rely=0.65,relwidth=0.6)
329 self.ajout_valeurs = None
330 self.b = Button(self.frame_choix,text='ajout select.',command=self.add_valeur_from_salome)
332 self.b.place(relx=0.03,rely=0.05,relwidth=0.35)
333 self.entrygroupe = Entry(self.frame_choix,relief='sunken')
334 self.entrygroupe.place(relx=0.4,rely=0.05,relwidth=0.6)
336 self.a = Button(self.frame_choix,text='enlev. select.',command=self.sup_valeur_from_salome)
337 self.a.place(relx=0.03,rely=0.2,relwidth=0.35)
338 self.sortie = Entry(self.frame_choix,relief='sunken')
339 self.sortie.place(relx=0.4,rely=0.2,relwidth=0.6)
340 self.c = Button(self.frame_choix,text='Visualiser',command=self.visu_in_salome)
341 self.c.place(relx=0.03,rely=0.35,relwidth=0.35)
343 self.genea =self.node.item.get_genealogie()
345 if "AFFE_CARA_ELEM" in self.genea :
346 self.d=Button(self.frame_choix,text='Visu 3D',command=self.visu3D_in_salome)
347 self.d.place(relx=0.47,rely=0.35,relwidth=0.35)
349 l_salome_valeurs=self.node.item.get_salome_valeurs()
350 self.Liste_valeurs_salome=ListeChoix(self,self.frame_valeurs_salome,l_salome_valeurs,
351 liste_commandes = liste_commandes_valeurs,
352 titre="Valeur(s) Salome actuelle(s) ")
353 self.Liste_valeurs_salome.affiche_liste()
356 # boutons Ajouter et Supprimer
357 bouton_add = Button(self.frame_choix,
358 image = images.get_image('arrow_left'),
359 command = self.add_valeur_plusieurs_base)
360 bouton_sup = Button(self.frame_choix,
361 image = images.get_image('arrow_right'),
362 command = self.sup_valeur_sans_into)
363 bouton_add.place(relx=0.08,rely=0.55)
364 bouton_sup.place(relx=0.08,rely=0.65)
366 # affichage de l'aide
367 self.frame_aide.update()
368 self.aide = Label(self.frame_aide, text = aide,
369 justify='center', anchor='center',
370 wraplength=int(self.frame_aide.winfo_width()*0.8))
371 self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
372 self.Liste_valeurs.affiche_liste()
374 # boutons Accepter et Annuler
375 bouton_accepter = Button(self.frame_boutons,
377 command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
378 bouton_annuler = Button(self.frame_boutons,
380 command = self.annule_modifs_valeur)
381 for but in (bouton_accepter,bouton_annuler):
382 but.pack(side='left',padx=5)
386 # ------------------------------------------------------------------------------#
387 # classe SALOME_UNIQUE_BASE_Panel
389 # Commandes modifiées :
390 # - LIRE_MAILLAGE_UNITE
391 # Methodes surchargées :
392 # - makeValeurPage(self,page)
394 # ------------------------------------------------------------------------------#
396 class SALOME_UNIQUE_BASE_Panel(UNIQUE_BASE_Panel):
398 # ce dictionnaire va servir lors de la sortie d efficas
399 # a creer le fichier qui sera integre au config.txt
400 # pour relier une unite logique et un nom de fichier
402 dict_fichier_unite={}
405 def SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_N(self):
406 entrychaine=salome.sg.getAllSelected()
407 if entrychaine != '':
408 self.entry2.delete(0,END)
410 SO = salome.myStudy.FindObjectID(entrychaine[0])
417 myBuilder = salome.myStudy.NewBuilder()
418 boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeFileType")
421 if (val !="FICHIERMED" and val != "FICHIER_RESU_MED"):
423 showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
425 boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeExternalFileDef")
427 FileName=FileAttr.Value()
429 showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
431 self.entry2.insert(0,FileName)
432 self.entry.delete(0,END)
433 self.entry.insert(0,FileName)
437 def SALOME_DONNEES_HOMARD_TRAITEMENT_NOM_MED_MAILLAGE_N(self):
439 entrychaine=salome.sg.getAllSelected()
440 if entrychaine != '':
441 self.entry2.delete(0,END)
443 SO = salome.myStudy.FindObjectID(entrychaine[0])
449 myBuilder = salome.myStudy.NewBuilder()
450 ok, AtName = myBuilder.FindAttribute(SO,"AttributeName")
452 EntryName=AtName.Value()
455 self.entry2.insert(0,EntryName)
456 self.entry.delete(0,END)
457 self.entry.insert(0,EntryName)
460 def SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_NP1(self):
461 self.SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_N()
464 # def SALOME_LIRE_MAILLAGE_UNITE(self):
466 # unite=self.node.item.get_valeur()
467 # entrychaine=salome.sg.getAllSelected()
468 # if entrychaine != '':
469 # self.entry2.delete(0,END)
472 # SO = salome.myStudy.FindObjectID(entrychaine[0])
478 # myBuilder = salome.myStudy.NewBuilder()
479 # boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeComment")
483 # myBuilder = salome.myStudy.NewBuilder()
484 # boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeFileType")
487 # val=FileAttr.Value()
488 # if (val !="FICHIERMED"):
489 # showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
491 # boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeExternalFileDef")
493 # FileName=FileAttr.Value()
495 # showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
497 # print "FileName = " , FileName
498 # if FileName != '' :
499 # self.entry2.insert(0,FileName)
501 # SALOME_UNIQUE_BASE_Panel.dict_fichier_unite[unite]=typefic+FileName
503 # print "il faut afficher une Fenetre d impossibilit\xe9"
504 # showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
506 def redistribue_selon_simp(self):
507 genea = self.node.item.get_genealogie()
509 for i in range(0,len( genea )) :
510 commande=commande+"_"+ genea[i]
511 (SALOME_UNIQUE_BASE_Panel.__dict__[commande])(self)
514 def makeValeurPage(self,page):
516 Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
517 de base cad entier, réel, string ou complexe
519 # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
520 # et de la liste des SD du bon type (constituant la liste des choix)
521 bulle_aide=self.get_bulle_aide()
523 aide= justify_text(texte=aide)
524 liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
525 # Remplissage du panneau
526 self.frame_valeur = Frame(page)
527 self.frame_valeur.pack(fill='both',expand=1)
528 self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
529 self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
530 self.label = Label(self.frame_valeur,text='Valeur :')
531 self.label.place(relx=0.1,rely=0.5)
532 self.entry = Entry(self.frame_valeur,relief='sunken')
533 self.entry.place(relx=0.28,rely=0.5,relwidth=0.6)
534 self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
535 self.entry.bind("<KP_Enter>",lambda e,c=self.valid_valeur:c())
537 # PN : Ajout d'un bouton pour selectionner à partir de Salome
538 self.b = Button(self.frame_valeur,text='Relier selection',command=self.redistribue_selon_simp)
539 self.b.place(relx=0.05,rely=0.1)
540 unite=self.node.item.get_valeur()
541 self.entry2 = Entry(self.frame_valeur,relief='sunken')
542 self.entry2.place(relx=0.3,rely=0.1)
543 self.entry2.configure(width = 250)
545 if SALOME_UNIQUE_BASE_Panel.dict_fichier_unite.has_key(unite):
546 associe=SALOME_UNIQUE_BASE_Panel.dict_fichier_unite[unite][1:]
547 self.entry2.delete(0,END)
549 self.entry2.insert(0,associe)
551 self.entry2.delete(0,END)
553 # aide associée au panneau
554 self.frame_valeur.update()
555 self.aide = Label(self.frame_valeur,
557 wraplength=int(self.frame_valeur.winfo_width()*0.8),
559 self.aide.place(relx=0.5,rely=0.7,anchor='n')
560 # affichage de la valeur du MCS
561 self.display_valeur()
563 #---------------------------------------------------------------------------------------
564 # Correspondances entre les classes eficas et les classes salome_eficas
565 #______________________________________________________________________________________
566 dict_classes_salome = { SHELLPanel : SALOME_SHELLPanel,
567 FONCTION_Panel : SALOME_FONCTION_Panel,
568 PLUSIEURS_INTO_Panel : SALOME_PLUSIEURS_INTO_Panel,
569 PLUSIEURS_ASSD_Panel : SALOME_PLUSIEURS_ASSD_Panel,
570 PLUSIEURS_BASE_Panel : SALOME_PLUSIEURS_BASE_Panel,
571 UNIQUE_INTO_Panel : SALOME_UNIQUE_INTO_Panel,
572 UNIQUE_SDCO_Panel : SALOME_UNIQUE_SDCO_Panel,
573 UNIQUE_ASSD_Panel : SALOME_UNIQUE_ASSD_Panel,
574 UNIQUE_ASSD_Panel_Reel : SALOME_UNIQUE_ASSD_Panel_Reel,
575 UNIQUE_COMP_Panel : SALOME_UNIQUE_COMP_Panel,
576 UNIQUE_BASE_Panel : SALOME_UNIQUE_BASE_Panel}
578 dict_geom_numgroupe = { }
579 dict_geom_numface = { }