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 $"
8 import string,linecache,os,traceback,re
12 from Accas import ASSD
14 def DEBUT(self,PAR_LOT,**args):
16 Fonction sdprod de la macro DEBUT
18 self.jdc.set_par_lot(PAR_LOT)
20 def POURSUITE(self,PAR_LOT,**args):
22 Fonction sdprod de la macro POURSUITE
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'
30 lot,ier,lonuti,concepts=self.codex.poursu(self,1)
32 #print "Fin de debut",ier,lot,lonuti
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
44 self.parent.NommerSdprod(v,k)
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
52 if hasattr(self,'fichier_init'):
56 def POURSUITE_context(self,d):
58 Fonction op_init de la macro POURSUITE
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)
68 def INCLUDE(self,UNITE,**args):
70 Fonction sd_prod pour la macro INCLUDE
72 if hasattr(self,'unite'):return
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
79 self.parent.cr.add(cr)
83 self.make_include(unite=UNITE)
85 def INCLUDE_context(self,d):
87 Fonction op_init pour macro INCLUDE
89 for k,v in self.g_context.items():
94 Cette fonction est la fonction op_init de la PROC DETRUIRE
97 for mc in self["CONCEPT"]:
99 if type(mcs) == types.ListType or type(mcs) == types.TupleType:
101 if isinstance(e,ASSD):
104 if d.has_key(e):del d[e]
106 if isinstance(mcs,ASSD):
109 if d.has_key(mcs):del d[mcs]
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)
114 def subst_materiau(text,NOM_MATER,EXTRACTION):
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
120 lines=string.split(text,'\n')
123 regmcf=re.compile(r" *(.*) *= *_F\( *## +(.*) +(.*)")
124 regmcs=re.compile(r" *(.*) *= *([^ ,]*) *, *## +([^ ]*) *([^ ]*)")
125 regfin=re.compile(r" *\) *")
130 temps[mcf]=e['TEMP_EVAL']
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(")
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
143 else: # Mot cle facteur commentarise non substituable
145 else: # La ligne ne contient pas un mot cle facteur commentarise
146 if FLAG == 0: # On n est pas en cours de substitution
148 else: # On est en cours de substitution. On cherche les mots cles simples commentarises
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":
157 else: # On cherche la fin du mot cle facteur en cours de substitution
159 if m: # On l a trouve. On le supprime de la liste
171 l=re.sub(" *MAT *= *",NOM_MATER+" = ",l,1)
173 text=string.join(ll,'\n')
176 def INCLUDE_MATERIAU(self,NOM_AFNOR,TYPE_MODELE,VARIANTE,TYPE_VALE,NOM_MATER,
177 EXTRACTION,INFO,**args):
179 Fonction sd_prod pour la macro INCLUDE_MATERIAU
181 mat=string.join((NOM_AFNOR,'_',TYPE_MODELE,'_',VARIANTE,'.',TYPE_VALE),'')
182 if not hasattr(self,'mat') or 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)
197 print "INCLUDE_MATERIAU: ", self.mat,' ',NOM_MATER,'\n'
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
209 self.parent.cr.add(cr)
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)
218 self.contexte_fichier_init = d
219 exec code in self.parent.g_context,d