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 import N_OBJECT
44 from Ihm import I_OBJECT
46 from Ihm import CONNECTOR
47 from Extensions.i18n import tr
50 class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
52 Cette classe permet de creer des objets de type PARAMETRE
53 cad des affectations directes dans le jeu de commandes (ex: a=10.)
54 qui sont interpretees par le parseur de fichiers Python.
55 Les objets ainsi crees constituent des parametres pour le jdc
61 def __new__(cls,nom,valeur=None):
62 # on est en relecture du .comm: l objet a ete detecte comme parametre par le parsing
63 # mais il s agit d une reference, une UserASDD
64 if (issubclass(valeur.__class__, UserASSD)):
65 valeur.initialiseNom(nom)
68 return super(PARAMETRE, cls).__new__(cls,*args,**kwargs)
70 return super(PARAMETRE, cls).__new__(cls)
73 def __init__(self,nom,valeur=None):
74 #print ('__init__ de parametre pour', nom,valeur)
76 # La classe PARAMETRE n'a pas de definition : on utilise self pour
79 # parent ne peut etre qu'un objet de type JDC
80 self.jdc = self.parent = CONTEXT.getCurrentStep()
81 self.niveau=self.parent.niveau
83 self.state='undetermined'
86 #self.valeur = self.interpreteValeur(valeur)
92 def interpreteValeur(self,val):
94 Essaie d'interpreter val (chaine de caracteres)comme :
97 - une chaine de caracteres
98 - une liste d'items d'un type qui precede
99 Retourne la valeur interpretee
101 #if not val : return None
104 if type(val) == list:
105 # Un premier traitement a ete fait lors de la saisie
106 # permet de tester les parametres qui sont des listes
116 if type(val) == bytes or type(val) == str:
117 # on tente l'evaluation dans un contexte fourni par le parent s'il existe
119 valeur=self.parent.evalInContext(val,self)
124 #traceback.print_exc()
126 #PN je n ose pas modifier je rajoute
127 # refus des listes heterogenes : ne dvrait pas etre la
129 if type(valeur) == tuple:
137 # la liste est heterogene --> on refuse d'interpreter
138 # self comme une liste
139 # on retourne la string initiale
140 print(('liste heterogene ',val))
143 return tuple(l_new_val)
146 if type(valeur).__name__ == 'list':
148 for i in range(len(valeur)):
149 self.dict_valeur.append(valeur[i])
151 # on retourne val comme une string car on n'a pas su l'interpreter
154 def getValeurs(self):
156 if self.dict_valeur != []:
157 for val in self.dict_valeur:
158 valeurretour.append(val)
160 valeurretour.append(self.valeur)
163 def setValeur(self,new_valeur):
165 Remplace la valeur de self par new_valeur interpretee
167 self.valeur = self.interpreteValeur(new_valeur)
168 self.val=repr(self.valeur)
169 self.parent.updateConceptAfterEtape(self,self)
172 def setNom(self,new_nom):
174 Change le nom du parametre
182 Methode qui declare l'objet courant comme modifie et propage
183 cet etat modifie a ses ascendants
185 self.state = 'modified'
187 self.parent.initModif()
189 def getJdcRoot(self):
191 return self.parent.getJdcRoot()
197 Enregistre le parametre dans la liste des etapes de son parent (JDC)
199 self.parent.registerParametre(self)
200 self.parent.register(self)
202 def isValid(self,cr='non'):
204 Retourne 1 si self est valide, 0 sinon
205 Un parametre est considere comme valide si :
211 self.cr.fatal(tr("Pas de nom donne au parametre "))
214 if self.valeur == None :
216 self.cr.fatal(tr("Le parametre %s ne peut valoir None" , self.nom))
222 Indique si self est obligatoire ou non : retourne toujours 0
226 def isRepetable(self):
228 Indique si self est repetable ou non : retourne toujours 1
232 def listeMcPresents(self):
237 Methode qui supprime toutes les boucles de references afin que
238 l'objet puisse etre correctement detruit par le garbage collector
247 Rend l'etape courante active.
248 Il faut ajouter le parametre au contexte global du JDC
252 self.jdc.appendParam(self)
255 CONNECTOR.Emit(self,"add",None)
256 CONNECTOR.Emit(self,"valid")
260 Rend l'etape courante inactive
261 Il faut supprimer le parametre du contexte global du JDC
264 self.jdc.delParam(self)
265 self.jdc.deleteConceptAfterEtape(self,self)
266 CONNECTOR.Emit(self,"supp",None)
267 CONNECTOR.Emit(self,"valid")
271 Booleenne qui retourne 1 si self est actif, 0 sinon
275 def setAttribut(self,nom_attr,new_valeur):
277 Remplace la valeur de self.nom_attr par new_valeur)
279 if hasattr(self,nom_attr):
280 setattr(self,nom_attr,new_valeur)
283 def supprimeSdProds(self):
285 Il faut supprimer le parametre qui a ete entre dans la liste des
288 self.jdc.deleteParam(self)
289 self.parent.deleteConcept(self)
291 def updateContext(self,d):
293 Update le dictionnaire d avec le parametre que produit self
299 Donne un echo de self sous la forme nom = valeur
301 if type(self.valeur) == bytes or type(self.valeur) == str :
302 if self.valeur.find('\n') == -1:
303 # pas de retour chariot, on utilise repr
304 return self.nom+' = '+ repr(self.valeur)
305 elif self.valeur.find('"""') == -1:
306 # retour chariot mais pas de triple ", on formatte
307 return self.nom+' = """'+self.valeur+'"""'
309 return self.nom+' = '+ repr(self.valeur)
311 if type(self.valeur) == list :
312 aRetourner=self.nom+' = ['
313 for l in self.valeur :
314 aRetourner=aRetourner+str(l) +","
315 aRetourner=aRetourner[0:-1]+']'
317 return self.nom+' = '+ str(self.valeur)
321 Retourne le nom du parametre comme representation de self
325 def getSdprods(self,nom_sd):
327 Retourne les concepts produits par la commande
332 """ Genere l'objet rapport (classe CR) """
334 self.isValid(cr='oui')
339 Retourne le nom interne associe a self
340 Ce nom n'est jamais vu par l'utilisateur dans EFICAS
344 def deleteConcept(self,sd):
347 def replaceConcept(self,old_sd,sd):
350 def verifConditionBloc(self):
352 Evalue les conditions de tous les blocs fils possibles
353 (en fonction du catalogue donc de la definition) de self et
354 retourne deux listes :
355 - la premiere contient les noms des blocs a rajouter
356 - la seconde contient les noms des blocs a supprimer
360 def verifConditionRegles(self,liste_presents):
362 Retourne la liste des mots-cles a rajouter pour satisfaire les regles
363 en fonction de la liste des mots-cles presents
367 def verifExistenceSd(self):
370 def controlSdprods(self,d):
377 def resetContext(self):
381 if isinstance(self.valeur,Formula):
382 return self.valeur.eval()
386 def __adapt__(self,validator):
387 return validator.adapt(self.eval())
389 class COMBI_PARAMETRE(object) :
390 def __init__(self,chainevaleur,valeur):
391 self.chainevaleur=chainevaleur
395 return self.chainevaleur
398 if self.valeur and self.chainevaleur:
401 class ITEM_PARAMETRE(object) :
402 def __init__(self,param_pere,item=None):
403 self.param_pere = param_pere
408 return self.param_pere.nom+'['+str(self.item)+']'
416 longueur= len(self.param_pere.dict_valeur) - 1
419 if self.item > longueur :