Salome HOME
a2565e0548b47c32d3a802f0ca675b62ae3fdb93
[tools/eficas.git] / ajoutGroupe.py
1 # -*- coding: iso-8859-1 -*-
2
3 def handleAjoutGroupFiltre(editor,listeGroup):
4         """CARMEL3D : obtention des groupes de maille du maillage selectionne dans Salome
5         Les groupes de mailles sont filtres en utilisant une liste des  prefixes autorises pour code Code_Carmel3D,
6         i.e. un nom de groupe de mailles est DIEL_toto_foo par exemple, qui deviendra toto_foo.
7         La creation du MESH_GROUPE est type (materiau ou source), d'après le prefixe.
8         ATTENTION! Le nom devenant un concept, i.e. une variable Python, certains signes sont interdits dans le nom du groupe,
9         e.g. les signes moins (-), plus (+), etc. Une erreur est retournee en ce cas.
10         """
11         from string import join
12         debug = True
13         listePrefixesMateriaux = ('DIEL', 'NOCOND','COND', 'ZS', 'ZJ', 'NILMAT') # liste des prefixes pour les materiaux
14         listePrefixesSources = ('CURRENT', 'EPORT', 'HPORT') # liste des prefixes pour les sources
15         listePrefixes = listePrefixesMateriaux + listePrefixesSources # liste de tous les prefixes autorises
16         listePrefixesGroupesMultiples = ('CURRENT', ) # listes des prefixes autorises pour groupes multiples, i.e. plusieurs groupes de mailles associes en une seule caracteistique materiau ou source
17         sep = '_' # separateur entre le prefixe et le nom reel du groupe (qui peut lui aussi contenir ce separateur)
18         dictGroupesMultiplesNomsPossibles = {} # dictionnaire contenant les noms reels possibles de groupes multiples et leur occurence dans la liste, i.e. 1 par defaut et > 1 pour une groupe multiple, e.g. pour un inducteur bobine en plusieurs morceaux CURRENT_toto_1, CURRENT_toto_2, ce dictionnaire contiendra 'toto':2 
19         listeGroupesMultiples = [] # liste contenant les noms possibles de groupes multiples, e.g. pour un inducteur bobine en plusieurs morceaux CURRENT_toto_1, CURRENT_toto_2, cette liste contiendra 'toto'
20         for groupe in listeGroup:
21             partiesGroupe = groupe.split(sep) # parties du nom, separees initialement par le separateur du prefixe, e.g. 'CURRENT_toto_foo' devient ['CURRENT','toto','foo'] et 'toto' devient ['toto']
22             prefix = partiesGroupe[0] # prefixe possible de ce nom, ou nom lui-meme
23             if len(partiesGroupe) >= 2 and prefix in listePrefixesGroupesMultiples: # prefixe existant et autorise
24                 nomGroupeMultiple = partiesGroupe[1] # nom possible d'un groupe multiple
25                 if dictGroupesMultiplesNomsPossibles.has_key(nomGroupeMultiple): # comptage du nombre d'occurrences de ce nom de groupe multiple possible
26                     dictGroupesMultiplesNomsPossibles[nomGroupeMultiple] += 1
27                 else:
28                     dictGroupesMultiplesNomsPossibles[nomGroupeMultiple] = 1
29         for nom in dictGroupesMultiplesNomsPossibles: # suppression des noms avec une seule occurence, i.e. ils ne sont pas des groupes multiples
30             if dictGroupesMultiplesNomsPossibles[nom] > 1: listeGroupesMultiples.append(nom)
31         if debug:
32             print "listeGroup=", listeGroup
33             print "dictGroupesMultiplesNomPossibles=", dictGroupesMultiplesNomsPossibles
34             print "listeGroupesMultiples=", listeGroupesMultiples
35             print "listePrefixes=", listePrefixes
36         # retourne le dernier element du JdC, ou None si le JdC est vide, afin de savoir a quelle place ajouter les MESH_GROUPE (en dernier)
37         try:
38             dernier=editor.tree.racine.children[-1]
39         except:
40             dernier=None
41         for groupe in listeGroup: # parcours de la liste de tous les groupes de maille trouves (volumiques et les autres)
42             if debug: print 'groupe=', groupe
43             partiesGroupe = groupe.split(sep) # parties du nom, separees initialement par le separateur du prefixe, e.g. 'CURRENT_toto_foo' devient ['CURRENT','toto','foo'] et 'toto' devient ['toto']
44             prefix = partiesGroupe[0] # prefixe possible de ce nom, ou nom lui-meme
45             if len(partiesGroupe) == 1: # pas de prefixe
46                 print u"ERREUR: ce nom de groupe ("+groupe+") ne peut pas etre utilise car il n'a pas de prefixe"
47             elif len(partiesGroupe) >= 2 and prefix in listePrefixes: # prefixe existant et autorise
48                 nomReel = None # initialisation du nom reel, qui provoquera une erreur par la suite (evaluation de None=None) s'il reste ainsi
49                 if prefix in listePrefixesGroupesMultiples: # ce groupe pourrait faire partie d'un groupe multiple
50                     nomGroupeMultiple = partiesGroupe[1] # nom possible d'un groupe multiple
51                     if nomGroupeMultiple in listeGroupesMultiples: # ce groupe est multiple et n'a pas encore ete cree
52                         nomReel = nomGroupeMultiple # ce groupe pourrait etre utilise...
53                         listeGroupesMultiples.remove(nomGroupeMultiple) #... une seule fois
54                         if debug: print u"ce nom de groupe ("+nomReel+") est multiple et sera utilise une fois seulement"
55                     elif dictGroupesMultiplesNomsPossibles[nomGroupeMultiple] == 1: # ce groupe existe dans le dictionnaire et n'est pas multiple (occurence =1)
56                         nomReel = join(partiesGroupe[1:], sep) # reconstruction du nom reel, i.e. sans le prefixe
57                         if debug: print u"ce nom de groupe ("+nomReel+") n'est pas multiple et sera utilise"
58                     else: # ce groupe est multiple et a deja ete utilise
59                         if debug: print u"ce nom de groupe ("+groupe+") est multiple et a deja ete utilise"
60                 else: # ce groupe n'est pas multiple, il pourrait etre utilise tel quel
61                     nomReel = join(partiesGroupe[1:], sep) # reconstruction du nom reel, i.e. sans le prefixe
62                 if nomReel is not None: # on a un nom de groupe possible, il faut realiser des tests plus pousses
63                     try: # test de conformite du nom pour un concept, i.e. une variable Python
64                         exec(nomReel+'=None') # le test consiste a tenter de creer une variable, initialisee a None, a partir du nom, e.g. toto=None est bon mais toto-foo=None ne fonctionne pas.
65                         # creation du groupe MESH_GROUPE
66                         if dernier != None:
67                             new_node = dernier.append_brother("MESHGROUP",'after')
68                         else:
69                             new_node=editor.tree.racine.append_child("MESHGROUP",pos='first')
70                         test,mess = new_node.item.nomme_sd(nomReel) # precision du nom (de concept) du groupe
71                         if debug: print u"ce nom de groupe ("+nomReel+") est utilise..."
72                         if prefix in listePrefixesMateriaux: # ce groupe est associe a un materiau
73                             new_node.append_child('MATERIAL') # on rajoute la propriete de materiau, qu'il suffit d'associer ensuite a la liste des materiaux presents
74                             if debug: print u" et c'est un materiau."
75                         elif prefix in listePrefixesSources: # ce groupe est associe a une source
76                             new_node.append_child('SOURCE') # on rajoute la propriete de la source, qu'il suffit d'associer ensuite a la liste des sources presentes
77                             if debug: print u" et c'est une source."
78                         else: # ce cas ne devrait pas se produire
79                             pass
80                         dernier=new_node # mise a jour du dernier noeud du JdC, afin de rajouter les autres MESH_GROUPE eventuels a sa suite
81                     except:
82                         print u"ERREUR: ce nom de groupe ("+nomReel+") ne peut pas etre utilise car il ne peut pas servir de concept a cause de caractères interdits, e.g. signes moins (-), plus (+), etc."
83                 else: # ce nom de groupe est ecarte car le groupe multiple  deja ete cree
84                         print u"Ce nom de groupe ("+groupe+") ne peut pas etre utilise car il appartient a un groupe multiple qui a deja ete cree."
85             else: # prefixe existant mais non autorise
86                 print u"ERREUR: ce nom de groupe ("+groupe+") ne peut pas etre utilise car son prefixe ("+partiesGroupe[0]+") n'est pas dans la liste autorisee "+str(listePrefixes)
87