1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2021 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
21 Ce module contient le plugin generateur de fichier au format
26 from builtins import str
27 from builtins import object
32 from Extensions.i18n import tr
33 from Extensions.eficas_exception import EficasException
35 from Noyau import N_CR
36 from Noyau.N_utils import repr_float
37 from Accas import ETAPE,PROC_ETAPE,MACRO_ETAPE,ETAPE_NIVEAU,JDC,FORM_ETAPE
38 from Accas import MCSIMP,MCFACT,MCBLOC,MCList,EVAL
39 from Accas import GEOM,ASSD,MCNUPLET
40 from Accas import COMMENTAIRE,PARAMETRE, PARAMETRE_EVAL,COMMANDE_COMM
44 Retourne les informations necessaires pour le chargeur de plugins
46 Ces informations sont retournees dans un dictionnaire
51 # La factory pour creer une instance du plugin
52 'factory' : AplatGenerator,
56 class AplatGenerator(object):
58 Ce generateur parcourt un objet de type JDC et produit
59 un fichier au format aplat
61 L'acquisition et le parcours sont realises par la methode
62 generator.gener(objet_jdc,format)
64 L'ecriture du fichier au format ini par appel de la methode
65 generator.writefile(nom_fichier)
67 Ses caracteristiques principales sont exposees dans des attributs
69 - extensions : qui donne une liste d'extensions de fichier preconisees
72 # Les extensions de fichier preconisees
75 def __init__(self,cr=None):
76 # Si l'objet compte-rendu n'est pas fourni, on utilise le compte-rendu standard
80 self.cr=N_CR.CR(debut='CR generateur format aplat pour eficas',
81 fin='fin CR format aplat pour eficas')
83 # Le separateur utiise
85 # Le texte au format aplat est stocke dans l'attribut text
88 def writefile(self,filename):
93 def gener(self,obj,format='brut',config=None,appliEficas=None):
95 Retourne une representation du JDC obj sous une forme qui est parametree par format.
96 Si format vaut 'brut', 'standard' ou 'beautifie', retourne le texte issu de generator
98 liste= self.generator(obj)
101 elif format == 'standard':
103 elif format == 'beautifie':
106 raise EficasException(tr("Format pas implemente : %s", format))
109 def generator(self,obj):
111 Cette methode joue un role d'aiguillage en fonction du type de obj
112 On pourrait utiliser les methodes accept et visitxxx a la
113 place (depend des gouts !!!)
115 # ATTENTION a l'ordre des tests : il peut avoir de l'importance (heritage)
116 if isinstance(obj,PROC_ETAPE):
117 return self.generPROC_ETAPE(obj)
118 elif isinstance(obj,MACRO_ETAPE):
119 return self.generMACRO_ETAPE(obj)
120 elif isinstance(obj,FORM_ETAPE):
121 return self.generFORM_ETAPE(obj)
122 elif isinstance(obj,ETAPE):
123 return self.generETAPE(obj)
124 elif isinstance(obj,MCFACT):
125 return self.generMCFACT(obj)
126 elif isinstance(obj,MCList):
127 return self.generMCList(obj)
128 elif isinstance(obj,MCBLOC):
129 return self.generMCBLOC(obj)
130 elif isinstance(obj,MCSIMP):
131 return self.generMCSIMP(obj)
132 elif isinstance(obj,ASSD):
133 return self.generASSD(obj)
134 elif isinstance(obj,ETAPE_NIVEAU):
135 return self.generETAPE_NIVEAU(obj)
136 elif isinstance(obj,COMMENTAIRE):
137 return self.generCOMMENTAIRE(obj)
138 # Attention doit etre place avant PARAMETRE (raison : heritage)
139 elif isinstance(obj,PARAMETRE_EVAL):
140 return self.generPARAMETRE_EVAL(obj)
141 elif isinstance(obj,PARAMETRE):
142 return self.generPARAMETRE(obj)
143 elif isinstance(obj,EVAL):
144 return self.generEVAL(obj)
145 elif isinstance(obj,COMMANDE_COMM):
146 return self.generCOMMANDE_COMM(obj)
147 elif isinstance(obj,JDC):
148 return self.generJDC(obj)
149 elif isinstance(obj,MCNUPLET):
150 return self.generMCNUPLET(obj)
152 raise EficasException(tr("Format non implemente : %s", format))
155 def generJDC(self,obj):
157 Cette methode convertit un objet JDC en une chaine de
158 caracteres a la syntaxe aplat
161 if obj.definition.l_niveaux == ():
162 # Il n'y a pas de niveaux
163 for etape in obj.etapes:
164 text=text+self.generator(etape)+'\n'
167 for etape_niveau in obj.etapes_niveaux:
168 text=text+self.generator(etape_niveau)+'\n'
171 def generCOMMANDE_COMM(self,obj):
173 Cette methode convertit un COMMANDE_COMM
174 en une chaine de caracteres a la syntaxe aplat
176 l_lignes = obj.valeur.split('\n')
178 for ligne in l_lignes:
179 txt = txt + '##'+ligne+'\n'
182 def generEVAL(self,obj):
184 Cette methode convertit un EVAL
185 en une chaine de caracteres a la syntaxe aplat
187 return 'EVAL("""'+ obj.valeur +'""")'
189 def generCOMMENTAIRE(self,obj):
191 Cette methode convertit un COMMENTAIRE
192 en une chaine de caracteres a la syntaxe aplat
194 l_lignes = obj.valeur.split('\n')
196 for ligne in l_lignes:
197 txt = txt + '#'+ligne+'\n'
200 def generPARAMETRE_EVAL(self,obj):
202 Cette methode convertit un PARAMETRE_EVAL
203 en une chaine de caracteres a la syntaxe aplat
205 if obj.valeur == None:
206 return obj.nom + ' = None ;\n'
208 return obj.nom + ' = '+ self.generator(obj.valeur) +';\n'
210 def generPARAMETRE(self,obj):
212 Cette methode convertit un PARAMETRE
213 en une chaine de caracteres a la syntaxe aplat
215 if type(obj.valeur) == bytes or type(obj.valeur) == str:
216 # PN pour corriger le bug a='3+4' au lieu de a= 3+4
217 #return obj.nom + " = '" + obj.valeur + "';\n"
218 return obj.nom + " = " + obj.valeur + ";\n"
220 return obj.nom + ' = ' + str(obj.valeur) + ';\n'
222 def generETAPE_NIVEAU(self,obj):
224 Cette methode convertit une etape niveau
225 en une chaine de caracteres a la syntaxe aplat
228 if obj.etapes_niveaux == []:
229 for etape in obj.etapes:
230 text=text+self.generator(etape)+'\n'
232 for etape_niveau in obj.etapes_niveaux:
233 text=text+self.generator(etape_niveau)+'\n'
236 def gener_etape(self,obj):
238 Cette methode est utilise pour convertir les objets etape
239 en une chaine de caracteres a la syntaxe aplat
242 for v in obj.mcListe:
243 text=text + self.generator(v)
245 return self.init+'\n'
249 def generETAPE(self,obj):
251 Cette methode convertit une etape
252 en une chaine de caracteres a la syntaxe aplat
255 sdname= self.generator(obj.sd)
258 self.init = sdname + self.sep + obj.nom
259 return self.gener_etape(obj)
261 def generMACRO_ETAPE(self,obj):
263 Cette methode convertit une macro-etape
264 en une chaine de caracteres a la syntaxe aplat
270 sdname= self.generator(obj.sd)
271 self.init = sdname + self.sep + obj.nom
273 self.init = 'sansnom' + self.sep + obj.nom
275 return self.gener_etape(obj)
277 generPROC_ETAPE = generMACRO_ETAPE
279 generFORM_ETAPE = generMACRO_ETAPE
281 def generASSD(self,obj):
283 Convertit un objet derive d'ASSD en une chaine de caracteres a la
288 def generMCList(self,obj):
290 Convertit un objet MCList en une chaine de caracteres a la
295 init = self.init + self.sep + obj.nom
297 for data in obj.data :
299 self.init = init + self.sep + "occurrence n"+repr(i)
300 text = text + self.generator(data)
304 def generMCSIMP(self,obj) :
306 Convertit un objet MCSIMP en une chaine de caracteres a la
309 if type(obj.valeur) in (tuple,list) :
310 # On est en presence d'une liste de valeur
312 for val in obj.valeur:
313 #if type(val) == types.InstanceType :
314 if isinstance(val,object):
315 rep = rep + self.generator(val) +','
317 rep = rep + repr(val)+','
319 #elif type(obj.valeur) == types.InstanceType :
320 elif type(obj.valeur) == object :
321 # On est en presence d'une valeur unique de type instance
322 rep = self.generator(obj.valeur)
324 # On est en presence d'une valeur unique
325 rep = repr(obj.valeur)
326 return self.init + self.sep + obj.nom + ' :' + rep + '\n'
328 def generMCCOMPO(self,obj):
330 Convertit un objet MCCOMPO en une chaine de caracteres a la
335 self.init = self.init + self.sep + obj.nom
336 for mocle in obj.mcListe :
337 text = text + self.generator(mocle)
341 generMCFACT=generMCCOMPO
343 generMCBLOC=generMCCOMPO
345 generMCNUPLET=generMCCOMPO