1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013 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 import string,types,re
31 # import modules Eficas
32 import interpreteur_formule
33 from Noyau.N_CR import CR
34 from Extensions.i18n import tr
37 pattern_eval = re.compile(r'^(EVAL)([ \t\r\f\v]*)\(([\w\W]*)')
39 class PARAMETRE_EVAL(parametre.PARAMETRE) :
41 Cette classe permet de creer des objets de type PARAMETRE_EVAL
42 cad des affectations directes evaluees dans le jeu de commandes (ex: a=EVAL('''10.*SQRT(25)'''))
43 qui sont interpretees par le parseur de fichiers Python.
44 Les objets ainsi crees constituent des parametres evalues pour le jdc
46 nature = 'PARAMETRE_EVAL'
49 def __init__(self,nom,valeur=None):
50 # parent ne peut etre qu'un objet de type JDC
52 self.Accas_EVAL=Accas.EVAL
53 self.valeur = self.interprete_valeur(valeur)
56 self.jdc = self.parent = CONTEXT.get_current_step()
58 self.niveau = self.parent.niveau
60 self.state='undetermined'
61 # Ceci est-il indispensable ???
62 #self.appel = N_utils.callee_where(niveau=2)
67 Donne un echo de self sous la forme nom = valeur
69 return self.nom+' = '+ repr(self.valeur)
73 Retourne le nom du parametre evalue comme representation de self
77 def interprete_valeur(self,val):
79 Essaie d'interpreter val (chaîne de caracteres ou None) comme :
80 une instance de Accas.EVAL
81 Retourne la valeur interpretee
83 if not val : return None
85 val = string.strip(val)
86 if val[-1] == ';' : val = val[0:-1]
87 d['EVAL'] = self.Accas_EVAL
89 valeur = eval(val,{},d)
93 print ("Le texte %s n'est pas celui d'un parametre evalue" %val)
96 def set_valeur(self,new_valeur):
98 Remplace la valeur de self par new_valeur interpretee.
100 self.valeur = self.interprete_valeur(new_valeur)
101 self.val = new_valeur
106 Retourne le nom du parametre
110 def get_valeur(self):
112 Retourne la valeur de self, cad le texte de l'objet class_eval.EVAL
115 return self.valeur.valeur
119 def verif_eval(self,exp_eval=None,cr='non'):
121 Cette methode a pour but de verifier si l'expression EVAL
122 est syntaxiquement correcte.
124 - un booleen, qui vaut 1 si licite, 0 sinon
125 - un message d'erreurs ('' si illicite)
129 exp_eval = self.valeur.valeur[3:-3] # on enleve les triples guillemets
133 # on construit un interpreteur de formule
134 formule=(self.nom,'',None,exp_eval)
135 # on recupere la liste des constantes et des autres fonctions predefinies
136 # et qui peuvent etre utilisees dans le corps de la formule courante
137 l_ctes,l_form = self.jdc.get_parametres_fonctions_avant_etape(self)
138 # on cree un objet verificateur
139 verificateur = interpreteur_formule.Interpreteur_Formule(formule=formule,
143 if not verificateur.cr.estvide():
144 self.cr.fatal(verificateur.cr.get_mess_fatal())
145 return verificateur.isvalid(),string.join(verificateur.cr.crfatal)
147 # pas d'expression EVAL --> self non valide
149 self.cr.fatal(tr("Le parametre EVAL %s ne peut valoir None") , self.nom)
150 return 0,tr("Le parametre EVAL ne peut valoir None")
152 def verif_nom(self,nom=None,cr='non'):
154 Verifie si le nom passe en argument (si aucun prend le nom courant)
155 est un nom valide pour un parametre EVAL
157 - un booleen, qui vaut 1 si nom licite, 0 sinon
158 - un message d'erreurs ('' si illicite)
163 if cr == 'oui' : self.cr.fatal(tr("Pas de nom donne au parametre EVAL"))
164 return 0,"Pas de nom donne au parametre EVAL"
166 if cr == 'oui' : self.cr.fatal(tr("Un nom de parametre ne peut depasser 8 caracteres"))
167 return 0,"Un nom de parametre ne peut depasser 8 caracteres"
168 sd = self.parent.get_sd_autour_etape(nom,self)
170 if cr == 'oui' : self.cr.fatal(tr("Un concept de nom %s existe deja !"), nom)
171 return 0,"Un concept de nom %s existe deja !" %nom
174 def verif_parametre_eval(self,param=None,cr='non'):
176 Verifie la validite du parametre EVAL passe en argument.
177 Ce nouveau parametre est passe sous la forme d'un tuple : (nom,valeur)
178 Si aucun tuple passe, prend les valeurs courantes de l'objet
180 - un booleen, qui vaut 1 si EVAL licite, 0 sinon
181 - un message d'erreurs ('' si illicite)
185 param = (self.nom,self.valeur.valeur)
187 param = (self.nom,None)
188 test_nom,erreur_nom = self.verif_nom(param[0],cr=cr)
189 test_eval,erreur_eval = self.verif_eval(param[1],cr=cr)
190 # test global = produit des tests partiels
191 test = test_nom*test_eval
192 # message d'erreurs global = concatenation des messages partiels
195 for mess in (erreur_nom,erreur_eval):
196 erreur = erreur+(len(mess) > 0)*'\n'+mess
199 def update(self,param):
202 Met a jour les champs nom, valeur de self
203 par les nouvelles valeurs passees dans le tuple formule.
204 On stocke les valeurs SANS verifications.
207 self.set_nom(param[0])
208 self.set_valeur('EVAL("""'+param[1]+'""")')
210 def isvalid(self,cr='non'):
212 Retourne 1 si self est valide, 0 sinon
213 Un parametre evalue est considere comme valide si :
215 - il a une valeur qui est interpretable par l'interpreteur de FORMULEs
217 resu,erreur= self.verif_parametre_eval(cr=cr)
222 Genere l'objet rapport (classe CR)
225 self.isvalid(cr='oui')
228 def set_nom(self,new_nom):
230 Remplace le nom de self par new_nom