]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/ops.py
Salome HOME
mise a jour sdist
[tools/eficas.git] / Aster / Cata / ops.py
1 #@ MODIF ops Cata  DATE 06/09/2003   AUTEUR D6BHHJP J.P.LEFEBVRE 
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 from Noyau.N_FONCTION import formule
28
29 try:
30    import aster
31    # Si le module aster est présent, on le connecte
32    # au JDC
33    import Build.B_CODE
34    Build.B_CODE.CODE.codex=aster
35 except:
36    pass
37
38 def DEBUT(self,PAR_LOT,CODE,**args):
39    """
40        Fonction sdprod de la macro DEBUT
41    """
42    # La commande DEBUT ne peut exister qu'au niveau jdc
43    if self.jdc is not self.parent :
44       raise Accas.AsException("La commande DEBUT ne peut exister qu'au niveau jdc")
45
46    self.jdc.set_par_lot(PAR_LOT)
47    if CODE!=None :
48       self.jdc.fico=CODE['NOM']
49    else:
50       self.jdc.fico=None
51
52 def build_debut(self,**args):
53    """
54    Fonction ops pour la macro DEBUT
55    """
56    self.jdc.UserError=self.codex.error
57
58    if self.jdc.par_lot == 'NON' :
59       self.jdc._Build()
60    # On execute la fonction debut pour initialiser les bases
61    # Cette execution est indispensable avant toute autre action sur ASTER
62    # op doit etre un entier car la fonction debut appelle GCECDU qui demande
63    # le numero de l'operateur associé (getoper)
64    self.definition.op=0
65    self.set_icmd(1)
66    lot,ier=self.codex.debut(self,1)
67    # On remet op a None juste apres pour eviter que la commande DEBUT
68    # ne soit executée dans la phase d'execution
69    self.definition.op=None
70    return ier
71
72 def POURSUITE(self,PAR_LOT,CODE,HDF,**args):
73    """
74        Fonction sdprod de la macro POURSUITE
75    """
76    # La commande POURSUITE ne peut exister qu'au niveau jdc
77    if self.jdc is not self.parent :
78       raise Accas.AsException("La commande POURSUITE ne peut exister qu'au niveau jdc")
79
80    self.jdc.set_par_lot(PAR_LOT)
81    if CODE!=None :
82       self.jdc.fico=CODE['NOM']
83    else:
84       self.jdc.fico=None
85    if (self.codex and os.path.isfile("glob.1")) or HDF!=None:
86      # Le module d'execution est accessible et glob.1 est present
87      # Pour eviter de rappeler plusieurs fois la sequence d'initialisation
88      # on memorise avec l'attribut fichier_init que l'initialisation
89      # est réalisée
90      if hasattr(self,'fichier_init'):return
91      self.fichier_init='glob.1'
92      self.jdc.initexec()
93      # le sous programme fortran appelé par self.codex.poursu demande le numero
94      # de l'operateur (GCECDU->getoper), on lui donne la valeur 0
95      self.definition.op=0
96      lot,ier,lonuti,concepts=self.codex.poursu(self,1)
97      # Par la suite pour ne pas executer la commande pendant la phase
98      # d'execution on le remet à None
99      self.definition.op=None
100      # On demande la numerotation de la commande POURSUITE avec l'incrément
101      # lonuti pour qu'elle soit numérotée à la suite des commandes existantes.
102      self.set_icmd(lonuti)
103      pos=0
104      d={}
105      while pos+80 < len(concepts)+1:
106        nomres=concepts[pos:pos+8]
107        concep=concepts[pos+8:pos+24]
108        nomcmd=concepts[pos+24:pos+40]
109        statut=concepts[pos+40:pos+48]
110        print nomres,concep,nomcmd,statut
111        if nomres[0] not in (' ','.','&') and statut != '&DETRUIT':
112           exec nomres+'='+string.lower(concep)+'()' in self.parent.g_context,d
113        pos=pos+80
114      for k,v in d.items():
115        self.parent.NommerSdprod(v,k)
116      self.g_context=d
117      return
118    else:
119      # Si le module d'execution n est pas accessible ou glob.1 absent on 
120      # demande un fichier (EFICAS)
121      # Il faut éviter de réinterpréter le fichier à chaque appel de
122      # POURSUITE
123      if hasattr(self,'fichier_init'):
124         return
125      self.make_poursuite()
126
127 def POURSUITE_context(self,d):
128    """
129        Fonction op_init de la macro POURSUITE
130    """
131    # self représente la macro POURSUITE ...
132    d.update(self.g_context)
133    # Une commande POURSUITE n'est possible qu'au niveau le plus haut
134    # On ajoute directement les concepts dans le contexte du jdc
135    # XXX est ce que les concepts ne sont pas ajoutés plusieurs fois ??
136    for v in self.g_context.values():
137       if isinstance(v,ASSD) : self.jdc.sds.append(v)
138
139 def build_poursuite(self,**args):
140    """
141    Fonction ops pour la macro POURSUITE
142    """
143    # Pour POURSUITE on ne modifie pas la valeur initialisee dans ops.POURSUITE
144    # Il n y a pas besoin d executer self.codex.poursu (c'est deja fait dans
145    # la fonction sdprod de la commande (ops.POURSUITE))
146    self.jdc.UserError=self.codex.error
147    return 0
148
149 def INCLUDE(self,UNITE,**args):
150    """ 
151        Fonction sd_prod pour la macro INCLUDE
152    """
153    if not UNITE : return
154    if hasattr(self,'unite'):return
155    self.unite=UNITE
156
157    if self.jdc and self.jdc.par_lot == 'NON':
158       # On est en mode commande par commande, on appelle la methode speciale
159       self.Execute_alone()
160
161    self.make_include(unite=UNITE)
162
163 def INCLUDE_context(self,d):
164    """ 
165        Fonction op_init pour macro INCLUDE
166    """
167    for k,v in self.g_context.items():
168       d[k]=v
169
170 def build_include(self,**args):
171    """
172    Fonction ops de la macro INCLUDE appelée lors de la phase de Build
173    """
174    # Pour presque toutes les commandes (sauf FORMULE et POURSUITE)
175    # le numero de la commande n est pas utile en phase de construction
176    # La macro INCLUDE ne sera pas numérotée (incrément=None)
177    ier=0
178    self.set_icmd(None)
179    icmd=0
180    # On n'execute pas l'ops d'include en phase BUILD car il ne sert a rien.
181    #ier=self.codex.opsexe(self,icmd,-1,1)
182    return ier
183
184 def detruire(self,d):
185    """
186        Cette fonction est la fonction op_init de la PROC DETRUIRE
187    """
188    if self["CONCEPT"]!=None:
189      sd=[]
190      for mc in self["CONCEPT"]:
191        mcs=mc["NOM"]
192        if type(mcs) == types.ListType or type(mcs) == types.TupleType:
193          for e in mcs:
194            if isinstance(e,ASSD):
195              sd.append(e)
196              e=e.nom
197            if d.has_key(e):del d[e]
198            if self.jdc.sds_dict.has_key(e):del self.jdc.sds_dict[e]
199        else:
200 #CCAR: ajout de ce test pour ne pas détruire une formule. Faut-il le reintegrer 
201 #      dans le catalogue d'Aster ? Est-il spécial EFICAS ?
202          if isinstance(mcs,formule):
203            cr=self.parent.report()
204            cr.fatal("la destruction d'une FORMULE est impossible" )
205 #CCAR: fin ajout
206          if isinstance(mcs,ASSD):
207            sd.append(mcs)
208            mcs=mcs.nom
209          if d.has_key(mcs):del d[mcs]
210          if self.jdc.sds_dict.has_key(mcs):del self.jdc.sds_dict[mcs]
211      for s in sd:
212        # On signale au parent que le concept s n'existe plus apres l'étape self
213        self.parent.delete_concept_after_etape(self,s)
214
215 def subst_materiau(text,NOM_MATER,EXTRACTION,UNITE_LONGUEUR):
216    """
217        Cette fonction retourne un texte obtenu à partir du texte passé en argument (text)
218        en substituant le nom du materiau par NOM_MATER 
219        et en réalisant les extractions spéciifées dans EXTRACTION
220    """
221    lines=string.split(text,'\n')
222
223 ##### traitement de UNIT : facteur multiplicatif puissance de 10
224    regmcsu=re.compile(r" *(.*) *= *([^ ,]*) *## +([^ ]*) *([^ ]*)")
225    ll_u=[]
226    for l in lines:
227        m=regmcsu.match(l)
228        if m:
229           if m.group(3) == "UNIT":
230              if   UNITE_LONGUEUR=='M'  : coef = '0'
231              elif UNITE_LONGUEUR=='MM' : coef = m.group(4)
232              print ' UNITE_LONGUEUR = BINGO'
233              print ' UNITE_LONGUEUR = ',m.group(4),type(m.group(4))
234              ll_u.append('   '+m.group(1)+" = "+m.group(2)+coef)
235           else : ll_u.append(l)
236        else : ll_u.append(l)
237
238 ##### traitement de EXTRACTION
239    if EXTRACTION:
240      regmcf=re.compile(r" *(.*) *= *_F\( *## +(.*) +(.*)")
241      regmcs=re.compile(r" *(.*) *= *([^ ,]*) *, *## +([^ ]*) *([^ ]*)")
242      regfin=re.compile(r" *\) *")
243      ll=[]
244      temps={};lmcf=[]
245      for e in EXTRACTION:
246        mcf=e['COMPOR']
247        lmcf.append(mcf)
248        temps[mcf]=e['TEMP_EVAL']
249      FLAG=0
250      for l in ll_u:
251        m=regmcf.match(l)
252        if m: # On a trouve un mot cle facteur "commentarise"
253          if m.group(2) == "SUBST": # il est de plus substituable
254            if temps.has_key(m.group(3)): # Il est a substituer
255              ll.append(" "+m.group(3)+"=_F(")
256              mcf=m.group(3)
257              TEMP=temps[mcf]
258              FLAG=1 # Indique que l'on est en cours de substitution
259            else: # Il n est pas a substituer car il n est pas dans la liste demandee
260              ll.append(l)
261          else: # Mot cle facteur commentarise non substituable
262            ll.append(l)
263        else:  # La ligne ne contient pas un mot cle facteur commentarise
264          if FLAG == 0: # On n est pas en cours de substitution
265            ll.append(l)
266          else: # On est en cours de substitution. On cherche les mots cles simples commentarises
267            m=regmcs.match(l)
268            if m: # On a trouve un mot cle simple commentarise
269              if m.group(3) == "EVAL":
270                ll.append("  "+m.group(1)+' = EVAL("'+m.group(4)+"("+str(TEMP)+')"),')
271              elif m.group(3) == "SUPPR":
272                pass
273              else:
274                ll.append(l)
275            else: # On cherche la fin du mot cle facteur en cours de substitution
276              m=regfin.match(l)
277              if m: # On l a trouve. On le supprime de la liste
278                FLAG=0
279                del temps[mcf]
280              ll.append(l)
281    else:
282      ll=ll_u
283
284    for l in ll:
285      print l
286    lines=ll
287    ll=[]
288    for l in lines:
289      l=re.sub(" *MAT *= *",NOM_MATER+" = ",l,1)
290      ll.append(l)
291    text=string.join(ll,'\n')
292    return text
293
294 def post_INCLUDE(self):
295   """
296       Cette fonction est executée apres toutes les commandes d'un INCLUDE (RETOUR)
297       Elle sert principalement pour les INCLUDE_MATERIAU : remise a blanc du prefixe Fortran
298   """
299   self.codex.opsexe(self,0,-1,2)
300
301 def INCLUDE_MATERIAU(self,NOM_AFNOR,TYPE_MODELE,VARIANTE,TYPE_VALE,NOM_MATER,
302                     EXTRACTION,UNITE_LONGUEUR,INFO,**args):
303   """ 
304       Fonction sd_prod pour la macro INCLUDE_MATERIAU
305   """
306   mat=string.join((NOM_AFNOR,'_',TYPE_MODELE,'_',VARIANTE,'.',TYPE_VALE),'')
307   if not hasattr(self,'mat') or self.mat != mat or self.nom_mater != NOM_MATER :
308     # On récupère le répertoire des matériaux dans les arguments 
309     # supplémentaires du JDC
310     rep_mat=self.jdc.args.get("rep_mat","NOrep_mat")
311     f=os.path.join(rep_mat,mat)
312     self.mat=mat
313     self.nom_mater=NOM_MATER
314     if not os.path.isfile(f):
315        del self.mat
316        self.make_contexte(f,"#Texte sans effet pour reinitialiser le contexte a vide\n")
317        raise "Erreur sur le fichier materiau: "+f
318     # Les materiaux sont uniquement disponibles en syntaxe Python
319     # On lit le fichier et on supprime les éventuels \r
320     text=string.replace(open(f).read(),'\r\n','\n')
321     # On effectue les substitutions necessaires
322     self.prefix=NOM_MATER
323     self.text= subst_materiau(text,NOM_MATER,EXTRACTION,UNITE_LONGUEUR)
324     if INFO == 2:
325       print "INCLUDE_MATERIAU: ", self.mat,' ',NOM_MATER,'\n'
326       print self.text
327     # on execute le texte fourni dans le contexte forme par
328     # le contexte de l etape pere (global au sens Python)
329     # et le contexte de l etape (local au sens Python)
330     # Il faut auparavant l'enregistrer aupres du module linecache (utile pour nommage.py)
331     linecache.cache[f]=0,0,string.split(self.text,'\n'),f
332
333     self.postexec=post_INCLUDE
334
335     if self.jdc.par_lot == 'NON':
336       # On est en mode commande par commande, on appelle la methode speciale
337       self.Execute_alone()
338
339     self.make_contexte(f,self.text)
340
341 def build_formule(self,**args):
342   """
343   Fonction ops de la macro FORMULE appelée lors de la phase de Build
344   """
345   from Build import B_utils
346   for mc in self.mc_liste:
347 ###    if mc.nom in ('REEL','ENTIER','COMPLEXE'):
348     if mc.nom in ('REEL','COMPLEXE'):
349       texte= self.sd.get_name()+ string.strip(mc.valeur)
350       mc.valeur=B_utils.ReorganisationDe(texte,80)
351   # ATTENTION : FORMULE est une des rares commandes qui a besoin de
352   # connaitre son numero d execution avant d etre construite
353   self.set_icmd(1)
354   # La macro formule doit etre executee. Seules les macros qui ont
355   # un numero d'op sont executees lors des phases suivantes
356   self.definition.op = -5
357   ier=self.codex.opsexe(self,self.icmd,-1,-self.definition.op)
358   return ier
359
360 def build_procedure(self,**args):
361     """
362     Fonction ops de la macro PROCEDURE appelée lors de la phase de Build
363     """
364     ier=0
365     # Pour presque toutes les commandes (sauf FORMULE et POURSUITE)
366     # le numero de la commande n est pas utile en phase de construction
367     # On ne numérote pas une macro PROCEDURE (incrément=None)
368     self.set_icmd(None)
369     icmd=0
370     #ier=self.codex.opsexe(self,icmd,-1,3)
371     return ier
372
373 def build_retour(self,**args):
374     """
375     Fonction ops de la macro RETOUR appelée lors de la phase de Build
376     """
377     ier=0
378     # Pour presque toutes les commandes (sauf FORMULE et POURSUITE)
379     # le numero de la commande n est pas utile en phase de construction
380     # On ne numérote pas une macro RETOUR (incrément=None)
381     self.set_icmd(None)
382     icmd=0
383     #ier=self.codex.opsexe(self,icmd,-1,2)
384     return ier
385