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 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
28 # import de modules Python
29 from __future__ import absolute_import
30 from __future__ import print_function
32 from builtins import str
33 from builtins import object
40 # import de modules Eficas
41 from Noyau.N_CR import CR
42 from Noyau.N_UserASSD import UserASSD
43 from Noyau.N_UserASSDMultiple import UserASSDMultiple
44 from Noyau import N_OBJECT
45 from Ihm import I_OBJECT
47 from Ihm import CONNECTOR
48 from Extensions.i18n import tr
51 class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
53 Cette classe permet de creer des objets de type PARAMETRE
54 cad des affectations directes dans le jeu de commandes (ex: a=10.)
55 qui sont interpretees par le parseur de fichiers Python.
56 Les objets ainsi crees constituent des parametres pour le jdc
62 def __new__(cls,nom,valeur=None):
63 # on est en relecture du .comm: l objet a ete detecte comme parametre par le parsing
64 # mais il s agit d une reference, une UserASDD
65 if (issubclass(valeur.__class__, UserASSDMultiple)):
66 valeur.initialiseNom(nom)
68 if (issubclass(valeur.__class__, UserASSD)):
69 valeur.initialiseNom(nom)
72 return super(PARAMETRE, cls).__new__(cls,*args,**kwargs)
74 return super(PARAMETRE, cls).__new__(cls)
77 def __init__(self,nom,valeur=None):
78 #print ('__init__ de parametre pour', nom,valeur)
80 # La classe PARAMETRE n'a pas de definition : on utilise self pour
83 # parent ne peut etre qu'un objet de type JDC
84 self.jdc = self.parent = CONTEXT.getCurrentStep()
85 self.niveau=self.parent.niveau
87 self.state='undetermined'
90 #self.valeur = self.interpreteValeur(valeur)
96 def interpreteValeur(self,val):
98 Essaie d'interpreter val (chaine de caracteres)comme :
101 - une chaine de caracteres
102 - une liste d'items d'un type qui precede
103 Retourne la valeur interpretee
105 #if not val : return None
108 if type(val) == list:
109 # Un premier traitement a ete fait lors de la saisie
110 # permet de tester les parametres qui sont des listes
120 if type(val) == bytes or type(val) == str:
121 # on tente l'evaluation dans un contexte fourni par le parent s'il existe
123 valeur=self.parent.evalInContext(val,self)
128 #traceback.print_exc()
130 #PN je n ose pas modifier je rajoute
131 # refus des listes heterogenes : ne dvrait pas etre la
133 if type(valeur) == tuple:
141 # la liste est heterogene --> on refuse d'interpreter
142 # self comme une liste
143 # on retourne la string initiale
144 print(('liste heterogene ',val))
147 return tuple(l_new_val)
150 if type(valeur).__name__ == 'list':
152 for i in range(len(valeur)):
153 self.dict_valeur.append(valeur[i])
155 # on retourne val comme une string car on n'a pas su l'interpreter
158 def getValeurs(self):
160 if self.dict_valeur != []:
161 for val in self.dict_valeur:
162 valeurretour.append(val)
164 valeurretour.append(self.valeur)
167 def setValeur(self,new_valeur):
169 Remplace la valeur de self par new_valeur interpretee
171 self.valeur = self.interpreteValeur(new_valeur)
172 self.val=repr(self.valeur)
173 self.parent.updateConceptAfterEtape(self,self)
176 def setNom(self,new_nom):
178 Change le nom du parametre
186 Methode qui declare l'objet courant comme modifie et propage
187 cet etat modifie a ses ascendants
189 self.state = 'modified'
191 self.parent.initModif()
193 def getJdcRoot(self):
195 return self.parent.getJdcRoot()
201 Enregistre le parametre dans la liste des etapes de son parent (JDC)
203 self.parent.registerParametre(self)
204 self.parent.register(self)
206 def isValid(self,cr='non'):
208 Retourne 1 si self est valide, 0 sinon
209 Un parametre est considere comme valide si :
215 self.cr.fatal(tr("Pas de nom donne au parametre "))
218 if self.valeur == None :
220 self.cr.fatal(tr("Le parametre %s ne peut valoir None" , self.nom))
226 Indique si self est obligatoire ou non : retourne toujours 0
230 def isRepetable(self):
232 Indique si self est repetable ou non : retourne toujours 1
236 def listeMcPresents(self):
241 Methode qui supprime toutes les boucles de references afin que
242 l'objet puisse etre correctement detruit par le garbage collector
251 Rend l'etape courante active.
252 Il faut ajouter le parametre au contexte global du JDC
256 self.jdc.appendParam(self)
259 CONNECTOR.Emit(self,"add",None)
260 CONNECTOR.Emit(self,"valid")
264 Rend l'etape courante inactive
265 Il faut supprimer le parametre du contexte global du JDC
268 self.jdc.delParam(self)
269 self.jdc.deleteConceptAfterEtape(self,self)
270 CONNECTOR.Emit(self,"supp",None)
271 CONNECTOR.Emit(self,"valid")
275 Booleenne qui retourne 1 si self est actif, 0 sinon
279 def setAttribut(self,nom_attr,new_valeur):
281 Remplace la valeur de self.nom_attr par new_valeur)
283 if hasattr(self,nom_attr):
284 setattr(self,nom_attr,new_valeur)
287 def supprimeSdProds(self):
289 Il faut supprimer le parametre qui a ete entre dans la liste des
292 self.jdc.deleteParam(self)
293 self.parent.deleteConcept(self)
295 def updateContext(self,d):
297 Update le dictionnaire d avec le parametre que produit self
303 Donne un echo de self sous la forme nom = valeur
305 if type(self.valeur) == bytes or type(self.valeur) == str :
306 if self.valeur.find('\n') == -1:
307 # pas de retour chariot, on utilise repr
308 return self.nom+' = '+ repr(self.valeur)
309 elif self.valeur.find('"""') == -1:
310 # retour chariot mais pas de triple ", on formatte
311 return self.nom+' = """'+self.valeur+'"""'
313 return self.nom+' = '+ repr(self.valeur)
315 if type(self.valeur) == list :
316 aRetourner=self.nom+' = ['
317 for l in self.valeur :
318 aRetourner=aRetourner+str(l) +","
319 aRetourner=aRetourner[0:-1]+']'
321 return self.nom+' = '+ str(self.valeur)
325 Retourne le nom du parametre comme representation de self
329 def getSdprods(self,nom_sd):
331 Retourne les concepts produits par la commande
336 """ Genere l'objet rapport (classe CR) """
338 self.isValid(cr='oui')
343 Retourne le nom interne associe a self
344 Ce nom n'est jamais vu par l'utilisateur dans EFICAS
348 def deleteConcept(self,sd):
351 def replaceConcept(self,old_sd,sd):
354 def verifConditionBloc(self):
356 Evalue les conditions de tous les blocs fils possibles
357 (en fonction du catalogue donc de la definition) de self et
358 retourne deux listes :
359 - la premiere contient les noms des blocs a rajouter
360 - la seconde contient les noms des blocs a supprimer
364 def verifConditionRegles(self,liste_presents):
366 Retourne la liste des mots-cles a rajouter pour satisfaire les regles
367 en fonction de la liste des mots-cles presents
371 def verifExistenceSd(self):
374 def controlSdprods(self,d):
381 def resetContext(self):
385 if isinstance(self.valeur,Formula):
386 return self.valeur.eval()
390 def __adapt__(self,validator):
391 return validator.adapt(self.eval())
393 class COMBI_PARAMETRE(object) :
394 def __init__(self,chainevaleur,valeur):
395 self.chainevaleur=chainevaleur
399 return self.chainevaleur
402 if self.valeur and self.chainevaleur:
405 class ITEM_PARAMETRE(object) :
406 def __init__(self,param_pere,item=None):
407 self.param_pere = param_pere
412 return self.param_pere.nom+'['+str(self.item)+']'
420 longueur= len(self.param_pere.dict_valeur) - 1
423 if self.item > longueur :