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"
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 debutTexteZs0 =" [ZSURFACIC\n NAME "
49 debutTexteZs ="\n [CONDUCTIVITY\n"
50 debutTexteZs+=" LAW LINEAR\n"
51 debutTexteZs+=" HOMOGENEOUS TRUE\n"
52 debutTexteZs+=" ISOTROPIC TRUE\n"
53 debutTexteZs+=" VALUE COMPLEX "
54 texteZs2 =" 0.0000000000000000E+00\n ]\n"
55 texteZs2 +=" [PERMEABILITY\n LAW LINEAR\n"
56 texteZs2 +=" HOMOGENEOUS TRUE\n"
57 texteZs2 +=" ISOTROPIC TRUE\n VALUE COMPLEX "
58 finTexteZs =" 0.0000000000000000E+00\n ]\n ]\n"
62 Retourne les informations necessaires pour le chargeur de plugins
63 Ces informations sont retournees dans un dictionnaire
68 # La factory pour creer une instance du plugin
69 'factory' : CARMELCNDGenerator,
73 class CARMELCNDGenerator(PythonGenerator):
75 Ce generateur parcourt un objet de type JDC et produit
76 un texte au format eficas et
77 un texte au format dictionnaire
80 # Les extensions de fichier permis?
83 #----------------------------------------------------------------------------------------
84 def gener(self,obj,format='brut',config=None):
88 # Cette instruction genere le contenu du fichier de commandes (persistance)
89 self.text=PythonGenerator.gener(self,obj,format)
94 #----------------------------------------------------------------------------------------
96 #----------------------------------------------------------------------------------------
102 #----------------------------------------------------------------------------------------
104 #----------------------------------------------------------------------------------------
106 def writeDefault(self,file) :
109 self.texteIngendof=""
110 self.texteParam=debutTexteParam
111 self.chercheFichier()
112 self.traiteSourceVCut()
115 fileIngendofDeb = fn[:fn.rfind(".")] + '.ingendof'
116 fileIngendof = os.path.join(self.sauveDirectory,fileIngendofDeb)
117 f = open( str(fileIngendof), 'wb')
118 f.write( self.texteIngendof )
121 self.textePhys=debutTextePhys
122 self.traiteMateriaux()
123 filePhysDeb = fn[:fn.rfind(".")] + '.phys'
124 filePhys = os.path.join(self.sauveDirectory,filePhysDeb)
125 f = open( str(filePhys), 'wb')
126 f.write( self.textePhys )
129 fileParamDeb = fn[:fn.rfind(".")] + '.param'
130 fileParam = os.path.join(self.sauveDirectory,fileParamDeb)
132 f = open( str(fileParam), 'wb')
133 f.write( self.texteParam )
136 self.texteCMD="[ \n GLOBAL \n] \n[ \nVISU \n"+self.fnBase.split(".med")[0]+"\nMED \nELEMENT \n] "
137 fileCMDDeb = fn[:fn.rfind(".")] + '.cmd'
138 fileCMD =os.path.join(self.sauveDirectory,fileCMDDeb)
139 f = open( str(fileCMD), 'wb')
140 f.write( self.texteCMD )
143 nomBaseFichier=os.path.basename(fileParam).split(".med")[0]
145 self.texteInfcarmel=nomBaseFichier
146 fileInfcarmelDeb = fn[:fn.rfind(".")] + '.infcarmel'
147 fileInfcarmel=os.path.join(self.sauveDirectory,fileInfcarmelDeb)
148 f = open( str(fileInfcarmel), 'wb')
149 f.write( self.texteInfcarmel )
152 self.texteInpostpro=nomBaseFichier+"\n"+nomBaseFichier.split(".param")[0]+'.xmat\n'+nomBaseFichier.split(".param")[0]+'.cmd'
153 fileInpostproDeb = fn[:fn.rfind(".")] + '.inpostprocess'
154 fileInpostpro = os.path.join(self.sauveDirectory,fileInpostproDeb)
155 f = open( str(fileInpostpro), 'wb')
156 f.write( self.texteInpostpro )
159 #----------------------------------------------------------------------------------------
160 # analyse des commentaires pour trouver le nom du fichier
161 #----------------------------------------------------------------------------------------
163 def chercheFichier(self) :
165 for e in self.racine.etapes:
166 if isinstance(e,Accas.COMMENTAIRE):
167 print 'ùmasdkfh=',e.valeur[0:17]
168 if e.valeur[0:17]=="Cree - fichier : ":
170 liste=debut.split(" - ")
172 #print 'nom=',nomFichier
173 #print 'e.va=',e.valeur.split(" ")[-1]
174 #print 'liste=',liste
175 nomDomaine=e.valeur.split(" ")[-1]
177 self.sauveDirectory=os.path.dirname(nomFichier)
178 self.fnBase=os.path.basename(nomFichier)
179 self.texteIngendof =os.path.basename(nomFichier)+"\n"
180 self.texteParam += os.path.basename(nomFichier).split(".med")[0]+".car\n]\n"
181 self.texteParam +="[PHYS_FILES\n NAME "+os.path.basename(nomFichier).split(".med")[0]+".phys\n]\n"
183 #----------------------------------------------------------------------------------------
184 # analyse du dictionnaire pour trouver les sources et les VCut et les ZS
185 #----------------------------------------------------------------------------------------
187 def traiteSourceVCut(self) :
191 self.texteSourcePhys="[SOURCES\n"
192 for k in self.dictMCVal.keys():
193 if k.find ("______SOURCE__") > -1 :
194 noms=k.split("_____")
195 if noms[0] not in listeSource : listeSource.append(noms[0])
196 if k.find ("______VCUT__") > -1 :
197 noms=k.split("_____")
198 if noms[0] not in listeVCut : listeVCut.append(noms[0])
199 if k.find ("______ZS") > -1 :
200 noms=k.split("_____")
201 if noms[0] not in self.listeZS : self.listeZS.append(noms[0])
203 for source in listeSource:
204 debutKey=source+"______SOURCE__"
205 texteSource=self.dictMCVal[debutKey+"EnveloppeConnexeInducteur"]+"\n"
207 for val in self.dictMCVal[debutKey+"VecteurDirecteur"] :
208 texteSource+=str(val)+" "
210 for val in self.dictMCVal[debutKey+"Centre"] :
211 texteSource+=str(val)+" "
213 texteSource+=str(self.dictMCVal[debutKey+"SectionBobine"])+"\n"
214 self.texteIngendof+=texteSource
215 self.texteSourcePhys+=" [STRANDED_INDUCTOR\n"
216 self.texteSourcePhys+=" NAME "+source+"\n"
217 self.texteSourcePhys+=" NTURNS "+str(self.dictMCVal[debutKey+"NbdeTours"])+"\n"
218 self.texteSourcePhys+=" CURJ POLAR "+str(self.dictMCVal[debutKey+"Amplitude"])
219 self.texteSourcePhys+=" 0.0000000000000000E+00\n ]\n"
221 self.texteSourcePhys+="]\n"
222 for vcut in listeVCut:
223 self.texteIngendof+="1\n"
224 debutKey=vcut+"______VCUT__"
225 if self.dictMCVal[debutKey+"Orientation"] == "Oppose" :self.texteIngendof+="0\n"
226 else : self.texteIngendof+="1\n"
227 if self.dictMCVal["__PARAMETRES__TypedeFormule"]=="APHI" :self.texteIngendof+="1\n"
228 else : self.texteIngendof+="2\n"
232 #----------------------------------------------------------------------------------------
233 def traiteMateriaux(self) :
234 #----------------------------------------------------------------------------------------
237 for k in self.dictMCVal.keys():
238 if k.find ("______CONDUCTEUR") > -1 :
239 noms=k.split("_____")
240 if noms[0] not in listeCond : listeCond.append(noms[0])
241 if k.find ("______NOCOND") > -1 :
242 noms=k.split("_____")
243 if noms[0] not in listeNoCond : listeNoCond.append(noms[0])
246 self.textePhys +=" [CONDUCTOR\n"
247 self.textePhys +=" NAME "+c+"\n"
248 self.textePhys +=texteConductor
249 self.textePhys+=" VALUE COMPLEX "
250 self.textePhys+=str(self.dictMCVal[c+"______CONDUCTEUR__Conductivite"])
251 self.textePhys+=texteConducto2
252 self.textePhys+=" VALUE COMPLEX "
253 self.textePhys+=str(self.dictMCVal[c+"______CONDUCTEUR__PermeabiliteRelative"])
254 self.textePhys+=" 0.0000000000000000E+00\n ]\n ]\n"
256 for c in listeNoCond:
257 self.textePhys+=" [DIELECTRIC\n"
258 self.textePhys +=" NAME "+c+"\n"
259 self.textePhys += texteNoCond
260 self.textePhys+=" VALUE COMPLEX "
261 self.textePhys+=str(self.dictMCVal[c+"______NOCOND__PermeabiliteRelative"])
262 self.textePhys+=" 0.0000000000000000E+00\n ]\n ]\n"
264 for zs in self.listeZS:
265 self.textePhys+=debutTexteZs0+zs
266 self.textePhys+=debutTexteZs
267 self.textePhys+=str(self.dictMCVal[zs+"______ZS__Conductivite"])
268 self.textePhys+=texteZs2
269 self.textePhys+=str(self.dictMCVal[zs+"______ZS__PermeabiliteRelative"])
270 self.textePhys+=finTexteZs
272 self.textePhys+="]\n"
273 self.textePhys+=self.texteSourcePhys
275 #----------------------------------------------------------------------------------------
276 # Creation du fichier Param
277 #----------------------------------------------------------------------------------------
278 def traiteParam(self):
279 self.texteParam +="[FREQUENCY\n SINGLE "+str(self.dictMCVal["__PARAMETRES__Frequence"])+"\n]\n"
280 self.texteParam +="[SOLVER\n NAME BICGCR\n"
281 self.texteParam +=" [ITERATIVE_PARAM\n"
282 self.texteParam +=" NITERMAX "+str(self.dictMCVal["__PARAMETRES__Nb_Max_Iterations"])+"\n"
283 self.texteParam +=" EPSILON "+ str(self.dictMCVal["__PARAMETRES__Erreur_Max"])+"\n ]\n]"
286 #----------------------------------------------------------------------------------------
287 # analyse de chaque noeud de l'arbre
288 #----------------------------------------------------------------------------------------
290 def generMCSIMP(self,obj) :
291 """recuperation de l objet MCSIMP"""
292 s=PythonGenerator.generMCSIMP(self,obj)
293 if hasattr(obj.etape,'sdnom'): clef=obj.etape.sdnom+"____"
295 for i in obj.get_genealogie() :
297 self.dictMCVal[clef]=obj.valeur
301 def get_repExeCarmel(self) :
302 return self.dictMCVal["__PARAMETRES__RepCarmel"]