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
19 from Noyau.N_CR import justify_text
26 sgQt=SalomePyQt.SalomePyQt()
30 # 2 types de commandes vont etre particularisees dans Salome
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)
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)
54 class SALOME_SHELLPanel (SHELLPanel):
57 class SALOME_FONCTION_Panel (FONCTION_Panel):
60 class SALOME_PLUSIEURS_INTO_Panel (PLUSIEURS_INTO_Panel):
63 class SALOME_PLUSIEURS_ASSD_Panel (PLUSIEURS_ASSD_Panel):
66 class SALOME_UNIQUE_INTO_Panel (UNIQUE_INTO_Panel):
69 class SALOME_UNIQUE_SDCO_Panel (UNIQUE_SDCO_Panel):
72 class SALOME_UNIQUE_ASSD_Panel (UNIQUE_ASSD_Panel):
75 class SALOME_UNIQUE_COMP_Panel (UNIQUE_COMP_Panel):
78 # ------------------------------------------------------------------------------#
79 # classe SALOME_PLUSIEURS_BASE_Panel
81 # Commandes modifiées :
82 # - AFFE_CHAR_MECA_DDL_IMPO_GROUP_NO
83 # Methodes surchargées :
84 # - makeValeurPage(self,page)
86 # ------------------------------------------------------------------------------#
88 class SALOME_PLUSIEURS_BASE_Panel(PLUSIEURS_BASE_Panel):
91 def convertit_group_no_from_salome(self,liste_in):
95 for entree in liste_in :
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]
103 r=SMESH_utils.getAsterGroupNo(salome.myStudy,travail)
104 dict_geom_numgroupe[entreeName]=r
109 print "pas de groupe de noeuds associé"
110 showerror("Pas de groupe associé","Cet Objet ne peut pas être défini comme un ensemble de groupe de noeuds")
113 def convertit_group_maille_from_salome(self,liste_in):
117 for entree in liste_in :
119 travail.append(entree)
120 entryname_list=SMESH_utils.entryToName(salome.myStudy,travail)
121 entreeName=entryname_list[0]
122 if dict_geom_numgroupe.has_key(entreeName):
123 r=dict_geom_numgroupe[entreeName]
125 r=SMESH_utils.getAsterGroupMa(salome.myStudy,travail)
126 dict_geom_numgroupe[entreeName]=r
130 print "pas de groupe de maille associé"
131 showerror("Pas de groupe associé","Cet Objet ne peut pas être défini comme un ensemble de groupe de maille")
134 def convertit_entrees_en_valeurs(self,entrychaine):
135 if SALOME_PLUSIEURS_BASE_Panel.__dict__.has_key(self.clef_fonction):
136 valeur=apply(SALOME_PLUSIEURS_BASE_Panel.__dict__[self.clef_fonction],(self,entrychaine))
138 if (self.clef_fonction.find("GROUP_NO") != -1) and (self.clef_fonction.find("GROUP_MA") != -1) :
139 if (self.clef_fonction.find("GROUP_NO") < self.clef_fonction.find("GROUP_MA")) :
140 valeur=self.convertit_group_maille_from_salome(entrychaine)
142 valeur=self.convertit_group_no_from_salome(entrychaine)
143 elif self.clef_fonction.find("GROUP_NO") != -1 :
144 valeur=self.convertit_group_no_from_salome(entrychaine)
146 if self.clef_fonction.find("GROUP_MA") != -1 :
147 valeur=self.convertit_group_maille_from_salome(entrychaine)
149 print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
150 print "Pb pas de fonction de conversion de la valeur Salome en valeur Aster"
151 print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
153 print "VALEUR", valeur
156 def sup_valeur_from_salome(self,name=None):
158 Méthode qui sert à retirer de la liste des valeurs la valeur sélectionnée
160 liste_valeurs = self.Liste_valeurs.get_liste()
161 liste_valeurs_salome=self.Liste_valeurs_salome.get_liste()
162 entrychaine=salome.sg.getAllSelected()
165 valeur = self.convertit_entrees_en_valeurs(entrychaine)
167 if i in liste_valeurs :
168 liste_valeurs.remove(i)
171 # la valeur sélectionnée n'est pas dans la liste
174 entryname_list=SMESH_utils.entryToName(salome.myStudy,entrychaine)
175 self.entrygroupe.delete(0,END)
176 self.sortie.delete(0,END)
177 for entryname in entryname_list:
179 liste_valeurs_salome.remove(entryname)
181 print "la valeur ", entryname, "n est pas dans la liste"
182 entryname=entryname + " "
183 self.sortie.insert(0,entryname)
184 self.selected_valeur = None
185 self.Liste_valeurs.put_liste(liste_valeurs)
186 self.Liste_valeurs_salome.put_liste(liste_valeurs_salome)
190 liste_valeurs_salome=self.Liste_valeurs_salome.get_liste()
192 liste_valeurs = self.Liste_valeurs.get_liste()
193 for valeur in liste_valeurs_salome:
194 r=dict_geom_numgroupe[valeur]
196 if i not in liste_valeurs :
197 liste_valeurs.append(i)
198 self.Liste_valeurs.put_liste(liste_valeurs)
200 def add_valeur_from_salome(self,name=None):
201 entrychaine=salome.sg.getAllSelected()
202 self.sortie.delete(0,END)
203 self.entrygroupe.delete(0,END)
204 if entrychaine != '':
205 entryname_list=SMESH_utils.entryToName(salome.myStudy,entrychaine)
206 touteslesvaleurs = self.convertit_entrees_en_valeurs(entrychaine)
209 liste_valeurs = self.Liste_valeurs.get_liste()
210 for i in touteslesvaleurs:
211 if i not in liste_valeurs:
217 liste_valeurs_salome = self.Liste_valeurs_salome.get_liste()
218 for entryname in entryname_list:
219 if entryname not in liste_valeurs_salome:
220 liste_valeurs_salome.append(entryname)
221 entryname=entryname + " "
222 self.entrygroupe.insert(0,entryname)
223 self.Liste_valeurs_salome.put_liste(liste_valeurs_salome)
225 if self.node.item.wait_reel():
227 valeur = self.traite_reel(valeur)
228 if self.node.item.wait_geom():
233 val,test1 = self.node.item.object.eval_valeur(valeur)
236 test2 = self.node.item.object.verif_type(val)
238 liste_valeurs = self.Liste_valeurs.get_liste()
239 if len(liste_valeurs) >= max :
240 self.parent.appli.affiche_infos("La liste a déjà atteint le nombre maximum d'éléments, ajout refusé")
243 if type(val) == type([]):
245 liste_valeurs.append(groupe)
247 liste_valeurs.append(val)
248 self.Liste_valeurs.put_liste(liste_valeurs)
249 self.parent.appli.affiche_infos("Nouvelle valeur acceptée")
251 self.parent.appli.affiche_infos("Valeur incorrecte : ajout à la liste refusé")
253 print "impossible d'évaluer %s" %val
254 self.parent.appli.affiche_infos("Valeur incorrecte : ajout à la liste refusé")
257 def makeValeurPage(self,page):
259 Crée la page de saisie d'une liste de valeurs à priori quelconques,
260 cad qui ne sont pas à choisir dans une liste prédéfinie
262 # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
263 # et la liste des valeurs déjà affectées à l'objet courant
264 bulle_aide=self.get_bulle_aide()
265 objet_mc = self.node.item.get_definition()
266 aide = self.get_aide()
267 aide = justify_text(texte=aide)
268 min,max = self.node.item.GetMinMax()
269 self.clef_fonction= self.node.item.clef_fonction
270 l_valeurs = self.node.item.GetListeValeurs()
272 self.frame1 = Frame(page,relief='groove',bd=2)
273 self.frame2 = Frame(page)
274 self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
275 self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
276 self.frame_right = Frame(self.frame1)
277 self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
279 # création des frames internes
280 self.frame_valeurs = Frame(self.frame1)
281 self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
283 self.frame_boutons_fleches = Frame(self.frame_right)
284 self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.3)
285 self.frame_choix = Frame(self.frame_right)
286 self.frame_choix.place(relx=0.2,rely=0.1,relwidth=0.85,relheight=0.9)
287 self.frame_valeurs_salome = Frame(self.frame_right)
288 self.frame_valeurs_salome.place(relx=0.02,rely=0.7,relwidth=0.9,relheight=0.3)
290 self.frame_boutons = Frame(self.frame2)
291 self.frame_boutons.place(relx=0.1,rely=0.,relwidth=0.5,relheight=1.)
292 self.frame_aide = Frame(self.frame2)
293 self.frame_aide.place(relx=0.6,rely=0.,relwidth=0.5,relheight=1)
295 for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
296 self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
297 fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
298 fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
300 # création des objets dans les frames
301 liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
302 ("<Button-3>",self.deselectValeur),
303 ("<Double-Button-1>",self.sup_valeur_sans_into))
304 self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,
305 liste_commandes = liste_commandes_valeurs,
306 titre="Valeur(s) actuelle(s)")
308 self.label = Label(self.frame_choix,text="Valeur :")
309 self.label.place(relx=0.05,rely=0.4)
310 # PN : pour ajouter les validators
311 self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
313 bouton_valeurs_fichier = Button(self.frame_choix,
315 command=self.select_in_file)
316 bouton_valeurs_fichier.place(relx=0.28,rely=0.55,relwidth=0.6)
318 self.ajout_valeurs = None
319 self.b = Button(self.frame_choix,text='ajouter selection',command=self.add_valeur_from_salome)
321 self.b.place(relx=0.05,rely=0.05)
322 self.entrygroupe = Entry(self.frame_choix,relief='sunken')
323 self.entrygroupe.place(relx=0.50,rely=0.05)
325 self.a = Button(self.frame_choix,text='enlever selection',command=self.sup_valeur_from_salome)
326 self.a.place(relx=0.05,rely=0.2)
327 self.sortie = Entry(self.frame_choix,relief='sunken')
328 self.sortie.place(relx=0.50,rely=0.2)
330 l_salome_valeurs=self.node.item.get_salome_valeurs()
331 self.Liste_valeurs_salome=ListeChoix(self,self.frame_valeurs_salome,l_salome_valeurs,
332 liste_commandes = liste_commandes_valeurs,
333 titre="Valeur(s) Salome actuelle(s) ")
334 self.Liste_valeurs_salome.affiche_liste()
337 # boutons Ajouter et Supprimer
338 bouton_add = Button(self.frame_boutons_fleches,
339 image = images.get_image('arrow_left'),
340 command = self.add_valeur_plusieurs_base)
341 bouton_sup = Button(self.frame_boutons_fleches,
342 image = images.get_image('arrow_right'),
343 command = self.sup_valeur_sans_into)
344 bouton_add.place(relx=0.3,rely=0.35)
345 bouton_sup.place(relx=0.3,rely=0.65)
347 # affichage de l'aide
348 self.frame_aide.update()
349 self.aide = Label(self.frame_aide, text = aide,
350 justify='center', anchor='center',
351 wraplength=int(self.frame_aide.winfo_width()*0.8))
352 self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
353 self.Liste_valeurs.affiche_liste()
355 # boutons Accepter et Annuler
356 bouton_accepter = Button(self.frame_boutons,
358 command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
359 bouton_annuler = Button(self.frame_boutons,
361 command = self.annule_modifs_valeur)
362 for but in (bouton_accepter,bouton_annuler):
363 but.pack(side='left',padx=5)
367 # ------------------------------------------------------------------------------#
368 # classe SALOME_UNIQUE_BASE_Panel
370 # Commandes modifiées :
371 # - LIRE_MAILLAGE_UNITE
372 # Methodes surchargées :
373 # - makeValeurPage(self,page)
375 # ------------------------------------------------------------------------------#
377 class SALOME_UNIQUE_BASE_Panel(UNIQUE_BASE_Panel):
379 # ce dictionnaire va servir lors de la sortie d efficas
380 # a creer le fichier qui sera integre au config.txt
381 # pour relier une unite logique et un nom de fichier
383 dict_fichier_unite={}
386 def SALOME_DONNEES_HOMARD_TRAITEMENT_FICHIER_MED_MAILLAGE_N(self):
387 entrychaine=salome.sg.getAllSelected()
388 if entrychaine != '':
389 self.entry2.delete(0,END)
391 SO = salome.myStudy.FindObjectID(entrychaine[0])
398 myBuilder = salome.myStudy.NewBuilder()
399 boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeFileType")
402 if (val !="FICHIERMED"):
404 showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
406 boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeExternalFileDef")
408 FileName=FileAttr.Value()
410 showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
412 self.entry2.insert(0,FileName)
413 self.entry.delete(0,END)
414 self.entry.insert(0,FileName)
418 def SALOME_DONNEES_HOMARD_TRAITEMENT_NOM_MED_MAILLAGE_N(self):
420 entrychaine=salome.sg.getAllSelected()
421 if entrychaine != '':
422 self.entry2.delete(0,END)
424 SO = salome.myStudy.FindObjectID(entrychaine[0])
430 myBuilder = salome.myStudy.NewBuilder()
431 ok, AtName = myBuilder.FindAttribute(SO,"AttributeName")
433 EntryName=AtName.Value()
436 self.entry2.insert(0,EntryName)
437 self.entry.delete(0,END)
438 self.entry.insert(0,EntryName)
441 def SALOME_DONNEES_HOMARD_TRAITEMENT_FICHIER_MED_MAILLAGE_NP1(self):
442 self.SALOME_DONNEES_HOMARD_TRAITEMENT_FICHIER_MED_MAILLAGE_N()
445 def SALOME_LIRE_MAILLAGE_UNITE(self):
447 unite=self.node.item.get_valeur()
448 entrychaine=salome.sg.getAllSelected()
449 if entrychaine != '':
450 self.entry2.delete(0,END)
453 SO = salome.myStudy.FindObjectID(entrychaine[0])
459 myBuilder = salome.myStudy.NewBuilder()
460 boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeComment")
464 myBuilder = salome.myStudy.NewBuilder()
465 boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeFileType")
469 if (val !="FICHIERMED"):
470 showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
472 boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeExternalFileDef")
474 FileName=FileAttr.Value()
476 showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
478 print "FileName = " , FileName
480 self.entry2.insert(0,FileName)
482 SALOME_UNIQUE_BASE_Panel.dict_fichier_unite[unite]=typefic+FileName
484 print "il faut afficher une Fenetre d impossibilit\xe9"
485 showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
487 def redistribue_selon_simp(self):
488 genea = self.node.item.get_genealogie()
490 for i in range(0,len( genea )) :
491 commande=commande+"_"+ genea[i]
492 (SALOME_UNIQUE_BASE_Panel.__dict__[commande])(self)
495 def makeValeurPage(self,page):
497 Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
498 de base cad entier, réel, string ou complexe
500 # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
501 # et de la liste des SD du bon type (constituant la liste des choix)
502 bulle_aide=self.get_bulle_aide()
504 aide= justify_text(texte=aide)
505 liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
506 # Remplissage du panneau
507 self.frame_valeur = Frame(page)
508 self.frame_valeur.pack(fill='both',expand=1)
509 self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
510 self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
511 self.label = Label(self.frame_valeur,text='Valeur :')
512 self.label.place(relx=0.1,rely=0.5)
513 self.entry = Entry(self.frame_valeur,relief='sunken')
514 self.entry.place(relx=0.28,rely=0.5,relwidth=0.6)
515 self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
517 # PN : Ajout d'un bouton pour selectionner à partir de Salome
518 self.b = Button(self.frame_valeur,text='Relier selection',command=self.redistribue_selon_simp)
519 self.b.place(relx=0.05,rely=0.1)
520 unite=self.node.item.get_valeur()
521 self.entry2 = Entry(self.frame_valeur,relief='sunken')
522 self.entry2.place(relx=0.3,rely=0.1)
523 self.entry2.configure(width = 250)
525 if SALOME_UNIQUE_BASE_Panel.dict_fichier_unite.has_key(unite):
526 associe=SALOME_UNIQUE_BASE_Panel.dict_fichier_unite[unite][1:]
527 self.entry2.delete(0,END)
529 self.entry2.insert(0,associe)
531 self.entry2.delete(0,END)
533 # aide associée au panneau
534 self.frame_valeur.update()
535 self.aide = Label(self.frame_valeur,
537 wraplength=int(self.frame_valeur.winfo_width()*0.8),
539 self.aide.place(relx=0.5,rely=0.7,anchor='n')
540 # affichage de la valeur du MCS
541 self.display_valeur()
543 #---------------------------------------------------------------------------------------
544 # Correspondances entre les classes eficas et les classes salome_eficas
545 #______________________________________________________________________________________
546 dict_classes_salome = { SHELLPanel : SALOME_SHELLPanel,
547 FONCTION_Panel : SALOME_FONCTION_Panel,
548 PLUSIEURS_INTO_Panel : SALOME_PLUSIEURS_INTO_Panel,
549 PLUSIEURS_ASSD_Panel : SALOME_PLUSIEURS_ASSD_Panel,
550 PLUSIEURS_BASE_Panel : SALOME_PLUSIEURS_BASE_Panel,
551 UNIQUE_INTO_Panel : SALOME_UNIQUE_INTO_Panel,
552 UNIQUE_SDCO_Panel : SALOME_UNIQUE_SDCO_Panel,
553 UNIQUE_ASSD_Panel : SALOME_UNIQUE_ASSD_Panel,
554 UNIQUE_COMP_Panel : SALOME_UNIQUE_COMP_Panel,
555 UNIQUE_BASE_Panel : SALOME_UNIQUE_BASE_Panel}
557 dict_geom_numgroupe = { }
558 dict_geom_numface = { }