Salome HOME
bugs + translator
[tools/eficas.git] / Noyau / N_MCLIST.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 """
22     Ce module contient la classe MCList qui sert à controler la valeur
23     d'une liste de mots-clés facteur par rapport à sa définition portée par un objet
24     de type ENTITE
25 """
26
27 from copy import copy
28 import UserList
29 import types
30
31
32 class MCList(UserList.UserList):
33
34     """ Liste semblable a la liste Python
35         mais avec quelques methodes en plus
36         = liste de MCFACT
37     """
38     nature = 'MCList'
39
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:
90                 return child
91         # Phase 2 : on cherche dans les blocs de self
92         for child in obj.mc_liste:
93             if child.isBLOC():
94                 resu = child.get_child(name)
95                 if resu != None:
96                     return resu
97         # Phase 3 : on cherche dans les entites possibles pour les défauts
98         for k, v in obj.definition.entites.items():
99             # if k == name: return v.defaut
100             if k == name:
101                 if v.defaut != None:
102                     return v(None, k, None)
103         # si on passe ici, c'est que l'on demande un fils qui n'est pas possible --> erreur
104         # print "Erreur : %s ne peut etre un descendant de %s" %(name,self.nom)
105         return None
106
107     def isBLOC(self):
108         """
109              Indique si l'objet est de type BLOC
110         """
111         return 0
112
113     def accept(self, visitor):
114         """
115            Cette methode permet de parcourir l'arborescence des objets
116            en utilisant le pattern VISITEUR
117         """
118         visitor.visitMCList(self)
119
120     def get_sd_utilisees(self):
121         """
122           Retourne la liste des concepts qui sont utilisés à l'intérieur de self
123           ( comme valorisation d'un MCS)
124         """
125         l = []
126         for child in self.data:
127             l.extend(child.get_sd_utilisees())
128         return l
129
130     def get_sd_mcs_utilisees(self):
131         """
132             Retourne la ou les SD utilisée par self sous forme d'un dictionnaire :
133               - Si aucune sd n'est utilisée, le dictionnaire est vide.
134               - Sinon, les clés du dictionnaire sont les mots-clés derrière lesquels on
135                 trouve des sd ; la valeur est la liste des sd attenante.
136
137                 Exemple ::
138
139                   { 'VALE_F': [ <Cata.cata.fonction_sdaster instance at 0x9419854>,
140                                 <Cata.cata.fonction_sdaster instance at 0x941a204> ],
141                     'MODELE': [<Cata.cata.modele instance at 0x941550c>] }
142         """
143         dico = {}
144         for child in self.data:
145             daux = child.get_sd_mcs_utilisees()
146             for cle in daux.keys():
147                 dico[cle] = dico.get(cle, [])
148                 dico[cle].extend(daux[cle])
149         return dico
150
151     def get_mcs_with_co(self, co):
152         """
153            Cette methode retourne l'objet MCSIMP fils de self
154            qui a le concept co comme valeur.
155            En principe, elle ne doit etre utilisee que pour les concepts
156            instances de la classe CO
157         """
158         l = []
159         for child in self.data:
160             l.extend(child.get_mcs_with_co(co))
161         return l
162
163     def get_all_co(self):
164         """
165            Cette methode retourne tous les concepts instances de CO
166         """
167         l = []
168         for child in self.data:
169             l.extend(child.get_all_co())
170         return l
171
172     def copy(self):
173         """
174           Réalise la copie d'une MCList
175         """
176         liste = self.data[0].definition.list_instance()
177         # FR -->Il faut spécifier un parent pour la méthode init qui attend 2
178         # arguments ...
179         liste.init(self.nom, self.parent)
180         for objet in self:
181             new_obj = objet.copy()
182             # Pour etre coherent avec le constructeur de mots cles facteurs N_FACT.__call__
183             # dans lequel le parent de l'element d'une MCList est le parent de
184             # la MCList
185             new_obj.reparent(self.parent)
186             liste.append(new_obj)
187         return liste
188
189     def reparent(self, parent):
190         """
191            Cette methode sert a reinitialiser la parente de l'objet
192         """
193         self.parent = parent
194         self.jdc = parent.jdc
195         self.etape = parent.etape
196         for mcfact in self.data:
197             mcfact.reparent(parent)
198
199     def get_etape(self):
200         """
201            Retourne l'étape à laquelle appartient self
202            Un objet de la catégorie etape doit retourner self pour indiquer que
203            l'étape a été trouvée
204            XXX double emploi avec self.etape ???
205         """
206         if self.parent == None:
207             return None
208         return self.parent.get_etape()
209
210     def __getitem__(self, key):
211         """
212            Dans le cas d un mot cle facteur de longueur 1 on simule un scalaire
213         """
214         if type(key) != types.IntType and len(self) == 1:
215             return self.data[0].get_mocle(key)
216         else:
217             return self.data[key]
218
219     def List_F(self):
220         """
221            Retourne une liste de dictionnaires (eventuellement singleton) qui peut etre
222            passe directement derriere un mot-cle facteur (pour les macros).
223         """
224         dresu = []
225         for mcf in self:
226             dico = mcf.cree_dict_valeurs(mcf.mc_liste)
227             for i in dico.keys():
228                 if dico[i] == None:
229                     del dico[i]
230             dresu.append(dico)
231         return dresu