1 # -*- coding: iso-8859-1 -*-
3 import re # module interne utilisé pour vérifier la validité du nom du maillage
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:nomme_sd, qui fait foi
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.
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)
17 dernier=editor.tree.racine.children[-1]
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
28 new_node = dernier.append_brother("MESHGROUP",'after')
30 new_node=editor.tree.racine.append_child("MESHGROUP",pos='first')
31 test,mess = new_node.item.nomme_sd(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
35 raise ValueError, "Ce nom de groupe ("+groupe+") pose un probleme inconnu"
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.
45 from string import join
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
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))
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)
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)
76 dernier=editor.tree.racine.children[-1]
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
95 new_node = dernier.append_brother("MESHGROUP",'after')
97 new_node=editor.tree.racine.append_child("MESHGROUP",pos='first')
98 test,mess = new_node.item.nomme_sd(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.append_child('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.append_child('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.append_child('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.append_child('SOURCE') # on rajoute la propriete de la source, qu'il suffit d'associer ensuite a la liste des sources presentes
111 new_node.append_child('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
115 dernier=new_node # mise a jour du dernier noeud du JdC, afin de rajouter les autres MESH_GROUPE eventuels a sa suite
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
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
130 new_node = dernier.append_brother("MACRO_GROUPE",'after')
132 new_node=editor.tree.racine.append_child("MACRO_GROUPE",pos='first')
133 test,mess = new_node.item.nomme_sd(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.append_child('LISTE_MESHGROUP') # Ajout de la liste des membres du groupe multiple
138 print 'Liste possible pour LISTE_MESHGROUP :'
139 print '_____________________'
140 print node_list.item.get_liste_possible(())
141 print '_____________________'
142 print dir(node_list.item)
143 listeNom=node_list.item.get_sd_avant_du_bon_type()
146 if nom in dictGroupesMultiples[groupe]['membres']:
147 #--> transformation du nom en objet
148 obj,valide=node_list.item.eval_valeur(nom)
149 listeObjet.append(obj)
150 node_list.item.set_valeur(listeObjet)
151 node_list.affichePanneau()
152 if prefix in listePrefixesMateriaux: # ce groupe est associe a un materiau
153 new_node.append_child('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.append_child('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.append_child('SOURCE') # on rajoute la propriete de la source, qu'il suffit d'associer ensuite a la liste des sources presentes
160 new_node.append_child('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.append_child('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
167 dernier=new_node # mise a jour du dernier noeud du JdC, afin de rajouter les autres MESH_GROUPE eventuels a sa suite
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."
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.
179 from string import join
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
191 print "listeGroup=", listeGroup
192 version_catalogue = editor.CONFIGURATION.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
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'
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)