Salome HOME
Changement sur le choix des parametres
[tools/eficas.git] / Ihm / I_MCSIMP.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 import types,string
22 import traceback
23 from copy import copy
24 from repr import Repr
25 myrepr = Repr()
26 myrepr.maxstring = 100
27 myrepr.maxother = 100
28
29 from Noyau.N_utils import repr_float
30
31 # Attention : les classes ASSD,.... peuvent etre surchargées
32 # dans le package Accas. Il faut donc prendre des précautions si
33 # on utilise les classes du Noyau pour faire des tests (isxxxx, ...)
34 # Si on veut créer des objets comme des CO avec les classes du noyau
35 # ils n'auront pas les conportements des autres packages (pb!!!)
36 # Il vaut mieux les importer d'Accas mais problème d'import circulaire,
37 # on ne peut pas les importer au début.
38 # On fait donc un import local quand c'est nécessaire (peut occasionner
39 # des pbs de prformance).
40 from Noyau.N_ASSD import ASSD,assd
41 from Noyau.N_GEOM import GEOM,geom
42 from Noyau.N_CO import CO
43 # fin attention
44
45 from Extensions import parametre
46 import I_OBJECT
47
48 class MCSIMP(I_OBJECT.OBJECT):
49   def GetText(self):
50     """
51         Retourne le texte à afficher dans l'arbre représentant la valeur de l'objet
52         pointé par self
53     """
54     if self.valeur == None : 
55       return None
56     elif type(self.valeur) == types.FloatType : 
57       # Traitement d'un flottant isolé
58       #txt = repr_float(self.valeur)
59       # Normalement str fait un travail correct
60       txt = str(self.valeur)
61     elif type(self.valeur) in (types.ListType,types.TupleType) :
62       # Traitement des listes
63       txt='('
64       i=0
65       for val in self.valeur:
66         if type(val) == types.FloatType : 
67            # CCAR : Normalement str fait un travail correct
68            #txt=txt + i*',' + repr_float(val)
69            txt=txt + i*',' + str(val)
70         elif isinstance(val,ASSD): 
71            txt = txt + i*',' + val.get_name()
72     #PN
73     # ajout du elif
74         elif type(val) == types.InstanceType and val.__class__.__name__ in  ('PARAMETRE','PARAMETRE_EVAL'):
75            txt = txt + i*','+ str(val) 
76         else: 
77            txt = txt + i*','+ myrepr.repr(val)
78         i=1
79       txt=txt+')'
80     elif isinstance(self.valeur,ASSD): 
81       # Cas des ASSD
82       txt=self.getval()
83     elif type(self.valeur) == types.InstanceType and self.valeur.__class__.__name__ in  ('PARAMETRE','PARAMETRE_EVAL'):
84       # Cas des PARAMETRES
85       txt=str(self.valeur)
86     else:
87       # Traitement des autres cas
88       txt = myrepr.repr(self.valeur)
89
90     # txt peut etre une longue chaine sur plusieurs lignes.
91     # Il est possible de tronquer cette chaine au premier \n et 
92     # de limiter la longueur de la chaine a 30 caracteres. Cependant
93     # ceci provoque une perte d'information pour l'utilisateur
94     # Pour le moment on retourne la chaine telle que
95     return txt
96
97   def getval(self):
98     """ 
99        Retourne une chaîne de caractère représentant la valeur de self 
100     """
101     val=self.valeur
102     if type(val) != types.TupleType :
103       try:
104         return val.get_name()
105       except:
106         return val
107     else :
108       s='( '
109       for item in val :
110         try :
111           s=s+item.get_name()+','
112         except:
113           s=s+`item`+','
114       s=s+' )'
115       return s
116
117   def wait_co(self):
118     """
119         Méthode booléenne qui retourne 1 si l'objet attend un objet ASSD 
120         qui n'existe pas encore (type CO()), 0 sinon
121     """
122     for typ in self.definition.type:
123       if type(typ) == types.ClassType :
124         if issubclass(typ,CO) :
125            return 1
126     return 0
127
128   def wait_assd(self):
129     """ 
130         Méthode booléenne qui retourne 1 si le MCS attend un objet de type ASSD 
131         ou dérivé, 0 sinon
132     """
133     for typ in self.definition.type:
134       if type(typ) == types.ClassType :
135         if issubclass(typ,ASSD) and not issubclass(typ,GEOM):
136           return 1
137     return 0
138
139   def wait_assd_or_geom(self):
140     """ 
141          Retourne 1 si le mot-clé simple attend un objet de type
142          assd, ASSD, geom ou GEOM
143          Retourne 0 dans le cas contraire
144     """
145     for typ in self.definition.type:
146       if type(typ) == types.ClassType :
147         if typ.__name__ in ("GEOM","ASSD","geom","assd") or issubclass(typ,GEOM) :
148           return 1
149     return 0
150
151   def wait_geom(self):
152     """ 
153          Retourne 1 si le mot-clé simple attend un objet de type GEOM
154          Retourne 0 dans le cas contraire
155     """
156     for typ in self.definition.type:
157       if type(typ) == types.ClassType :
158         if issubclass(typ,GEOM) : return 1
159     return 0
160
161   def wait_TXM(self):
162     """ 
163          Retourne 1 si le mot-clé simple attend un objet de type TXM
164          Retourne 0 dans le cas contraire
165     """
166     for typ in self.definition.type:
167       if typ == 'TXM' :return 1
168     return 0
169
170   def get_liste_valeurs(self):
171     """
172     """
173     if self.valeur == None:
174       return []
175     elif type(self.valeur) == types.TupleType:
176       return list(self.valeur)
177     elif type(self.valeur) == types.ListType:
178       return self.valeur
179     else:
180       return [self.valeur]
181
182   def isoblig(self):
183     return self.definition.statut=='o'
184
185   def set_valeur(self,new_valeur,evaluation='oui'):
186         self.init_modif()
187         self.valeur = new_valeur
188         self.val = new_valeur
189         self.fin_modif()
190         return 1
191
192   def eval_valeur(self,new_valeur):
193     """
194         Essaie d'évaluer new_valeur comme une SD, une déclaration Python 
195         ou un EVAL: Retourne la valeur évaluée (ou None) et le test de réussite (1 ou 0)
196     """
197     sd = self.jdc.get_contexte_avant(self.etape).get(new_valeur,None)
198     if sd :
199       return sd,1
200     else:
201       d={}
202       # On veut EVAL avec tous ses comportements. On utilise Accas. Perfs ??
203       from Accas import EVAL
204       d['EVAL']=EVAL
205       try :
206         objet = eval(new_valeur,d)
207         return objet,1
208       except Exception:
209         if CONTEXT.debug : traceback.print_exc()
210         return None,0
211
212   def delete_concept(self,sd):
213     """ 
214         Inputs :
215            - sd=concept detruit
216         Fonction :
217         Met a jour la valeur du mot cle simple suite à la disparition 
218         du concept sd
219     """
220     if type(self.valeur) == types.TupleType :
221       if sd in self.valeur:
222         self.valeur=list(self.valeur)
223         self.valeur.remove(sd)
224         self.init_modif()
225     elif type(self.valeur) == types.ListType:
226       if sd in self.valeur:
227         self.valeur.remove(sd)
228         self.init_modif()
229     else:
230       if self.valeur == sd:
231         self.valeur=None
232         self.val=None
233         self.init_modif()
234
235   def replace_concept(self,old_sd,sd):
236     """
237         Inputs :
238            - old_sd=concept remplacé
239            - sd=nouveau concept
240         Fonction :
241         Met a jour la valeur du mot cle simple suite au remplacement 
242         du concept old_sd
243     """
244     if type(self.valeur) == types.TupleType :
245       if old_sd in self.valeur:
246         self.valeur=list(self.valeur)
247         i=self.valeur.index(old_sd)
248         self.valeur[i]=sd
249         self.init_modif()
250     elif type(self.valeur) == types.ListType:
251       if old_sd in self.valeur:
252         i=self.valeur.index(old_sd)
253         self.valeur[i]=sd
254         self.init_modif()
255     else:
256       if self.valeur == old_sd:
257         self.valeur=sd
258         self.val=sd
259         self.init_modif()
260
261   def set_valeur_co(self,nom_co):
262       """
263           Affecte à self l'objet de type CO et de nom nom_co
264       """
265       step=self.etape.parent
266       if nom_co == None or nom_co == '':
267          new_objet=None
268       else:
269          # Pour le moment on importe en local le CO de Accas.
270          # Si problème de perfs, il faudra faire autrement
271          from Accas import CO
272          # Avant de créer un concept il faut s'assurer du contexte : step 
273          # courant
274          sd= step.get_sd_autour_etape(nom_co,self.etape,avec='oui')
275          if sd:
276             # Si un concept du meme nom existe deja dans la portée de l'étape
277             # on ne crée pas le concept
278             return 0,"un concept de meme nom existe deja"
279          # Il n'existe pas de concept de meme nom. On peut donc le créer 
280          # Il faut néanmoins que la méthode NommerSdProd de step gère les 
281          # contextes en mode editeur
282          # Normalement la méthode  du Noyau doit etre surchargée
283          # On déclare l'étape du mot clé comme etape courante pour NommerSdprod
284          cs= CONTEXT.get_current_step()
285          CONTEXT.unset_current_step()
286          CONTEXT.set_current_step(step)
287          step.set_etape_context(self.etape)
288          new_objet = CO(nom_co)
289          CONTEXT.unset_current_step()
290          CONTEXT.set_current_step(cs)
291       self.init_modif()
292       self.valeur = new_objet
293       self.val = new_objet
294       self.fin_modif()
295       step.reset_context()
296       # On force l'enregistrement de new_objet en tant que concept produit 
297       # de la macro en appelant get_type_produit avec force=1
298       self.etape.get_type_produit(force=1)
299       return 1,"Concept créé"
300         
301   def verif_existence_sd(self):
302      """
303         Vérifie que les structures de données utilisées dans self existent bien dans le contexte
304         avant étape, sinon enlève la référence à ces concepts
305      """
306      l_sd_avant_etape = self.jdc.get_contexte_avant(self.etape).values()  
307      if type(self.valeur) in (types.TupleType,types.ListType) :
308        l=[]
309        for sd in self.valeur:
310          if isinstance(sd,ASSD) :
311             if sd in l_sd_avant_etape :
312                l.append(sd)
313          else:
314             l.append(sd)
315        self.valeur=tuple(l)
316        # Est ce init_modif ou init_modif_up
317        # Normalement init_modif va avec fin_modif
318        self.init_modif()
319        self.fin_modif()
320      else:
321        if isinstance(self.valeur,ASSD) :
322           if self.valeur not in l_sd_avant_etape :
323              self.valeur = None
324              self.init_modif()
325              self.fin_modif()
326  
327   def get_min_max(self):
328      """
329      Retourne les valeurs min et max admissibles pour la valeur de self
330      """
331      return self.definition.min,self.definition.max
332
333
334   def get_type(self):
335      """
336      Retourne le type attendu par le mot-clé simple
337      """
338      return self.definition.type
339
340 #--------------------------------------------------------------------------------
341 # PN : ajout pour Salome des methodes suivantes (jusqu aux méthodes surchargees)
342 #--------------------------------------------------------------------------------
343   def get_salome_valeurs(self):
344        l=[]
345        if not hasattr(self,'list_salome_valeurs'):
346            self.list_salome_valeurs=[]
347        if self.list_salome_valeurs != [] :
348            for val in self.list_salome_valeurs:
349                 l.append(val)
350        return l
351
352   def put_salome_valeurs(self,list):
353        self.list_salome_valeurs=[]
354        for val in list:
355            self.list_salome_valeurs.append(val)
356
357   def add_salome_valeurs(self,val):
358       if not hasattr(self,'list_salome_valeurs'):
359            self.list_salome_valeurs=[]
360       try:
361            self.list_salome_valeurs.append(val)
362       except :
363            try:
364               for uneval in val :
365                   self.list_salome_valeurs.append(uneval)
366            except :
367               pass
368
369   def has_salome_valeurs(self):
370       if not hasattr(self,'list_salome_valeurs'):
371            self.list_salome_valeurs=[]
372       if self.list_salome_valeurs != []:
373            return true
374       else:
375            return false
376
377 #--------------------------------------------------------------------------------
378 # PN : fin ajout pour Salome 
379 #--------------------------------------------------------------------------------
380  
381 #ATTENTION SURCHARGE : toutes les methodes ci apres sont des surcharges du Noyau et de Validation
382 # Elles doivent etre reintegrees des que possible
383