Salome HOME
CCAR: correction d'un probleme de mise a jour de contexte lors d'une insertion
[tools/eficas.git] / Noyau / N_MCLIST.py
1 #@ MODIF N_MCLIST Noyau  DATE 22/02/2005   AUTEUR DURAND C.DURAND 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR   
9 # (AT YOUR OPTION) ANY LATER VERSION.                                 
10 #
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT 
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF          
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU    
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                            
15 #
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE   
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,       
18 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
19 #                                                                       
20 #                                                                       
21 # ======================================================================
22
23
24 """ 
25     Ce module contient la classe MCList qui sert à controler la valeur
26     d'une liste de mots-clés facteur par rapport à sa définition portée par un objet
27     de type ENTITE
28 """
29
30 from copy import copy
31 import UserList
32 import types
33
34 class MCList(UserList.UserList):
35    """ Liste semblable a la liste Python
36        mais avec quelques methodes en plus
37        = liste de MCFACT
38    """
39    nature = 'MCList'
40    def init(self,nom,parent):
41       self.definition = None
42       self.nom = nom
43       self.parent=parent
44       if parent :
45          self.jdc = self.parent.jdc
46          self.niveau = self.parent.niveau
47          self.etape = self.parent.etape
48       else:
49          # Le mot cle a été créé sans parent
50          self.jdc = None
51          self.niveau = None
52          self.etape = None
53
54    def get_valeur(self):
55       """
56          Retourne la "valeur" d'un objet MCList. Sert à construire
57          un contexte d'évaluation pour une expression Python.
58          On retourne l'objet lui-meme.
59       """
60       return self
61
62    def get_val(self):
63       """
64           Une autre méthode qui retourne une "autre" valeur d'une MCList
65           Elle est utilisée par la méthode get_mocle
66       """
67       return self
68
69    def supprime(self):
70       """ 
71          Méthode qui supprime toutes les références arrières afin que l'objet puisse
72          etre correctement détruit par le garbage collector 
73       """
74       self.parent = None
75       self.etape = None
76       self.jdc = None
77       self.niveau = None
78       for child in self.data :
79          child.supprime()
80
81    def get_child(self,name):
82       """ 
83           Retourne le fils de nom name s'il est contenu dans self
84           Par défaut retourne le fils du premier de la liste 
85       """
86       obj = self.data[0]
87       # Phase 1 : on cherche dans les fils directs de obj
88       for child in obj.mc_liste :
89         if child.nom == name: return child
90       # Phase 2 : on cherche dans les blocs de self
91       for child in obj.mc_liste:
92         if child.isBLOC() :
93           resu = child.get_child(name)
94           if resu != None : return resu
95       # Phase 3 : on cherche dans les entites possibles pour les défauts
96       for k,v in obj.definition.entites.items():
97         #if k == name: return v.defaut
98         if k == name:
99           if v.defaut != None : return v(None,k,None)
100       # si on passe ici, c'est que l'on demande un fils qui n'est pas possible --> erreur
101       #print "Erreur : %s ne peut etre un descendant de %s" %(name,self.nom)
102       return None
103
104    def isBLOC(self):
105       """
106            Indique si l'objet est de type BLOC
107       """
108       return 0
109
110    def accept(self,visitor):
111       """
112          Cette methode permet de parcourir l'arborescence des objets
113          en utilisant le pattern VISITEUR
114       """
115       visitor.visitMCList(self)
116
117    def get_sd_utilisees(self):
118       """ 
119         Retourne la liste des concepts qui sont utilisés à l'intérieur de self
120         ( comme valorisation d'un MCS) 
121       """
122       l=[]
123       for child in self.data:
124         l.extend(child.get_sd_utilisees())
125       return l
126
127    def get_sd_mcs_utilisees(self):
128       """ 
129           Retourne la ou les SD utilisée par self sous forme d'un dictionnaire :
130           . Si aucune sd n'est utilisée, le dictionnaire est vide.
131           . Sinon, les clés du dictionnaire sont les mots-clés derrière lesquels on
132             trouve des sd ; la valeur est la liste des sd attenante.
133             Exemple : { 'VALE_F': [ <Cata.cata.para_sensi instance at 0x9419854>,
134                                     <Cata.cata.para_sensi instance at 0x941a204> ],
135                         'MODELE': [<Cata.cata.modele instance at 0x941550c>] }
136      """
137       dico = {}
138       for child in self.data:
139         daux = child.get_sd_mcs_utilisees()
140         for cle in daux.keys():
141           dico[cle] = daux[cle]
142       return dico
143
144    def get_mcs_with_co(self,co):
145       """
146          Cette methode retourne l'objet MCSIMP fils de self
147          qui a le concept co comme valeur.
148          En principe, elle ne doit etre utilisee que pour les concepts
149          instances de la classe CO 
150       """
151       l=[]
152       for child in self.data:
153         l.extend(child.get_mcs_with_co(co))
154       return l
155
156    def get_all_co(self):
157       """
158          Cette methode retourne tous les concepts instances de CO
159       """
160       l=[]
161       for child in self.data:
162         l.extend(child.get_all_co())
163       return l
164
165    def copy(self):
166       """
167         Réalise la copie d'une MCList
168       """
169       liste = self.data[0].definition.list_instance()
170       # FR -->Il faut spécifier un parent pour la méthode init qui attend 2 arguments ...
171       liste.init(self.nom,self.parent)
172       for objet in self:
173         new_obj = objet.copy()
174         # Pour etre coherent avec le constructeur de mots cles facteurs N_FACT.__call__
175         # dans lequel le parent de l'element d'une MCList est le parent de la MCList
176         new_obj.reparent(self.parent)
177         liste.append(new_obj)
178       return liste
179
180    def reparent(self,parent):
181       """
182          Cette methode sert a reinitialiser la parente de l'objet
183       """
184       self.parent=parent
185       self.jdc=parent.jdc
186       self.etape=parent.etape
187       for mcfact in self.data:
188         mcfact.reparent(parent)
189
190    def get_etape(self):
191       """
192          Retourne l'étape à laquelle appartient self
193          Un objet de la catégorie etape doit retourner self pour indiquer que
194          l'étape a été trouvée
195          XXX double emploi avec self.etape ???
196       """
197       if self.parent == None: return None
198       return self.parent.get_etape()
199
200    def __getitem__(self,key):
201       """
202          Dans le cas d un mot cle facteur de longueur 1 on simule un scalaire
203       """
204       if type(key) != types.IntType and len(self) ==1:
205          return self.data[0].get_mocle(key)
206       else:
207          return self.data[key]