]> SALOME platform Git repositories - tools/eficas.git/blob - Extensions/parametre.py
Salome HOME
CCAR: merge de la version 1.14 dans la branche principale
[tools/eficas.git] / Extensions / parametre.py
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.
9 #
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.
14 #
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.
18 #
19 #
20 # ======================================================================
21 """
22     Ce module contient la classe PARAMETRE qui sert à définir
23     des objets paramètres qui sont compréhensibles et donc affichables
24     par EFICAS.
25     Ces objets sont créés à partir de la modification du fichier de commandes
26     de l'utilisateur par le parseur de fichiers Python
27 """
28
29 # import de modules Python
30 import string,types
31 from math import *
32 import traceback
33
34 # import de modules Eficas
35 from Noyau.N_CR import CR
36 from Noyau import N_OBJECT
37 from Ihm import I_OBJECT
38 from param2 import *
39 from Ihm import CONNECTOR
40
41 class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
42   """
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
47   """
48
49   nature = 'PARAMETRE'
50   idracine = 'param'
51
52   def __init__(self,nom,valeur=None):
53     self.nom = nom
54     # La classe PARAMETRE n'a pas de définition : on utilise self pour
55     # complétude
56     self.definition=self
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
60     self.actif=1
61     self.state='undetermined'
62     self.register()
63     self.dict_valeur=[]
64     #self.valeur = self.interprete_valeur(valeur)
65     #self.val=valeur
66     self.valeur = valeur
67     self.val=repr(valeur)
68
69   def interprete_valeur(self,val):
70     """
71     Essaie d'interpréter val (chaîne de caractères)comme :
72     - un entier
73     - un réel
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
77     """
78     #if not val : return None
79     valeur = None
80
81     if type(val) == types.StringType:
82        # on tente l'evaluation dans un contexte fourni par le parent s'il existe
83        if self.parent:
84           valeur=self.parent.eval_in_context(val,self)
85        else:
86           try :
87               valeur = eval(val)
88           except:
89               #traceback.print_exc()
90               pass
91     #PN je n ose pas modifier je rajoute
92     # refus des listes heterogenes : ne dvrait pas etre la
93     if valeur != None :
94         if type(valeur) == types.TupleType:
95             l_new_val = []
96             typ = None
97             for v in valeur :
98                 if not typ:
99                     typ = type(v)
100                 else:
101                     if type(v) != typ :
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
106                         return val
107                 l_new_val.append(v)
108             return tuple(l_new_val)
109
110     if valeur != None :
111        if type(valeur).__name__ == 'list':
112           self.dict_valeur=[]
113           for i in range(len(valeur)):
114              self.dict_valeur.append(valeur[i])
115        return valeur
116     # on retourne val comme une string car on n'a pas su l'interpréter
117     return val
118
119   def get_valeurs(self):
120     valeurretour=[]
121     if self.dict_valeur != []:
122        for val in self.dict_valeur:
123            valeurretour.append(val)
124     else:
125         valeurretour.append(self.valeur)
126     return valeurretour
127
128   def set_valeur(self,new_valeur):
129     """
130     Remplace la valeur de self par new_valeur interprétée
131     """
132     self.valeur = self.interprete_valeur(new_valeur)
133     self.init_modif()
134
135   def set_nom(self,new_nom):
136     """
137     Change le nom du parametre
138     """
139     self.init_modif()
140     self.nom=new_nom
141     self.fin_modif()
142
143   def init_modif(self):
144     """
145     Méthode qui déclare l'objet courant comme modifié et propage
146     cet état modifié à ses ascendants
147     """
148     self.state = 'modified'
149     if self.parent:
150       self.parent.init_modif()
151
152   def get_jdc_root(self):
153     if self.parent:
154       return self.parent.get_jdc_root()
155     else:
156       return self
157
158   def register(self):
159     """
160     Enregistre le paramètre dans la liste des étapes de son parent (JDC)
161     """
162     self.parent.register_parametre(self)
163     self.parent.register(self)
164
165   def isvalid(self,cr='non'):
166     """
167     Retourne 1 si self est valide, 0 sinon
168     Un paramètre est considéré comme valide si :
169       - il a un nom
170       - il a une valeur
171     """
172     if self.nom == '' :
173         if cr == 'oui':
174            self.cr.fatal("Pas de nom donné au paramètre ")
175         return 0
176     else:
177         if self.valeur == None :
178             if cr == 'oui' : 
179                self.cr.fatal("Le paramètre %s ne peut valoir None" % self.nom)
180             return 0
181     return 1
182
183   def isoblig(self):
184     """
185     Indique si self est obligatoire ou non : retourne toujours 0
186     """
187     return 0
188
189   def isrepetable(self):
190     """
191     Indique si self est répétable ou non : retourne toujours 1
192     """
193     return 1
194
195   def liste_mc_presents(self):
196     return []
197
198   def supprime(self):
199     """
200     Méthode qui supprime toutes les boucles de références afin que 
201     l'objet puisse être correctement détruit par le garbage collector
202     """
203     self.parent = None
204     self.jdc = None
205     self.definition=None
206     self.niveau=None
207
208   def active(self):
209     """
210     Rend l'etape courante active.
211     Il faut ajouter le paramètre au contexte global du JDC
212     """
213     self.actif = 1
214     try:
215         self.jdc.append_param(self)
216     except:
217         pass
218     CONNECTOR.Emit(self,"add",None)
219     CONNECTOR.Emit(self,"valid")
220
221   def inactive(self):
222     """
223     Rend l'etape courante inactive
224     Il faut supprimer le paramètre du contexte global du JDC
225     """
226     self.actif = 0
227     self.jdc.del_param(self)
228     self.jdc.delete_concept_after_etape(self,self)
229     CONNECTOR.Emit(self,"supp",None)
230     CONNECTOR.Emit(self,"valid")
231
232   def isactif(self):
233     """
234     Booléenne qui retourne 1 si self est actif, 0 sinon
235     """
236     return self.actif
237
238   def set_attribut(self,nom_attr,new_valeur):
239     """
240     Remplace la valeur de self.nom_attr par new_valeur)
241     """
242     if hasattr(self,nom_attr):
243       setattr(self,nom_attr,new_valeur)
244       self.init_modif()
245
246   def supprime_sdprods(self):
247     """
248     Il faut supprimer le paramètre qui a été entré dans la liste des
249     paramètres du JDC
250     """
251     self.jdc.delete_param(self)
252
253   def update_context(self,d):
254     """
255     Update le dictionnaire d avec le paramètre que produit self
256     """
257     d[self.nom]=self
258
259   def __repr__(self):
260     """
261         Donne un echo de self sous la forme nom = valeur
262     """
263     if type(self.valeur) == types.StringType:
264          if self.valeur.find('\n') == -1:
265             # pas de retour chariot, on utilise repr
266             return self.nom+' = '+ repr(self.valeur)
267          elif self.valeur.find('"""') == -1:
268             # retour chariot mais pas de triple ", on formatte
269             return self.nom+' = """'+self.valeur+'"""'
270          else:
271             return self.nom+' = '+ repr(self.valeur)
272     else:
273        return self.nom+' = '+ str(self.valeur)
274
275   def __str__(self):
276     """
277         Retourne le nom du paramètre comme représentation de self
278     """
279     return self.nom
280
281   def get_sdprods(self,nom_sd):
282      """
283          Retourne les concepts produits par la commande
284      """
285      return None
286
287   def report(self):
288     """ Génère l'objet rapport (classe CR) """
289     self.cr=CR()
290     self.isvalid(cr='oui')
291     return self.cr
292
293   def ident(self):
294     """
295     Retourne le nom interne associé à self
296     Ce nom n'est jamais vu par l'utilisateur dans EFICAS
297     """
298     return self.nom
299
300   def delete_concept(self,sd):
301     pass
302
303   def replace_concept(self,old_sd,sd):
304     pass
305
306   def verif_condition_bloc(self):
307     """
308         Evalue les conditions de tous les blocs fils possibles
309         (en fonction du catalogue donc de la définition) de self et
310         retourne deux listes :
311           - la première contient les noms des blocs à rajouter
312           - la seconde contient les noms des blocs à supprimer
313     """
314     return [],[]
315
316   def verif_condition_regles(self,liste_presents):
317     """
318         Retourne la liste des mots-clés à rajouter pour satisfaire les règles
319         en fonction de la liste des mots-clés présents
320     """
321     return []
322
323   def verif_existence_sd(self):
324      pass
325
326   def control_sdprods(self,d):
327       """sans objet """
328       pass
329
330   def close(self):
331       pass
332
333   def reset_context(self):
334       pass
335
336   def eval(self):
337       if isinstance(self.valeur,Formula):
338          return self.valeur.eval()
339       else:
340          return self.valeur
341
342   def __adapt__(self,validator):
343       return validator.adapt(self.eval())
344
345 class COMBI_PARAMETRE :
346   def __init__(self,chainevaleur,valeur):
347       self.chainevaleur=chainevaleur
348       self.valeur=valeur
349
350   def __repr__(self):
351       return self.chainevaleur
352
353   def isvalid(self):
354       if self.valeur and self.chainevaleur:
355          return 1
356
357 class ITEM_PARAMETRE :
358   def __init__(self,param_pere,item=None):
359       self.param_pere = param_pere
360       self.item = item
361       
362
363   def __repr__(self):
364     return self.param_pere.nom+'['+str(self.item)+']'
365
366
367   def isvalid(self):
368       isvalid = 1
369       if self.item < 0:
370          isvalid =  0
371       try:
372          longueur= len(self.param_pere.dict_valeur) - 1
373       except:
374          longueur=0
375       if self.item > longueur :
376          isvalid= 0
377       return isvalid