1 # -*- coding: utf-8 -*-
2 # CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
20 # ======================================================================
22 Ce module contient la classe PARAMETRE qui sert à définir
23 des objets paramètres qui sont compréhensibles et donc affichables
25 Ces objets sont créés à partir de la modification du fichier de commandes
26 de l'utilisateur par le parseur de fichiers Python
29 # import de modules Python
34 # import de modules Eficas
35 from Noyau.N_CR import CR
36 from Noyau import N_OBJECT
37 from Ihm import I_OBJECT
39 from Ihm import CONNECTOR
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.StringType:
82 # on tente l'evaluation dans un contexte fourni par le parent s'il existe
84 valeur=self.parent.eval_in_context(val,self)
89 #traceback.print_exc()
91 #PN je n ose pas modifier je rajoute
92 # refus des listes heterogenes : ne dvrait pas etre la
94 if type(valeur) == types.TupleType:
102 # la liste est hétérogène --> on refuse d'interpréter
103 # self comme une liste
104 # on retourne la string initiale
105 print 'liste hétérogène ',val
108 return tuple(l_new_val)
111 if type(valeur).__name__ == 'list':
113 for i in range(len(valeur)):
114 self.dict_valeur.append(valeur[i])
116 # on retourne val comme une string car on n'a pas su l'interpréter
119 def get_valeurs(self):
121 if self.dict_valeur != []:
122 for val in self.dict_valeur:
123 valeurretour.append(val)
125 valeurretour.append(self.valeur)
128 def set_valeur(self,new_valeur):
130 Remplace la valeur de self par new_valeur interprétée
132 self.valeur = self.interprete_valeur(new_valeur)
133 self.parent.update_concept_after_etape(self,self)
136 def set_nom(self,new_nom):
138 Change le nom du parametre
144 def init_modif(self):
146 Méthode qui déclare l'objet courant comme modifié et propage
147 cet état modifié à ses ascendants
149 self.state = 'modified'
151 self.parent.init_modif()
153 def get_jdc_root(self):
155 return self.parent.get_jdc_root()
161 Enregistre le paramètre dans la liste des étapes de son parent (JDC)
163 self.parent.register_parametre(self)
164 self.parent.register(self)
166 def isvalid(self,cr='non'):
168 Retourne 1 si self est valide, 0 sinon
169 Un paramètre est considéré comme valide si :
175 self.cr.fatal("Pas de nom donné au paramètre ")
178 if self.valeur == None :
180 self.cr.fatal("Le paramètre %s ne peut valoir None" % self.nom)
186 Indique si self est obligatoire ou non : retourne toujours 0
190 def isrepetable(self):
192 Indique si self est répétable ou non : retourne toujours 1
196 def liste_mc_presents(self):
201 Méthode qui supprime toutes les boucles de références afin que
202 l'objet puisse être correctement détruit par le garbage collector
211 Rend l'etape courante active.
212 Il faut ajouter le paramètre au contexte global du JDC
216 self.jdc.append_param(self)
219 CONNECTOR.Emit(self,"add",None)
220 CONNECTOR.Emit(self,"valid")
224 Rend l'etape courante inactive
225 Il faut supprimer le paramètre du contexte global du JDC
228 self.jdc.del_param(self)
229 self.jdc.delete_concept_after_etape(self,self)
230 CONNECTOR.Emit(self,"supp",None)
231 CONNECTOR.Emit(self,"valid")
235 Booléenne qui retourne 1 si self est actif, 0 sinon
239 def set_attribut(self,nom_attr,new_valeur):
241 Remplace la valeur de self.nom_attr par new_valeur)
243 if hasattr(self,nom_attr):
244 setattr(self,nom_attr,new_valeur)
247 def supprime_sdprods(self):
249 Il faut supprimer le paramètre qui a été entré dans la liste des
252 self.jdc.delete_param(self)
253 self.parent.delete_concept(self)
255 def update_context(self,d):
257 Update le dictionnaire d avec le paramètre que produit self
263 Donne un echo de self sous la forme nom = valeur
265 if type(self.valeur) == types.StringType:
266 if self.valeur.find('\n') == -1:
267 # pas de retour chariot, on utilise repr
268 return self.nom+' = '+ repr(self.valeur)
269 elif self.valeur.find('"""') == -1:
270 # retour chariot mais pas de triple ", on formatte
271 return self.nom+' = """'+self.valeur+'"""'
273 return self.nom+' = '+ repr(self.valeur)
275 return self.nom+' = '+ str(self.valeur)
279 Retourne le nom du paramètre comme représentation de self
283 def get_sdprods(self,nom_sd):
285 Retourne les concepts produits par la commande
290 """ Génère l'objet rapport (classe CR) """
292 self.isvalid(cr='oui')
297 Retourne le nom interne associé à self
298 Ce nom n'est jamais vu par l'utilisateur dans EFICAS
302 def delete_concept(self,sd):
305 def replace_concept(self,old_sd,sd):
308 def verif_condition_bloc(self):
310 Evalue les conditions de tous les blocs fils possibles
311 (en fonction du catalogue donc de la définition) de self et
312 retourne deux listes :
313 - la première contient les noms des blocs à rajouter
314 - la seconde contient les noms des blocs à supprimer
318 def verif_condition_regles(self,liste_presents):
320 Retourne la liste des mots-clés à rajouter pour satisfaire les règles
321 en fonction de la liste des mots-clés présents
325 def verif_existence_sd(self):
328 def control_sdprods(self,d):
335 def reset_context(self):
339 if isinstance(self.valeur,Formula):
340 return self.valeur.eval()
344 def __adapt__(self,validator):
345 return validator.adapt(self.eval())
347 class COMBI_PARAMETRE :
348 def __init__(self,chainevaleur,valeur):
349 self.chainevaleur=chainevaleur
353 return self.chainevaleur
356 if self.valeur and self.chainevaleur:
359 class ITEM_PARAMETRE :
360 def __init__(self,param_pere,item=None):
361 self.param_pere = param_pere
366 return self.param_pere.nom+'['+str(self.item)+']'
374 longueur= len(self.param_pere.dict_valeur) - 1
377 if self.item > longueur :