1 #@ MODIF conv Parsers DATE 17/10/2001 AUTEUR DURAND C.DURAND
2 # CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2001 EDF R&D WWW.CODE-ASTER.ORG
5 # SEE THE FILE "LICENSE.TERMS" FOR INFORMATION ON USAGE AND
6 # REDISTRIBUTION OF THIS FILE.
7 # ======================================================================
10 from tables import ERRORS
13 __version__="$Name: V1_1p1 $"
14 __Id__="$Id: conv.py,v 1.1.1.1 2001/12/04 15:38:23 eficas Exp $"
17 Keywords=('MAILLE_1','MAILLE_2','MAILLE_ESCL','MAILLE_FOND','MAILLE_MAIT','MAILLE_ORIG','MAILLE',
18 'NOEUD', 'NOEUD_1','NOEUD_2','NOEUD_INIT','NOEUD_FIN', 'NOEUD_ORIG','NOEUD_REFE','NOEUD_EXTR',
19 'NOEUD_I', 'NOEUD_J','NOEUD_CHOC','NOEUD_ANCRAGE','NOEUD_CENTRE','NOEUD_CMP','NOEUD_DOUBLE',
20 'NOEUD_ESCL','NOEUD_FOND','NOEUD_PARA','NOEUD_POIN_TANG',
21 'GROUP_MA', 'GROUP_MA_1','GROUP_MA_2','GROUP_MA_INT','GROUP_MA_EXT', 'GROUP_MA_ORIG',
22 'GROUP_MA_BORD','GROUP_MA_INTE','GROUP_MA_FLUIDE', 'GROUP_MA_INTERF','GROUP_MA_BETON',
23 'GROUP_MA_ESCL','GROUP_MA_FINAL','GROUP_MA_FLU_SOL','GROUP_MA_FLU_STR','GROUP_MA_FOND',
24 'GROUP_MA_MAIT','GROUP_MA_RADIER','GROUP_MA_SOL_SOL','GROUP_MA_INIT',
25 'GROUP_NO', 'GROUP_NO_1','GROUP_NO_2','GROUP_NO_EXT', 'GROUP_NO_ORIG','GROUP_NO_CHOC',
26 'GROUP_NO_ANCRAGE','GROUP_NO_CENTRE','GROUP_NO_ESCL','GROUP_NO_EXTR','GROUP_NO_FIN',
27 'GROUP_NO_FOND','GROUP_NO_INIT','GROUP_NO_POIN_TG','GROUP_NO_RADIER',
29 'SANS_NOEUD', 'SANS_GROUP_NO',
30 'INTERSEC', 'UNION','DIFFE',
31 'VECT_GRNO_ORIG','VECT_GRNO_EXTR',
35 liste_macros=('MACRO_MATR_ASSE','MACRO_ELAS_MULT','MACR_ASCOUF_MAIL','MACR_ASCOUF_CALC','MACR_ASPIC_MAIL',
36 'MACR_ASPIC_CALC','MACRO_MATR_AJOU','MACRO_ELAS_MULT','MACRO_MODE_MECA','MACRO_PROJ_BASE',
39 liste_concepts_produits=[]
42 def text_nom_ope(text,tags,left,right):
43 global commande_courante
45 tag,l,r,subtags=tags[0]
46 commande_courante=text[left:l]
47 return text[left:l]+'('+text[l:r]
49 commande_courante=text[left:right]
50 return text[left:right]+'('
52 def text_reuse(text,tags):
54 for tag,l,r,subtags in tags:
58 elif tag == 'nom_ope' : s=s+ '='+text_nom_ope(text,subtags,l,r)
60 s=s+ '='+text_affe(text,subtags)
62 if commande_courante in liste_macros:
63 s=s+'reuse='+sd+','+text_macro(text,subtags)+')'
65 s=s+'reuse='+sd+','+text_com(text,subtags)+')'
70 def text_noreuse(text,tags):
71 global commande_courante
73 for tag,l,r,subtags in tags:
77 elif tag == 'nom_ope' :
78 s=s+ '='+ text_nom_ope(text,subtags,l,r)
80 liste_concepts_produits.append(sd)
81 s=s+ '='+text_affe(text,subtags)
84 if sd in liste_macros:
85 s=s+'('+text_macro(text,subtags)+')'
87 s=s+'('+text_com(text,subtags)+')'
89 liste_concepts_produits.append(sd)
90 if commande_courante in liste_macros:
91 s=s+text_macro(text,subtags)+')'
93 s=s+text_com(text,subtags)+')'
109 s=s+string.join((c,va,','),'')
114 def text_com(text,tags):
119 for tag,l,r,subtags in tags:
122 if not mcs.has_key(currid):
126 ll=text_mcf(text,subtags)
127 mcs[currid].append((ll,comment))
130 a=string.replace(text[l:r],'D','E')
131 mcs[currid].append((a,comment))
134 a=text_cplx(text,text[l:r],subtags)
135 mcs[currid].append((a,comment))
139 if currid in Keywords :
140 # FR : (SGDG) il faut tester s'il n'y a pas déjà des cotes !!!
141 if text[l]!="'" and text[r-1]!="'":
142 a=a+"'"+text[l:r]+"'"
147 mcs[currid].append((a,comment))
150 a=text_eval(text,subtags)
151 mcs[currid].append((a,comment))
153 elif tag == 'comment' :
154 comment=comment + '#'+text[l+1:r]
155 elif tag == 'comments' :
156 comment=comment + text[l:r]
158 if currid in Keywords:mcs[currid].append((text_larg2(text,subtags),comment))
159 else:mcs[currid].append((text_larg(text,subtags),comment))
163 if comment :s=s+comment
166 def text_macro(text,tags):
171 for tag,l,r,subtags in tags:
174 if not mcs.has_key(currid):
178 ll=text_macro_mcf(text,subtags)
179 mcs[currid].append((ll,comment))
182 a=string.replace(text[l:r],'D','E')
183 mcs[currid].append((a,comment))
186 a=text_cplx(text,text[l:r],subtags)
187 mcs[currid].append((a,comment))
192 # FR : (SGDG) il faut tester s'il n'y a pas déjà des cotes !!!
194 elif currid in Keywords :
195 a=a+"'"+text[l:r]+"'"
198 if sd not in liste_concepts_produits:
199 # Il s agit d un concept produit par la macro mais situe à droite de =
201 liste_concepts_produits.append(sd)
204 mcs[currid].append((a,comment))
207 a=text_eval(text,subtags)
208 mcs[currid].append((a,comment))
210 elif tag == 'comment' :
211 comment=comment + '#'+text[l+1:r]
212 elif tag == 'comments' :
213 comment=comment + text[l:r]
215 if currid in Keywords:mcs[currid].append((text_larg2(text,subtags),comment))
216 else:mcs[currid].append((text_larg(text,subtags),comment))
220 if comment :s=s+comment
223 def comments_text(text):
224 l=string.replace(text,'%','#')
227 def text_eval(text,tags):
228 # on retourne l expression sans conversion dans un objet EVAL et entre quotes
229 for tag,l,r,subtags in tags:
231 s='EVAL("""'+text[l:r]+'""")'
235 def text_mcf(text,tags):
238 for tag,l,r,subtags in tags:
245 if currid in Keywords :
246 # FR : (SGDG) il faut tester s'il n'y a pas déjà des cotes !!!
247 if text[l]!="'" and text[r-1]!="'":
248 s=s+"'"+text[l:r]+"',"
251 else:s=s+text[l:r]+","
253 s=s+string.replace(text[l:r],'D','E')+','
255 s=s+text_cplx(text,text[l:r],subtags)+','
257 s=s+text_eval(text,subtags)+','
259 if currid in Keywords:s=s+text_larg2(text,subtags)+','
260 else: s=s+text_larg(text,subtags)+','
261 elif tag == 'comments' :
262 comment=comment+text[l:r]
267 def text_macro_mcf(text,tags):
270 for tag,l,r,subtags in tags:
277 # FR : (SGDG) il faut tester s'il n'y a pas déjà des cotes !!!
279 elif currid in Keywords :
280 s=s+"'"+text[l:r]+"',"
283 if sd not in liste_concepts_produits:
284 # Il s agit d un concept produit par la macro mais situe à droite de =
286 liste_concepts_produits.append(sd)
291 s=s+string.replace(text[l:r],'D','E')+','
293 s=s+text_cplx(text,text[l:r],subtags)+','
296 s=s+text_eval(text,subtags)+','
299 if currid in Keywords:s=s+text_larg2(text,subtags)+','
300 else: s=s+text_larg(text,subtags)+','
302 elif tag == 'comments' :
303 comment=comment+text[l:r]
306 def text_cplx(texte,text,tags):
307 """ Retourne une chaîne de caractères représentant un complexe """
308 s="('"+text[0:2]+"'," #text[0:2] = RI ou MP
309 for tag,l,r,subtags in tags:
311 s=s+string.replace(texte[l:r],'D','E')+','
315 def text_larg2(text,tags):
316 """ Pareil que text_larg mais ajoute des cotes autour des arg """
318 for tag,l,r,subtags in tags:
320 # FR : (SGDG) il faut tester le cas où les cotes sont déjà là !!!!
321 if text[l] != "'" and text[r-1] != "'":
322 ll.append( "'"+text[l:r]+"',")
324 ll.append(text[l:r]+",")
326 ll.append(string.replace(text[l:r],'D','E')+',')
328 ll.append(text_cplx(text,text[l:r],subtags)+',')
329 elif tag == 'comments' :
331 return '('+string.join(ll,'')+')'
333 def text_larg(text,tags):
334 # Pour les listes d arguments il semble plus rapide de construire
335 # une liste puis de faire join (ne pas exagerer : voir ajout ,)
337 for tag,l,r,subtags in tags:
339 ll.append((text,l,r))
342 # cette facon de faire est un peu plus rapide que la suivante
343 ll.append(string.replace(text[l:r],'D','E')+',')
344 elif tag == 'comments' :
345 ll.append((text,l,r))
347 ll.append(text_eval(text,subtags)+',')
349 print "Argument ignore: ",text[l:r]
350 return '('+TextTools.join(ll,'')+')'
352 def comment_text(text):
353 l=string.replace(text,'\n','\n#')
354 if l[-1]=='#':return '#'+l[:-1]
357 def text_affe(text,tags):
359 for tag,l,r,subtags in tags:
363 s=s+text_eval(text,subtags)
365 s=s+text_larg(text,subtags)
367 s=s+string.replace(text[l:r],'D','E')
369 s=s+text_cplx(text,text[l:r],subtags)+','
372 def text_commande(text,tags):
374 Convertit une taglist de type commande en une chaine de caracteres
375 à la syntaxe Python représentative d'une commande
378 for tag,l,r,subtags in tags:
380 s=s+text_noreuse(text,subtags)
381 elif tag == 'reuse':s=s+text_reuse(text,subtags)
384 def text_formule(text,tags):
386 Convertit une taglist de type formule en une chaine de caracteres
387 à la syntaxe Python représentative d'une formule
392 for tag,l,r,subtags in tags:
395 s=text[l:r]+' = FORMULE('+ty+'="""('
404 s=s+ ') =\n'+text[l:r]
409 def text_comms(text,tags):
411 Convertit une taglist resultat d'un appel à TextTools.tag avec une table de type Aster
412 en une chaine de caracteres à la syntaxe Python
414 # On met la liste globale des concepts produits à zero
415 global liste_concepts_produits
416 liste_concepts_produits=[]
419 for tag,l,r,subtags in tags:
424 elif tag == 'formule':
425 s=s+ text_formule(text,subtags)
426 elif tag == 'commande' :
427 s=s+text_commande(text,subtags)
429 s=s+ comment_text(text[l:r])
432 def format_errs(text,tags):
435 for tag,l,r,subtags in tags:
437 err,warn=format_errs(text,subtags)
439 warnings=warnings+warn
441 s=s+ tag+" ligne : "+`TextTools.countlines(text[:l])`+" texte erroné : "+text[l-10:l]+'?'+text[l:r]+'\n'
442 if tag == 'passline':
443 warnings=warnings+ " ligne "+`TextTools.countlines(text[:l])`+" ignorée : " +text[l:r]+'\n'
447 from tables import aster_script
449 text=string.upper(text)
450 result, taglist, next = TextTools.tag(text,aster_script)
451 # Pour vérifier les résultats intermédiaires décommenter la ligne suivante
452 #TextTools.print_tags(text,taglist)
453 text=string.replace(text,'%','#')
454 s_errors,warnings = format_errs(text,taglist)
456 return None,s_errors,warnings
458 ss=text_comms(text,taglist)
459 return string.replace(ss,'\r\n','\n'),s_errors,warnings