2 Ce module contient la classe PARAMETRE_EVAL qui sert à définir
3 des objets paramètres qui sont compréhensibles et donc affichables
5 Ces objets sont créés à partir de la modification du fichier de commandes
6 de l'utilisateur par le parseur de fichiers Python
8 # import de modules Python
12 # import modules Eficas
14 import interpreteur_formule
15 from Noyau.N_CR import CR
18 pattern_eval = re.compile(r'^(EVAL)([ \t\r\f\v]*)\(([\w\W]*)')
20 class PARAMETRE_EVAL(parametre.PARAMETRE) :
22 Cette classe permet de créer des objets de type PARAMETRE_EVAL
23 cad des affectations directes évaluées dans le jeu de commandes
24 (ex: a=EVAL('''10.*SQRT(25)'''))
25 qui sont interprétées par le parseur de fichiers Python.
26 Les objets ainsi créés constituent des paramètres évalués pour le jdc
28 nature = 'PARAMETRE_EVAL'
31 def __init__(self,nom,valeur=None):
32 # parent ne peut être qu'un objet de type JDC
33 self.valeur = self.interprete_valeur(valeur)
36 self.jdc = self.parent = CONTEXT.get_current_step()
38 self.niveau = self.parent.niveau
39 # Ceci est-il indispensable ???
40 #self.appel = N_utils.callee_where(niveau=2)
45 Donne un echo de self sous la forme nom = valeur
47 return self.nom+' = '+ repr(self.valeur) + '\n'
51 Retourne le nom du paramètre évalué comme représentation de self
55 def interprete_valeur(self,val):
57 Essaie d'interpréter val (chaîne de caractères ou None) comme :
58 une instance de Accas.EVAL
59 Retourne la valeur interprétée
61 if not val : return None
63 d['EVAL'] = Accas.EVAL
65 valeur = eval(val,{},d)
69 print "Le texte %s n'est pas celui d'un paramètre évalué" %val
72 def set_valeur(self,new_valeur):
74 Remplace la valeur de self par new_valeur interprétée.
76 self.valeur = self.interprete_valeur(new_valeur)
82 Retourne le nom du paramètre
88 Retourne la valeur de self, cad le texte de l'objet class_eval.EVAL
91 return self.valeur.valeur
95 def verif_eval(self,exp_eval=None,cr='non'):
97 Cette méthode a pour but de vérifier si l'expression EVAL
98 est syntaxiquement correcte.
100 - un booléen, qui vaut 1 si licite, 0 sinon
101 - un message d'erreurs ('' si illicite)
105 exp_eval = self.valeur.valeur[3:-3] # on enlève les triples guillemets
109 # on construit un interpréteur de formule
110 formule=(self.nom,'',None,exp_eval)
111 # on récupère la liste des constantes et des autres fonctions prédéfinies
112 # et qui peuvent être utilisées dans le corps de la formule courante
113 l_ctes,l_form = self.jdc.get_parametres_fonctions_avant_etape(self)
114 # on crée un objet vérificateur
115 verificateur = interpreteur_formule.Interpreteur_Formule(formule=formule,
119 if not verificateur.cr.estvide():
120 self.cr.fatal(verificateur.cr.get_mess_fatal())
121 return verificateur.isvalid(),string.join(verificateur.cr.crfatal)
123 # pas d'expression EVAL --> self non valide
125 self.cr.fatal("Le paramètre EVAL %s ne peut valoir None" % self.nom)
126 return 0,"Le paramètre EVAL ne peut valoir None"
128 def verif_nom(self,nom=None,cr='non'):
130 Vérifie si le nom passé en argument (si aucun prend le nom courant)
131 est un nom valide pour un paramètre EVAL
133 - un booléen, qui vaut 1 si nom licite, 0 sinon
134 - un message d'erreurs ('' si illicite)
139 if cr == 'oui' : self.cr.fatal("Pas de nom donné au paramètre EVAL")
140 return 0,"Pas de nom donné au paramètre EVAL"
142 if cr == 'oui' : self.cr.fatal("Un nom de paramètre ne peut dépasser 8 caractères")
143 return 0,"Un nom de paramètre ne peut dépasser 8 caractères"
144 sd = self.parent.get_sd_autour_etape(nom,self)
146 if cr == 'oui' : self.cr.fatal("Un concept de nom %s existe déjà !" %nom)
147 return 0,"Un concept de nom %s existe déjà !" %nom
150 def verif_parametre_eval(self,param=None,cr='non'):
152 Vérifie la validité du paramètre EVAL passé en argument.
153 Ce nouveau paramètre est passé sous la forme d'un tuple :
155 Si aucun tuple passé, prend les valeurs courantes de l'objet
157 - un booléen, qui vaut 1 si EVAL licite, 0 sinon
158 - un message d'erreurs ('' si illicite)
162 param = (self.nom,self.valeur.valeur)
164 param = (self.nom,None)
165 test_nom,erreur_nom = self.verif_nom(param[0],cr=cr)
166 test_eval,erreur_eval = self.verif_eval(param[1],cr=cr)
167 # test global = produit des tests partiels
168 test = test_nom*test_eval
169 # message d'erreurs global = concaténation des messages partiels
172 for mess in (erreur_nom,erreur_eval):
173 erreur = erreur+(len(mess) > 0)*'\n'+mess
176 def update(self,param):
179 Met à jour les champs nom, valeur de self
180 par les nouvelles valeurs passées dans le tuple formule.
181 On stocke les valeurs SANS vérifications.
184 self.set_nom(param[0])
185 self.set_valeur('EVAL("""'+param[1]+'""")')
187 def isvalid(self,cr='non'):
189 Retourne 1 si self est valide, 0 sinon
190 Un paramètre évalué est considéré comme valide si :
192 - il a une valeur qui est interprétable par l'interpréteur de FORMULEs
194 resu,erreur= self.verif_parametre_eval(cr=cr)
199 Génère l'objet rapport (classe CR)
202 self.isvalid(cr='oui')
205 def set_nom(self,new_nom):
207 Remplace le nom de self par new_nom