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.val=repr(self.valeur)
146 self.parent.update_concept_after_etape(self,self)
149 def set_nom(self,new_nom):
151 Change le nom du parametre
157 def init_modif(self):
159 Méthode qui déclare l'objet courant comme modifié et propage
160 cet état modifié à ses ascendants
162 self.state = 'modified'
164 self.parent.init_modif()
166 def get_jdc_root(self):
168 return self.parent.get_jdc_root()
174 Enregistre le paramètre dans la liste des étapes de son parent (JDC)
176 self.parent.register_parametre(self)
177 self.parent.register(self)
179 def isvalid(self,cr='non'):
181 Retourne 1 si self est valide, 0 sinon
182 Un paramètre est considéré comme valide si :
188 self.cr.fatal(tr("Pas de nom donne au parametre "))
191 if self.valeur == None :
193 self.cr.fatal(tr("Le parametre %s ne peut valoir None" , self.nom))
199 Indique si self est obligatoire ou non : retourne toujours 0
203 def isrepetable(self):
205 Indique si self est répétable ou non : retourne toujours 1
209 def liste_mc_presents(self):
214 Méthode qui supprime toutes les boucles de références afin que
215 l'objet puisse être correctement détruit par le garbage collector
224 Rend l'etape courante active.
225 Il faut ajouter le paramètre au contexte global du JDC
229 self.jdc.append_param(self)
232 CONNECTOR.Emit(self,"add",None)
233 CONNECTOR.Emit(self,"valid")
237 Rend l'etape courante inactive
238 Il faut supprimer le paramètre du contexte global du JDC
241 self.jdc.del_param(self)
242 self.jdc.delete_concept_after_etape(self,self)
243 CONNECTOR.Emit(self,"supp",None)
244 CONNECTOR.Emit(self,"valid")
248 Booléenne qui retourne 1 si self est actif, 0 sinon
252 def set_attribut(self,nom_attr,new_valeur):
254 Remplace la valeur de self.nom_attr par new_valeur)
256 if hasattr(self,nom_attr):
257 setattr(self,nom_attr,new_valeur)
260 def supprime_sdprods(self):
262 Il faut supprimer le paramètre qui a été entré dans la liste des
265 self.jdc.delete_param(self)
266 self.parent.delete_concept(self)
268 def update_context(self,d):
270 Update le dictionnaire d avec le paramètre que produit self
276 Donne un echo de self sous la forme nom = valeur
278 if type(self.valeur) == types.StringType:
279 if self.valeur.find('\n') == -1:
280 # pas de retour chariot, on utilise repr
281 return self.nom+' = '+ repr(self.valeur)
282 elif self.valeur.find('"""') == -1:
283 # retour chariot mais pas de triple ", on formatte
284 return self.nom+' = """'+self.valeur+'"""'
286 return self.nom+' = '+ repr(self.valeur)
288 if type(self.valeur) == types.ListType :
289 aRetourner=self.nom+' = ['
290 for l in self.valeur :
291 aRetourner=aRetourner+str(l) +","
292 aRetourner=aRetourner[0:-1]+']'
294 return self.nom+' = '+ str(self.valeur)
298 Retourne le nom du paramètre comme représentation de self
302 def get_sdprods(self,nom_sd):
304 Retourne les concepts produits par la commande
309 """ Génère l'objet rapport (classe CR) """
311 self.isvalid(cr='oui')
316 Retourne le nom interne associé à self
317 Ce nom n'est jamais vu par l'utilisateur dans EFICAS
321 def delete_concept(self,sd):
324 def replace_concept(self,old_sd,sd):
327 def verif_condition_bloc(self):
329 Evalue les conditions de tous les blocs fils possibles
330 (en fonction du catalogue donc de la définition) de self et
331 retourne deux listes :
332 - la première contient les noms des blocs à rajouter
333 - la seconde contient les noms des blocs à supprimer
337 def verif_condition_regles(self,liste_presents):
339 Retourne la liste des mots-clés à rajouter pour satisfaire les règles
340 en fonction de la liste des mots-clés présents
344 def verif_existence_sd(self):
347 def control_sdprods(self,d):
354 def reset_context(self):
358 if isinstance(self.valeur,Formula):
359 return self.valeur.eval()
363 def __adapt__(self,validator):
364 return validator.adapt(self.eval())
366 class COMBI_PARAMETRE :
367 def __init__(self,chainevaleur,valeur):
368 self.chainevaleur=chainevaleur
372 return self.chainevaleur
375 if self.valeur and self.chainevaleur:
378 class ITEM_PARAMETRE :
379 def __init__(self,param_pere,item=None):
380 self.param_pere = param_pere
385 return self.param_pere.nom+'['+str(self.item)+']'
393 longueur= len(self.param_pere.dict_valeur) - 1
396 if self.item > longueur :