1 # CONFIGURATION MANAGEMENT OF EDF VERSION
2 # ======================================================================
3 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
4 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
5 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
6 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
7 # (AT YOUR OPTION) ANY LATER VERSION.
9 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
10 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
11 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
12 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
15 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
16 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
21 Ce module contient le plugin generateur de fichier au format
26 import types,string,re
28 from Noyau import N_CR
29 from Noyau.N_utils import repr_float
30 from Accas import ETAPE,PROC_ETAPE,MACRO_ETAPE,ETAPE_NIVEAU,JDC,FORM_ETAPE
31 from Accas import MCSIMP,MCFACT,MCBLOC,MCList,EVAL
32 from Accas import GEOM,ASSD,MCNUPLET
33 from Accas import COMMENTAIRE,PARAMETRE, PARAMETRE_EVAL,COMMANDE_COMM
34 from Formatage import Formatage
38 Retourne les informations nécessaires pour le chargeur de plugins
40 Ces informations sont retournées dans un dictionnaire
45 # La factory pour créer une instance du plugin
46 'factory' : PythonGenerator,
50 class PythonGenerator:
52 Ce generateur parcourt un objet de type JDC et produit
53 un fichier au format python
55 L'acquisition et le parcours sont réalisés par la méthode
56 generator.gener(objet_jdc,format)
58 L'écriture du fichier au format ini par appel de la méthode
59 generator.writefile(nom_fichier)
61 Ses caractéristiques principales sont exposées dans des attributs
64 - extensions : qui donne une liste d'extensions de fichier préconisées
67 # Les extensions de fichier préconisées
70 def __init__(self,cr=None):
71 # Si l'objet compte-rendu n'est pas fourni, on utilise le compte-rendu standard
75 self.cr=N_CR.CR(debut='CR generateur format python pour python',
76 fin='fin CR format python pour python')
77 # Le texte au format python est stocké dans l'attribut text
80 def writefile(self,filename):
85 def gener(self,obj,format='brut'):
87 Retourne une représentation du JDC obj sous une
88 forme qui est paramétrée par format.
89 Si format vaut 'brut', retourne une liste de listes de ...
90 Si format vaut 'standard', retourne un texte obtenu par concaténation de la liste
91 Si format vaut 'beautifie', retourne le meme texte beautifié
93 liste= self.generator(obj)
96 elif format == 'standard':
97 self.text=string.join(liste)
98 elif format == 'beautifie':
99 jdc_formate = Formatage(liste,mode='.py')
100 self.text=jdc_formate.formate_jdc()
102 raise "Format pas implémenté : "+format
105 def generator(self,obj):
107 Cette methode joue un role d'aiguillage en fonction du type de obj
108 On pourrait utiliser les méthodes accept et visitxxx à la
109 place (dépend des gouts !!!)
111 # ATTENTION a l'ordre des tests : il peut avoir de l'importance (héritage)
112 if isinstance(obj,PROC_ETAPE):
113 return self.generPROC_ETAPE(obj)
114 elif isinstance(obj,MACRO_ETAPE):
115 return self.generMACRO_ETAPE(obj)
116 elif isinstance(obj,FORM_ETAPE):
117 return self.generFORM_ETAPE(obj)
118 elif isinstance(obj,ETAPE):
119 return self.generETAPE(obj)
120 elif isinstance(obj,MCFACT):
121 return self.generMCFACT(obj)
122 elif isinstance(obj,MCList):
123 return self.generMCList(obj)
124 elif isinstance(obj,MCBLOC):
125 return self.generMCBLOC(obj)
126 elif isinstance(obj,MCSIMP):
127 return self.generMCSIMP(obj)
128 elif isinstance(obj,ASSD):
129 return self.generASSD(obj)
130 elif isinstance(obj,ETAPE_NIVEAU):
131 return self.generETAPE_NIVEAU(obj)
132 elif isinstance(obj,COMMENTAIRE):
133 return self.generCOMMENTAIRE(obj)
134 # Attention doit etre placé avant PARAMETRE (raison : héritage)
135 elif isinstance(obj,PARAMETRE_EVAL):
136 return self.generPARAMETRE_EVAL(obj)
137 elif isinstance(obj,PARAMETRE):
138 return self.generPARAMETRE(obj)
139 elif isinstance(obj,EVAL):
140 return self.generEVAL(obj)
141 elif isinstance(obj,COMMANDE_COMM):
142 return self.generCOMMANDE_COMM(obj)
143 elif isinstance(obj,JDC):
144 return self.generJDC(obj)
145 elif isinstance(obj,MCNUPLET):
146 return self.generMCNUPLET(obj)
148 raise "Type d'objet non prévu",obj
150 def generJDC(self,obj):
152 Cette méthode convertit un objet JDC en une liste de chaines de
153 caractères à la syntaxe python
156 if obj.definition.l_niveaux == ():
157 # Il n'y a pas de niveaux
158 for etape in obj.etapes:
159 l.append(self.generator(etape))
162 for etape_niveau in obj.etapes_niveaux:
163 l.extend(self.generator(etape_niveau))
165 # Si au moins une étape, on ajoute le retour chariot sur la dernière étape
166 if type(l[-1])==types.ListType:
167 l[-1][-1] = l[-1][-1]+'\n'
168 elif type(l[-1])==types.StringType:
172 def generMCNUPLET(self,obj):
174 Méthode générant une représentation de self permettant son ecriture
175 dans le format python
179 for v in obj.mc_liste:
180 text = re.sub(".*=","",self.generator(v))
185 def generCOMMANDE_COMM(self,obj):
187 Cette méthode convertit un COMMANDE_COMM
188 en une liste de chaines de caractères à la syntaxe python
190 l_lignes = string.split(obj.valeur,'\n')
192 for ligne in l_lignes:
193 txt = txt + '##'+ligne+'\n'
196 def generEVAL(self,obj):
198 Cette méthode convertit un EVAL
199 en une liste de chaines de caractères à la syntaxe python
201 return 'EVAL("""'+ obj.valeur +'""")'
203 def generCOMMENTAIRE(self,obj):
205 Cette méthode convertit un COMMENTAIRE
206 en une liste de chaines de caractères à la syntaxe python
208 # modification pour répondre à la demande de C. Durand, d'éviter
209 # l'ajout systématique d'un dièse, à la suite du commentaire
210 # Dans la chaine de caracteres obj.valeur, on supprime le dernier
212 sans_saut = re.sub("\n$","",obj.valeur)
213 l_lignes = string.split(sans_saut,'\n')
215 for ligne in l_lignes:
216 txt = txt + '#'+ligne+'\n'
218 # suppression du dernier saut de ligne
219 txt = re.sub("\n$","",txt)
222 def generPARAMETRE_EVAL(self,obj):
224 Cette méthode convertit un PARAMETRE_EVAL
225 en une liste de chaines de caractères à la syntaxe python
227 if obj.valeur == None:
228 return obj.nom + ' = None ;\n'
230 return obj.nom + ' = '+ self.generator(obj.valeur) +';\n'
232 def generPARAMETRE(self,obj):
234 Cette méthode convertit un PARAMETRE
235 en une liste de chaines de caractères à la syntaxe python
237 if type(obj.valeur) == types.StringType:
238 return obj.nom + " = '" + obj.valeur + "';\n"
240 return obj.nom + ' = ' + str(obj.valeur) + ';\n'
242 def generETAPE_NIVEAU(self,obj):
244 Cette méthode convertit une étape niveau
245 en une liste de chaines de caractères à la syntaxe python
248 if obj.etapes_niveaux == []:
249 for etape in obj.etapes:
250 l.append(self.generator(etape))
252 for etape_niveau in obj.etapes_niveaux:
253 l.extend(self.generator(etape_niveau))
256 def generETAPE(self,obj):
258 Cette méthode convertit une étape
259 en une liste de chaines de caractères à la syntaxe python
262 sdname= self.generator(obj.sd)
266 label=sdname + '='+obj.definition.nom+'('
268 if obj.reuse != None :
269 str = 'reuse ='+ self.generator(obj.reuse) + ','
271 for v in obj.mc_liste:
272 if isinstance(v,MCBLOC) :
273 liste=self.generator(v)
276 elif isinstance(v,MCSIMP) :
277 text=self.generator(v)
278 l.append(v.nom+'='+text)
281 liste=self.generator(v)
282 liste[0]=v.nom+'='+liste[0]
290 def generFORM_ETAPE(self,obj):
292 Méthode particulière pour les objets de type FORMULE
296 if nom == '' : nom = 'sansnom'
297 if len(obj.mc_liste)>0:
298 l.append(nom + ' = FORMULE(')
299 s=obj.type_retourne + ' = ' + "'''" + obj.arguments + ' = ' + obj.corps+"'''"
303 l.append(nom+' = FORMULE();')
306 def generMACRO_ETAPE(self,obj):
308 Cette méthode convertit une macro-étape
309 en une liste de chaines de caractères à la syntaxe python
311 if obj.definition.nom == 'FORMULE' : return self.gen_formule(obj)
316 sdname= self.generator(obj.sd)+'='
320 label = sdname + obj.definition.nom+'('
322 if obj.reuse != None:
323 # XXX faut il la virgule ou pas ????
324 str = "reuse =" + self.generator(obj.reuse) + ','
326 for v in obj.mc_liste:
327 if isinstance(v,MCBLOC) :
328 liste=self.generator(v)
331 elif isinstance(v,MCSIMP) :
332 text=self.generator(v)
333 l.append(v.nom+'='+text)
336 liste=self.generator(v)
337 liste[0]=v.nom+'='+liste[0]
346 def gen_formule(self,obj):
348 Méthode particuliere aux objets de type FORMULE
354 sdname= self.generator(obj.sd)
358 label=sdname + ' = FORMULE('
360 for v in obj.mc_liste:
362 s= v.nom+':'+sdname+'('+v.valeur+')'
370 def generPROC_ETAPE(self,obj):
372 Cette méthode convertit une PROC étape
373 en une liste de chaines de caractères à la syntaxe python
376 label=obj.definition.nom+'('
378 for v in obj.mc_liste:
379 if isinstance(v,MCBLOC) :
380 liste=self.generator(v)
383 elif isinstance(v,MCSIMP) :
384 text=self.generator(v)
385 l.append(v.nom+'='+text)
388 liste=self.generator(v)
389 liste[0]=v.nom+'='+liste[0]
398 def generASSD(self,obj):
400 Convertit un objet dérivé d'ASSD en une chaine de caractères à la
403 return obj.get_name()
405 def generMCFACT(self,obj):
407 Convertit un objet MCFACT en une liste de chaines de caractères à la
412 for v in obj.mc_liste:
413 if not isinstance(v,MCSIMP) and not isinstance (v,MCBLOC) :
414 # on est en présence d'une entite composée : on récupère une liste
415 liste=self.generator(v)
416 liste[0]=v.nom+'='+liste[0]
418 elif isinstance(v,MCBLOC):
419 liste=self.generator(v)
423 # on est en présence d'un MCSIMP : on récupère une string
424 text =self.generator(v)
425 l.append(v.nom+'='+text)
426 # il faut être plus subtil dans l'ajout de la virgule en différenciant
427 # le cas où elle est obligatoire (si self a des frères cadets
428 # dans self.parent) ou non
429 # (cas où self est seul ou le benjamin de self.parent)
433 def generMCList(self,obj):
435 Convertit un objet MCList en une liste de chaines de caractères à la
441 for mcfact in obj.data:
442 l.append(self.generator(mcfact))
446 def generMCBLOC(self,obj):
448 Convertit un objet MCBLOC en une liste de chaines de caractères à la
452 for v in obj.mc_liste:
453 if isinstance(v,MCBLOC) :
454 liste=self.generator(v)
457 elif isinstance(v,MCList):
458 liste=self.generator(v)
459 liste[0]=v.nom+'='+liste[0]
463 data=self.generator(v)
464 if type(data) == types.ListType:
465 data[0]=v.nom+'='+data[0]
471 def generMCSIMP(self,obj) :
473 Convertit un objet MCSIMP en une liste de chaines de caractères à la
476 if type(obj.valeur) in (types.TupleType,types.ListType) :
478 for val in obj.valeur :
479 if type(val) == types.InstanceType :
480 if hasattr(obj.etape,'sdprods'):
481 if val in obj.etape.sdprods :
482 s = s + "CO('"+ self.generator(val) +"')"
483 elif val.__class__.__name__ == 'CO':
484 s = s + "CO('"+ self.generator(val) +"')"
486 s = s + self.generator(val)
487 elif isinstance(val,PARAMETRE):
488 # il ne faut pas prendre la string que retourne gener
489 # mais seulement le nom dans le cas d'un paramètre
492 s = s + self.generator(val)
493 elif type(val) == types.FloatType :
494 # Pour un flottant on utilise str qui a une precision de
495 # "seulement" 12 chiffres : evite les flottants du genre 0.599999999999998
500 if len(obj.valeur) > 1:
504 if type(val) == types.InstanceType :
505 if hasattr(obj.etape,'sdprods'):
506 if val in obj.etape.sdprods :
507 s = "CO('"+ self.generator(val) +"')"
508 elif val.__class__.__name__ == 'CO':
509 s = "CO('"+ self.generator(val) +"')"
511 s = self.generator(val)
512 elif isinstance(val,PARAMETRE):
513 # il ne faut pas prendre la string que retourne gener
514 # mais seulement le nom dans le cas d'un paramètre
517 s = self.generator(val)
518 elif type(val) == types.FloatType :