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 # ======================================================================
27 from tables import ERRORS
32 __version__="$Name: $"
33 __Id__="$Id: conv.py,v 1.4 2003/08/08 10:14:37 eficas Exp $"
36 Keywords=('MAILLE_1','MAILLE_2','MAILLE_ESCL','MAILLE_FOND','MAILLE_MAIT','MAILLE_ORIG','MAILLE',
37 'NOEUD', 'NOEUD_1','NOEUD_2','NOEUD_INIT','NOEUD_FIN', 'NOEUD_ORIG','NOEUD_REFE','NOEUD_EXTR',
38 'NOEUD_I', 'NOEUD_J','NOEUD_CHOC','NOEUD_ANCRAGE','NOEUD_CENTRE','NOEUD_CMP','NOEUD_DOUBLE',
39 'NOEUD_ESCL','NOEUD_FOND','NOEUD_PARA','NOEUD_POIN_TANG',
40 'GROUP_MA', 'GROUP_MA_1','GROUP_MA_2','GROUP_MA_INT','GROUP_MA_EXT', 'GROUP_MA_ORIG',
41 'GROUP_MA_BORD','GROUP_MA_INTE','GROUP_MA_FLUIDE', 'GROUP_MA_INTERF','GROUP_MA_BETON',
42 'GROUP_MA_ESCL','GROUP_MA_FINAL','GROUP_MA_FLU_SOL','GROUP_MA_FLU_STR','GROUP_MA_FOND',
43 'GROUP_MA_MAIT','GROUP_MA_RADIER','GROUP_MA_SOL_SOL','GROUP_MA_INIT',
44 'GROUP_NO', 'GROUP_NO_1','GROUP_NO_2','GROUP_NO_EXT', 'GROUP_NO_ORIG','GROUP_NO_CHOC',
45 'GROUP_NO_ANCRAGE','GROUP_NO_CENTRE','GROUP_NO_ESCL','GROUP_NO_EXTR','GROUP_NO_FIN',
46 'GROUP_NO_FOND','GROUP_NO_INIT','GROUP_NO_POIN_TG','GROUP_NO_RADIER',
48 'SANS_NOEUD', 'SANS_GROUP_NO',
49 'INTERSEC', 'UNION','DIFFE',
50 'VECT_GRNO_ORIG','VECT_GRNO_EXTR',
54 liste_macros=('MACRO_MATR_ASSE','MACRO_ELAS_MULT','MACR_ASCOUF_MAIL','MACR_ASCOUF_CALC','MACR_ASPIC_MAIL',
55 'MACR_ASPIC_CALC','MACRO_MATR_AJOU','MACRO_ELAS_MULT','MACRO_MODE_MECA','MACRO_PROJ_BASE',
58 liste_concepts_produits=[]
61 def text_nom_ope(text,tags,left,right):
62 global commande_courante
64 tag,l,r,subtags=tags[0]
65 commande_courante=text[left:l]
66 return text[left:l]+'('+text[l:r]
68 commande_courante=text[left:right]
69 return text[left:right]+'('
71 def text_reuse(text,tags):
73 for tag,l,r,subtags in tags:
77 elif tag == 'nom_ope' : s=s+ '='+text_nom_ope(text,subtags,l,r)
79 s=s+ '='+text_affe(text,subtags)
81 if commande_courante in liste_macros:
82 s=s+'reuse='+sd+','+text_macro(text,subtags)+')'
84 s=s+'reuse='+sd+','+text_com(text,subtags)+')'
89 def text_noreuse(text,tags):
90 global commande_courante
92 for tag,l,r,subtags in tags:
96 elif tag == 'nom_ope' :
97 s=s+ '='+ text_nom_ope(text,subtags,l,r)
99 liste_concepts_produits.append(sd)
100 s=s+ '='+text_affe(text,subtags)
103 if sd in liste_macros:
104 s=s+'('+text_macro(text,subtags)+')'
106 s=s+'('+text_com(text,subtags)+')'
108 liste_concepts_produits.append(sd)
109 if commande_courante in liste_macros:
110 s=s+text_macro(text,subtags)+')'
112 s=s+text_com(text,subtags)+')'
118 def list_mc(lmc,mcs):
128 s=s+string.join((c,va,','),'')
133 def text_com(text,tags):
138 for tag,l,r,subtags in tags:
141 if not mcs.has_key(currid):
145 ll=text_mcf(text,subtags)
146 mcs[currid].append((ll,comment))
149 a=string.replace(text[l:r],'D','E')
150 mcs[currid].append((a,comment))
153 a=text_cplx(text,text[l:r],subtags)
154 mcs[currid].append((a,comment))
158 if currid in Keywords :
159 # FR : (SGDG) il faut tester s'il n'y a pas déjà des cotes !!!
160 if text[l]!="'" and text[r-1]!="'":
161 a=a+"'"+text[l:r]+"'"
166 mcs[currid].append((a,comment))
169 a=text_eval(text,subtags)
170 mcs[currid].append((a,comment))
172 elif tag == 'comment' :
173 comment=comment + '#'+text[l+1:r]
174 elif tag == 'comments' :
175 comment=comment + text[l:r]
177 if currid in Keywords:mcs[currid].append((text_larg2(text,subtags),comment))
178 else:mcs[currid].append((text_larg(text,subtags),comment))
182 if comment :s=s+comment
185 def text_macro(text,tags):
190 for tag,l,r,subtags in tags:
193 if not mcs.has_key(currid):
197 ll=text_macro_mcf(text,subtags)
198 mcs[currid].append((ll,comment))
201 a=string.replace(text[l:r],'D','E')
202 mcs[currid].append((a,comment))
205 a=text_cplx(text,text[l:r],subtags)
206 mcs[currid].append((a,comment))
211 # FR : (SGDG) il faut tester s'il n'y a pas déjà des cotes !!!
213 elif currid in Keywords :
214 a=a+"'"+text[l:r]+"'"
217 if sd not in liste_concepts_produits:
218 # Il s agit d un concept produit par la macro mais situe à droite de =
220 liste_concepts_produits.append(sd)
223 mcs[currid].append((a,comment))
226 a=text_eval(text,subtags)
227 mcs[currid].append((a,comment))
229 elif tag == 'comment' :
230 comment=comment + '#'+text[l+1:r]
231 elif tag == 'comments' :
232 comment=comment + text[l:r]
234 if currid in Keywords:mcs[currid].append((text_larg2(text,subtags),comment))
235 else:mcs[currid].append((text_larg(text,subtags),comment))
239 if comment :s=s+comment
242 def comments_text(text):
243 l=string.replace(text,'%','#')
246 def text_eval(text,tags):
247 # on retourne l expression sans conversion dans un objet EVAL et entre quotes
248 for tag,l,r,subtags in tags:
250 s='EVAL("""'+text[l:r]+'""")'
254 def text_mcf(text,tags):
257 for tag,l,r,subtags in tags:
264 if currid in Keywords :
265 # FR : (SGDG) il faut tester s'il n'y a pas déjà des cotes !!!
266 if text[l]!="'" and text[r-1]!="'":
267 s=s+"'"+text[l:r]+"',"
270 else:s=s+text[l:r]+","
272 s=s+string.replace(text[l:r],'D','E')+','
274 s=s+text_cplx(text,text[l:r],subtags)+','
276 s=s+text_eval(text,subtags)+','
278 if currid in Keywords:s=s+text_larg2(text,subtags)+','
279 else: s=s+text_larg(text,subtags)+','
280 elif tag == 'comments' :
281 comment=comment+text[l:r]
286 def text_macro_mcf(text,tags):
289 for tag,l,r,subtags in tags:
296 # FR : (SGDG) il faut tester s'il n'y a pas déjà des cotes !!!
298 elif currid in Keywords :
299 s=s+"'"+text[l:r]+"',"
302 if sd not in liste_concepts_produits:
303 # Il s agit d un concept produit par la macro mais situe à droite de =
305 liste_concepts_produits.append(sd)
310 s=s+string.replace(text[l:r],'D','E')+','
312 s=s+text_cplx(text,text[l:r],subtags)+','
315 s=s+text_eval(text,subtags)+','
318 if currid in Keywords:s=s+text_larg2(text,subtags)+','
319 else: s=s+text_larg(text,subtags)+','
321 elif tag == 'comments' :
322 comment=comment+text[l:r]
325 def text_cplx(texte,text,tags):
326 """ Retourne une chaîne de caractères représentant un complexe """
327 s="('"+text[0:2]+"'," #text[0:2] = RI ou MP
328 for tag,l,r,subtags in tags:
330 s=s+string.replace(texte[l:r],'D','E')+','
334 def text_larg2(text,tags):
335 """ Pareil que text_larg mais ajoute des cotes autour des arg """
337 for tag,l,r,subtags in tags:
339 # FR : (SGDG) il faut tester le cas où les cotes sont déjà là !!!!
340 if text[l] != "'" and text[r-1] != "'":
341 ll.append( "'"+text[l:r]+"',")
343 ll.append(text[l:r]+",")
345 ll.append(string.replace(text[l:r],'D','E')+',')
347 ll.append(text_cplx(text,text[l:r],subtags)+',')
348 elif tag == 'comments' :
350 return '('+string.join(ll,'')+')'
352 def text_larg(text,tags):
353 # Pour les listes d arguments il semble plus rapide de construire
354 # une liste puis de faire join (ne pas exagerer : voir ajout ,)
356 for tag,l,r,subtags in tags:
358 ll.append((text,l,r))
361 # cette facon de faire est un peu plus rapide que la suivante
362 ll.append(string.replace(text[l:r],'D','E')+',')
363 elif tag == 'comments' :
364 ll.append((text,l,r))
366 ll.append(text_eval(text,subtags)+',')
368 print "Argument ignore: ",text[l:r]
369 return '('+TextTools.join(ll,'')+')'
371 def comment_text(text):
372 l=string.replace(text,'\n','\n#')
373 if l[-1]=='#':return '#'+l[:-1]
376 def text_affe(text,tags):
378 for tag,l,r,subtags in tags:
382 s=s+text_eval(text,subtags)
384 s=s+text_larg(text,subtags)
386 s=s+string.replace(text[l:r],'D','E')
388 s=s+text_cplx(text,text[l:r],subtags)+','
391 def text_commande(text,tags):
393 Convertit une taglist de type commande en une chaine de caracteres
394 à la syntaxe Python représentative d'une commande
397 for tag,l,r,subtags in tags:
399 s=s+text_noreuse(text,subtags)
400 elif tag == 'reuse':s=s+text_reuse(text,subtags)
403 def text_formule(text,tags):
405 Convertit une taglist de type formule en une chaine de caracteres
406 à la syntaxe Python représentative d'une formule
411 for tag,l,r,subtags in tags:
414 s=text[l:r]+' = FORMULE('+ty+'="""('
423 s=s+ ') =\n'+text[l:r]
428 def text_comms(text,tags):
430 Convertit une taglist resultat d'un appel à TextTools.tag avec une table de type Aster
431 en une chaine de caracteres à la syntaxe Python
433 # On met la liste globale des concepts produits à zero
434 global liste_concepts_produits
435 liste_concepts_produits=[]
438 for tag,l,r,subtags in tags:
443 elif tag == 'formule':
444 s=s+ text_formule(text,subtags)
445 elif tag == 'commande' :
446 s=s+text_commande(text,subtags)
448 s=s+ comment_text(text[l:r])
451 def format_errs(text,tags):
454 for tag,l,r,subtags in tags:
456 err,warn=format_errs(text,subtags)
458 warnings=warnings+warn
460 s=s+ tag+" ligne : "+`TextTools.countlines(text[:l])`+" texte erroné : "+text[l-10:l]+'?'+text[l:r]+'\n'
461 if tag == 'passline':
462 warnings=warnings+ " ligne "+`TextTools.countlines(text[:l])`+" ignorée : " +text[l:r]+'\n'
466 from tables import aster_script
468 # On ajoute un '\n' en fin au cas ou il serait absent
470 text=string.upper(text)
471 result, taglist, next = TextTools.tag(text,aster_script)
472 # Pour vérifier les résultats intermédiaires décommenter la ligne suivante
473 #TextTools.print_tags(text,taglist)
474 text=string.replace(text,'%','#')
475 s_errors,warnings = format_errs(text,taglist)
477 return None,s_errors,warnings
479 ss=text_comms(text,taglist)
480 return string.replace(ss,'\r\n','\n'),s_errors,warnings