Salome HOME
modif pour MT
[tools/eficas.git] / Noyau / N_MCLIST.py
1 # coding=utf-8
2 # Copyright (C) 2007-2017   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 __future__ import absolute_import
28 try :
29    from future import standard_library
30    standard_library.install_aliases()
31 except : 
32    pass
33 from copy import copy
34 import types
35
36 try:
37    from UserList import UserList
38 except ImportError:
39    from collections import UserList
40
41
42
43
44 class MCList(UserList):
45
46     """ Liste semblable a la liste Python
47         mais avec quelques methodes en plus
48         = liste de MCFACT
49     """
50     nature = 'MCList'
51
52     def init(self, nom, parent):
53         self.objPyxbDeConstruction=None
54         self.definition = None
55         self.nom = nom
56         self.parent = parent
57         if parent:
58             self.jdc = self.parent.jdc
59             self.niveau = self.parent.niveau
60             self.etape = self.parent.etape
61         else:
62             # Le mot cle a été créé sans parent
63             self.jdc = None
64             self.niveau = None
65             self.etape = None
66
67     def getValeur(self):
68         """
69            Retourne la "valeur" d'un objet MCList. Sert à construire
70            un contexte d'évaluation pour une expression Python.
71            On retourne l'objet lui-meme.
72         """
73         return self
74
75     def getVal(self):
76         """
77             Une autre méthode qui retourne une "autre" valeur d'une MCList
78             Elle est utilisée par la méthode getMocle
79         """
80         return self
81
82     def supprime(self):
83         """
84            Méthode qui supprime toutes les références arrières afin que l'objet puisse
85            etre correctement détruit par le garbage collector
86         """
87         self.parent = None
88         self.etape = None
89         self.jdc = None
90         self.niveau = None
91         for child in self.data:
92             child.supprime()
93
94     def getChild(self, name,restreint='non'):
95         """
96             Retourne le fils de nom name s'il est contenu dans self
97             Par défaut retourne le fils du premier de la liste
98         """
99         obj = self.data[0]
100         # Phase 1 : on cherche dans les fils directs de obj
101         for child in obj.mcListe:
102             if child.nom == name:
103                 return child
104         # Phase 2 : on cherche dans les blocs de self
105         for child in obj.mcListe:
106             if child.isBLOC():
107                 resu = child.getChild(name)
108                 if resu != None:
109                     return resu
110         # Phase 3 : on cherche dans les entites possibles pour les défauts
111         for k, v in list(obj.definition.entites.items()):
112             # if k == name: return v.defaut
113             if k == name:
114                 if v.defaut != None:
115                     return v(None, k, None)
116         # si on passe ici, c'est que l'on demande un fils qui n'est pas possible --> erreur
117         # print "Erreur : %s ne peut etre un descendant de %s" %(name,self.nom)
118         return None
119
120     def isBLOC(self):
121         """
122              Indique si l'objet est de type BLOC
123         """
124         return 0
125
126     def accept(self, visitor):
127         """
128            Cette methode permet de parcourir l'arborescence des objets
129            en utilisant le pattern VISITEUR
130         """
131         visitor.visitMCList(self)
132
133     def getSd_utilisees(self):
134         """
135           Retourne la liste des concepts qui sont utilisés à l'intérieur de self
136           ( comme valorisation d'un MCS)
137         """
138         l = []
139         for child in self.data:
140             l.extend(child.getSd_utilisees())
141         return l
142
143     def getSd_mcs_utilisees(self):
144         """
145             Retourne la ou les SD utilisée par self sous forme d'un dictionnaire :
146               - Si aucune sd n'est utilisée, le dictionnaire est vide.
147               - Sinon, les clés du dictionnaire sont les mots-clés derrière lesquels on
148                 trouve des sd ; la valeur est la liste des sd attenante.
149
150                 Exemple ::
151
152                   { 'VALE_F': [ <Cata.cata.fonction_sdaster instance at 0x9419854>,
153                                 <Cata.cata.fonction_sdaster instance at 0x941a204> ],
154                     'MODELE': [<Cata.cata.modele instance at 0x941550c>] }
155         """
156         dico = {}
157         for child in self.data:
158             daux = child.getSd_mcs_utilisees()
159             for cle in daux:
160                 dico[cle] = dico.get(cle, [])
161                 dico[cle].extend(daux[cle])
162         return dico
163
164     def getMcsWithCo(self, co):
165         """
166            Cette methode retourne l'objet MCSIMP fils de self
167            qui a le concept co comme valeur.
168            En principe, elle ne doit etre utilisee que pour les concepts
169            instances de la classe CO
170         """
171         l = []
172         for child in self.data:
173             l.extend(child.getMcsWithCo(co))
174         return l
175
176     def getAllCo(self):
177         """
178            Cette methode retourne tous les concepts instances de CO
179         """
180         l = []
181         for child in self.data:
182             l.extend(child.getAllCo())
183         return l
184
185     def copy(self):
186         """
187           Réalise la copie d'une MCList
188         """
189         liste = self.data[0].definition.list_instance()
190         # FR -->Il faut spécifier un parent pour la méthode init qui attend 2
191         # arguments ...
192         liste.init(self.nom, self.parent)
193         for objet in self:
194             new_obj = objet.copy()
195             # Pour etre coherent avec le constructeur de mots cles facteurs N_FACT.__call__
196             # dans lequel le parent de l'element d'une MCList est le parent de
197             # la MCList
198             new_obj.reparent(self.parent)
199             liste.append(new_obj)
200         return liste
201
202     def reparent(self, parent):
203         """
204            Cette methode sert a reinitialiser la parente de l'objet
205         """
206         self.parent = parent
207         self.jdc = parent.jdc
208         self.etape = parent.etape
209         for mcfact in self.data:
210             mcfact.reparent(parent)
211
212     def getEtape(self):
213         """
214            Retourne l'étape à laquelle appartient self
215            Un objet de la catégorie etape doit retourner self pour indiquer que
216            l'étape a été trouvée
217            XXX double emploi avec self.etape ???
218         """
219         if self.parent == None:
220             return None
221         return self.parent.getEtape()
222
223     def __getitem__(self, key):
224         """
225            Dans le cas d un mot cle facteur de longueur 1 on simule un scalaire
226         """
227         if type(key) != int and len(self) == 1:
228             return self.data[0].getMocle(key)
229         else:
230             return self.data[key]
231
232     def List_F(self):
233         """
234            Retourne une liste de dictionnaires (eventuellement singleton) qui peut etre
235            passe directement derriere un mot-cle facteur (pour les macros).
236         """
237         dresu = []
238         for mcf in self:
239             dico = mcf.creeDictValeurs(mcf.mcListe)
240             for i in list(dico.keys()):
241                 if dico[i] == None:
242                     del dico[i]
243             dresu.append(dico)
244         return dresu
245     
246     def longueurDsArbre(self):
247     # pour Pyxb : longueur  dans le orderedcontent de pyxb
248         return len(self)