Salome HOME
modif Adao 7 6
[tools/eficas.git] / Extensions / parametre.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013   EDF R&D
3 #
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.
8 #
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.
13 #
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
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 """
21     Ce module contient la classe PARAMETRE qui sert à définir
22     des objets paramètres qui sont compréhensibles et donc affichables
23     par EFICAS.
24     Ces objets sont créés à partir de la modification du fichier de commandes
25     de l'utilisateur par le parseur de fichiers Python
26 """
27
28 # import de modules Python
29 import string,types
30 from math import *
31 import traceback
32
33 # import de modules Eficas
34 from Noyau.N_CR import CR
35 from Noyau import N_OBJECT
36 from Ihm import I_OBJECT
37 from param2 import *
38 from Ihm import CONNECTOR
39 from Extensions.i18n import tr
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.ListType:
82     # Un premier traitement a ete fait lors de la saisie
83     # permet de tester les parametres qui sont des listes
84        l_new_val = []
85        for v in val :
86            try :
87                valeur=eval(str(v))
88                l_new_val.append(v)
89            except :
90                return None
91        return l_new_val
92
93     if type(val) == types.StringType:
94        # on tente l'evaluation dans un contexte fourni par le parent s'il existe
95        if self.parent:
96           valeur=self.parent.eval_in_context(val,self)
97        else:
98           try :
99               valeur = eval(val)
100           except:
101               #traceback.print_exc()
102               pass
103     #PN je n ose pas modifier je rajoute
104     # refus des listes heterogenes : ne dvrait pas etre la
105     if valeur != None :
106         if type(valeur) == types.TupleType:
107             l_new_val = []
108             typ = None
109             for v in valeur :
110                 if not typ:
111                     typ = type(v)
112                 else:
113                     if type(v) != typ :
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
118                         return val
119                 l_new_val.append(v)
120             return tuple(l_new_val)
121
122     if valeur != None :
123        if type(valeur).__name__ == 'list':
124           self.dict_valeur=[]
125           for i in range(len(valeur)):
126              self.dict_valeur.append(valeur[i])
127        return valeur
128     # on retourne val comme une string car on n'a pas su l'interpréter
129     return val
130
131   def get_valeurs(self):
132     valeurretour=[]
133     if self.dict_valeur != []:
134        for val in self.dict_valeur:
135            valeurretour.append(val)
136     else:
137         valeurretour.append(self.valeur)
138     return valeurretour
139
140   def set_valeur(self,new_valeur):
141     """
142     Remplace la valeur de self par new_valeur interprétée
143     """
144     self.valeur = self.interprete_valeur(new_valeur)
145     self.parent.update_concept_after_etape(self,self)
146     self.init_modif()
147
148   def set_nom(self,new_nom):
149     """
150     Change le nom du parametre
151     """
152     self.init_modif()
153     self.nom=new_nom
154     self.fin_modif()
155
156   def init_modif(self):
157     """
158     Méthode qui déclare l'objet courant comme modifié et propage
159     cet état modifié à ses ascendants
160     """
161     self.state = 'modified'
162     if self.parent:
163       self.parent.init_modif()
164
165   def get_jdc_root(self):
166     if self.parent:
167       return self.parent.get_jdc_root()
168     else:
169       return self
170
171   def register(self):
172     """
173     Enregistre le paramètre dans la liste des étapes de son parent (JDC)
174     """
175     self.parent.register_parametre(self)
176     self.parent.register(self)
177
178   def isvalid(self,cr='non'):
179     """
180     Retourne 1 si self est valide, 0 sinon
181     Un paramètre est considéré comme valide si :
182       - il a un nom
183       - il a une valeur
184     """
185     if self.nom == '' :
186         if cr == 'oui':
187            self.cr.fatal(tr("Pas de nom donné au paramètre "))
188         return 0
189     else:
190         if self.valeur == None :
191             if cr == 'oui' : 
192                self.cr.fatal(tr("Le paramètre %s ne peut valoir None" , self.nom))
193             return 0
194     return 1
195
196   def isoblig(self):
197     """
198     Indique si self est obligatoire ou non : retourne toujours 0
199     """
200     return 0
201
202   def isrepetable(self):
203     """
204     Indique si self est répétable ou non : retourne toujours 1
205     """
206     return 1
207
208   def liste_mc_presents(self):
209     return []
210
211   def supprime(self):
212     """
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
215     """
216     self.parent = None
217     self.jdc = None
218     self.definition=None
219     self.niveau=None
220
221   def active(self):
222     """
223     Rend l'etape courante active.
224     Il faut ajouter le paramètre au contexte global du JDC
225     """
226     self.actif = 1
227     try:
228         self.jdc.append_param(self)
229     except:
230         pass
231     CONNECTOR.Emit(self,"add",None)
232     CONNECTOR.Emit(self,"valid")
233
234   def inactive(self):
235     """
236     Rend l'etape courante inactive
237     Il faut supprimer le paramètre du contexte global du JDC
238     """
239     self.actif = 0
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")
244
245   def isactif(self):
246     """
247     Booléenne qui retourne 1 si self est actif, 0 sinon
248     """
249     return self.actif
250
251   def set_attribut(self,nom_attr,new_valeur):
252     """
253     Remplace la valeur de self.nom_attr par new_valeur)
254     """
255     if hasattr(self,nom_attr):
256       setattr(self,nom_attr,new_valeur)
257       self.init_modif()
258
259   def supprime_sdprods(self):
260     """
261     Il faut supprimer le paramètre qui a été entré dans la liste des
262     paramètres du JDC
263     """
264     self.jdc.delete_param(self)
265     self.parent.delete_concept(self)
266
267   def update_context(self,d):
268     """
269     Update le dictionnaire d avec le paramètre que produit self
270     """
271     d[self.nom]=self
272
273   def __repr__(self):
274     """
275         Donne un echo de self sous la forme nom = valeur
276     """
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+'"""'
284          else:
285             return self.nom+' = '+ repr(self.valeur)
286     else:
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]+']'
292           return aRetourner
293        return self.nom+' = '+ str(self.valeur)
294
295   def __str__(self):
296     """
297         Retourne le nom du paramètre comme représentation de self
298     """
299     return self.nom
300
301   def get_sdprods(self,nom_sd):
302      """
303          Retourne les concepts produits par la commande
304      """
305      return None
306
307   def report(self):
308     """ Génère l'objet rapport (classe CR) """
309     self.cr=CR()
310     self.isvalid(cr='oui')
311     return self.cr
312
313   def ident(self):
314     """
315     Retourne le nom interne associé à self
316     Ce nom n'est jamais vu par l'utilisateur dans EFICAS
317     """
318     return self.nom
319
320   def delete_concept(self,sd):
321     pass
322
323   def replace_concept(self,old_sd,sd):
324     pass
325
326   def verif_condition_bloc(self):
327     """
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
333     """
334     return [],[]
335
336   def verif_condition_regles(self,liste_presents):
337     """
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
340     """
341     return []
342
343   def verif_existence_sd(self):
344      pass
345
346   def control_sdprods(self,d):
347       """sans objet """
348       pass
349
350   def close(self):
351       pass
352
353   def reset_context(self):
354       pass
355
356   def eval(self):
357       if isinstance(self.valeur,Formula):
358          return self.valeur.eval()
359       else:
360          return self.valeur
361
362   def __adapt__(self,validator):
363       return validator.adapt(self.eval())
364
365 class COMBI_PARAMETRE :
366   def __init__(self,chainevaleur,valeur):
367       self.chainevaleur=chainevaleur
368       self.valeur=valeur
369
370   def __repr__(self):
371       return self.chainevaleur
372
373   def isvalid(self):
374       if self.valeur and self.chainevaleur:
375          return 1
376
377 class ITEM_PARAMETRE :
378   def __init__(self,param_pere,item=None):
379       self.param_pere = param_pere
380       self.item = item
381       
382
383   def __repr__(self):
384     return self.param_pere.nom+'['+str(self.item)+']'
385
386
387   def isvalid(self):
388       isvalid = 1
389       if self.item < 0:
390          isvalid =  0
391       try:
392          longueur= len(self.param_pere.dict_valeur) - 1
393       except:
394          longueur=0
395       if self.item > longueur :
396          isvalid= 0
397       return isvalid