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