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.
23 from __future__ import absolute_import
24 from __future__ import print_function
26 from builtins import str
31 from Extensions.i18n import tr
32 from .generator_python import PythonGenerator
37 from enumDicoTelemac import TelemacdicoEn
38 DicoEnumCasEnInverse={}
39 for motClef in TelemacdicoEn:
41 for valTelemac in TelemacdicoEn[motClef]:
42 valEficas= TelemacdicoEn[motClef][valTelemac]
43 d[valEficas]=valTelemac
44 DicoEnumCasEnInverse[motClef]=d
54 Retourne les informations necessaires pour le chargeur de plugins
55 Ces informations sont retournees dans un dictionnaire
60 # La factory pour creer une instance du plugin
61 'factory' : TELEMACGenerator,
65 class TELEMACGenerator(PythonGenerator):
67 Ce generateur parcourt un objet de type JDC et produit
68 un texte au format eficas et
69 un texte au format dictionnaire
73 #----------------------------------------------------------------------------------------
74 def gener(self,obj,format='brut',config=None,appli=None,statut="Entier"):
77 self.langue=appli.langue
79 # Pour Simplifier les verifs d ecriture
80 if hasattr(appli,'listeTelemac') : self.listeTelemac=appli.listeTelemac
81 else : self.listeTelemac = ()
84 self.dicoCasToCata=appli.readercata.dicoCasToCata
85 for motClef in self.dicoCasToCata:
86 self.dicoCataToCas[self.dicoCasToCata[motClef]]=motClef
90 # Cette instruction genere le contenu du fichier de commandes (persistance)
91 self.text=PythonGenerator.gener(self,obj,format)
95 #----------------------------------------------------------------------------------------
97 #----------------------------------------------------------------------------------------
104 self.commentaireAvant = False
106 if self.langue == "fr" :
107 self.textPE = 'COTES IMPOSEES :'
108 self.textFE = 'DEBITS IMPOSES :'
109 self.textVE = 'VITESSES IMPOSEES :'
111 self.textPE = 'PRESCRIBED ELEVATIONS :'
112 self.textFE = 'PRESCRIBED FLOWRATES :'
113 self.textVE = 'PRESCRIBED VELOCITIES :'
120 #----------------------------------------------------------------------------------------
122 #----------------------------------------------------------------------------------------
124 def writeDefault(self,fn) :
125 self.texteDico+='\n&ETA\n&FIN\n'
126 if self.statut == 'Leger' : extension = ".Lcas"
127 else : extension = ".cas"
128 fileDico = fn[:fn.rfind(".")] + extension
129 f = open( str(fileDico), 'w')
130 f.write( self.texteDico )
133 #----------------------------------------------------------------------------------------
135 #----------------------------------------------------------------------------------------
137 def writeLeger(self,fn,jdc,config,appli) :
138 jdc_formate=self.gener(jdc,config=config,appli=appli,statut="Leger")
139 self.writeDefault(fn)
142 #----------------------------------------------------------------------------------------
143 # analyse de chaque noeud de l'arbre
144 #----------------------------------------------------------------------------------------
146 def generPROC_ETAPE(self,obj):
147 if not self.commentaireAvant or self.texteCom.find(obj.nom) < 0:
148 self.texteDico += '/------------------------------------------------------------------/\n'
149 self.texteDico += '/\t\t\t'+obj.nom +'\n'
150 self.texteDico += '/------------------------------------------------------------------/\n'
151 self.commentaireAvant = False
153 s=PythonGenerator.generPROC_ETAPE(self,obj)
154 if obj.nom in TELEMACGenerator.__dict__ : TELEMACGenerator.__dict__[obj.nom](*(self,obj))
158 def generMCSIMP(self,obj) :
159 """recuperation de l objet MCSIMP"""
160 s=PythonGenerator.generMCSIMP(self,obj)
163 # Attention pas sur --> ds certains cas non traite par MCFACT ?
164 # a reflechir avec Yoann
165 # ajouter le statut ?
166 if self.statut == 'Leger' :
167 if hasattr(obj.definition,'defaut') and (obj.definition.defaut == obj.valeur) and (obj.nom not in self.listeTelemac) : return s
168 if hasattr(obj.definition,'defaut') and obj.definition.defaut != None and (type(obj.valeur) == tuple or type(obj.valeur) == list) and (tuple(obj.definition.defaut) == tuple(obj.valeur)) and (obj.nom not in self.listeTelemac) : return s
171 #nomMajuscule=obj.nom.upper()
172 #nom=nomMajuscule.replace('_',' ')
173 #if nom in listeSupprime or s == "" : return s
174 if s == "" : return s
179 if not( type(obj.valeur) in (tuple,list) ):
180 if obj.nom in DicoEnumCasEnInverse:
181 try : sTelemac=str(DicoEnumCasEnInverse[obj.nom][obj.valeur])
183 if obj.valeur==None : sTelemac=obj.valeur
184 else : print(("generMCSIMP Pb valeur avec ", obj.nom, obj.valeur))
185 if type(obj.valeur) in (tuple,list) :
186 if obj.nom in DicoEnumCasEnInverse:
190 try : sT +=str(DicoEnumCasEnInverse[obj.nom][v]) +";"
192 if obj.definition.intoSug != [] : sT +=str(v) + ";"
193 else : print(("generMCSIMP Pb Tuple avec ", obj.nom, v, obj.valeur))
194 #sTelemac=sT[0:-1]+"'"
197 sTelemac=sTelemac[0:-1]
198 if sTelemac.find("'") > 0 :
199 sTelemac= sTelemac.replace (',',';\n ')
200 # on enleve le dernier ';'
201 index=(sTelemac.rfind(";"))
202 sTelemac=sTelemac[:index]+' '+sTelemac[index+1:]
205 if self.langue=='fr' :
206 s1=str(sTelemac).replace('True','OUI')
207 s2=s1.replace('False','NON')
209 s1=str(sTelemac).replace('True','YES')
210 s2=s1.replace('False','NO')
211 s3=s2.replace(',',';')
212 if s3 != "" and s3[0]=='(' :
213 try : s3=s3[1:-1] # cas de liste vide
218 if obj.nom in ('PRESCRIBED_FLOWRATES','PRESCRIBED_VELOCITIES','PRESCRIBED_ELEVATIONS') :
221 if obj.nom not in self.dicoCataToCas :
222 if obj.nom == 'Consigne' : return ""
225 nom=self.dicoCataToCas[obj.nom]
226 if nom in ["VARIABLES FOR GRAPHIC PRINTOUTS", "VARIABLES POUR LES SORTIES GRAPHIQUES", "VARIABLES TO BE PRINTED","VARIABLES A IMPRIMER"] :
228 s3=s3.replace(';',',')
230 if s3 == "" or s3 == " " : s3 = "None"
231 ligne=nom+ " : " + s3 + "\n"
232 if len(ligne) > 72 : ligne=self.redecoupeLigne(nom,s3)
233 self.texteDico+=ligne
235 def generMCFACT(self,obj):
238 s=PythonGenerator.generMCFACT(self,obj)
239 if obj.nom in TELEMACGenerator.__dict__ : TELEMACGenerator.__dict__[obj.nom](self,obj)
244 def LIQUID_BOUNDARIES(self,obj):
246 if 'BOUNDARY_TYPE' in obj.liste_mc_presents() :
247 objForme=obj.get_child('BOUNDARY_TYPE')
248 valForme=objForme.valeur
249 if valForme == None : return
251 nomBloc='b_'+valForme.split(" ")[1]
252 if nomBloc in obj.liste_mc_presents() :
253 objBloc=obj.get_child(nomBloc)
254 objValeur=objBloc.get_child(objBloc.liste_mc_presents()[0])
255 valeur=objValeur.valeur
256 if valeur== None : valeur="0."
257 if valForme == 'Prescribed Elevations' :
259 self.textPE += str(valeur) +"; "
260 else : self.textPE += "0.; "
261 if valForme == 'Prescribed Flowrates' :
263 self.textFE += str(valeur) +"; "
264 else : self.textFE += "0.; "
265 if valForme == 'Prescribed Velocity' :
267 self.textVE += str(valeur) +"; "
268 else : self.textVE += "0.; "
270 def BOUNDARY_CONDITIONS(self,obj):
272 if self.FE : self.texteDico += self.textFE[0:-2]+'\n'
273 if self.PE : self.texteDico += self.textPE[0:-2]+'\n'
274 if self.VE : self.texteDico += self.textVE[0:-2]+'\n'
276 def TRACERS(self,obj):
277 if self.nbTracers != 0 : self.texteDico += 'NUMBER_OF_TRACERS : '+str(self.nbTracers) + '\n'
280 def NAME_OF_TRACER(self,obj):
282 print((obj.get_genealogie_precise()))
284 def Validation(self,obj):
285 self.texteDico += "VALIDATION : True \n"
287 def Date_De_L_Origine_Des_Temps (self,obj):
288 an=obj.get_child('Year').valeur
289 mois=obj.get_child('Month').valeur
290 jour=obj.get_child('Day').valeur
291 self.texteDico += "ORIGINAL DATE OF TIME :"+ str(an)+ " ,"+str(mois)+ "," +str(jour)+ "\n"
293 def Original_Hour_Of_Time (self,obj):
294 hh=obj.get_child('Hour').valeur
295 mm=obj.get_child('Minute').valeur
296 ss=obj.get_child('Second').valeur
297 self.texteDico += "ORIGINAL HOUR OF TIME :"+str(hh)+" ,"+str(mm)+ ","+str(ss)+"\n"
299 def Type_Of_Advection(self,obj):
300 listeAdvection=[1,5,1,1]
302 listeUpwind=[1.,1.,1.,1.]
303 self.listeMCAdvection=[]
304 self.chercheChildren(obj)
305 dicoSuf={ 'U_And_V' : 0, 'H' : 1, 'K_And_Epsilon' : 2, 'Tracers' : 3}
306 for c in self.listeMCAdvection:
307 if c.nom[0:18] == 'Type_Of_Advection_' and c.valeur!=None:
310 listeAdvection[index]=DicoEnumCasEnInverse['Type_Of_Advection'][c.valeur]
311 if c.nom[0:13] == 'Supg_Option_' and c.valeur!=None:
314 listeAdvection[index]=DicoEnumCasEnInverse['Supg_Option'][c.valeur]
315 if c.nom[0:23] == 'Upwind_Coefficients_Of_' and c.valeur!=None:
318 listeUpwind[index]=c.valeur
319 self.texteDico += "TYPE OF ADVECTION = "+ str(listeAdvection) + "\n"
320 self.texteDico += "SUPG OPTION = "+ str(listeSupg) + "\n"
321 self.texteDico += "UPWIND COEFFICIENTS = "+ str(listeUpwind) + "\n"
323 def chercheChildren(self,obj):
324 for c in obj.liste_mc_presents():
325 objc=obj.get_child(c)
326 if hasattr(objc,'liste_mc_presents') and objc.liste_mc_presents() != [] : self.chercheChildren(objc)
327 else : self.listeMCAdvection.append(objc)
331 def redecoupeLigne(self,nom,valeur) :
334 if valeur.find("'") > -1:
335 lval=valeur.split(";")
336 for v in lval : text+=' '+v+';'
339 lval=valeur.split(";")
342 if len(ligne) < 70 : ligne += str(v)+'; '
345 ligne=" "+str(v)+'; '
346 text+= ligne[0:-2]+'\n'
349 def generCOMMENTAIRE(self,obj):
350 sans_saut = re.sub("\n$","",obj.valeur)
351 l_lignes = sans_saut.split('\n')
352 txt='/'+66*'-'+'/'+'\n'
354 for ligne in l_lignes:
355 self.texteCom+=ligne+'\n'
356 txt = txt + '/'+ligne+'\n'
357 txt= txt + '/'+66*'-'+'/'+'\n'
358 self.texteDico += txt
359 self.commentaireAvant= True
360 return PythonGenerator.generCOMMENTAIRE(self,obj)