]> SALOME platform Git repositories - tools/eficas.git/blob - Noyau/N_MCLIST.py
Salome HOME
*** empty log message ***
[tools/eficas.git] / Noyau / N_MCLIST.py
1 #@ MODIF N_MCLIST Noyau  DATE 07/09/2009   AUTEUR COURTOIS M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 # RESPONSABLE COURTOIS M.COURTOIS
4 #            CONFIGURATION MANAGEMENT OF EDF VERSION
5 # ======================================================================
6 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
7 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
8 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
9 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR   
10 # (AT YOUR OPTION) ANY LATER VERSION.                                 
11 #
12 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT 
13 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF          
14 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU    
15 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                            
16 #
17 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE   
18 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,       
19 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
20 #                                                                       
21 #                                                                       
22 # ======================================================================
23
24
25 """ 
26     Ce module contient la classe MCList qui sert à controler la valeur
27     d'une liste de mots-clés facteur par rapport à sa définition portée par un objet
28     de type ENTITE
29 """
30
31 from copy import copy
32 import UserList
33 import types
34
35 class MCList(UserList.UserList):
36    """ Liste semblable a la liste Python
37        mais avec quelques methodes en plus
38        = liste de MCFACT
39    """
40    nature = 'MCList'
41    def init(self,nom,parent):
42       self.definition = None
43       self.nom = nom
44       self.parent=parent
45       if parent :
46          self.jdc = self.parent.jdc
47          self.niveau = self.parent.niveau
48          self.etape = self.parent.etape
49       else:
50          # Le mot cle a été créé sans parent
51          self.jdc = None
52          self.niveau = None
53          self.etape = None
54
55    def get_valeur(self):
56       """
57          Retourne la "valeur" d'un objet MCList. Sert à construire
58          un contexte d'évaluation pour une expression Python.
59          On retourne l'objet lui-meme.
60       """
61       return self
62
63    def get_val(self):
64       """
65           Une autre méthode qui retourne une "autre" valeur d'une MCList
66           Elle est utilisée par la méthode get_mocle
67       """
68       return self
69
70    def supprime(self):
71       """ 
72          Méthode qui supprime toutes les références arrières afin que l'objet puisse
73          etre correctement détruit par le garbage collector 
74       """
75       self.parent = None
76       self.etape = None
77       self.jdc = None
78       self.niveau = None
79       for child in self.data :
80          child.supprime()
81
82    def get_child(self,name):
83       """ 
84           Retourne le fils de nom name s'il est contenu dans self
85           Par défaut retourne le fils du premier de la liste 
86       """
87       obj = self.data[0]
88       # Phase 1 : on cherche dans les fils directs de obj
89       for child in obj.mc_liste :
90         if child.nom == name: return child
91       # Phase 2 : on cherche dans les blocs de self
92       for child in obj.mc_liste:
93         if child.isBLOC() :
94           resu = child.get_child(name)
95           if resu != None : return resu
96       # Phase 3 : on cherche dans les entites possibles pour les défauts
97       for k,v in obj.definition.entites.items():
98         #if k == name: return v.defaut
99         if k == name:
100           if v.defaut != None : return v(None,k,None)
101       # si on passe ici, c'est que l'on demande un fils qui n'est pas possible --> erreur
102       #print "Erreur : %s ne peut etre un descendant de %s" %(name,self.nom)
103       return None
104
105    def isBLOC(self):
106       """
107            Indique si l'objet est de type BLOC
108       """
109       return 0
110
111    def accept(self,visitor):
112       """
113          Cette methode permet de parcourir l'arborescence des objets
114          en utilisant le pattern VISITEUR
115       """
116       visitor.visitMCList(self)
117
118    def get_sd_utilisees(self):
119       """ 
120         Retourne la liste des concepts qui sont utilisés à l'intérieur de self
121         ( comme valorisation d'un MCS) 
122       """
123       l=[]
124       for child in self.data:
125          l.extend(child.get_sd_utilisees())
126       return l
127
128    def get_sd_mcs_utilisees(self):
129       """ 
130           Retourne la ou les SD utilisée par self sous forme d'un dictionnaire :
131             - Si aucune sd n'est utilisée, le dictionnaire est vide.
132             - Sinon, les clés du dictionnaire sont les mots-clés derrière lesquels on
133               trouve des sd ; la valeur est la liste des sd attenante.
134
135               Exemple ::
136               
137                 { 'VALE_F': [ <Cata.cata.para_sensi instance at 0x9419854>,
138                               <Cata.cata.para_sensi instance at 0x941a204> ],
139                   'MODELE': [<Cata.cata.modele instance at 0x941550c>] }
140       """
141       dico = {}
142       for child in self.data:
143          daux = child.get_sd_mcs_utilisees()
144          for cle in daux.keys():
145             dico[cle] = dico.get(cle, [])
146             dico[cle].extend(daux[cle])
147       return dico
148
149    def get_mcs_with_co(self,co):
150       """
151          Cette methode retourne l'objet MCSIMP fils de self
152          qui a le concept co comme valeur.
153          En principe, elle ne doit etre utilisee que pour les concepts
154          instances de la classe CO 
155       """
156       l=[]
157       for child in self.data:
158         l.extend(child.get_mcs_with_co(co))
159       return l
160
161    def get_all_co(self):
162       """
163          Cette methode retourne tous les concepts instances de CO
164       """
165       l=[]
166       for child in self.data:
167         l.extend(child.get_all_co())
168       return l
169
170    def copy(self):
171       """
172         Réalise la copie d'une MCList
173       """
174       liste = self.data[0].definition.list_instance()
175       # FR -->Il faut spécifier un parent pour la méthode init qui attend 2 arguments ...
176       liste.init(self.nom,self.parent)
177       for objet in self:
178         new_obj = objet.copy()
179         # Pour etre coherent avec le constructeur de mots cles facteurs N_FACT.__call__
180         # dans lequel le parent de l'element d'une MCList est le parent de la MCList
181         new_obj.reparent(self.parent)
182         liste.append(new_obj)
183       return liste
184
185    def reparent(self,parent):
186       """
187          Cette methode sert a reinitialiser la parente de l'objet
188       """
189       self.parent=parent
190       self.jdc=parent.jdc
191       self.etape=parent.etape
192       for mcfact in self.data:
193         mcfact.reparent(parent)
194
195    def get_etape(self):
196       """
197          Retourne l'étape à laquelle appartient self
198          Un objet de la catégorie etape doit retourner self pour indiquer que
199          l'étape a été trouvée
200          XXX double emploi avec self.etape ???
201       """
202       if self.parent == None: return None
203       return self.parent.get_etape()
204
205    def __getitem__(self,key):
206       """
207          Dans le cas d un mot cle facteur de longueur 1 on simule un scalaire
208       """
209       if type(key) != types.IntType and len(self) ==1:
210          return self.data[0].get_mocle(key)
211       else:
212          return self.data[key]
213    
214    def List_F(self):
215       """
216          Retourne une liste de dictionnaires (eventuellement singleton) qui peut etre
217          passe directement derriere un mot-cle facteur (pour les macros).
218       """
219       dresu = []
220       for mcf in self:
221          dico = mcf.cree_dict_valeurs(mcf.mc_liste)
222          for i in dico.keys():
223             if dico[i] == None:
224                del dico[i]
225          dresu.append(dico)
226       return dresu