1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 """Ce module contient le plugin generateur de fichier au format Code_Carmel3D pour EFICAS.
24 import types,string,re,os
25 from Extensions.i18n import tr
26 from generator_python import PythonGenerator
29 debutTextePhys ="[VERSION\n NUM 1\n FILETYPE PHYS\n]\n"
30 debutTextePhys+="[MATERIALS\n [CONDUCTOR\n"
31 texteConductor =" [CONDUCTIVITY\n LAW LINEAR\n"
32 texteConductor+=" HOMOGENEOUS TRUE\n"
33 texteConductor+=" ISOTROPIC TRUE\n"
34 texteConducto2 =" 0.0000000000000000E+00\n ]\n"
35 texteConducto2+=" [PERMEABILITY\n LAW LINEAR\n"
36 texteConducto2+=" HOMOGENEOUS TRUE\n"
37 texteConducto2+=" ISOTROPIC TRUE\n"
38 texteNoCond =" [PERMITTIVITY\n LAW LINEAR\n"
39 texteNoCond+=" HOMOGENEOUS TRUE\n ISOTROPIC TRUE\n"
40 texteNoCond+=" VALUE COMPLEX 0.1000000000000000E+01 0.0000000000000000E+00\n"
41 texteNoCond+=" ]\n [PERMEABILITY\n LAW LINEAR\n"
42 texteNoCond+=" HOMOGENEOUS TRUE\n ISOTROPIC TRUE\n"
44 debutTexteParam ="[VERSION\n NUM 1\n FILETYPE PARAM\n]\n"
45 debutTexteParam+="[PROBLEM\n NAME HARMONIC\n]\n"
46 debutTexteParam+="[CAR_FILES\n NAME "
48 debutTexteBav ="[ZSURFACIC\n NAME BAV\n [CONDUCTIVITY\n"
49 debutTexteBav+=" LAW LINEAR\n"
50 debutTexteBav+=" HOMOGENEOUS TRUE\n"
51 debutTexteBav+=" ISOTROPIC TRUE\n"
52 debutTexteBav+=" VALUE COMPLEX "
53 texteBav2 =" 0.0000000000000000E+00\n ]\n"
54 texteBav2 +=" [PERMEABILITY\n LAW LINEAR\n"
55 texteBav2 +=" HOMOGENEOUS TRUE\n"
56 texteBav2 +=" ISOTROPIC TRUE\n VALUE COMPLEX "
57 finTexteBav =" 0.0000000000000000E+00\n ]\n]\n"
61 Retourne les informations necessaires pour le chargeur de plugins
62 Ces informations sont retournees dans un dictionnaire
67 # La factory pour creer une instance du plugin
68 'factory' : CARMELCNDGenerator,
72 class CARMELCNDGenerator(PythonGenerator):
74 Ce generateur parcourt un objet de type JDC et produit
75 un texte au format eficas et
76 un texte au format dictionnaire
79 # Les extensions de fichier permis?
82 #----------------------------------------------------------------------------------------
83 def gener(self,obj,format='brut',config=None):
87 # Cette instruction genere le contenu du fichier de commandes (persistance)
88 self.text=PythonGenerator.gener(self,obj,format)
93 #----------------------------------------------------------------------------------------
95 #----------------------------------------------------------------------------------------
101 #----------------------------------------------------------------------------------------
103 #----------------------------------------------------------------------------------------
105 def writeDefault(self,fn) :
107 self.texteIngendof=""
108 self.texteParam=debutTexteParam
109 self.chercheFichier()
110 self.traiteSourceVCut()
113 fileIngendof = fn[:fn.rfind(".")] + '.ingendof'
114 f = open( str(fileIngendof), 'wb')
115 f.write( self.texteIngendof )
117 f = open( str("/tmp/toto"), 'wb')
118 f.write( self.texteIngendof )
121 self.textePhys=debutTextePhys
122 self.traiteMateriaux()
123 filePhys = fn[:fn.rfind(".")] + '.phys'
124 f = open( str(filePhys), 'wb')
125 f.write( self.textePhys )
128 fileParam = fn[:fn.rfind(".")] + '.param'
130 f = open( str(fileParam), 'wb')
131 f.write( self.texteParam )
134 self.texteCMD="[ \n GLOBAL \n] \n[ \nVISU \nDomaine \nMED \nELEMENT \n] "
135 fileCMD = fn[:fn.rfind(".")] + '.cmd'
136 f = open( str(fileCMD), 'wb')
137 f.write( self.texteCMD )
140 nomBaseFichier=os.path.basename(fileParam).split(".med")[0]
142 self.texteInfcarmel=nomBaseFichier
143 fileInfcarmel = fn[:fn.rfind(".")] + '.infcarmel'
144 f = open( str(fileInfcarmel), 'wb')
145 f.write( self.texteInfcarmel )
148 self.texteInpostpro=nomBaseFichier+"\n"+nomBaseFichier.split(".param")[0]+'.xmat\n'+nomBaseFichier.split(".param")[0]+'.cmd'
149 fileInpostpro = fn[:fn.rfind(".")] + '.inpostprocess'
150 f = open( str(fileInpostpro), 'wb')
151 f.write( self.texteInpostpro )
154 #----------------------------------------------------------------------------------------
155 # analyse des commentaires pour trouver le nom du fichier
156 #----------------------------------------------------------------------------------------
158 def chercheFichier(self) :
160 for e in self.racine.etapes:
161 if isinstance(e,Accas.COMMENTAIRE):
162 print 'ùmasdkfh=',e.valeur[0:17]
163 if e.valeur[0:17]=="Cree - fichier : ":
165 liste=debut.split(" - ")
167 print 'nom=',nomFichier
168 print 'e.va=',e.valeur.split(" ")[-1]
170 nomDomaine=e.valeur.split(" ")[-1]
172 self.texteIngendof =os.path.basename(nomFichier)+"\n"
173 self.texteParam += os.path.basename(nomFichier).split(".med")[0]+".car\n]\n"
174 self.texteParam +="[PHYS_FILES\n NAME "+os.path.basename(nomFichier).split(".med")[0]+".phys\n]\n"
176 #----------------------------------------------------------------------------------------
177 # analyse du dictionnaire pour trouver les sources et les VCut
178 #----------------------------------------------------------------------------------------
180 def traiteSourceVCut(self) :
183 self.texteSourcePhys="[SOURCES\n"
184 for k in self.dictMCVal.keys():
185 if k.find ("______SOURCE__") > -1 :
186 noms=k.split("_____")
187 if noms[0] not in listeSource : listeSource.append(noms[0])
188 if k.find ("______VCUT__") > -1 :
189 noms=k.split("_____")
190 if noms[0] not in listeVCut : listeVCut.append(noms[0])
192 for source in listeSource:
193 debutKey=source+"______SOURCE__"
194 texteSource=self.dictMCVal[debutKey+"NomDomaine"]+"\n"
196 for val in self.dictMCVal[debutKey+"VecteurDirecteur"] :
197 texteSource+=str(val)+" "
199 for val in self.dictMCVal[debutKey+"Centre"] :
200 texteSource+=str(val)+" "
202 texteSource+=str(self.dictMCVal[debutKey+"SectionDomaine"])+"\n"
203 self.texteIngendof+=texteSource
204 self.texteSourcePhys+=" [STRANDED_INDUCTOR\n"
205 self.texteSourcePhys+=" NAME "+source+"\n"
206 self.texteSourcePhys+=" NTURNS "+str(self.dictMCVal[debutKey+"NbdeTours"])+"\n"
207 self.texteSourcePhys+=" CURJ POLAR "+str(self.dictMCVal[debutKey+"Amplitude"])
208 self.texteSourcePhys+=" 0.0000000000000000E+00\n ]\n"
210 self.texteSourcePhys+="]\n"
211 for vcut in listeVCut:
212 self.texteIngendof+="1\n"
213 debutKey=vcut+"______VCUT__"
214 if self.dictMCVal[debutKey+"Orientation"] == "Oppose" :self.texteIngendof+="0\n"
215 else : self.texteIngendof+="1\n"
216 if self.dictMCVal["__PARAMETRES__TypedeFormule"]=="APHI" :self.texteIngendof+="1\n"
217 else : self.texteIngendof+="2\n"
219 #----------------------------------------------------------------------------------------
220 def traiteZs_Bav(self):
221 #----------------------------------------------------------------------------------------
222 if "__ZS_BAV__Permeabilite" in self.dictMCVal.keys():
223 self.texteSourcePhys+=debutTexteBav
224 self.texteSourcePhys+=str(self.dictMCVal["__ZS_BAV__Conductivite"])
225 self.texteSourcePhys+=texteBav2
226 self.texteSourcePhys+=str(self.dictMCVal["__ZS_BAV__Permeabilite"])
227 self.texteSourcePhys+=finTexteBav
230 #----------------------------------------------------------------------------------------
231 def traiteMateriaux(self) :
232 #----------------------------------------------------------------------------------------
235 for k in self.dictMCVal.keys():
236 if k.find ("______CONDUCTEUR") > -1 :
237 noms=k.split("_____")
238 if noms[0] not in listeCond : listeCond.append(noms[0])
239 if k.find ("______NOCOND") > -1 :
240 noms=k.split("_____")
241 if noms[0] not in listeNoCond : listeNoCond.append(noms[0])
244 self.textePhys +=" NAME "+c+"\n"
245 self.textePhys +=texteConductor
246 self.textePhys+=" VALUE COMPLEX "
247 self.textePhys+=str(self.dictMCVal[c+"______CONDUCTEUR__Conductivite"])
248 self.textePhys+=texteConducto2
249 self.textePhys+=" VALUE COMPLEX "
250 self.textePhys+=str(self.dictMCVal[c+"______CONDUCTEUR__Permeabilite"])
251 self.textePhys+=" 0.0000000000000000E+00\n ]\n ]\n"
253 for c in listeNoCond:
254 self.textePhys+=" [DIELECTRIC\n"
255 self.textePhys +=" NAME "+c+"\n"
256 self.textePhys += texteNoCond
257 self.textePhys+=" VALUE COMPLEX "
258 self.textePhys+=str(self.dictMCVal[c+"______NOCOND__Permeabilite"])
259 self.textePhys+=" 0.0000000000000000E+00\n ]\n ]\n"
261 self.textePhys+="]\n"
262 self.textePhys+=self.texteSourcePhys
264 #----------------------------------------------------------------------------------------
265 # Creation du fichier Param
266 #----------------------------------------------------------------------------------------
267 def traiteParam(self):
268 self.texteParam +="[FREQUENCY\n SINGLE "+str(self.dictMCVal["__PARAMETRES__Frequence_en_Hz"])+"\n]\n"
269 self.texteParam +="[SOLVER\n NAME BICGCR\n"
270 self.texteParam +=" [ITERATIVE_PARAM\n"
271 self.texteParam +=" NITERMAX "+str(self.dictMCVal["__PARAMETRES__Nb_Max_Iterations"])+"\n"
272 self.texteParam +=" EPSILON "+ str(self.dictMCVal["__PARAMETRES__Erreur_Max"])+"\n ]\n]"
275 #----------------------------------------------------------------------------------------
276 # analyse de chaque noeud de l'arbre
277 #----------------------------------------------------------------------------------------
279 def generMCSIMP(self,obj) :
280 """recuperation de l objet MCSIMP"""
281 s=PythonGenerator.generMCSIMP(self,obj)
282 if hasattr(obj.etape,'sdnom'): clef=obj.etape.sdnom+"____"
284 for i in obj.get_genealogie() :
286 self.dictMCVal[clef]=obj.valeur
290 def get_repExeCarmel(self) :
291 return self.dictMCVal["__PARAMETRES__RepCarmel"]