Salome HOME
Version initiale de EFICAS 1.2
[tools/eficas.git] / Minicode / ops.py
1 #
2 __version__="$Name: FR_28_06_10_00 $"
3 __Id__="$Id: ops.py,v 1.12.18.3 2001/06/19 12:24:51 iliade Exp $"
4 #
5
6 # Modules Python
7 import types
8 import string,linecache,os,traceback,re
9
10 # Modules Eficas
11 import Accas
12 from Accas import ASSD
13
14 def DEBUT(self,PAR_LOT,**args):
15    """
16        Fonction sdprod de la macro DEBUT
17    """
18    self.jdc.set_par_lot(PAR_LOT)
19
20 def POURSUITE(self,PAR_LOT,**args):
21    """
22        Fonction sdprod de la macro POURSUITE
23    """
24    self.jdc.set_par_lot(PAR_LOT)
25    if self.codex and os.path.isfile("glob.1"):
26       # Le module d'execution est accessible et glob.1 est present
27       if hasattr(self,'fichier_init'):return
28       self.fichier_init='glob.1'
29       self.jdc.initexec()
30       lot,ier,lonuti,concepts=self.codex.poursu(self,1)
31       self.icmd=lonuti
32       #print "Fin de debut",ier,lot,lonuti
33       pos=0
34       d={}
35       while pos+80 < len(concepts)+1:
36         nomres=concepts[pos:pos+8]
37         concep=concepts[pos+8:pos+24]
38         nomcmd=concepts[pos+24:pos+40]
39         statut=concepts[pos+40:pos+48]
40         if nomres[0] not in (' ','.','&') and statut != '&DETRUIT':
41            exec nomres+'='+string.lower(concep)+'()' in self.parent.g_context,d
42         pos=pos+80
43       for k,v in d.items():
44         self.parent.NommerSdprod(v,k)
45       self.g_context=d
46       return
47    else:
48       # Si le module d'execution n est pas accessible ou glob.1 absent on 
49       # demande un fichier (EFICAS)
50       # Il faut éviter de réinterpréter le fichier à chaque appel de
51       # POURSUITE
52       if hasattr(self,'fichier_init'):
53          return
54       self.make_poursuite()
55
56 def POURSUITE_context(self,d):
57    """
58        Fonction op_init de la macro POURSUITE
59    """
60    # self représente la macro POURSUITE ...
61    d.update(self.g_context)
62    # Une commande POURSUITE n'est possible qu'au niveau le plus haut
63    # On ajoute directement les concepts dans le contexte du jdc
64    # XXX est ce que les concepts ne sont pas ajoutés plusieurs fois ??
65    for v in self.g_context.values():
66       if isinstance(v,ASSD) : self.jdc.sds.append(v)
67
68 def INCLUDE(self,UNITE,**args):
69    """ 
70        Fonction sd_prod pour la macro INCLUDE
71    """
72    if hasattr(self,'unite'):return
73    self.unite=UNITE
74
75    if self.jdc and self.jdc.par_lot == 'NON':
76       # On est en mode commande par commande
77       # On teste la validite de la commande avec interruption eventuelle
78       cr=self.report()
79       self.parent.cr.add(cr)
80       if not cr.estvide():
81          raise EOFError
82
83    self.make_include(unite=UNITE)
84
85 def INCLUDE_context(self,d):
86    """ 
87        Fonction op_init pour macro INCLUDE
88    """
89    for k,v in self.g_context.items():
90       d[k]=v
91
92 def detruire(self,d):
93    """
94        Cette fonction est la fonction op_init de la PROC DETRUIRE
95    """
96    sd=[]
97    for mc in self["CONCEPT"]:
98      mcs=mc["NOM"]
99      if type(mcs) == types.ListType or type(mcs) == types.TupleType:
100        for e in mcs:
101          if isinstance(e,ASSD):
102            sd.append(e)
103            e=e.nom
104          if d.has_key(e):del d[e]
105      else:
106        if isinstance(mcs,ASSD):
107          sd.append(mcs)
108          mcs=mcs.nom
109        if d.has_key(mcs):del d[mcs]
110    for s in sd:
111      # On signale au parent que le concept s n'existe plus apres l'étape self
112      self.parent.delete_concept_after_etape(self,s)
113
114 def subst_materiau(text,NOM_MATER,EXTRACTION):
115    """
116        Cette fonction retourne un texte obtenu à partir du texte passé en argument (text)
117        en substituant le nom du materiau par NOM_MATER 
118        et en réalisant les extractions spéciifées dans EXTRACTION
119    """
120    lines=string.split(text,'\n')
121    if EXTRACTION:
122      ll=[]
123      regmcf=re.compile(r" *(.*) *= *_F\( *## +(.*) +(.*)")
124      regmcs=re.compile(r" *(.*) *= *([^ ,]*) *, *## +([^ ]*) *([^ ]*)")
125      regfin=re.compile(r" *\) *")
126      temps={};lmcf=[]
127      for e in EXTRACTION:
128        mcf=e['COMPOR']
129        lmcf.append(mcf)
130        temps[mcf]=e['TEMP_EVAL']
131      FLAG=0
132      for l in lines:
133        m=regmcf.match(l)
134        if m: # On a trouve un mot cle facteur "commentarise"
135          if m.group(2) == "SUBST": # il est de plus substituable
136            if temps.has_key(m.group(3)): # Il est a substituer
137              ll.append(" "+m.group(3)+"=_F(")
138              mcf=m.group(3)
139              TEMP=temps[mcf]
140              FLAG=1 # Indique que l'on est en cours de substitution
141            else: # Il n est pas a substituer car il n est pas dans la liste demandee
142              ll.append(l)
143          else: # Mot cle facteur commentarise non substituable
144            ll.append(l)
145        else:  # La ligne ne contient pas un mot cle facteur commentarise
146          if FLAG == 0: # On n est pas en cours de substitution
147            ll.append(l)
148          else: # On est en cours de substitution. On cherche les mots cles simples commentarises
149            m=regmcs.match(l)
150            if m: # On a trouve un mot cle simple commentarise
151              if m.group(3) == "EVAL":
152                ll.append("  "+m.group(1)+' = EVAL("'+m.group(4)+"("+str(TEMP)+')"),')
153              elif m.group(3) == "SUPPR":
154                pass
155              else:
156                ll.append(l)
157            else: # On cherche la fin du mot cle facteur en cours de substitution
158              m=regfin.match(l)
159              if m: # On l a trouve. On le supprime de la liste
160                FLAG=0
161                del temps[mcf]
162              ll.append(l)
163    else:
164      ll=lines
165
166    for l in ll:
167      print l
168    lines=ll
169    ll=[]
170    for l in lines:
171      l=re.sub(" *MAT *= *",NOM_MATER+" = ",l,1)
172      ll.append(l)
173    text=string.join(ll,'\n')
174    return text
175
176 def INCLUDE_MATERIAU(self,NOM_AFNOR,TYPE_MODELE,VARIANTE,TYPE_VALE,NOM_MATER,
177                     EXTRACTION,INFO,**args):
178   """ 
179       Fonction sd_prod pour la macro INCLUDE_MATERIAU
180   """
181   mat=string.join((NOM_AFNOR,'_',TYPE_MODELE,'_',VARIANTE,'.',TYPE_VALE),'')
182   if not hasattr(self,'mat') or self.mat != mat:
183     self.mat=mat
184     # On récupère le répertoire des matériaux dans les arguments 
185     # supplémentaires du JDC
186     rep_mat=self.jdc.args["rep_mat"]
187     f=os.path.join(rep_mat,mat)
188     if not os.path.isfile(f):
189        raise "Erreur sur le fichier materiau: "+f
190     # Les materiaux sont uniquement disponibles en syntaxe Python
191     # On lit le fichier et on supprime les éventuels \r
192     text=string.replace(open(f).read(),'\r\n','\n')
193     # On effectue les substitutions necessaires
194     self.prefix=NOM_MATER
195     self.text= subst_materiau(text,NOM_MATER,EXTRACTION)
196     if INFO == 2:
197       print "INCLUDE_MATERIAU: ", self.mat,' ',NOM_MATER,'\n'
198       print self.text
199     # on execute le texte fourni dans le contexte forme par
200     # le contexte de l etape pere (global au sens Python)
201     # et le contexte de l etape (local au sens Python)
202     # Il faut auparavant l'enregistrer aupres du module linecache (utile pour nommage.py)
203     linecache.cache[f]=0,0,string.split(self.text,'\n'),f
204     code=compile(self.text,f,'exec')
205     if self.jdc.par_lot == 'NON':
206       # On est en mode commande par commande
207       # On teste la validite de la commande avec interruption eventuelle
208       cr=self.report()
209       self.parent.cr.add(cr)
210       if not cr.estvide():
211         raise EOFError
212       # Et en plus il faut executer la fonction ops014 avant les sous
213       # commandes car le prefixe PRFXCO doit etre initialise dans le Fortran
214       self.codex.opsexe(self,0,-1,-self.definition.op)  
215
216     d={}
217     self.g_context = d
218     self.contexte_fichier_init = d
219     exec code in self.parent.g_context,d