Salome HOME
CCAR: ajout des fichiers macros
[tools/eficas.git] / Noyau / N_MCLIST.py
1 # -*- coding: utf-8 -*-
2 #@ MODIF N_MCLIST Noyau  DATE 17/08/2004   AUTEUR DURAND C.DURAND 
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR   
9 # (AT YOUR OPTION) ANY LATER VERSION.                                 
10 #
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT 
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF          
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU    
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                            
15 #
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE   
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,       
18 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
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             Exemple : { 'VALE_F': [ <Cata.cata.para_sensi instance at 0x9419854>,
132                                     <Cata.cata.para_sensi instance at 0x941a204> ],
133                         'MODELE': [<Cata.cata.modele instance at 0x941550c>] }
134      """
135       dico = {}
136       for child in self.data:
137         daux = child.get_sd_mcs_utilisees()
138         for cle in daux.keys():
139           dico[cle] = daux[cle]
140       return dico
141
142    def copy(self):
143       """
144         Réalise la copie d'une MCList
145       """
146       liste = self.data[0].definition.list_instance()
147       # FR -->Il faut spécifier un parent pour la méthode init qui attend 2 arguments ...
148       liste.init(self.nom,self.parent)
149       for objet in self:
150         new_obj = objet.copy()
151         # Pour etre coherent avec le constructeur de mots cles facteurs N_FACT.__call__
152         # dans lequel le parent de l'element d'une MCList est le parent de la MCList
153         new_obj.reparent(self.parent)
154         liste.append(new_obj)
155       return liste
156
157    def reparent(self,parent):
158       """
159          Cette methode sert a reinitialiser la parente de l'objet
160       """
161       self.parent=parent
162       self.jdc=parent.jdc
163       self.etape=parent.etape
164       for mcfact in self.data:
165         mcfact.reparent(parent)
166
167    def get_etape(self):
168       """
169          Retourne l'étape à laquelle appartient self
170          Un objet de la catégorie etape doit retourner self pour indiquer que
171          l'étape a été trouvée
172          XXX double emploi avec self.etape ???
173       """
174       if self.parent == None: return None
175       return self.parent.get_etape()
176
177    def __getitem__(self,key):
178       """
179          Dans le cas d un mot cle facteur de longueur 1 on simule un scalaire
180       """
181       if type(key) != types.IntType and len(self) ==1:
182          return self.data[0].get_mocle(key)
183       else:
184          return self.data[key]