1 # -*- coding: iso-8859-1 -*-
3 # Copyright (C) 2007-2013 EDF R&D
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.
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.
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
19 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
24 from N_utils import import_object
25 from N_info import message, SUPERV
29 Classe de base pour definir des types de structures de donnees ASTER
30 equivalent d un concept ASTER
34 def __init__(self, etape=None, sd=None, reg='oui'):
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
44 self.parent = etape.parent
46 self.parent = CONTEXT.get_current_step()
48 self.jdc = self.parent.get_jdc_root()
55 self.id = self.parent.reg_sd(self)
57 self.id = self.parent.o_register(self)
58 # permet de savoir si le concept a été calculé (1) ou non (0)
60 # permet de savoir si le catalogue de SD a déjà été supprimé (1) ou non (0)
63 self.order = self.parent.icmd
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
71 # construit en tant que CO('...')
72 # 0 : assd normal, 1 : type CO, 2 : type CO typé
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)
88 """Suppression du catalogue de SD."""
89 if self.ptr_sdj is not None:
90 self.ptr_sdj.supprime(True)
92 self.ptr_class_sdj = None
94 sdj = property(_get_sdj, None, _del_sdj)
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]
106 def set_name(self, nom):
107 """Positionne le nom de self (et appelle sd_init)
112 """Permet de savoir si l'ASSD est issu d'un type CO.
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é
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.'
128 Retourne le nom de self, éventuellement en le demandant au JDC
132 self.nom = self.parent.get_name(self) or self.id
135 if self.nom.find('sansnom') != -1 or self.nom == '':
139 def supprime(self, force=False):
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).
151 def supprime_sd(self):
152 """Supprime la partie du catalogue de SD."""
153 # 'del self.sdj' appellerait la méthode '_get_sdj()'...
157 #message.debug(SUPERV, "__del__ ASSD %s <%s>", getattr(self, 'nom', 'unknown'), self)
160 def accept(self,visitor):
162 Cette methode permet de parcourir l'arborescence des objets
163 en utilisant le pattern VISITEUR
165 visitor.visitASSD(self)
167 def __getstate__(self):
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 !
175 d = self.__dict__.copy()
176 for key in ('parent', 'etape', 'jdc'):
184 def accessible(self):
185 """Dit si on peut acceder aux "valeurs" (jeveux) de l'ASSD.
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)
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
197 for key, value in context.items():
198 if type(value) is types.ClassType:
200 if type(value) is types.ModuleType and value.__name__.startswith('Accas'):
202 if issubclass(type(value), types.TypeType):
204 if isinstance(value, ENTITE):
210 """Conserver uniquement pour la compatibilite avec le catalogue v9 dans eficas."""
212 if not hasattr(self, 'jdc') or self.jdc == None:
215 val = self.jdc.par_lot
218 def rebuild_sd(self):
219 """Conserver uniquement pour la compatibilite avec le catalogue v10 dans eficas."""
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):
228 raise ValueError(_(u"On attend un objet concept."))
229 __convert__ = classmethod(__convert__)
232 class not_checked(ASSD):
233 def __convert__(cls, valeur):
235 __convert__ = classmethod(__convert__)