1 # -*- coding: utf-8 -*-
2 # CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
20 # ======================================================================
22 Ce module contient le plugin generateur de fichier au format
27 import types,string,re
29 from Noyau import N_CR
30 from Noyau.N_utils import repr_float
31 from Accas import ETAPE,PROC_ETAPE,MACRO_ETAPE,ETAPE_NIVEAU,JDC,FORM_ETAPE
32 from Accas import MCSIMP,MCFACT,MCBLOC,MCList,EVAL
33 from Accas import GEOM,ASSD,MCNUPLET
34 from Accas import COMMENTAIRE,PARAMETRE, PARAMETRE_EVAL,COMMANDE_COMM
35 from Extensions.parametre import ITEM_PARAMETRE
36 from Formatage import Formatage
40 Retourne les informations nécessaires pour le chargeur de plugins
42 Ces informations sont retournées dans un dictionnaire
47 # La factory pour créer une instance du plugin
48 'factory' : PythonGenerator,
52 class PythonGenerator:
54 Ce generateur parcourt un objet de type JDC et produit
55 un fichier au format python
57 L'acquisition et le parcours sont réalisés par la méthode
58 generator.gener(objet_jdc,format)
60 L'écriture du fichier au format ini par appel de la méthode
61 generator.writefile(nom_fichier)
63 Ses caractéristiques principales sont exposées dans des attributs
65 - extensions : qui donne une liste d'extensions de fichier préconisées
68 # Les extensions de fichier préconisées
71 def __init__(self,cr=None):
72 # Si l'objet compte-rendu n'est pas fourni, on utilise le compte-rendu standard
76 self.cr=N_CR.CR(debut='CR generateur format python pour python',
77 fin='fin CR format python pour python')
78 # Le texte au format python est stocké dans l'attribut text
81 def writefile(self,filename):
86 def gener(self,obj,format='brut'):
88 Retourne une représentation du JDC obj sous une
89 forme qui est paramétrée par format.
90 Si format vaut 'brut', retourne une liste de listes de ...
91 Si format vaut 'standard', retourne un texte obtenu par concaténation de la liste
92 Si format vaut 'beautifie', retourne le meme texte beautifié
94 liste= self.generator(obj)
97 elif format == 'standard':
98 self.text=string.join(liste)
99 elif format == 'beautifie':
100 jdc_formate = Formatage(liste,mode='.py')
101 self.text=jdc_formate.formate_jdc()
103 raise "Format pas implémenté : "+format
106 def generator(self,obj):
108 Cette methode joue un role d'aiguillage en fonction du type de obj
109 On pourrait utiliser les méthodes accept et visitxxx à la
110 place (dépend des gouts !!!)
112 # ATTENTION a l'ordre des tests : il peut avoir de l'importance (héritage)
113 if isinstance(obj,PROC_ETAPE):
114 return self.generPROC_ETAPE(obj)
115 elif isinstance(obj,MACRO_ETAPE):
116 return self.generMACRO_ETAPE(obj)
117 elif isinstance(obj,FORM_ETAPE):
118 return self.generFORM_ETAPE(obj)
119 elif isinstance(obj,ETAPE):
120 return self.generETAPE(obj)
121 elif isinstance(obj,MCFACT):
122 return self.generMCFACT(obj)
123 elif isinstance(obj,MCList):
124 return self.generMCList(obj)
125 elif isinstance(obj,MCBLOC):
126 return self.generMCBLOC(obj)
127 elif isinstance(obj,MCSIMP):
128 return self.generMCSIMP(obj)
129 elif isinstance(obj,ASSD):
130 return self.generASSD(obj)
131 elif isinstance(obj,ETAPE_NIVEAU):
132 return self.generETAPE_NIVEAU(obj)
133 elif isinstance(obj,COMMENTAIRE):
134 return self.generCOMMENTAIRE(obj)
135 # Attention doit etre placé avant PARAMETRE (raison : héritage)
136 elif isinstance(obj,PARAMETRE_EVAL):
137 return self.generPARAMETRE_EVAL(obj)
138 elif isinstance(obj,PARAMETRE):
139 return self.generPARAMETRE(obj)
140 elif isinstance(obj,EVAL):
141 return self.generEVAL(obj)
142 elif isinstance(obj,COMMANDE_COMM):
143 return self.generCOMMANDE_COMM(obj)
144 elif isinstance(obj,JDC):
145 return self.generJDC(obj)
146 elif isinstance(obj,MCNUPLET):
147 return self.generMCNUPLET(obj)
148 elif isinstance(obj,ITEM_PARAMETRE):
149 return self.generITEM_PARAMETRE(obj)
151 raise "Type d'objet non prévu",obj
153 def generJDC(self,obj):
155 Cette méthode convertit un objet JDC en une liste de chaines de
156 caractères à la syntaxe python
159 if obj.definition.l_niveaux == ():
160 # Il n'y a pas de niveaux
161 for etape in obj.etapes:
162 l.append(self.generator(etape))
165 for etape_niveau in obj.etapes_niveaux:
166 l.extend(self.generator(etape_niveau))
168 # Si au moins une étape, on ajoute le retour chariot sur la dernière étape
169 if type(l[-1])==types.ListType:
170 l[-1][-1] = l[-1][-1]+'\n'
171 elif type(l[-1])==types.StringType:
175 def generMCNUPLET(self,obj):
177 Méthode générant une représentation de self permettant son ecriture
178 dans le format python
182 for v in obj.mc_liste:
183 text = re.sub(".*=","",self.generator(v))
188 def generCOMMANDE_COMM(self,obj):
190 Cette méthode convertit un COMMANDE_COMM
191 en une liste de chaines de caractères à la syntaxe python
193 l_lignes = string.split(obj.valeur,'\n')
195 for ligne in l_lignes:
196 txt = txt + '##'+ligne+'\n'
199 def generEVAL(self,obj):
201 Cette méthode convertit un EVAL
202 en une liste de chaines de caractères à la syntaxe python
204 return 'EVAL("""'+ obj.valeur +'""")'
206 def generCOMMENTAIRE(self,obj):
208 Cette méthode convertit un COMMENTAIRE
209 en une liste de chaines de caractères à la syntaxe python
211 # modification pour répondre à la demande de C. Durand, d'éviter
212 # l'ajout systématique d'un dièse, à la suite du commentaire
213 # Dans la chaine de caracteres obj.valeur, on supprime le dernier
215 sans_saut = re.sub("\n$","",obj.valeur)
216 l_lignes = string.split(sans_saut,'\n')
218 for ligne in l_lignes:
219 txt = txt + '#'+ligne+'\n'
221 # suppression du dernier saut de ligne
222 txt = re.sub("\n$","",txt)
225 def generPARAMETRE_EVAL(self,obj):
227 Cette méthode convertit un PARAMETRE_EVAL
228 en une liste de chaines de caractères à la syntaxe python
230 if obj.valeur == None:
231 return obj.nom + ' = None ;\n'
233 return obj.nom + ' = '+ self.generator(obj.valeur) +';\n'
235 def generITEM_PARAMETRE(self,obj):
238 def generPARAMETRE(self,obj):
240 Cette méthode convertit un PARAMETRE
241 en une liste de chaines de caractères à la syntaxe python
243 if type(obj.valeur) == types.StringType:
244 # PN pour corriger le bug a='3+4' au lieu de a= 3+4
245 #return obj.nom + " = '" + obj.valeur + "';\n"
246 return obj.nom + " = " + obj.valeur + ";\n"
248 return obj.nom + ' = ' + str(obj.valeur) + ';\n'
250 def generETAPE_NIVEAU(self,obj):
252 Cette méthode convertit une étape niveau
253 en une liste de chaines de caractères à la syntaxe python
256 if obj.etapes_niveaux == []:
257 for etape in obj.etapes:
258 l.append(self.generator(etape))
260 for etape_niveau in obj.etapes_niveaux:
261 l.extend(self.generator(etape_niveau))
264 def generETAPE(self,obj):
266 Cette méthode convertit une étape
267 en une liste de chaines de caractères à la syntaxe python
270 sdname= self.generator(obj.sd)
274 label=sdname + '='+obj.definition.nom+'('
276 if obj.reuse != None :
277 str = 'reuse ='+ self.generator(obj.reuse) + ','
279 for v in obj.mc_liste:
280 if isinstance(v,MCBLOC) :
281 liste=self.generator(v)
284 elif isinstance(v,MCSIMP) :
285 text=self.generator(v)
286 l.append(v.nom+'='+text)
289 liste=self.generator(v)
290 liste[0]=v.nom+'='+liste[0]
298 def generFORM_ETAPE(self,obj):
300 Méthode particulière pour les objets de type FORMULE
304 if nom == '' : nom = 'sansnom'
305 l.append(nom + ' = FORMULE(')
306 for v in obj.mc_liste:
307 text=self.generator(v)
308 l.append(v.nom+'='+text)
312 def generMACRO_ETAPE(self,obj):
314 Cette méthode convertit une macro-étape
315 en une liste de chaines de caractères à la syntaxe python
317 if obj.definition.nom == 'FORMULE' : return self.gen_formule(obj)
322 sdname= self.generator(obj.sd)+'='
326 label = sdname + obj.definition.nom+'('
328 if obj.reuse != None:
329 # XXX faut il la virgule ou pas ????
330 str = "reuse =" + self.generator(obj.reuse) + ','
332 for v in obj.mc_liste:
333 if isinstance(v,MCBLOC) :
334 liste=self.generator(v)
337 elif isinstance(v,MCSIMP) :
338 text=self.generator(v)
339 l.append(v.nom+'='+text)
342 liste=self.generator(v)
343 liste[0]=v.nom+'='+liste[0]
352 def gen_formule(self,obj):
354 Méthode particuliere aux objets de type FORMULE
360 sdname= self.generator(obj.sd)
364 label=sdname + ' = FORMULE('
366 for v in obj.mc_liste:
368 s= v.nom+':'+sdname+'('+v.valeur+')'
376 def generPROC_ETAPE(self,obj):
378 Cette méthode convertit une PROC étape
379 en une liste de chaines de caractères à la syntaxe python
382 label=obj.definition.nom+'('
384 for v in obj.mc_liste:
385 if isinstance(v,MCBLOC) :
386 liste=self.generator(v)
389 elif isinstance(v,MCSIMP) :
390 text=self.generator(v)
391 l.append(v.nom+'='+text)
394 liste=self.generator(v)
395 liste[0]=v.nom+'='+liste[0]
404 def generASSD(self,obj):
406 Convertit un objet dérivé d'ASSD en une chaine de caractères à la
409 return obj.get_name()
411 def generMCFACT(self,obj):
413 Convertit un objet MCFACT en une liste de chaines de caractères à la
418 for v in obj.mc_liste:
419 if not isinstance(v,MCSIMP) and not isinstance (v,MCBLOC) :
420 # on est en présence d'une entite composée : on récupère une liste
421 liste=self.generator(v)
422 liste[0]=v.nom+'='+liste[0]
424 elif isinstance(v,MCBLOC):
425 liste=self.generator(v)
429 # on est en présence d'un MCSIMP : on récupère une string
430 text =self.generator(v)
431 l.append(v.nom+'='+text)
432 # il faut être plus subtil dans l'ajout de la virgule en différenciant
433 # le cas où elle est obligatoire (si self a des frères cadets
434 # dans self.parent) ou non
435 # (cas où self est seul ou le benjamin de self.parent)
439 def generMCList(self,obj):
441 Convertit un objet MCList en une liste de chaines de caractères à la
447 for mcfact in obj.data:
448 l.append(self.generator(mcfact))
452 def generMCBLOC(self,obj):
454 Convertit un objet MCBLOC en une liste de chaines de caractères à la
458 for v in obj.mc_liste:
459 if isinstance(v,MCBLOC) :
460 liste=self.generator(v)
463 elif isinstance(v,MCList):
464 liste=self.generator(v)
465 liste[0]=v.nom+'='+liste[0]
469 data=self.generator(v)
470 if type(data) == types.ListType:
471 data[0]=v.nom+'='+data[0]
477 def generMCSIMP(self,obj) :
479 Convertit un objet MCSIMP en une liste de chaines de caractères à la
482 if type(obj.valeur) in (types.TupleType,types.ListType) :
484 for val in obj.valeur :
485 if type(val) == types.InstanceType :
486 if hasattr(obj.etape,'sdprods') and val in obj.etape.sdprods :
487 s = s + "CO('"+ self.generator(val) +"')"
488 elif val.__class__.__name__ == 'CO':
489 s = s + "CO('"+ self.generator(val) +"')"
490 elif isinstance(val,PARAMETRE):
491 # il ne faut pas prendre la string que retourne gener
492 # mais seulement le nom dans le cas d'un paramètre
495 s = s + self.generator(val)
496 elif type(val) == types.FloatType :
497 # Pour un flottant on utilise str qui a une precision de
498 # "seulement" 12 chiffres : evite les flottants du genre 0.599999999999998
501 # Pour les autres types on utilise repr
504 if len(obj.valeur) > 1:
508 if type(val) == types.InstanceType :
509 if hasattr(obj.etape,'sdprods') and val in obj.etape.sdprods :
510 s = "CO('"+ self.generator(val) +"')"
511 elif val.__class__.__name__ == 'CO':
512 s = "CO('"+ self.generator(val) +"')"
513 elif isinstance(val,PARAMETRE):
514 # il ne faut pas prendre la string que retourne gener
515 # mais seulement le nom dans le cas d'un paramètre
518 s = self.generator(val)
519 elif type(val) == types.FloatType :
520 # Pour un flottant on utilise str
523 # Pour les autres types on utilise repr