Salome HOME
travail sur monPlusieurs
[tools/eficas.git] / Noyau / N_ASSD.py
1 # -*- coding: iso-8859-1 -*-
2 """
3 # Copyright (C) 2007-2013   EDF R&D
4 #
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Lesser General Public
7 # License as published by the Free Software Foundation; either
8 # version 2.1 of the License.
9 #
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # Lesser General Public License for more details.
14 #
15 # You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18 #
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #
21
22 """
23
24 from N_utils import import_object
25 from N_info import message, SUPERV
26
27 class ASSD(object):
28    """
29       Classe de base pour definir des types de structures de donnees ASTER
30       equivalent d un concept ASTER
31    """
32    idracine="SD"
33
34    def __init__(self, etape=None, sd=None, reg='oui'):
35       """
36         reg est un paramètre qui vaut oui ou non :
37           - si oui (défaut) : on enregistre la SD auprès du JDC
38           - si non : on ne l'enregistre pas
39       """
40       self.etape = etape
41       self.sd = sd
42       self.nom = None
43       if etape:
44         self.parent = etape.parent
45       else:
46         self.parent = CONTEXT.get_current_step()
47       if self.parent :
48          self.jdc = self.parent.get_jdc_root()
49       else:
50          self.jdc = None
51
52       if not self.parent:
53         self.id = None
54       elif reg == 'oui' :
55         self.id = self.parent.reg_sd(self)
56       else :
57         self.id = self.parent.o_register(self)
58       # permet de savoir si le concept a été calculé (1) ou non (0)
59       self.executed = 0
60       # permet de savoir si le catalogue de SD a déjà été supprimé (1) ou non (0)
61       self.sd_deleted = 0
62       if self.parent:
63           self.order = self.parent.icmd
64       else:
65           self.order = 0
66
67       # attributs pour le Catalogue de Structure de Données Jeveux
68       # "self.cata_sdj" est un attribut de classe
69       self.ptr_class_sdj = None
70       self.ptr_sdj = None
71       # construit en tant que CO('...')
72       # 0 : assd normal, 1 : type CO, 2 : type CO typé
73       self._as_co = 0
74
75    def _get_sdj(self):
76        """Retourne le catalogue de SD associé au concept."""
77        if self.ptr_sdj is None:
78            cata_sdj = getattr(self, 'cata_sdj', None)
79            assert cata_sdj, "The attribute 'cata_sdj' must be defined in the class %s" \
80                 % self.__class__.__name__
81            assert self.nom, "The attribute 'nom' has not been filled!"
82            if self.ptr_class_sdj is None:
83                self.ptr_class_sdj = import_object(cata_sdj)
84            self.ptr_sdj = self.ptr_class_sdj(nomj=self.nom)
85        return self.ptr_sdj
86
87    def _del_sdj(self):
88        """Suppression du catalogue de SD."""
89        if self.ptr_sdj is not None:
90            self.ptr_sdj.supprime(True)
91            self.ptr_sdj = None
92        self.ptr_class_sdj = None
93
94    sdj = property(_get_sdj, None, _del_sdj)
95
96
97    def __getitem__(self,key):
98       from strfunc import convert
99       text_error = convert(_(u"ASSD.__getitem__ est déprécié car la référence à "
100                              u"l'objet ETAPE parent sera supprimée."))
101       #raise NotImplementedError(text_error)
102       from warnings import warn
103       warn(text_error, DeprecationWarning, stacklevel=2)
104       return self.etape[key]
105
106    def set_name(self, nom):
107       """Positionne le nom de self (et appelle sd_init)
108       """
109       self.nom = nom
110
111    def is_typco(self):
112        """Permet de savoir si l'ASSD est issu d'un type CO.
113        Retourne:
114           0 : ce n'est pas un type CO
115           1 : c'est un type CO, non encore typé
116           2 : c'est un type CO retypé
117        """
118        return self._as_co
119
120    def change_type(self, new_type):
121       """Type connu a posteriori (type CO)."""
122       self.__class__ = new_type
123       assert self._as_co != 0, 'it should only be called on CO object.'
124       self._as_co = 2
125
126    def get_name(self):
127       """
128           Retourne le nom de self, éventuellement en le demandant au JDC
129       """
130       if not self.nom :
131          try:
132             self.nom = self.parent.get_name(self) or self.id
133          except:
134             self.nom = ""
135       if self.nom.find('sansnom') != -1 or self.nom == '':
136          self.nom = self.id
137       return self.nom
138
139    def supprime(self, force=False):
140       """
141       Cassage des boucles de références pour destruction du JDC.
142       'force' est utilisée pour faire des suppressions complémentaires
143       (voir les formules dans N_FONCTION).
144       """
145       self.supprime_sd()
146       self.etape = None
147       self.sd = None
148       self.jdc = None
149       self.parent = None
150
151    def supprime_sd(self):
152       """Supprime la partie du catalogue de SD."""
153       # 'del self.sdj' appellerait la méthode '_get_sdj()'...
154       self._del_sdj()
155
156    def __del__(self):
157        #message.debug(SUPERV, "__del__ ASSD %s <%s>", getattr(self, 'nom', 'unknown'), self)
158        pass
159
160    def accept(self,visitor):
161       """
162          Cette methode permet de parcourir l'arborescence des objets
163          en utilisant le pattern VISITEUR
164       """
165       visitor.visitASSD(self)
166
167    def __getstate__(self):
168       """
169           Cette methode permet de pickler les objets ASSD
170           Ceci est possible car on coupe les liens avec les objets
171           parent, etape et jdc qui conduiraient à pickler de nombreux
172           objets inutiles ou non picklables.
173           En sortie, l'objet n'est plus tout à fait le même !
174       """
175       d = self.__dict__.copy()
176       for key in ('parent', 'etape', 'jdc'):
177           if d.has_key(key):
178               del d[key]
179       for key in d.keys():
180           if key[0] == '_':
181               del d[key]
182       return d
183
184    def accessible(self):
185       """Dit si on peut acceder aux "valeurs" (jeveux) de l'ASSD.
186       """
187       if CONTEXT.debug: print '| accessible ?', self.nom
188       is_accessible = CONTEXT.get_current_step().sd_accessible()
189       if CONTEXT.debug: print '  `- is_accessible =', repr(is_accessible)
190       return is_accessible
191
192    def filter_context(self, context):
193       """Filtre le contexte fourni pour retirer (en gros) ce qui vient du catalogue."""
194       from N_ENTITE import ENTITE
195       import types
196       ctxt = {}
197       for key, value in context.items():
198          if type(value) is types.ClassType:
199             continue
200          if type(value) is types.ModuleType and value.__name__.startswith('Accas'):
201             continue
202          if issubclass(type(value), types.TypeType):
203             continue
204          if isinstance(value, ENTITE):
205             continue
206          ctxt[key] = value
207       return ctxt
208
209    def par_lot(self):
210       """Conserver uniquement pour la compatibilite avec le catalogue v9 dans eficas."""
211       #XXX eficas
212       if not hasattr(self, 'jdc') or self.jdc == None:
213          val = None
214       else:
215          val = self.jdc.par_lot
216       return val == 'OUI'
217
218    def rebuild_sd(self):
219       """Conserver uniquement pour la compatibilite avec le catalogue v10 dans eficas."""
220
221
222 class assd(ASSD):
223     def __convert__(cls, valeur):
224         # On accepte les vraies ASSD et les objets 'entier' et 'reel'
225         # qui font tout pour se faire passer pour de vrais entiers/réels.
226         if isinstance(valeur, ASSD) or type(valeur) in (int, float):
227             return valeur
228         raise ValueError(_(u"On attend un objet concept."))
229     __convert__ = classmethod(__convert__)
230
231
232 class not_checked(ASSD):
233     def __convert__(cls, valeur):
234         return valeur
235     __convert__ = classmethod(__convert__)
236