1 print "Import de panelsSalome"
4 from widgets import ListeChoix
5 from widgets import showerror
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
18 from Noyau.N_CR import justify_text
25 sgQt=SalomePyQt.SalomePyQt()
29 # 2 types de commandes vont etre particularisees dans Salome
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)
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)
53 class SALOME_SHELLPanel (SHELLPanel):
56 class SALOME_FONCTION_Panel (FONCTION_Panel):
59 class SALOME_PLUSIEURS_INTO_Panel (PLUSIEURS_INTO_Panel):
62 class SALOME_PLUSIEURS_ASSD_Panel (PLUSIEURS_ASSD_Panel):
65 class SALOME_UNIQUE_INTO_Panel (UNIQUE_INTO_Panel):
68 class SALOME_UNIQUE_SDCO_Panel (UNIQUE_SDCO_Panel):
71 class SALOME_UNIQUE_ASSD_Panel (UNIQUE_ASSD_Panel):
74 class SALOME_UNIQUE_COMP_Panel (UNIQUE_COMP_Panel):
77 # ------------------------------------------------------------------------------#
78 # classe SALOME_PLUSIEURS_BASE_Panel
80 # Commandes modifiées :
81 # - AFFE_CHAR_MECA_DDL_IMPO_GROUP_NO
82 # Methodes surchargées :
83 # - makeValeurPage(self,page)
85 # ------------------------------------------------------------------------------#
87 class SALOME_PLUSIEURS_BASE_Panel(PLUSIEURS_BASE_Panel):
90 def convertit_group_no_from_salome(self,liste_in):
94 for entree in liste_in :
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]
102 r=SMESH_utils.getAsterGroupNo(salome.myStudy,travail)
103 dict_geom_numgroupe[entreeName]=r
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")
111 def convertit_group_maille_from_salome(self,liste_in):
115 for entree in liste_in :
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]
123 r=SMESH_utils.getAsterGroupMa(salome.myStudy,travail)
124 dict_geom_numgroupe[entreeName]=r
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")
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))
136 if self.clef_fonction.find("GROUP_NO") != -1 :
137 valeur=self.convertit_group_no_from_salome(entrychaine)
139 if self.clef_fonction.find("GROUP_MA") != -1 :
140 valeur=self.convertit_group_maille_from_salome(entrychaine)
142 print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
143 print "Pb pas de fonction de conversion de la valeur Salome en valeur Aster"
144 print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
146 print "VALEUR", valeur
149 def sup_valeur_from_salome(self,name=None):
151 Méthode qui sert à retirer de la liste des valeurs la valeur sélectionnée
153 liste_valeurs = self.Liste_valeurs.get_liste()
154 liste_valeurs_salome=self.Liste_valeurs_salome.get_liste()
155 entrychaine=salome.sg.getAllSelected()
158 valeur = self.convertit_entrees_en_valeurs(entrychaine)
160 if i in liste_valeurs :
161 liste_valeurs.remove(i)
164 # la valeur sélectionnée n'est pas dans la liste
167 entryname_list=SMESH_utils.entryToName(salome.myStudy,entrychaine)
169 self.entrygroupe.delete(0,END)
170 self.sortie.delete(0,END)
171 for entryname in entryname_list:
173 liste_valeurs_salome.remove(entryname)
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)
184 liste_valeurs_salome=self.Liste_valeurs_salome.get_liste()
186 liste_valeurs = self.Liste_valeurs.get_liste()
187 for valeur in liste_valeurs_salome:
188 r=dict_geom_numgroupe[valeur]
190 if i not in liste_valeurs :
191 liste_valeurs.append(i)
192 self.Liste_valeurs.put_liste(liste_valeurs)
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)
203 liste_valeurs = self.Liste_valeurs.get_liste()
204 for i in touteslesvaleurs:
205 if i not in liste_valeurs:
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)
220 if self.node.item.wait_reel():
222 valeur = self.traite_reel(valeur)
223 if self.node.item.wait_geom():
228 val,test1 = self.node.item.object.eval_valeur(valeur)
231 test2 = self.node.item.object.verif_type(val)
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é")
238 if type(val) == type([]):
240 liste_valeurs.append(groupe)
242 liste_valeurs.append(val)
243 self.Liste_valeurs.put_liste(liste_valeurs)
244 self.parent.appli.affiche_infos("Nouvelle valeur acceptée")
246 self.parent.appli.affiche_infos("Valeur incorrecte : ajout à la liste refusé")
248 print "impossible d'évaluer %s" %val
249 self.parent.appli.affiche_infos("Valeur incorrecte : ajout à la liste refusé")
252 def makeValeurPage(self,page):
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
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()
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.)
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)
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)
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)
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)
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)")
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)
308 bouton_valeurs_fichier = Button(self.frame_choix,
310 command=self.select_in_file)
311 bouton_valeurs_fichier.place(relx=0.28,rely=0.55,relwidth=0.6)
313 self.ajout_valeurs = None
314 self.b = Button(self.frame_choix,text='ajouter selection',command=self.add_valeur_from_salome)
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)
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)
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()
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)
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()
350 # boutons Accepter et Annuler
351 bouton_accepter = Button(self.frame_boutons,
353 command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
354 bouton_annuler = Button(self.frame_boutons,
356 command = self.annule_modifs_valeur)
357 for but in (bouton_accepter,bouton_annuler):
358 but.pack(side='left',padx=5)
362 # ------------------------------------------------------------------------------#
363 # classe SALOME_UNIQUE_BASE_Panel
365 # Commandes modifiées :
366 # - LIRE_MAILLAGE_UNITE
367 # Methodes surchargées :
368 # - makeValeurPage(self,page)
370 # ------------------------------------------------------------------------------#
372 class SALOME_UNIQUE_BASE_Panel(UNIQUE_BASE_Panel):
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
378 dict_fichier_unite={}
380 def SALOME_LIRE_MAILLAGE_UNITE(self):
382 unite=self.node.item.get_valeur()
383 entrychaine=salome.sg.getAllSelected()
384 if entrychaine != '':
385 self.entry2.delete(0,END)
389 SO = salome.myStudy.FindObjectID(entrychaine[0])
396 myBuilder = salome.myStudy.NewBuilder()
397 boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeComment")
403 Comment=FileAttr.Value()
406 if Comment.find("FICHIERMED")== -1 :
409 FileName=Comment[10:]
412 print "FileName = " , FileName
415 self.entry2.insert(0,FileName)
417 SALOME_UNIQUE_BASE_Panel.dict_fichier_unite[unite]=typefic+FileName
419 print "il faut afficher une Fenetre d impossibilité"
420 showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associé")
422 def makeValeurPage(self,page):
424 Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
425 de base cad entier, réel, string ou complexe
427 # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
428 # et de la liste des SD du bon type (constituant la liste des choix)
429 bulle_aide=self.get_bulle_aide()
431 aide= justify_text(texte=aide)
432 liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
433 # Remplissage du panneau
434 self.frame_valeur = Frame(page)
435 self.frame_valeur.pack(fill='both',expand=1)
436 self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
437 self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
438 self.label = Label(self.frame_valeur,text='Valeur :')
439 self.label.place(relx=0.1,rely=0.5)
440 self.entry = Entry(self.frame_valeur,relief='sunken')
441 self.entry.place(relx=0.28,rely=0.5,relwidth=0.6)
442 self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
444 # PN : Ajout d'un bouton pour selectionner à partir de Salome
445 self.b = Button(self.frame_valeur,text='Relier a selection',command=self.SALOME_LIRE_MAILLAGE_UNITE)
446 self.b.place(relx=0.1,rely=0.1)
447 unite=self.node.item.get_valeur()
448 self.entry2 = Entry(self.frame_valeur,relief='sunken')
449 self.entry2.place(relx=0.3,rely=0.1)
450 self.entry2.configure(width = 250)
452 if SALOME_UNIQUE_BASE_Panel.dict_fichier_unite.has_key(unite):
453 associe=SALOME_UNIQUE_BASE_Panel.dict_fichier_unite[unite][1:]
454 self.entry2.delete(0,END)
456 self.entry2.insert(0,associe)
458 self.entry2.delete(0,END)
460 # aide associée au panneau
461 self.frame_valeur.update()
462 self.aide = Label(self.frame_valeur,
464 wraplength=int(self.frame_valeur.winfo_width()*0.8),
466 self.aide.place(relx=0.5,rely=0.7,anchor='n')
467 # affichage de la valeur du MCS
468 self.display_valeur()
470 #---------------------------------------------------------------------------------------
471 # Correspondances entre les classes eficas et les classes salome_eficas
472 #______________________________________________________________________________________
473 dict_classes_salome = { SHELLPanel : SALOME_SHELLPanel,
474 FONCTION_Panel : SALOME_FONCTION_Panel,
475 PLUSIEURS_INTO_Panel : SALOME_PLUSIEURS_INTO_Panel,
476 PLUSIEURS_ASSD_Panel : SALOME_PLUSIEURS_ASSD_Panel,
477 PLUSIEURS_BASE_Panel : SALOME_PLUSIEURS_BASE_Panel,
478 UNIQUE_INTO_Panel : SALOME_UNIQUE_INTO_Panel,
479 UNIQUE_SDCO_Panel : SALOME_UNIQUE_SDCO_Panel,
480 UNIQUE_ASSD_Panel : SALOME_UNIQUE_ASSD_Panel,
481 UNIQUE_COMP_Panel : SALOME_UNIQUE_COMP_Panel,
482 UNIQUE_BASE_Panel : SALOME_UNIQUE_BASE_Panel}
484 dict_geom_numgroupe = { }
485 dict_geom_numface = { }