2 # Copyright (C) 2007-2017 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)
122 Indique si l'objet est de type BLOC
126 def accept(self, visitor):
128 Cette methode permet de parcourir l'arborescence des objets
129 en utilisant le pattern VISITEUR
131 visitor.visitMCList(self)
133 def getSd_utilisees(self):
135 Retourne la liste des concepts qui sont utilisés à l'intérieur de self
136 ( comme valorisation d'un MCS)
139 for child in self.data:
140 l.extend(child.getSd_utilisees())
143 def getSd_mcs_utilisees(self):
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.
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>] }
157 for child in self.data:
158 daux = child.getSd_mcs_utilisees()
160 dico[cle] = dico.get(cle, [])
161 dico[cle].extend(daux[cle])
164 def getMcsWithCo(self, co):
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
172 for child in self.data:
173 l.extend(child.getMcsWithCo(co))
178 Cette methode retourne tous les concepts instances de CO
181 for child in self.data:
182 l.extend(child.getAllCo())
187 Réalise la copie d'une MCList
189 liste = self.data[0].definition.list_instance()
190 # FR -->Il faut spécifier un parent pour la méthode init qui attend 2
192 liste.init(self.nom, self.parent)
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
198 new_obj.reparent(self.parent)
199 liste.append(new_obj)
202 def reparent(self, parent):
204 Cette methode sert a reinitialiser la parente de l'objet
207 self.jdc = parent.jdc
208 self.etape = parent.etape
209 for mcfact in self.data:
210 mcfact.reparent(parent)
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 ???
219 if self.parent == None:
221 return self.parent.getEtape()
223 def __getitem__(self, key):
225 Dans le cas d un mot cle facteur de longueur 1 on simule un scalaire
227 if type(key) != int and len(self) == 1:
228 return self.data[0].getMocle(key)
230 return self.data[key]
234 Retourne une liste de dictionnaires (eventuellement singleton) qui peut etre
235 passe directement derriere un mot-cle facteur (pour les macros).
239 dico = mcf.creeDictValeurs(mcf.mcListe)
240 for i in list(dico.keys()):
246 def longueurDsArbre(self):
247 # pour Pyxb : longueur dans le orderedcontent de pyxb