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
41 Retourne les informations necessaires pour le chargeur de plugins
42 Ces informations sont retournees dans un dictionnaire
47 # La factory pour creer une instance du plugin
48 'factory' : TELEMACGenerator,
52 class TELEMACGenerator(PythonGenerator):
54 Ce generateur parcourt un objet de type JDC et produit
55 un texte au format eficas et
56 un texte au format dictionnaire
60 #----------------------------------------------------------------------------------------
61 def gener(self,obj,format='brut',config=None,appli=None,statut="Entier"):
64 self.langue=appli.langue
65 self.DicoEnumCasEnInverse={}
66 from enum_Telemac2d_auto import TelemacdicoEn
67 for motClef in TelemacdicoEn:
69 for valTelemac in TelemacdicoEn[motClef]:
70 valEficas= TelemacdicoEn[motClef][valTelemac]
71 d[valEficas]=valTelemac
72 self.DicoEnumCasEnInverse[motClef]=d
73 if self.langue == 'fr' :
74 from enum_Telemac2d_auto import DicoEnumCasFrToEnumCasEn
75 for motClef in DicoEnumCasFrToEnumCasEn:
77 for valTelemac in DicoEnumCasFrToEnumCasEn[motClef]:
78 valEficas= DicoEnumCasFrToEnumCasEn[motClef][valTelemac]
79 d[valEficas]=valTelemac
80 self.DicoEnumCasEnInverse[motClef]=d
82 #print (self.DicoEnumCasEnInverse.keys())
83 # Pour Simplifier les verifs d ecriture
84 if hasattr(appli,'listeTelemac') : self.listeTelemac=appli.listeTelemac
85 else : self.listeTelemac = ()
88 self.dicoCasToCata=appli.readercata.dicoCasToCata
89 for motClef in self.dicoCasToCata:
90 self.dicoCataToCas[self.dicoCasToCata[motClef]]=motClef
94 # Cette instruction genere le contenu du fichier de commandes (persistance)
95 self.text=PythonGenerator.gener(self,obj,format)
99 #----------------------------------------------------------------------------------------
101 #----------------------------------------------------------------------------------------
108 self.commentaireAvant = False
110 if self.langue == "fr" :
111 self.textPE = 'COTES IMPOSEES :'
112 self.textFE = 'DEBITS IMPOSES :'
113 self.textVE = 'VITESSES IMPOSEES :'
115 self.textPE = 'PRESCRIBED ELEVATIONS :'
116 self.textFE = 'PRESCRIBED FLOWRATES :'
117 self.textVE = 'PRESCRIBED VELOCITIES :'
124 #----------------------------------------------------------------------------------------
126 #----------------------------------------------------------------------------------------
128 def writeDefault(self,fn) :
129 self.texteDico+='&ETA\n'
130 if self.statut == 'Leger' : extension = ".Lcas"
131 else : extension = ".cas"
132 fileDico = fn[:fn.rfind(".")] + extension
133 f = open( str(fileDico), 'w')
134 f.write( self.texteDico )
137 #----------------------------------------------------------------------------------------
139 #----------------------------------------------------------------------------------------
141 def writeLeger(self,fn,jdc,config,appli) :
142 jdc_formate=self.gener(jdc,config=config,appli=appli,statut="Leger")
143 self.writeDefault(fn)
146 #----------------------------------------------------------------------------------------
147 # analyse de chaque noeud de l'arbre
148 #----------------------------------------------------------------------------------------
150 def generPROC_ETAPE(self,obj):
151 if not self.commentaireAvant or self.texteCom.find(obj.nom) < 0:
152 self.texteDico += '/------------------------------------------------------------------/\n'
153 self.texteDico += '/\t\t\t'+obj.nom +'\n'
154 self.texteDico += '/------------------------------------------------------------------/\n'
155 self.commentaireAvant = False
157 s=PythonGenerator.generPROC_ETAPE(self,obj)
158 if obj.nom in TELEMACGenerator.__dict__ : TELEMACGenerator.__dict__[obj.nom](*(self,obj))
162 def generMCSIMP(self,obj) :
163 """recuperation de l objet MCSIMP"""
164 s=PythonGenerator.generMCSIMP(self,obj)
167 # Attention pas sur --> ds certains cas non traite par MCFACT ?
168 # a reflechir avec Yoann
169 # ajouter le statut ?
170 if self.statut == 'Leger' :
171 if hasattr(obj.definition,'defaut') and (obj.definition.defaut == obj.valeur) and (obj.nom not in self.listeTelemac) : return s
172 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
175 #nomMajuscule=obj.nom.upper()
176 #nom=nomMajuscule.replace('_',' ')
177 #if nom in listeSupprime or s == "" : return s
178 if s == "" : return s
181 if not( type(obj.valeur) in (tuple,list) ):
182 if obj.nom in self.DicoEnumCasEnInverse:
183 try : sTelemac=str(self.DicoEnumCasEnInverse[obj.nom][obj.valeur])
185 if obj.valeur==None : sTelemac=obj.valeur
186 else : print(("generMCSIMP Pb valeur avec ", obj.nom, obj.valeur))
188 if type(obj.valeur) in (tuple,list) :
189 if obj.nom in self.DicoEnumCasEnInverse:
193 try : sT +=str(self.DicoEnumCasEnInverse[obj.nom][v]) +";"
195 if obj.definition.intoSug != [] : sT +=str(v) + ";"
196 else : print(("generMCSIMP Pb Tuple avec ", obj.nom, v, obj.valeur))
197 #sTelemac=sT[0:-1]+"'"
200 sTelemac=sTelemac[0:-1]
201 if sTelemac.find("'") > 0 :
202 sTelemac= sTelemac.replace (',',';\n ')
203 # on enleve le dernier ';'
204 index=(sTelemac.rfind(";"))
205 sTelemac=sTelemac[:index]+' '+sTelemac[index+1:]
207 if self.langue=='fr' :
208 s1=str(sTelemac).replace('True','OUI')
209 s2=s1.replace('False','NON')
211 s1=str(sTelemac).replace('True','YES')
212 s2=s1.replace('False','NO')
213 if hasattr(obj.definition,'max'):
214 if obj.definition.max != 1:
215 s3=s2.replace(',',';')
218 if s3 != "" and s3[0]=='(' :
219 try : s3=s3[1:-1] # cas de liste vide
224 #if obj.nom in ('PRESCRIBED_FLOWRATES','PRESCRIBED_VELOCITIES','PRESCRIBED_ELEVATIONS') :
227 if obj.nom not in self.dicoCataToCas :
228 if obj.nom == 'Consigne' : return ""
231 nom=self.dicoCataToCas[obj.nom]
232 if nom in ["VARIABLES FOR GRAPHIC PRINTOUTS", "VARIABLES POUR LES SORTIES GRAPHIQUES", "VARIABLES TO BE PRINTED","VARIABLES A IMPRIMER"] :
233 if s3 != 'None' and s3 != "''":
234 s3=s3.replace(';',',')
238 if s3 == "" or s3 == " " : s3 = " "
239 ligne=nom+ " : " + s3 + "\n"
240 if len(ligne) > 72 : ligne=self.redecoupeLigne(nom,s3)
241 self.texteDico+=ligne
243 def generMCFACT(self,obj):
246 s=PythonGenerator.generMCFACT(self,obj)
247 if obj.nom in TELEMACGenerator.__dict__ : TELEMACGenerator.__dict__[obj.nom](self,obj)
252 # def LIQUID_BOUNDARIES(self,obj):
254 # if 'BOUNDARY_TYPE' in obj.liste_mc_presents() :
255 # objForme=obj.get_child('BOUNDARY_TYPE')
256 # valForme=objForme.valeur
257 # if valForme == None : return
260 # if valForme == 'Prescribed Unknown':
261 # nomBloc='b_'+valForme.split(" ")[1]
262 # if nomBloc in obj.liste_mc_presents() :
263 # objBloc=obj.get_child(nomBloc)
264 # valeurPE = objValeur=objBloc.get_child(objBloc.liste_mc_presents()[0]).valeur
265 # valeurFE = objValeur=objBloc.get_child(objBloc.liste_mc_presents()[1]).valeur
266 # valeurVE = objValeur=objBloc.get_child(objBloc.liste_mc_presents()[2]).valeur
267 # if valeurPE== None : valeurPE="0."
268 # if valeurFE== None : valeurPE="0."
269 # if valeurVE== None : valeurPE="0."
271 # self.textPE += str(valeurPE) +"; "
273 # self.textFE += str(valeurFE) +"; "
275 # self.textVE += str(valeurVE) +"; "
277 # nomBloc='b_'+valForme.split(" ")[1]
278 # if nomBloc in obj.liste_mc_presents() :
279 # objBloc=obj.get_child(nomBloc)
280 # objValeur=objBloc.get_child(objBloc.liste_mc_presents()[0])
281 # valeur=objValeur.valeur
282 # if valeur== None : valeur="0."
283 # if valForme == 'Prescribed Elevations' :
285 # self.textPE += str(valeur) +"; "
286 # else : self.textPE += "0.; "
287 # if valForme == 'Prescribed Flowrates' :
289 # self.textFE += str(valeur) +"; "
290 # else : self.textFE += "0.; "
291 # if valForme == 'Prescribed Velocity' :
293 # self.textVE += str(valeur) +"; "
294 # else : self.textVE += "0.; "
296 # def BOUNDARY_CONDITIONS(self,obj):
298 # if self.FE : self.texteDico += self.textFE[0:-2]+'\n'
299 # if self.PE : self.texteDico += self.textPE[0:-2]+'\n'
300 # if self.VE : self.texteDico += self.textVE[0:-2]+'\n'
302 def TRACERS(self,obj):
303 if self.nbTracers != 0 : self.texteDico += 'NUMBER_OF_TRACERS : '+str(self.nbTracers) + '\n'
306 def NAME_OF_TRACER(self,obj):
308 print((obj.get_genealogie_precise()))
310 def Validation(self,obj):
311 self.texteDico += "VALIDATION : True \n"
313 def Date_De_L_Origine_Des_Temps (self,obj):
314 an=obj.get_child('Year').valeur
315 mois=obj.get_child('Month').valeur
316 jour=obj.get_child('Day').valeur
317 self.texteDico += "ORIGINAL DATE OF TIME :"+ str(an)+ " ,"+str(mois)+ "," +str(jour)+ "\n"
319 def Original_Hour_Of_Time (self,obj):
320 hh=obj.get_child('Hour').valeur
321 mm=obj.get_child('Minute').valeur
322 ss=obj.get_child('Second').valeur
323 self.texteDico += "ORIGINAL HOUR OF TIME :"+str(hh)+" ,"+str(mm)+ ","+str(ss)+"\n"
325 def Type_Of_Advection(self,obj):
326 listeAdvection=[1,5,1,1]
328 listeUpwind=[1.,1.,1.,1.]
329 self.listeMCAdvection=[]
330 self.chercheChildren(obj)
331 dicoSuf={ 'U_And_V' : 0, 'H' : 1, 'K_And_Epsilon' : 2, 'Tracers' : 3}
332 for c in self.listeMCAdvection:
333 if c.nom[0:18] == 'Type_Of_Advection_' and c.valeur!=None:
336 listeAdvection[index]=self.DicoEnumCasEnInverse['Type_Of_Advection'][c.valeur]
337 if c.nom[0:13] == 'Supg_Option_' and c.valeur!=None:
340 listeAdvection[index]=self.DicoEnumCasEnInverse['Supg_Option'][c.valeur]
341 if c.nom[0:23] == 'Upwind_Coefficients_Of_' and c.valeur!=None:
344 listeUpwind[index]=c.valeur
345 self.texteDico += "TYPE OF ADVECTION = "+ str(listeAdvection) + "\n"
346 self.texteDico += "SUPG OPTION = "+ str(listeSupg) + "\n"
347 self.texteDico += "UPWIND COEFFICIENTS = "+ str(listeUpwind) + "\n"
349 def chercheChildren(self,obj):
350 for c in obj.liste_mc_presents():
351 objc=obj.get_child(c)
352 if hasattr(objc,'liste_mc_presents') and objc.liste_mc_presents() != [] : self.chercheChildren(objc)
353 else : self.listeMCAdvection.append(objc)
357 def redecoupeLigne(self,nom,valeur) :
360 if valeur.find("'") > -1:
361 lval=valeur.split(";")
362 for v in lval : text+=' '+v+';'
365 lval=valeur.split(";")
368 if len(ligne) < 70 : ligne += str(v)+'; '
371 ligne=" "+str(v)+'; '
372 text+= ligne[0:-2]+'\n'
375 def generCOMMENTAIRE(self,obj):
376 sans_saut = re.sub("\n$","",obj.valeur)
377 l_lignes = sans_saut.split('\n')
378 txt='/'+66*'-'+'/'+'\n'
380 for ligne in l_lignes:
381 self.texteCom+=ligne+'\n'
382 txt = txt + '/'+ligne+'\n'
383 txt= txt + '/'+66*'-'+'/'+'\n'
384 self.texteDico += txt
385 self.commentaireAvant= True
386 return PythonGenerator.generCOMMENTAIRE(self,obj)