1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2021 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 Ce module contient la classe PARAMETRE_EVAL qui sert a definir
22 des objets parametres qui sont comprehensibles et donc affichables
24 Ces objets sont crees a partir de la modification du fichier de commandes
25 de l'utilisateur par le parseur de fichiers Python
27 # import de modules Python
28 from __future__ import absolute_import
29 from __future__ import print_function
33 # import modules Eficas
34 from . import interpreteur_formule
35 from Noyau.N_CR import CR
36 from Extensions.i18n import tr
37 from . import parametre
39 pattern_eval = re.compile(r'^(EVAL)([ \t\r\f\v]*)\(([\w\W]*)')
41 class PARAMETRE_EVAL(parametre.PARAMETRE) :
43 Cette classe permet de creer des objets de type PARAMETRE_EVAL
44 cad des affectations directes evaluees dans le jeu de commandes (ex: a=EVAL('''10.*SQRT(25)'''))
45 qui sont interpretees par le parseur de fichiers Python.
46 Les objets ainsi crees constituent des parametres evalues pour le jdc
48 nature = 'PARAMETRE_EVAL'
51 def __init__(self,nom,valeur=None):
52 # parent ne peut etre qu'un objet de type JDC
54 self.Accas_EVAL=Accas.EVAL
55 self.valeur = self.interpreteValeur(valeur)
58 self.jdc = self.parent = CONTEXT.getCurrentStep()
60 self.niveau = self.parent.niveau
62 self.state='undetermined'
63 # Ceci est-il indispensable ???
64 #self.appel = N_utils.calleeWhere(niveau=2)
69 Donne un echo de self sous la forme nom = valeur
71 return self.nom+' = '+ repr(self.valeur)
75 Retourne le nom du parametre evalue comme representation de self
79 def interpreteValeur(self,val):
81 Essaie d'interpreter val (chaine de caracteres ou None) comme :
82 une instance de Accas.EVAL
83 Retourne la valeur interpretee
85 if not val : return None
88 if val[-1] == ';' : val = val[0:-1]
89 d['EVAL'] = self.Accas_EVAL
91 valeur = eval(val,{},d)
95 print(("Le texte %s n'est pas celui d'un parametre evalue" %val))
98 def setValeur(self,new_valeur):
100 Remplace la valeur de self par new_valeur interpretee.
102 self.valeur = self.interpreteValeur(new_valeur)
103 self.val = new_valeur
108 Retourne le nom du parametre
114 Retourne la valeur de self, cad le texte de l'objet class_eval.EVAL
117 return self.valeur.valeur
121 def verifEval(self,exp_eval=None,cr='non'):
123 Cette methode a pour but de verifier si l'expression EVAL
124 est syntaxiquement correcte.
126 - un booleen, qui vaut 1 si licite, 0 sinon
127 - un message d'erreurs ('' si illicite)
131 exp_eval = self.valeur.valeur[3:-3] # on enleve les triples guillemets
135 # on construit un interpreteur de formule
136 formule=(self.nom,'',None,exp_eval)
137 # on recupere la liste des constantes et des autres fonctions predefinies
138 # et qui peuvent etre utilisees dans le corps de la formule courante
139 l_ctes,l_form = self.jdc.getParametresFonctionsAvantEtape(self)
140 # on cree un objet verificateur
141 verificateur = interpreteur_formule.Interpreteur_Formule(formule=formule,
145 if not verificateur.cr.estvide():
146 self.cr.fatal(verificateur.cr.getMessFatal())
147 return verificateur.isValid(),''.join(verificateur.cr.crfatal)
149 # pas d'expression EVAL --> self non valide
151 self.cr.fatal(tr("Le parametre EVAL %s ne peut valoir None") , self.nom)
152 return 0,tr("Le parametre EVAL ne peut valoir None")
154 def verifNom(self,nom=None,cr='non'):
156 Verifie si le nom passe en argument (si aucun prend le nom courant)
157 est un nom valide pour un parametre EVAL
159 - un booleen, qui vaut 1 si nom licite, 0 sinon
160 - un message d'erreurs ('' si illicite)
165 if cr == 'oui' : self.cr.fatal(tr("Pas de nom donne au parametre EVAL"))
166 return 0,"Pas de nom donne au parametre EVAL"
168 if cr == 'oui' : self.cr.fatal(tr("Un nom de parametre ne peut depasser 8 caracteres"))
169 return 0,"Un nom de parametre ne peut depasser 8 caracteres"
170 sd = self.parent.getSdAutourEtape(nom,self)
172 if cr == 'oui' : self.cr.fatal(tr("Un concept de nom %s existe deja !"), nom)
173 return 0,"Un concept de nom %s existe deja !" %nom
176 def verifParametreEval(self,param=None,cr='non'):
178 Verifie la validite du parametre EVAL passe en argument.
179 Ce nouveau parametre est passe sous la forme d'un tuple : (nom,valeur)
180 Si aucun tuple passe, prend les valeurs courantes de l'objet
182 - un booleen, qui vaut 1 si EVAL licite, 0 sinon
183 - un message d'erreurs ('' si illicite)
187 param = (self.nom,self.valeur.valeur)
189 param = (self.nom,None)
190 test_nom,erreur_nom = self.verifNom(param[0],cr=cr)
191 test_eval,erreur_eval = self.verifEval(param[1],cr=cr)
192 # test global = produit des tests partiels
193 test = test_nom*test_eval
194 # message d'erreurs global = concatenation des messages partiels
197 for mess in (erreur_nom,erreur_eval):
198 erreur = erreur+(len(mess) > 0)*'\n'+mess
201 def update(self,param):
204 Met a jour les champs nom, valeur de self
205 par les nouvelles valeurs passees dans le tuple formule.
206 On stocke les valeurs SANS verifications.
209 self.setNom(param[0])
210 self.setValeur('EVAL("""'+param[1]+'""")')
212 def isValid(self,cr='non'):
214 Retourne 1 si self est valide, 0 sinon
215 Un parametre evalue est considere comme valide si :
217 - il a une valeur qui est interpretable par l'interpreteur de FORMULEs
219 resu,erreur= self.verifParametreEval(cr=cr)
224 Genere l'objet rapport (classe CR)
227 self.isValid(cr='oui')
230 def setNom(self,new_nom):
232 Remplace le nom de self par new_nom