Salome HOME
debug intempestif
[tools/eficas.git] / Noyau / N_MCLIST.py
1 # coding=utf-8
2 # Copyright (C) 2007-2021   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 collections import UserList
38 except ImportError:
39     from UserList 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 getAllChild(self, name):
121     # A utiliser uniquement dans un filtre
122         maListeRetour= MCList()
123         for obj in self.data:
124             for objFils in obj.getChild(name) :
125                 maListeRetour.append(objFils)
126         return maListeRetour
127
128
129     def isBLOC(self):
130         """
131              Indique si l'objet est de type BLOC
132         """
133         return 0
134
135     def accept(self, visitor):
136         """
137            Cette methode permet de parcourir l'arborescence des objets
138            en utilisant le pattern VISITEUR
139         """
140         visitor.visitMCList(self)
141
142     def getSd_utilisees(self):
143         """
144           Retourne la liste des concepts qui sont utilisés à l'intérieur de self
145           ( comme valorisation d'un MCS)
146         """
147         l = []
148         for child in self.data:
149             l.extend(child.getSd_utilisees())
150         return l
151
152     def getSd_mcs_utilisees(self):
153         """
154             Retourne la ou les SD utilisée par self sous forme d'un dictionnaire :
155               - Si aucune sd n'est utilisée, le dictionnaire est vide.
156               - Sinon, les clés du dictionnaire sont les mots-clés derrière lesquels on
157                 trouve des sd ; la valeur est la liste des sd attenante.
158
159                 Exemple ::
160
161                   { 'VALE_F': [ <Cata.cata.fonction_sdaster instance at 0x9419854>,
162                                 <Cata.cata.fonction_sdaster instance at 0x941a204> ],
163                     'MODELE': [<Cata.cata.modele instance at 0x941550c>] }
164         """
165         dico = {}
166         for child in self.data:
167             daux = child.getSd_mcs_utilisees()
168             for cle in daux:
169                 dico[cle] = dico.get(cle, [])
170                 dico[cle].extend(daux[cle])
171         return dico
172
173     def getMcsWithCo(self, co):
174         """
175            Cette methode retourne l'objet MCSIMP fils de self
176            qui a le concept co comme valeur.
177            En principe, elle ne doit etre utilisee que pour les concepts
178            instances de la classe CO
179         """
180         l = []
181         for child in self.data:
182             l.extend(child.getMcsWithCo(co))
183         return l
184
185     def getAllCo(self):
186         """
187            Cette methode retourne tous les concepts instances de CO
188         """
189         l = []
190         for child in self.data:
191             l.extend(child.getAllCo())
192         return l
193
194     def copy(self):
195         """
196           Réalise la copie d'une MCList
197         """
198         liste = self.data[0].definition.list_instance()
199         # FR -->Il faut spécifier un parent pour la méthode init qui attend 2
200         # arguments ...
201         liste.init(self.nom, self.parent)
202         for objet in self:
203             new_obj = objet.copy()
204             # Pour etre coherent avec le constructeur de mots cles facteurs N_FACT.__call__
205             # dans lequel le parent de l'element d'une MCList est le parent de
206             # la MCList
207             new_obj.reparent(self.parent)
208             liste.append(new_obj)
209         return liste
210
211     def reparent(self, parent):
212         """
213            Cette methode sert a reinitialiser la parente de l'objet
214         """
215         self.parent = parent
216         self.jdc = parent.jdc
217         self.etape = parent.etape
218         for mcfact in self.data:
219             mcfact.reparent(parent)
220
221     def getEtape(self):
222         """
223            Retourne l'étape à laquelle appartient self
224            Un objet de la catégorie etape doit retourner self pour indiquer que
225            l'étape a été trouvée
226            XXX double emploi avec self.etape ???
227         """
228         if self.parent == None:
229             return None
230         return self.parent.getEtape()
231
232     def __getitem__(self, key):
233         """
234            Dans le cas d un mot cle facteur de longueur 1 on simule un scalaire
235         """
236         if type(key) != int and len(self) == 1:
237             return self.data[0].getMocle(key)
238         else:
239             return self.data[key]
240
241     def List_F(self):
242         """
243            Retourne une liste de dictionnaires (eventuellement singleton) qui peut etre
244            passe directement derriere un mot-cle facteur (pour les macros).
245         """
246         dresu = []
247         for mcf in self:
248             dico = mcf.creeDictValeurs(mcf.mcListe)
249             for i in list(dico.keys()):
250                 if dico[i] == None:
251                     del dico[i]
252             dresu.append(dico)
253         return dresu
254
255     def longueurDsArbre(self):
256     # pour Pyxb : longueur  dans le orderedcontent de pyxb
257         return len(self)