2 Ce module contient le plugin generateur de fichier au format asterv5 pour EFICAS.
10 from Accas import ETAPE,PROC_ETAPE,MACRO_ETAPE,ETAPE_NIVEAU,JDC,FORM_ETAPE
11 from Accas import MCSIMP,MCFACT,MCBLOC,MCList,EVAL
12 from Accas import GEOM,ASSD
13 from Accas import COMMENTAIRE,PARAMETRE, PARAMETRE_EVAL,COMMANDE_COMM
14 from Formatage import Formatage
18 Retourne les informations nécessaires pour le chargeur de plugins
20 Ces informations sont retournées dans un dictionnaire
25 # La factory pour créer une instance du plugin
26 'factory' : AsterGenerator,
32 Ce generateur parcourt un objet de type JDC et produit
33 un fichier au format asterv5
35 L'acquisition et le parcours sont réalisés par la méthode
36 generator.gener(objet_jdc,format)
38 L'écriture du fichier au format asterv5 est réalisée par appel de la méthode
39 generator.writefile(nom_fichier)
41 Ses caractéristiques principales sont exposées dans des attributs
44 - extensions : qui donne une liste d'extensions de fichier préconisées
47 # Les extensions de fichier préconisées
50 def __init__(self,cr=None):
51 # Si l'objet compte-rendu n'est pas fourni, on utilise le compte-rendu standard
55 self.cr=N_CR.CR(debut='CR generateur format asterv5',
56 fin='fin CR format asterv5')
57 # Le texte au format asterv5 est stocké dans l'attribut text
60 def writefile(self,filename):
65 def gener(self,obj,format='brut'):
67 Retourne une représentation du JDC obj sous une
68 forme qui est paramétrée par format.
69 Si format vaut 'brut', retourne une liste de listes de ...
70 Si format vaut 'standard', retourne un texte obtenu par concaténation de la liste
71 Si format vaut 'beautifie', retourne le meme texte beautifié
73 liste= self.generator(obj)
76 elif format == 'standard':
77 self.text=string.join(liste)
78 elif format == 'beautifie':
79 jdc_formate = Formatage(liste,sep=':',l_max=72)
80 self.text=jdc_formate.formate_jdc()
82 raise "Format pas implémenté : "+format
85 def generator(self,obj):
87 Cette methode joue un role d'aiguillage en fonction du type de obj
88 On pourrait utiliser les méthodes accept et visitxxx à la
89 place (dépend des gouts !!!)
91 # ATTENTION a l'ordre des tests : il peut avoir de l'importance (héritage)
92 if isinstance(obj,PROC_ETAPE):
93 return self.generPROC_ETAPE(obj)
94 elif isinstance(obj,MACRO_ETAPE):
95 return self.generMACRO_ETAPE(obj)
96 elif isinstance(obj,FORM_ETAPE):
97 return self.generFORM_ETAPE(obj)
98 elif isinstance(obj,ETAPE):
99 return self.generETAPE(obj)
100 elif isinstance(obj,MCFACT):
101 return self.generMCFACT(obj)
102 elif isinstance(obj,MCList):
103 return self.generMCList(obj)
104 elif isinstance(obj,MCBLOC):
105 return self.generMCBLOC(obj)
106 elif isinstance(obj,MCSIMP):
107 return self.generMCSIMP(obj)
108 elif isinstance(obj,ASSD):
109 return self.generASSD(obj)
110 elif isinstance(obj,ETAPE_NIVEAU):
111 return self.generETAPE_NIVEAU(obj)
112 elif isinstance(obj,COMMENTAIRE):
113 return self.generCOMMENTAIRE(obj)
114 # Attention doit etre placé avant PARAMETRE (raison : héritage)
115 elif isinstance(obj,PARAMETRE_EVAL):
116 return self.generPARAMETRE_EVAL(obj)
117 elif isinstance(obj,PARAMETRE):
118 return self.generPARAMETRE(obj)
119 elif isinstance(obj,EVAL):
120 return self.generEVAL(obj)
121 elif isinstance(obj,COMMANDE_COMM):
122 return self.generCOMMANDE_COMM(obj)
123 elif isinstance(obj,JDC):
124 return self.generJDC(obj)
126 raise "Type d'objet non prévu",obj
128 def generJDC(self,obj):
130 Cette méthode convertit un objet JDC en une liste de chaines de
131 caractères à la syntaxe asterv5
134 if obj.definition.l_niveaux == ():
135 # Il n'y a pas de niveaux
136 for etape in obj.etapes:
137 l.append(self.generator(etape))
140 for etape_niveau in obj.etapes_niveaux:
141 l.extend(self.generator(etape_niveau))
143 # Si au moins une étape, on ajoute le retour chariot sur la dernière étape
144 if type(l[-1])==types.ListType:
145 l[-1][-1] = l[-1][-1]+'\n'
146 elif type(l[-1])==types.StringType:
150 def generCOMMANDE_COMM(self,obj):
152 Cette méthode convertit un COMMANDE_COMM
153 en une liste de chaines de caractères à la syntaxe asterv5
155 l_lignes = string.split(obj.valeur,'\n')
157 for ligne in l_lignes:
158 txt = txt + '%%'+ligne+'\n'
161 def generEVAL(self,obj):
163 Cette méthode convertit un EVAL
164 en une liste de chaines de caractères à la syntaxe asterv5
166 return 'EVAL("'+ obj.valeur +'")'
168 def generCOMMENTAIRE(self,obj):
170 Cette méthode convertit un COMMENTAIRE
171 en une liste de chaines de caractères à la syntaxe asterv5
173 l_lignes = string.split(obj.valeur,'\n')
175 for ligne in l_lignes:
176 txt = txt + '%'+ligne+'\n'
179 def generPARAMETRE_EVAL(self,obj):
181 Cette méthode convertit un PARAMETRE_EVAL
182 en une liste de chaines de caractères à la syntaxe asterv5
184 if obj.valeur == None:
185 return obj.nom + ' = None ;\n'
187 return obj.nom + ' = '+ self.generator(obj.valeur) +';\n'
189 def generPARAMETRE(self,obj):
191 Cette méthode convertit un PARAMETRE
192 en une liste de chaines de caractères à la syntaxe asterv5
194 if type(obj.valeur) == types.StringType:
195 return obj.nom + " = '" + obj.valeur + "';\n"
197 return obj.nom + ' = ' + str(obj.valeur) + ';\n'
199 def generETAPE_NIVEAU(self,obj):
201 Cette méthode convertit une étape niveau
202 en une liste de chaines de caractères à la syntaxe asterv5
205 if obj.etapes_niveaux == []:
206 for etape in obj.etapes:
207 l.append(self.generator(etape))
209 for etape_niveau in obj.etapes_niveaux:
210 l.extend(self.generator(etape_niveau))
213 def generETAPE(self,obj):
215 Cette méthode convertit une étape
216 en une liste de chaines de caractères à la syntaxe asterv5
219 if obj.reuse != None:
220 sdname= "&" + self.generator(obj.reuse)
222 sdname= self.generator(obj.sd)
226 label=sdname + '='+obj.definition.nom+'('
228 for v in obj.mc_liste:
229 if isinstance(v,MCBLOC) or isinstance(v,MCList):
230 liste=self.generator(v)
234 l.append(self.generator(v))
241 def generFORM_ETAPE(self,obj):
243 Méthode particulière pour les objets de type FORMULE
247 if nom == '' : nom = 'sansnom'
248 if len(obj.mc_liste)>0:
249 l.append(nom + ' = FORMULE(')
250 s=obj.type_retourne + ' = ' + "'''" + obj.arguments + ' = ' + obj.corps+"'''"
254 l.append(nom+' = FORMULE();')
257 def generMACRO_ETAPE(self,obj):
259 Cette méthode convertit une macro-étape
260 en une liste de chaines de caractères à la syntaxe asterv5
262 if obj.definition.nom == 'FORMULE' : return self.gen_ast_formule(obj)
264 if obj.reuse != None:
265 sdname= "&" + self.generator(obj.reuse)+'='
269 sdname= self.generator(obj.sd)+'='
273 label = sdname + obj.definition.nom+'('
275 for v in obj.mc_liste:
276 if isinstance(v,MCBLOC) or isinstance(v,MCList):
277 liste=self.generator(v)
282 l.append(self.generator(v))
289 def gen_ast_formule(self,obj):
291 Méthode gen_ast particuliere aux objets de type FORMULE
295 sdname= self.generator(obj.sd)
300 for v in obj.mc_liste:
302 s= v.nom+':'+sdname+'('+v.valeur+')'
310 def generPROC_ETAPE(self,obj):
312 Cette méthode convertit une étape
313 en une liste de chaines de caractères à la syntaxe asterv5
316 label=obj.definition.nom+'('
318 for v in obj.mc_liste:
319 if isinstance(v,MCBLOC) or isinstance(v,MCList):
320 liste=self.generator(v)
324 l.append(self.generator(v))
331 def generMCSIMP(self,obj) :
333 Convertit un objet MCSIMP en une liste de chaines de caractères à la
336 if type(obj.valeur) == types.TupleType :
338 for val in obj.valeur :
339 if s != '(': s = s + ','
340 if type(val) == types.InstanceType :
341 if isinstance(val,PARAMETRE):
342 # il ne faut pas prendre la string que retourne gen_ast
343 # mais seulement le nom dans le cas d'un paramètre
346 s = s + self.generator(val)
347 elif self.wait_geom(obj):
349 elif type(val) == types.FloatType :
350 s = s + self.repr_float(val)
357 if type(obj.valeur) == types.InstanceType :
358 if isinstance(obj.valeur,PARAMETRE):
359 # il ne faut pas prendre la string que retourne gen_ast
360 # mais seulement str dans le cas d'un paramètre
363 s = self.generator(obj.valeur)
364 elif self.wait_geom(obj):
366 elif type(obj.valeur) == types.FloatType :
367 s = self.repr_float(obj.valeur)
373 def wait_geom(self,obj):
374 for typ in obj.definition.type:
375 if type(typ) == types.ClassType :
376 if issubclass(typ,GEOM) : return 1
379 def repr_float(self,valeur):
381 Cette fonction représente le réel valeur comme une chaîne de caractères
382 sous forme mantisse exposant si nécessaire cad si le nombre contient plus de 5 caractères
383 NB : valeur est un réel au format Python ou une chaîne de caractères représentant un réel
385 if type(valeur) == types.StringType : valeur = eval(valeur)
386 if valeur == 0. : return '0.0'
387 if abs(valeur) > 1. :
388 if abs(valeur) < 10000. : return repr(valeur)
390 if abs(valeur) > 0.01 : return repr(valeur)
392 if string.find(t,'e') != -1 or string.find(t,'E') != -1 :
393 # le réel est déjà sous forme mantisse exposant !
394 # --> on remplace e par E
395 t=string.replace(t,'e','E')
396 # --> on doit encore vérifier que la mantisse contient bien un '.'
397 if string.find(t,'.')!= -1:
400 # -->il faut rajouter le point avant le E
401 t=string.replace(t,'E','.E')
409 if string.atof(t[0]) == 0.:
410 # réel plus petit que 1
414 while string.atof(t[0]) == 0. :
421 # réel plus grand que 1
423 if string.atof(t[1:]) == 0.:
424 l=string.split(t[1:],'.')
432 if pt != 1 : cpt = cpt + 1
436 if r+1 == len(t) or string.atof(t[r+1:]) == 0.:break
437 s=s+'E'+neg*'-'+repr(cpt)
440 def generASSD(self,obj):
442 Convertit un objet dérivé d'ASSD en une chaine de caractères à la
445 return obj.get_name()
447 def generMCFACT(self,obj):
449 Convertit un objet MCFACT en une liste de chaines de caractères à la
455 for v in obj.mc_liste:
456 if isinstance(v,MCBLOC) or isinstance(v,MCList):
457 liste=self.generator(v)
461 l.append(self.generator(v))
465 def generMCList(self,obj):
467 Convertit un objet MCList en une liste de chaines de caractères à la
471 for mcfact in obj.data:
472 l.append(self.generator(mcfact))
475 def generMCBLOC(self,obj):
477 Convertit un objet MCBLOC en une liste de chaines de caractères à la
481 for v in obj.mc_liste:
482 if isinstance(v,MCBLOC) or isinstance(v,MCList):
483 liste=self.generator(v)
487 l.append(self.generator(v))