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