Salome HOME
AY a ajouté l'interception de l'exception levée lorsque la chaine passée
[tools/eficas.git] / Minicode / ops.py
1 #@ MODIF ops Cata  DATE 23/10/2002   AUTEUR DURAND C.DURAND 
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2001  EDF R&D                  WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR   
8 # (AT YOUR OPTION) ANY LATER VERSION.                                 
9 #
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT 
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF          
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU    
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                            
14 #
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE   
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,       
17 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
18 # ======================================================================
19
20 # Modules Python
21 import types
22 import string,linecache,os,traceback,re
23
24 # Modules Eficas
25 import Accas
26 from Accas import ASSD
27
28 try:
29    import aster
30    # Si le module aster est présent, on le connecte
31    # au JDC
32    import Build.B_CODE
33    Build.B_CODE.CODE.codex=aster
34 except:
35    pass
36
37 def DEBUT(self,PAR_LOT,**args):
38    """
39        Fonction sdprod de la macro DEBUT
40    """
41    self.jdc.set_par_lot(PAR_LOT)
42
43 def POURSUITE(self,PAR_LOT,**args):
44    """
45        Fonction sdprod de la macro POURSUITE
46    """
47    self.jdc.set_par_lot(PAR_LOT)
48    if self.codex and os.path.isfile("glob.1"):
49      # Le module d'execution est accessible et glob.1 est present
50      if hasattr(self,'fichier_init'):return
51      self.fichier_init='glob.1'
52      self.jdc.initexec()
53      lot,ier,lonuti,concepts=self.codex.poursu(self,1)
54      self.icmd=lonuti
55      #print "Fin de debut",ier,lot,lonuti
56      pos=0
57      d={}
58      while pos+80 < len(concepts)+1:
59        nomres=concepts[pos:pos+8]
60        concep=concepts[pos+8:pos+24]
61        nomcmd=concepts[pos+24:pos+40]
62        statut=concepts[pos+40:pos+48]
63        if nomres[0] not in (' ','.','&') and statut != '&DETRUIT':
64           exec nomres+'='+string.lower(concep)+'()' in self.parent.g_context,d
65        pos=pos+80
66      for k,v in d.items():
67        self.parent.NommerSdprod(v,k)
68      self.g_context=d
69      return
70    else:
71      # Si le module d'execution n est pas accessible ou glob.1 absent on 
72      # demande un fichier (EFICAS)
73      # Il faut éviter de réinterpréter le fichier à chaque appel de
74      # POURSUITE
75      if hasattr(self,'fichier_init'):
76         return
77      self.make_poursuite()
78
79 def POURSUITE_context(self,d):
80    """
81        Fonction op_init de la macro POURSUITE
82    """
83    # self représente la macro POURSUITE ...
84    d.update(self.g_context)
85    # Une commande POURSUITE n'est possible qu'au niveau le plus haut
86    # On ajoute directement les concepts dans le contexte du jdc
87    # XXX est ce que les concepts ne sont pas ajoutés plusieurs fois ??
88    for v in self.g_context.values():
89       if isinstance(v,ASSD) : self.jdc.sds.append(v)
90
91 def INCLUDE(self,UNITE,**args):
92    """ 
93        Fonction sd_prod pour la macro INCLUDE
94    """
95    if not UNITE : return
96    if hasattr(self,'unite'):return
97    self.unite=UNITE
98
99    if self.jdc and self.jdc.par_lot == 'NON':
100       # On est en mode commande par commande
101       # On teste la validite de la commande avec interruption eventuelle
102       cr=self.report()
103       self.parent.cr.add(cr)
104       if not cr.estvide():
105          raise EOFError
106
107    self.make_include(unite=UNITE)
108
109 def INCLUDE_context(self,d):
110    """ 
111        Fonction op_init pour macro INCLUDE
112    """
113    for k,v in self.g_context.items():
114       d[k]=v
115
116 def detruire(self,d):
117    """
118        Cette fonction est la fonction op_init de la PROC DETRUIRE
119    """
120    sd=[]
121    for mc in self["CONCEPT"]:
122      mcs=mc["NOM"]
123      if type(mcs) == types.ListType or type(mcs) == types.TupleType:
124        for e in mcs:
125          if isinstance(e,ASSD):
126            sd.append(e)
127            e=e.nom
128          if d.has_key(e):del d[e]
129          if self.jdc.sds_dict.has_key(e):del self.jdc.sds_dict[e]
130      else:
131        if isinstance(mcs,ASSD):
132          sd.append(mcs)
133          mcs=mcs.nom
134        if d.has_key(mcs):del d[mcs]
135        if self.jdc.sds_dict.has_key(mcs):del self.jdc.sds_dict[mcs]
136    for s in sd:
137      # On signale au parent que le concept s n'existe plus apres l'étape self
138      self.parent.delete_concept_after_etape(self,s)
139
140 def subst_materiau(text,NOM_MATER,EXTRACTION):
141    """
142        Cette fonction retourne un texte obtenu à partir du texte passé en argument (text)
143        en substituant le nom du materiau par NOM_MATER 
144        et en réalisant les extractions spéciifées dans EXTRACTION
145    """
146    lines=string.split(text,'\n')
147    if EXTRACTION:
148      ll=[]
149      regmcf=re.compile(r" *(.*) *= *_F\( *## +(.*) +(.*)")
150      regmcs=re.compile(r" *(.*) *= *([^ ,]*) *, *## +([^ ]*) *([^ ]*)")
151      regfin=re.compile(r" *\) *")
152      temps={};lmcf=[]
153      for e in EXTRACTION:
154        mcf=e['COMPOR']
155        lmcf.append(mcf)
156        temps[mcf]=e['TEMP_EVAL']
157      FLAG=0
158      for l in lines:
159        m=regmcf.match(l)
160        if m: # On a trouve un mot cle facteur "commentarise"
161          if m.group(2) == "SUBST": # il est de plus substituable
162            if temps.has_key(m.group(3)): # Il est a substituer
163              ll.append(" "+m.group(3)+"=_F(")
164              mcf=m.group(3)
165              TEMP=temps[mcf]
166              FLAG=1 # Indique que l'on est en cours de substitution
167            else: # Il n est pas a substituer car il n est pas dans la liste demandee
168              ll.append(l)
169          else: # Mot cle facteur commentarise non substituable
170            ll.append(l)
171        else:  # La ligne ne contient pas un mot cle facteur commentarise
172          if FLAG == 0: # On n est pas en cours de substitution
173            ll.append(l)
174          else: # On est en cours de substitution. On cherche les mots cles simples commentarises
175            m=regmcs.match(l)
176            if m: # On a trouve un mot cle simple commentarise
177              if m.group(3) == "EVAL":
178                ll.append("  "+m.group(1)+' = EVAL("'+m.group(4)+"("+str(TEMP)+')"),')
179              elif m.group(3) == "SUPPR":
180                pass
181              else:
182                ll.append(l)
183            else: # On cherche la fin du mot cle facteur en cours de substitution
184              m=regfin.match(l)
185              if m: # On l a trouve. On le supprime de la liste
186                FLAG=0
187                del temps[mcf]
188              ll.append(l)
189    else:
190      ll=lines
191
192    for l in ll:
193      print l
194    lines=ll
195    ll=[]
196    for l in lines:
197      l=re.sub(" *MAT *= *",NOM_MATER+" = ",l,1)
198      ll.append(l)
199    text=string.join(ll,'\n')
200    return text
201
202 def INCLUDE_MATERIAU(self,NOM_AFNOR,TYPE_MODELE,VARIANTE,TYPE_VALE,NOM_MATER,
203                     EXTRACTION,INFO,**args):
204   """ 
205       Fonction sd_prod pour la macro INCLUDE_MATERIAU
206   """
207   mat=string.join((NOM_AFNOR,'_',TYPE_MODELE,'_',VARIANTE,'.',TYPE_VALE),'')
208   if not hasattr(self,'mat') or self.mat != mat or self.nom_mater != NOM_MATER :
209     # On récupère le répertoire des matériaux dans les arguments 
210     # supplémentaires du JDC
211     rep_mat=self.jdc.args.get("rep_mat","NOrep_mat")
212     f=os.path.join(rep_mat,mat)
213     self.mat=mat
214     self.nom_mater=NOM_MATER
215     if not os.path.isfile(f):
216        del self.mat
217        self.make_contexte(f,"#Texte sans effet pour reinitialiser le contexte a vide\n")
218        raise "Erreur sur le fichier materiau: "+f
219     # Les materiaux sont uniquement disponibles en syntaxe Python
220     # On lit le fichier et on supprime les éventuels \r
221     text=string.replace(open(f).read(),'\r\n','\n')
222     # On effectue les substitutions necessaires
223     self.prefix=NOM_MATER
224     self.text= subst_materiau(text,NOM_MATER,EXTRACTION)
225     if INFO == 2:
226       print "INCLUDE_MATERIAU: ", self.mat,' ',NOM_MATER,'\n'
227       print self.text
228     # on execute le texte fourni dans le contexte forme par
229     # le contexte de l etape pere (global au sens Python)
230     # et le contexte de l etape (local au sens Python)
231     # Il faut auparavant l'enregistrer aupres du module linecache (utile pour nommage.py)
232     linecache.cache[f]=0,0,string.split(self.text,'\n'),f
233     if self.jdc.par_lot == 'NON':
234       # On est en mode commande par commande
235       # On teste la validite de la commande avec interruption eventuelle
236       cr=self.report()
237       self.parent.cr.add(cr)
238       if not cr.estvide():
239         raise EOFError
240       # Et en plus il faut executer la fonction ops014 avant les sous
241       # commandes car le prefixe PRFXCO doit etre initialise dans le Fortran
242       self.codex.opsexe(self,0,-1,-self.definition.op)  
243
244     self.make_contexte(f,self.text)
245