Salome HOME
debug intempestif
[tools/eficas.git] / Carmel3D / ajoutGroupe.py
1 # -*- coding: iso-8859-1 -*-
2
3 import re # module interne utilisé pour vérifier la validité du nom du maillage
4
5 concept_re=re.compile(r'[a-zA-Z_]\w*$') # nom de maillage valide s'il correspond à un identifiant (variable) Python possible. Basé sur Ihm/I_Etape.py:nommeSd, qui fait foi
6
7 def handleAjoutGroupSansFiltre(editor,listeGroup):
8         """code_Carmel temporel : obtention des groupes de maille du maillage selectionne dans Salome
9         Les groupes de mailles ne sont pas filtrés.
10         La creation du MESH_GROUPE n'est donc pas typé.
11         ATTENTION! Le nom devenant un concept, i.e. une variable Python, certains signes sont interdits dans le nom du groupe,
12         e.g. les signes moins (-), plus (+), etc. Une erreur est retournee en ce cas.
13         """
14         # 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)
15         debug = True
16         try:
17             dernier=editor.tree.racine.children[-1]
18         except:
19             dernier=None
20         for groupe in listeGroup: # parcours de la liste de tous les groupes de maille trouves (volumiques et les autres), puis ecriture du MESHGROUP systématique sans analyse de nom multiple
21             if debug: print 'groupe=', groupe
22             if not concept_re.match(groupe): # Le nom du groupe de maillage doit etre un identificateur Python
23                 raise ValueError, "Ce nom de groupe ("+groupe+") ne peut pas etre utilise car il ne peut pas servir de concept a cause de caracteres interdits, e.g. signes moins (-), plus (+), etc."
24             try: # test de conformite du nom pour un concept, i.e. une variable Python
25                 #exec(groupe+'=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.
26                 # creation du groupe MESH_GROUPE
27                 if dernier != None:
28                     new_node = dernier.append_brother("MESHGROUP",'after')
29                 else:
30                     new_node=editor.tree.racine.appendChild("MESHGROUP",pos='first')
31                 test,mess = new_node.item.nommeSd(groupe) # precision du nom (de concept) du groupe
32                 if debug: print u"ce nom de groupe ("+groupe+") est utilise..."
33                 dernier=new_node # mise a jour du dernier noeud du JdC, afin de rajouter les autres MESH_GROUPE eventuels a sa suite
34             except:
35                 raise ValueError,  "Ce nom de groupe ("+groupe+") pose un probleme inconnu"
36
37 def handleAjoutGroupAvecFiltre(editor,listeGroup):
38         """CARMEL3D : obtention des groupes de maille du maillage selectionne dans Salome
39         Les groupes de mailles sont filtres en utilisant une liste des  prefixes autorises pour code Code_Carmel3D,
40         i.e. un nom de groupe de mailles est DIEL_toto_foo par exemple, qui deviendra toto_foo.
41         La creation du MESH_GROUPE est type (materiau ou source), d'après le prefixe.
42         ATTENTION! Le nom devenant un concept, i.e. une variable Python, certains signes sont interdits dans le nom du groupe,
43         e.g. les signes moins (-), plus (+), etc. Une erreur est retournee en ce cas.
44         """
45         from string import join
46         debug = False #True
47         listePrefixesMateriaux = ('DIEL', 'NOCOND','COND', 'ZS', 'ZJ', 'NILMAT') # liste des prefixes pour les materiaux
48         listePrefixesSourcesHorsInducteur = ('EPORT', 'HPORT') # liste des prefixes pour les sources
49         listePrefixesInducteurBobine = ('CURRENT', ) # listes des prefixes autorises pour definir la geometrie d'un inducteur bobiné complet ou en morceaux
50         listePrefixesTrous = ('TOPO', ) # listes des prefixes autorises pour definir la geometrie d'un trou complet ou en morceaux
51         listePrefixesBBK = ('BBK', ) # listes des prefixes autorises pour definir le groupe d'éléments servant de boîte englobante dans laquelle est calculée K (inducteur bobiné ou topo).
52         listePrefixes = listePrefixesMateriaux + listePrefixesSourcesHorsInducteur +listePrefixesInducteurBobine + listePrefixesTrous + listePrefixesBBK # liste de tous les prefixes autorises
53         listePrefixesGroupesMultiples = ('CURRENT', 'TOPO' ) # listes des prefixes autorises pour groupes multiples, i.e. plusieurs groupes de mailles associes en une seule caracteistique materiau ou source
54         if debug:
55             print "listePrefixes=", listePrefixes
56             print "listePrefixesGroupesMultiples=", listePrefixesGroupesMultiples
57         sep = '_' # separateur entre le prefixe et le nom reel du groupe (qui peut lui aussi contenir ce separateur)
58         dictGroupesMultiples = {} # 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 
59         for groupe in listeGroup:
60             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']
61             prefix = partiesGroupe[0] # prefixe possible de ce nom, ou nom lui-meme
62             if len(partiesGroupe) >= 3 and prefix in listePrefixesGroupesMultiples: # prefixe existant et autorise
63                 nomGroupeMultiple = partiesGroupe[1] # nom possible d'un groupe multiple
64                 if dictGroupesMultiples.has_key(nomGroupeMultiple): # comptage du nombre d'occurrences de ce nom de groupe multiple possible
65                     dictGroupesMultiples[nomGroupeMultiple]['nombre'] += 1
66                     dictGroupesMultiples[nomGroupeMultiple]['membres'].append(join(partiesGroupe[1:], sep))
67                 else:
68                     dictGroupesMultiples[nomGroupeMultiple] = {'type': prefix,'nombre':1, 'membres':[join(partiesGroupe[1:], sep)]}
69         for groupe in dictGroupesMultiples.keys(): # recherche de tous les groupes multiples. Boucle ignorée si aucun groupe multiple.
70             dictGroupesMultiples[groupe]['membres'].sort() # tri alphabétique des membres du groupe multiple, qui est l'ordre lu par gendof.exe/MED (ordre lexicographique).
71             dictGroupesMultiples[groupe]['membres'] = tuple(dictGroupesMultiples[groupe]['membres']) # transformation en tuple, qui est le format attendu par le catalogue (LISTE_MESHGROUP)
72         if debug:
73             print "dictGroupesMultiples=", dictGroupesMultiples
74         # 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)
75         try:
76             dernier=editor.tree.racine.children[-1]
77         except:
78             dernier=None
79         for groupe in listeGroup: # parcours de la liste de tous les groupes de maille trouves (volumiques et les autres), puis ecriture du MESHGROUP systématique sans analyse de nom multiple
80             if debug: print 'groupe=', groupe
81             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']
82             if len(partiesGroupe) == 1: # pas de prefixe
83                 print u"ERREUR: ce nom de groupe ("+groupe+") ne peut pas etre utilise car il n'a pas de prefixe"
84             elif len(partiesGroupe) >= 2 and partiesGroupe[0] in listePrefixes: # prefixe existant et autorise
85                 prefix = partiesGroupe[0] # prefixe possible de ce nom, ou nom lui-meme
86                 nom = partiesGroupe[1] # nom du groupe ou du macro-groupe si défini.
87                 nomReel = join(partiesGroupe[1:], sep) # reconstruction du nom reel, i.e. sans le prefixe, pour la plupart des groupes
88                 if prefix in listePrefixesBBK: nomReel = groupe # pour la boite englobante, il faut le nom avec préfixe
89                 if not concept_re.match(nomReel): # Le nom du groupe de maillage doit etre un identificateur Python
90                     raise ValueError, "Ce nom de groupe ("+nomReel+") ne peut pas etre utilise car il ne peut pas servir de concept a cause de caracteres interdits, e.g. signes moins (-), plus (+), etc."
91                 try: # test de conformite du nom pour un concept, i.e. une variable Python
92                     #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.
93                     # creation du groupe MESH_GROUPE
94                     if dernier != None:
95                         new_node = dernier.append_brother("MESHGROUP",'after')
96                     else:
97                         new_node=editor.tree.racine.appendChild("MESHGROUP",pos='first')
98                     test,mess = new_node.item.nommeSd(nomReel) # precision du nom (de concept) du groupe
99                     if debug: print u"ce nom de groupe ("+nomReel+") est utilise..."
100                     if prefix in listePrefixesMateriaux: # ce groupe est associe a un materiau
101                         new_node.appendChild('MATERIAL') # on rajoute la propriete de materiau, qu'il suffit d'associer ensuite a la liste des materiaux presents
102                         if debug: print u" et c'est un materiau."
103                     elif prefix in listePrefixesSourcesHorsInducteur: # ce groupe est associe a une source
104                         new_node.appendChild('SOURCE') # on rajoute la propriete de la source, qu'il suffit d'associer ensuite a la liste des sources presentes
105                         if debug: print u" et c'est une source."
106                     elif prefix in listePrefixesInducteurBobine: # ce groupe est associe a une source
107                         new_node.appendChild('STRANDED_INDUCTOR_GEOMETRY') # on rajoute la propriete de géométrie de l'inducteur bobiné
108                         if debug: print u" et c'est un inducteur bobine dont on definit la geometrie."
109                         if nom not in dictGroupesMultiples.keys(): # il ne fait pas partie d'un macro-groupe. La source est définie ici, ainsi que le domaine.
110                             new_node.appendChild('SOURCE') # on rajoute la propriete de la source, qu'il suffit d'associer ensuite a la liste des sources presentes
111                             new_node.appendChild('Domaine') # on rajoute la propriete du domaine (default automatique), qu'il suffit d'associer ensuite a la liste des domaines présents
112                             if debug: print u" et c'est une source en un seul morceau."
113                     else: # ce cas ne devrait pas se produire
114                         pass
115                     dernier=new_node # mise a jour du dernier noeud du JdC, afin de rajouter les autres MESH_GROUPE eventuels a sa suite
116                 except:
117                     raise ValueError,  "Ce nom de groupe ("+nomReel+") pose un probleme inconnu"
118                     #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."
119             else: # prefixe existant mais non autorise
120                 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)
121         if len(dictGroupesMultiples) > 0: # on a des groupes à nom multiples, e.g., inducteur bobiné en morceaux.
122             for groupe, contenu in dictGroupesMultiples.iteritems(): # parcours de la liste de tous les groupes de maille trouves (volumiques et les autres), et sélection des groupes à nom multiple
123                 if debug: print 'groupe, contenu=', groupe, contenu
124                 nomReel = groupe
125                 prefix = contenu['type']
126                 try: # test de conformite du nom pour un concept, i.e. une variable Python
127                     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.
128                     # creation du groupe MACRO_GROUPE
129                     if dernier != None:
130                         new_node = dernier.append_brother("MACRO_GROUPE",'after')
131                     else:
132                         new_node=editor.tree.racine.appendChild("MACRO_GROUPE",pos='first')
133                     test,mess = new_node.item.nommeSd(nomReel) # precision du nom (de concept) du groupe
134                     if debug: print u"ce nom de groupe ("+nomReel+") est utilise..."
135                     if debug: print u" et on ajoute la liste LISTE_MESHGROUP."
136                     node_list=new_node.appendChild('LISTE_MESHGROUP') # Ajout de la liste des membres du groupe multiple
137                     if debug:
138                         print 'Liste possible pour LISTE_MESHGROUP :'
139                         print '_____________________'
140                         print node_list.item.getListePossible(())
141                         print '_____________________'
142                         print dir(node_list.item)
143                     listeNom=node_list.item.getSdAvantDuBonType()
144                     listeObjet=[]
145                     for nom in listeNom: 
146                         if nom in dictGroupesMultiples[groupe]['membres']:
147                            #--> transformation du nom en objet
148                            obj,valide=node_list.item.evalValeur(nom)
149                            listeObjet.append(obj)
150                     node_list.item.setValeur(listeObjet) 
151                     node_list.affichePanneau()             
152                     if prefix in listePrefixesMateriaux: # ce groupe est associe a un materiau
153                         new_node.appendChild('MATERIAL') # on rajoute la propriete de materiau, qu'il suffit d'associer ensuite a la liste des materiaux presents
154                         if debug: print u" et c'est un materiau."
155                     elif prefix in listePrefixesSourcesHorsInducteur: # ce groupe est associe a une source
156                         new_node.appendChild('SOURCE') # on rajoute la propriete de la source, qu'il suffit d'associer ensuite a la liste des sources presentes
157                         if debug: print u" et c'est une source hors inducteur."
158                     elif prefix in listePrefixesInducteurBobine: # ce groupe est associe a une source
159                         new_node.appendChild('SOURCE') # on rajoute la propriete de la source, qu'il suffit d'associer ensuite a la liste des sources presentes
160                         new_node.appendChild('Domaine') # on rajoute la propriete du domaine (default automatique), qu'il suffit d'associer ensuite a la liste des domaines présents
161                         if debug: print u" et c'est une source inducteur."
162                     elif prefix in listePrefixesTrous: # ce groupe est associe a un trou
163                         new_node.appendChild('Domaine') # on rajoute la propriete du domaine (default automatique), qu'il suffit d'associer ensuite a la liste des domaines présents
164                         if debug: print u" et c'est un trou."
165                     else: # ce cas ne devrait pas se produire
166                         pass
167                     dernier=new_node # mise a jour du dernier noeud du JdC, afin de rajouter les autres MESH_GROUPE eventuels a sa suite
168                 except:
169                     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."
170
171 def handleAjoutGroupFiltre(editor,listeGroup):
172         """CARMEL3D : obtention des groupes de maille du maillage selectionne dans Salome
173         Les groupes de mailles sont filtres en utilisant une liste des  prefixes autorises pour code Code_Carmel3D,
174         i.e. un nom de groupe de mailles est DIEL_toto_foo par exemple, qui deviendra toto_foo.
175         La creation du MESH_GROUPE est type (materiau ou source), d'après le prefixe.
176         ATTENTION! Le nom devenant un concept, i.e. une variable Python, certains signes sont interdits dans le nom du groupe,
177         e.g. les signes moins (-), plus (+), etc. Une erreur est retournee en ce cas.
178         """
179         from string import join
180         debug = True
181         #print 'DEBUG listeGroup manuel' # Il faut aussi commenter la ligne Msg,listeGroup=self.ChercheGrpMailleInSalome() dans la routine  ChercheGrpMaille de qtEficas.py
182         #listeGroup = ['DIEL_air', 'COND_plaque', 'CURRENT_bobine'  ] # cas-test plaque Rodger avec DIEL_
183         #listeGroup = ['NOCOND_air', 'COND_plaque', 'CURRENT_bobine'  ] # cas-test plaque Rodger
184         #listeGroup = ['DIEL_air', 'COND_plaque', 'NOCOND_noyau', 'CURRENT_bobine_1', 'CURRENT_bobine_2', 'CURRENT_bobine_3' ]
185         #listeGroup = ['DIEL_air', 'COND_plaque', 'NOCOND_noyau', 'CURRENT_bobine'  ]
186         #listeGroup = ['BBK_bobine', 'DIEL_air', 'COND_plaque', 'NOCOND_noyau', 'CURRENT_bobine'  ] # avec BBK
187         #listeGroup = ['EPORT+_dom', 'EPORT-_dom', 'H', 'COND_cyl', 'EPORT_dom'] # cas-test CSS_Tempimpo
188         #listeGroup= ['BBK_spire', 'CURRENT_spire_4', 'NOCOND_air', 'CURRENT_spire_3', 'CURRENT_spire_1', 'CURRENT_spire_2'] # cas-test spire_dans l'air en 4 morceaux
189         #listeGroup= ['BBK_bobine', 'CURRENT_ind_2', 'DIEL_air', 'CURRENT_ind_8', 'CURRENT_ind_6', 'CURRENT_ind_1', 'CURRENT_ind_3', 'CURRENT_ind_7', 'CURRENT_ind_5', 'CURRENT_ind_4', 'BBK_topo', 'COND_plaque', 'TOPO_trou_1', 'TOPO_trou_3', 'TOPO_trou_2', 'TOPO_trou_8', 'TOPO_trou_4', 'TOPO_trou_7', 'TOPO_trou_5', 'TOPO_trou_6'] # cas-test T.E.A.M. Workshop 7
190         if debug:
191             print "listeGroup=", listeGroup
192         version_catalogue = editor.maConfiguration.appli.readercata.version_code # détermination si le catalogue est fréquentiel ou temporel, d'après la deuxième entrée de la liste catalogues dans prefs_CARMEL3D.py
193         if debug:
194             print "Version catalogue=", version_catalogue
195         type_code = version_catalogue.split(' ')[0] # on garde le premier mot de la version du catalogue : 'frequentiel' ou 'temporel'
196         if debug:
197             print "Type de code=", type_code
198         if type_code not in ('frequentiel', 'temporel'): # test de cohérence du type de code
199             raise ValueError("Ce catalogue n'est ni frequentiel ni temporel")
200         if type_code == 'frequentiel':
201             handleAjoutGroupAvecFiltre(editor, listeGroup)
202         if type_code == 'temporel':
203             handleAjoutGroupSansFiltre(editor, listeGroup)