]> SALOME platform Git repositories - tools/eficas.git/blob - Noyau/N_FONCTION.py
Salome HOME
*** empty log message ***
[tools/eficas.git] / Noyau / N_FONCTION.py
1 #@ MODIF N_FONCTION Noyau  DATE 10/11/2009   AUTEUR COURTOIS M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 # RESPONSABLE COURTOIS M.COURTOIS
4 #            CONFIGURATION MANAGEMENT OF EDF VERSION
5 # ======================================================================
6 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
7 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
8 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
9 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR   
10 # (AT YOUR OPTION) ANY LATER VERSION.                                 
11 #
12 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT 
13 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF          
14 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU    
15 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                            
16 #
17 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE   
18 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,       
19 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
20 #                                                                       
21 #                                                                       
22 # ======================================================================
23
24 # attention ! cet import permet d'avoir, dans les formules, le comportement
25 # de la division réelle pour les entiers, et non la division entière
26 # 1/2=0.5 (et non 0)
27 from __future__ import division
28
29 from N_ASSD import ASSD
30 from asojb import AsBase
31
32 class FONCTION(ASSD):pass
33
34 class formule(ASSD,AsBase):
35    def __init__(self,**args):
36       ASSD.__init__(self,**args)
37       self.nompar    =None
38       self.expression=None
39
40    def __call__(self,*val):
41       context = {}
42       # cas de INCLUDE (ou POURSUITE dans Eficas)
43       context.update(getattr(self.parent, 'contexte_fichier_init', {}))
44       # récupération des constantes locales en cas de MACRO
45       context.update(getattr(self.parent, 'macro_const_context', {}))
46       i=0
47       for param in self.nompar : 
48          context[param]=val[i]
49          i=i+1
50       try :
51        res=eval(self.expression,self.jdc.const_context, context)
52       except :
53        print 75*'!'
54        print '! ' + '%-72s' % ('Erreur evaluation formule '+self.nom) + '!'
55        print 75*'!'
56        raise
57       return res
58
59    def setFormule(self,nom_para,texte):
60       """
61          Cette methode sert a initialiser les attributs
62          nompar, expression et code qui sont utilisés
63          dans l'évaluation de la formule
64       """
65       self.nompar     = nom_para
66       self.expression = texte
67       try :
68         self.code=compile(texte,texte,'eval')
69       except SyntaxError :
70         print 75*'!'
71         print '! ' + '%-72s' % ('Erreur evaluation formule '+self.nom) + '!'
72         print 75*'!'
73         raise
74
75    def __setstate__(self,state):
76       """
77          Cette methode sert a restaurer l'attribut code
78          lors d'un unpickle
79       """
80       self.__dict__.update(state)                  # update attributes
81       self.setFormule(self.nompar,self.expression) # restore code attribute
82       
83    def __getstate__(self):
84       """
85          Pour les formules, il faut enlever l'attribut code
86          qui n'est pas picklable
87       """
88       d=ASSD.__getstate__(self)
89       del d['code']
90       return d
91
92    def Parametres(self):
93       """Equivalent de fonction.Parametres pour pouvoir utiliser des formules
94       à la place de fonctions dans certaines macro-commandes.
95       """
96       from SD.sd_fonction  import sd_formule
97       from Utilitai.Utmess import UTMESS
98       if self.accessible():
99         TypeProl={'E':'EXCLU', 'L':'LINEAIRE', 'C':'CONSTANT', 'I':'INTERPRE' }
100         sd = sd_formule(self.get_name())
101         prol = sd.PROL.get()
102         nova = sd.NOVA.get()
103         if prol is None or nova is None:
104            UTMESS('F', 'SDVERI_2', valk=[objev])
105         dico={
106          'INTERPOL'    : ['LIN','LIN'],
107          'NOM_PARA'    : [s.strip() for s in nova],
108          'NOM_RESU'    : prol[3][0:16].strip(),
109          'PROL_DROITE' : TypeProl['E'],
110          'PROL_GAUCHE' : TypeProl['E'],
111         }
112       else:
113          raise Accas.AsException("Erreur dans fonction.Parametres en PAR_LOT='OUI'")
114       return dico
115
116
117 class formule_c(formule):
118    pass
119
120
121