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 # ======================================================================
26 from tables import ERRORS
29 __version__="$Name: $"
30 __Id__="$Id: conv.py,v 1.2 2003/07/01 10:26:14 salome Exp $"
33 Keywords=('MAILLE_1','MAILLE_2','MAILLE_ESCL','MAILLE_FOND','MAILLE_MAIT','MAILLE_ORIG','MAILLE',
34 'NOEUD', 'NOEUD_1','NOEUD_2','NOEUD_INIT','NOEUD_FIN', 'NOEUD_ORIG','NOEUD_REFE','NOEUD_EXTR',
35 'NOEUD_I', 'NOEUD_J','NOEUD_CHOC','NOEUD_ANCRAGE','NOEUD_CENTRE','NOEUD_CMP','NOEUD_DOUBLE',
36 'NOEUD_ESCL','NOEUD_FOND','NOEUD_PARA','NOEUD_POIN_TANG',
37 'GROUP_MA', 'GROUP_MA_1','GROUP_MA_2','GROUP_MA_INT','GROUP_MA_EXT', 'GROUP_MA_ORIG',
38 'GROUP_MA_BORD','GROUP_MA_INTE','GROUP_MA_FLUIDE', 'GROUP_MA_INTERF','GROUP_MA_BETON',
39 'GROUP_MA_ESCL','GROUP_MA_FINAL','GROUP_MA_FLU_SOL','GROUP_MA_FLU_STR','GROUP_MA_FOND',
40 'GROUP_MA_MAIT','GROUP_MA_RADIER','GROUP_MA_SOL_SOL','GROUP_MA_INIT',
41 'GROUP_NO', 'GROUP_NO_1','GROUP_NO_2','GROUP_NO_EXT', 'GROUP_NO_ORIG','GROUP_NO_CHOC',
42 'GROUP_NO_ANCRAGE','GROUP_NO_CENTRE','GROUP_NO_ESCL','GROUP_NO_EXTR','GROUP_NO_FIN',
43 'GROUP_NO_FOND','GROUP_NO_INIT','GROUP_NO_POIN_TG','GROUP_NO_RADIER',
45 'SANS_NOEUD', 'SANS_GROUP_NO',
46 'INTERSEC', 'UNION','DIFFE',
47 'VECT_GRNO_ORIG','VECT_GRNO_EXTR',
51 liste_macros=('MACRO_MATR_ASSE','MACRO_ELAS_MULT','MACR_ASCOUF_MAIL','MACR_ASCOUF_CALC','MACR_ASPIC_MAIL',
52 'MACR_ASPIC_CALC','MACRO_MATR_AJOU','MACRO_ELAS_MULT','MACRO_MODE_MECA','MACRO_PROJ_BASE',
55 liste_concepts_produits=[]
58 def text_nom_ope(text,tags,left,right):
59 global commande_courante
61 tag,l,r,subtags=tags[0]
62 commande_courante=text[left:l]
63 return text[left:l]+'('+text[l:r]
65 commande_courante=text[left:right]
66 return text[left:right]+'('
68 def text_reuse(text,tags):
70 for tag,l,r,subtags in tags:
74 elif tag == 'nom_ope' : s=s+ '='+text_nom_ope(text,subtags,l,r)
76 s=s+ '='+text_affe(text,subtags)
78 if commande_courante in liste_macros:
79 s=s+'reuse='+sd+','+text_macro(text,subtags)+')'
81 s=s+'reuse='+sd+','+text_com(text,subtags)+')'
86 def text_noreuse(text,tags):
87 global commande_courante
89 for tag,l,r,subtags in tags:
93 elif tag == 'nom_ope' :
94 s=s+ '='+ text_nom_ope(text,subtags,l,r)
96 liste_concepts_produits.append(sd)
97 s=s+ '='+text_affe(text,subtags)
100 if sd in liste_macros:
101 s=s+'('+text_macro(text,subtags)+')'
103 s=s+'('+text_com(text,subtags)+')'
105 liste_concepts_produits.append(sd)
106 if commande_courante in liste_macros:
107 s=s+text_macro(text,subtags)+')'
109 s=s+text_com(text,subtags)+')'
115 def list_mc(lmc,mcs):
125 s=s+string.join((c,va,','),'')
130 def text_com(text,tags):
135 for tag,l,r,subtags in tags:
138 if not mcs.has_key(currid):
142 ll=text_mcf(text,subtags)
143 mcs[currid].append((ll,comment))
146 a=string.replace(text[l:r],'D','E')
147 mcs[currid].append((a,comment))
150 a=text_cplx(text,text[l:r],subtags)
151 mcs[currid].append((a,comment))
155 if currid in Keywords :
156 # FR : (SGDG) il faut tester s'il n'y a pas déjà des cotes !!!
157 if text[l]!="'" and text[r-1]!="'":
158 a=a+"'"+text[l:r]+"'"
163 mcs[currid].append((a,comment))
166 a=text_eval(text,subtags)
167 mcs[currid].append((a,comment))
169 elif tag == 'comment' :
170 comment=comment + '#'+text[l+1:r]
171 elif tag == 'comments' :
172 comment=comment + text[l:r]
174 if currid in Keywords:mcs[currid].append((text_larg2(text,subtags),comment))
175 else:mcs[currid].append((text_larg(text,subtags),comment))
179 if comment :s=s+comment
182 def text_macro(text,tags):
187 for tag,l,r,subtags in tags:
190 if not mcs.has_key(currid):
194 ll=text_macro_mcf(text,subtags)
195 mcs[currid].append((ll,comment))
198 a=string.replace(text[l:r],'D','E')
199 mcs[currid].append((a,comment))
202 a=text_cplx(text,text[l:r],subtags)
203 mcs[currid].append((a,comment))
208 # FR : (SGDG) il faut tester s'il n'y a pas déjà des cotes !!!
210 elif currid in Keywords :
211 a=a+"'"+text[l:r]+"'"
214 if sd not in liste_concepts_produits:
215 # Il s agit d un concept produit par la macro mais situe à droite de =
217 liste_concepts_produits.append(sd)
220 mcs[currid].append((a,comment))
223 a=text_eval(text,subtags)
224 mcs[currid].append((a,comment))
226 elif tag == 'comment' :
227 comment=comment + '#'+text[l+1:r]
228 elif tag == 'comments' :
229 comment=comment + text[l:r]
231 if currid in Keywords:mcs[currid].append((text_larg2(text,subtags),comment))
232 else:mcs[currid].append((text_larg(text,subtags),comment))
236 if comment :s=s+comment
239 def comments_text(text):
240 l=string.replace(text,'%','#')
243 def text_eval(text,tags):
244 # on retourne l expression sans conversion dans un objet EVAL et entre quotes
245 for tag,l,r,subtags in tags:
247 s='EVAL("""'+text[l:r]+'""")'
251 def text_mcf(text,tags):
254 for tag,l,r,subtags in tags:
261 if currid in Keywords :
262 # FR : (SGDG) il faut tester s'il n'y a pas déjà des cotes !!!
263 if text[l]!="'" and text[r-1]!="'":
264 s=s+"'"+text[l:r]+"',"
267 else:s=s+text[l:r]+","
269 s=s+string.replace(text[l:r],'D','E')+','
271 s=s+text_cplx(text,text[l:r],subtags)+','
273 s=s+text_eval(text,subtags)+','
275 if currid in Keywords:s=s+text_larg2(text,subtags)+','
276 else: s=s+text_larg(text,subtags)+','
277 elif tag == 'comments' :
278 comment=comment+text[l:r]
283 def text_macro_mcf(text,tags):
286 for tag,l,r,subtags in tags:
293 # FR : (SGDG) il faut tester s'il n'y a pas déjà des cotes !!!
295 elif currid in Keywords :
296 s=s+"'"+text[l:r]+"',"
299 if sd not in liste_concepts_produits:
300 # Il s agit d un concept produit par la macro mais situe à droite de =
302 liste_concepts_produits.append(sd)
307 s=s+string.replace(text[l:r],'D','E')+','
309 s=s+text_cplx(text,text[l:r],subtags)+','
312 s=s+text_eval(text,subtags)+','
315 if currid in Keywords:s=s+text_larg2(text,subtags)+','
316 else: s=s+text_larg(text,subtags)+','
318 elif tag == 'comments' :
319 comment=comment+text[l:r]
322 def text_cplx(texte,text,tags):
323 """ Retourne une chaîne de caractères représentant un complexe """
324 s="('"+text[0:2]+"'," #text[0:2] = RI ou MP
325 for tag,l,r,subtags in tags:
327 s=s+string.replace(texte[l:r],'D','E')+','
331 def text_larg2(text,tags):
332 """ Pareil que text_larg mais ajoute des cotes autour des arg """
334 for tag,l,r,subtags in tags:
336 # FR : (SGDG) il faut tester le cas où les cotes sont déjà là !!!!
337 if text[l] != "'" and text[r-1] != "'":
338 ll.append( "'"+text[l:r]+"',")
340 ll.append(text[l:r]+",")
342 ll.append(string.replace(text[l:r],'D','E')+',')
344 ll.append(text_cplx(text,text[l:r],subtags)+',')
345 elif tag == 'comments' :
347 return '('+string.join(ll,'')+')'
349 def text_larg(text,tags):
350 # Pour les listes d arguments il semble plus rapide de construire
351 # une liste puis de faire join (ne pas exagerer : voir ajout ,)
353 for tag,l,r,subtags in tags:
355 ll.append((text,l,r))
358 # cette facon de faire est un peu plus rapide que la suivante
359 ll.append(string.replace(text[l:r],'D','E')+',')
360 elif tag == 'comments' :
361 ll.append((text,l,r))
363 ll.append(text_eval(text,subtags)+',')
365 print "Argument ignore: ",text[l:r]
366 return '('+TextTools.join(ll,'')+')'
368 def comment_text(text):
369 l=string.replace(text,'\n','\n#')
370 if l[-1]=='#':return '#'+l[:-1]
373 def text_affe(text,tags):
375 for tag,l,r,subtags in tags:
379 s=s+text_eval(text,subtags)
381 s=s+text_larg(text,subtags)
383 s=s+string.replace(text[l:r],'D','E')
385 s=s+text_cplx(text,text[l:r],subtags)+','
388 def text_commande(text,tags):
390 Convertit une taglist de type commande en une chaine de caracteres
391 à la syntaxe Python représentative d'une commande
394 for tag,l,r,subtags in tags:
396 s=s+text_noreuse(text,subtags)
397 elif tag == 'reuse':s=s+text_reuse(text,subtags)
400 def text_formule(text,tags):
402 Convertit une taglist de type formule en une chaine de caracteres
403 à la syntaxe Python représentative d'une formule
408 for tag,l,r,subtags in tags:
411 s=text[l:r]+' = FORMULE('+ty+'="""('
420 s=s+ ') =\n'+text[l:r]
425 def text_comms(text,tags):
427 Convertit une taglist resultat d'un appel à TextTools.tag avec une table de type Aster
428 en une chaine de caracteres à la syntaxe Python
430 # On met la liste globale des concepts produits à zero
431 global liste_concepts_produits
432 liste_concepts_produits=[]
435 for tag,l,r,subtags in tags:
440 elif tag == 'formule':
441 s=s+ text_formule(text,subtags)
442 elif tag == 'commande' :
443 s=s+text_commande(text,subtags)
445 s=s+ comment_text(text[l:r])
448 def format_errs(text,tags):
451 for tag,l,r,subtags in tags:
453 err,warn=format_errs(text,subtags)
455 warnings=warnings+warn
457 s=s+ tag+" ligne : "+`TextTools.countlines(text[:l])`+" texte erroné : "+text[l-10:l]+'?'+text[l:r]+'\n'
458 if tag == 'passline':
459 warnings=warnings+ " ligne "+`TextTools.countlines(text[:l])`+" ignorée : " +text[l:r]+'\n'
463 from tables import aster_script
465 # On ajoute un '\n' en fin au cas ou il serait absent
467 text=string.upper(text)
468 result, taglist, next = TextTools.tag(text,aster_script)
469 # Pour vérifier les résultats intermédiaires décommenter la ligne suivante
470 #TextTools.print_tags(text,taglist)
471 text=string.replace(text,'%','#')
472 s_errors,warnings = format_errs(text,taglist)
474 return None,s_errors,warnings
476 ss=text_comms(text,taglist)
477 return string.replace(ss,'\r\n','\n'),s_errors,warnings