2 # Copyright (C) 2007-2021 EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
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
27 from __future__ import absolute_import
29 from future import standard_library
30 standard_library.install_aliases()
37 from UserList import UserList
39 from collections import UserList
44 class MCList(UserList):
46 """ Liste semblable a la liste Python
47 mais avec quelques methodes en plus
52 def init(self, nom, parent):
53 self.objPyxbDeConstruction=None
54 self.definition = None
58 self.jdc = self.parent.jdc
59 self.niveau = self.parent.niveau
60 self.etape = self.parent.etape
62 # Le mot cle a été créé sans parent
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.
77 Une autre méthode qui retourne une "autre" valeur d'une MCList
78 Elle est utilisée par la méthode getMocle
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
91 for child in self.data:
94 def getChild(self, name,restreint='non'):
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
100 # Phase 1 : on cherche dans les fils directs de obj
101 for child in obj.mcListe:
102 if child.nom == name:
104 # Phase 2 : on cherche dans les blocs de self
105 for child in obj.mcListe:
107 resu = child.getChild(name)
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
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)
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)
131 Indique si l'objet est de type BLOC
135 def accept(self, visitor):
137 Cette methode permet de parcourir l'arborescence des objets
138 en utilisant le pattern VISITEUR
140 visitor.visitMCList(self)
142 def getSd_utilisees(self):
144 Retourne la liste des concepts qui sont utilisés à l'intérieur de self
145 ( comme valorisation d'un MCS)
148 for child in self.data:
149 l.extend(child.getSd_utilisees())
152 def getSd_mcs_utilisees(self):
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.
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>] }
166 for child in self.data:
167 daux = child.getSd_mcs_utilisees()
169 dico[cle] = dico.get(cle, [])
170 dico[cle].extend(daux[cle])
173 def getMcsWithCo(self, co):
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
181 for child in self.data:
182 l.extend(child.getMcsWithCo(co))
187 Cette methode retourne tous les concepts instances de CO
190 for child in self.data:
191 l.extend(child.getAllCo())
196 Réalise la copie d'une MCList
198 liste = self.data[0].definition.list_instance()
199 # FR -->Il faut spécifier un parent pour la méthode init qui attend 2
201 liste.init(self.nom, self.parent)
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
207 new_obj.reparent(self.parent)
208 liste.append(new_obj)
211 def reparent(self, parent):
213 Cette methode sert a reinitialiser la parente de l'objet
216 self.jdc = parent.jdc
217 self.etape = parent.etape
218 for mcfact in self.data:
219 mcfact.reparent(parent)
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 ???
228 if self.parent == None:
230 return self.parent.getEtape()
232 def __getitem__(self, key):
234 Dans le cas d un mot cle facteur de longueur 1 on simule un scalaire
236 if type(key) != int and len(self) == 1:
237 return self.data[0].getMocle(key)
239 return self.data[key]
243 Retourne une liste de dictionnaires (eventuellement singleton) qui peut etre
244 passe directement derriere un mot-cle facteur (pour les macros).
248 dico = mcf.creeDictValeurs(mcf.mcListe)
249 for i in list(dico.keys()):
255 def longueurDsArbre(self):
256 # pour Pyxb : longueur dans le orderedcontent de pyxb