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