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 qui sert à définir
22 des objets paramètres qui sont compréhensibles et donc affichables
24 Ces objets sont créés à partir de la modification du fichier de commandes
25 de l'utilisateur par le parseur de fichiers Python
28 # import de modules Python
33 # import de modules Eficas
34 from Noyau.N_CR import CR
35 from Noyau import N_OBJECT
36 from Ihm import I_OBJECT
38 from Ihm import CONNECTOR
39 from Extensions.i18n import tr
41 class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
43 Cette classe permet de créer des objets de type PARAMETRE
44 cad des affectations directes dans le jeu de commandes (ex: a=10.)
45 qui sont interprétées par le parseur de fichiers Python.
46 Les objets ainsi créés constituent des paramètres pour le jdc
52 def __init__(self,nom,valeur=None):
54 # La classe PARAMETRE n'a pas de définition : on utilise self pour
57 # parent ne peut être qu'un objet de type JDC
58 self.jdc = self.parent = CONTEXT.get_current_step()
59 self.niveau=self.parent.niveau
61 self.state='undetermined'
64 #self.valeur = self.interprete_valeur(valeur)
69 def interprete_valeur(self,val):
71 Essaie d'interpréter val (chaîne de caractères)comme :
74 - une chaîne de caractères
75 - une liste d'items d'un type qui précède
76 Retourne la valeur interprétée
78 #if not val : return None
81 if type(val) == types.ListType:
82 # Un premier traitement a ete fait lors de la saisie
83 # permet de tester les parametres qui sont des listes
93 if type(val) == types.StringType:
94 # on tente l'evaluation dans un contexte fourni par le parent s'il existe
96 valeur=self.parent.eval_in_context(val,self)
101 #traceback.print_exc()
103 #PN je n ose pas modifier je rajoute
104 # refus des listes heterogenes : ne dvrait pas etre la
106 if type(valeur) == types.TupleType:
114 # la liste est hétérogène --> on refuse d'interpréter
115 # self comme une liste
116 # on retourne la string initiale
117 print 'liste hétérogène ',val
120 return tuple(l_new_val)
123 if type(valeur).__name__ == 'list':
125 for i in range(len(valeur)):
126 self.dict_valeur.append(valeur[i])
128 # on retourne val comme une string car on n'a pas su l'interpréter
131 def get_valeurs(self):
133 if self.dict_valeur != []:
134 for val in self.dict_valeur:
135 valeurretour.append(val)
137 valeurretour.append(self.valeur)
140 def set_valeur(self,new_valeur):
142 Remplace la valeur de self par new_valeur interprétée
144 self.valeur = self.interprete_valeur(new_valeur)
145 self.parent.update_concept_after_etape(self,self)
148 def set_nom(self,new_nom):
150 Change le nom du parametre
156 def init_modif(self):
158 Méthode qui déclare l'objet courant comme modifié et propage
159 cet état modifié à ses ascendants
161 self.state = 'modified'
163 self.parent.init_modif()
165 def get_jdc_root(self):
167 return self.parent.get_jdc_root()
173 Enregistre le paramètre dans la liste des étapes de son parent (JDC)
175 self.parent.register_parametre(self)
176 self.parent.register(self)
178 def isvalid(self,cr='non'):
180 Retourne 1 si self est valide, 0 sinon
181 Un paramètre est considéré comme valide si :
187 self.cr.fatal(tr("Pas de nom donné au paramètre "))
190 if self.valeur == None :
192 self.cr.fatal(tr("Le paramètre %s ne peut valoir None" , self.nom))
198 Indique si self est obligatoire ou non : retourne toujours 0
202 def isrepetable(self):
204 Indique si self est répétable ou non : retourne toujours 1
208 def liste_mc_presents(self):
213 Méthode qui supprime toutes les boucles de références afin que
214 l'objet puisse être correctement détruit par le garbage collector
223 Rend l'etape courante active.
224 Il faut ajouter le paramètre au contexte global du JDC
228 self.jdc.append_param(self)
231 CONNECTOR.Emit(self,"add",None)
232 CONNECTOR.Emit(self,"valid")
236 Rend l'etape courante inactive
237 Il faut supprimer le paramètre du contexte global du JDC
240 self.jdc.del_param(self)
241 self.jdc.delete_concept_after_etape(self,self)
242 CONNECTOR.Emit(self,"supp",None)
243 CONNECTOR.Emit(self,"valid")
247 Booléenne qui retourne 1 si self est actif, 0 sinon
251 def set_attribut(self,nom_attr,new_valeur):
253 Remplace la valeur de self.nom_attr par new_valeur)
255 if hasattr(self,nom_attr):
256 setattr(self,nom_attr,new_valeur)
259 def supprime_sdprods(self):
261 Il faut supprimer le paramètre qui a été entré dans la liste des
264 self.jdc.delete_param(self)
265 self.parent.delete_concept(self)
267 def update_context(self,d):
269 Update le dictionnaire d avec le paramètre que produit self
275 Donne un echo de self sous la forme nom = valeur
277 if type(self.valeur) == types.StringType:
278 if self.valeur.find('\n') == -1:
279 # pas de retour chariot, on utilise repr
280 return self.nom+' = '+ repr(self.valeur)
281 elif self.valeur.find('"""') == -1:
282 # retour chariot mais pas de triple ", on formatte
283 return self.nom+' = """'+self.valeur+'"""'
285 return self.nom+' = '+ repr(self.valeur)
287 if type(self.valeur) == types.ListType :
288 aRetourner=self.nom+' = ['
289 for l in self.valeur :
290 aRetourner=aRetourner+str(l) +","
291 aRetourner=aRetourner[0:-1]+']'
293 return self.nom+' = '+ str(self.valeur)
297 Retourne le nom du paramètre comme représentation de self
301 def get_sdprods(self,nom_sd):
303 Retourne les concepts produits par la commande
308 """ Génère l'objet rapport (classe CR) """
310 self.isvalid(cr='oui')
315 Retourne le nom interne associé à self
316 Ce nom n'est jamais vu par l'utilisateur dans EFICAS
320 def delete_concept(self,sd):
323 def replace_concept(self,old_sd,sd):
326 def verif_condition_bloc(self):
328 Evalue les conditions de tous les blocs fils possibles
329 (en fonction du catalogue donc de la définition) de self et
330 retourne deux listes :
331 - la première contient les noms des blocs à rajouter
332 - la seconde contient les noms des blocs à supprimer
336 def verif_condition_regles(self,liste_presents):
338 Retourne la liste des mots-clés à rajouter pour satisfaire les règles
339 en fonction de la liste des mots-clés présents
343 def verif_existence_sd(self):
346 def control_sdprods(self,d):
353 def reset_context(self):
357 if isinstance(self.valeur,Formula):
358 return self.valeur.eval()
362 def __adapt__(self,validator):
363 return validator.adapt(self.eval())
365 class COMBI_PARAMETRE :
366 def __init__(self,chainevaleur,valeur):
367 self.chainevaleur=chainevaleur
371 return self.chainevaleur
374 if self.valeur and self.chainevaleur:
377 class ITEM_PARAMETRE :
378 def __init__(self,param_pere,item=None):
379 self.param_pere = param_pere
384 return self.param_pere.nom+'['+str(self.item)+']'
392 longueur= len(self.param_pere.dict_valeur) - 1
395 if self.item > longueur :