X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=Noyau%2FN_ASSD.py;h=cee339dc48cab455f5e042e618c1e252571e802d;hb=9a70f047c05012091a3cf8c6efc48b39ab2bb6e9;hp=6a6ccf94c2afbd67318569526c702cb5690daeba;hpb=61f2a263b67981f299c496ce7ef8bccc3ac6e68b;p=tools%2Feficas.git diff --git a/Noyau/N_ASSD.py b/Noyau/N_ASSD.py index 6a6ccf94..cee339dc 100644 --- a/Noyau/N_ASSD.py +++ b/Noyau/N_ASSD.py @@ -1,150 +1,236 @@ -#@ MODIF N_ASSD Noyau DATE 14/12/2009 AUTEUR COURTOIS M.COURTOIS -# -*- coding: iso-8859-1 -*- -# RESPONSABLE COURTOIS M.COURTOIS -# CONFIGURATION MANAGEMENT OF EDF VERSION -# ====================================================================== -# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG -# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY -# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY -# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR -# (AT YOUR OPTION) ANY LATER VERSION. +# coding=utf-8 +# Copyright (C) 2007-2017 EDF R&D # -# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT -# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF -# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU -# GENERAL PUBLIC LICENSE FOR MORE DETAILS. +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. # -# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE -# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER, -# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE. -# -# -# ====================================================================== - +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com """ """ + +from __future__ import absolute_import +from __future__ import print_function +try : + from builtins import object +except : pass + class ASSD(object): - """ - Classe de base pour definir des types de structures de donnees ASTER - equivalent d un concept ASTER - """ - idracine="SD" - - def __init__(self,etape=None,sd=None,reg='oui'): - """ - reg est un paramètre qui vaut oui ou non : - - si oui (défaut) : on enregistre la SD auprès du JDC - - si non : on ne l'enregistre pas - """ - self.etape=etape - self.sd=sd - self.nom=None - if etape: - self.parent=etape.parent - else: - self.parent=CONTEXT.get_current_step() - if self.parent : - self.jdc = self.parent.get_jdc_root() - else: - self.jdc = None - - if not self.parent: - self.id=None - elif reg == 'oui' : - self.id = self.parent.reg_sd(self) - else : - self.id = self.parent.o_register(self) - # permet de savoir si le concept a été calculé (1) ou non (0) - self.executed = 0 - - def __getitem__(self,key): - return self.etape[key] - - def set_name(self, nom): - """Positionne le nom de self (et appelle sd_init) - """ - self.nom = nom - # initialise la partie "sd" (pas pour entier, reel, formule) - sup = super(ASSD, self) - if hasattr(sup, 'nomj'): # == AsBase - sup.__init__(nomj=nom) - self.reparent_sd() - - def reparent_sd(self): - """Repositionne le parent des attributs de la SD associée. - """ - sup = super(ASSD, self) - if hasattr(sup, 'nomj'): # == AsBase - sup.reparent(None, None) - - def get_name(self): - """ - Retourne le nom de self, éventuellement en le demandant au JDC - """ - if not self.nom : - try: - self.nom=self.parent.get_name(self) or self.id - except: - self.nom="" - if self.nom.find('sansnom') != -1 or self.nom == '': - self.nom = self.id - return self.nom - - def supprime(self): - """ - Cassage des boucles de références pour destruction du JDC - """ - self.etape = None - self.sd = None - self.jdc = None - self.parent = None - - def accept(self,visitor): - """ - Cette methode permet de parcourir l'arborescence des objets - en utilisant le pattern VISITEUR - """ - visitor.visitASSD(self) - - def __getstate__(self): - """ - Cette methode permet de pickler les objets ASSD - Ceci est possible car on coupe les liens avec les objets - parent, etape et jdc qui conduiraient à pickler de nombreux - objets inutiles ou non picklables. - """ - d=self.__dict__.copy() - for key in ('parent','etape','jdc'): - if d.has_key(key):del d[key] - for key in d.keys(): - if key[0]=='_':del d[key] - return d - - - def accessible(self): - """Dit si on peut acceder aux "valeurs" (jeveux) de l'ASSD. - """ - if CONTEXT.debug: print '| accessible ?', self.nom - is_accessible = CONTEXT.get_current_step().sd_accessible() - if CONTEXT.debug: print ' `- is_accessible =', repr(is_accessible) - return is_accessible - - - def par_lot(self): - """Conserver uniquement pour la compatibilite avec le catalogue v9 dans eficas. - """ - #XXX eficas - if not hasattr(self, 'jdc') or self.jdc == None: - val = None - else: - val = self.jdc.par_lot - return val == 'OUI' + + """ + Classe de base pour definir des types de structures de donnees ASTER + equivalent d un concept ASTER + """ + idracine = "SD" + + def __init__(self, etape=None, sd=None, reg='oui'): + """ + reg est un parametre qui vaut oui ou non : + - si oui (défaut) : on enregistre la SD aupres du JDC + - si non : on ne l'enregistre pas + """ + self.etape = etape + self.sd = sd + self.nom = None + if etape: + self.parent = etape.parent + else: + self.parent = CONTEXT.get_current_step() + if self.parent: + self.jdc = self.parent.get_jdc_root() + else: + self.jdc = None + + if not self.parent: + self.id = None + elif reg == 'oui': + self.id = self.parent.reg_sd(self) + else: + self.id = self.parent.o_register(self) + # permet de savoir si le concept a été calculé (1) ou non (0) + self.executed = 0 + if self.parent: + self.order = self.parent.icmd + else: + self.order = 0 + # attributs pour le Catalogue de Structure de Données Jeveux + # "self.cata_sdj" est un attribut de classe + self.ptr_class_sdj = None + self.ptr_sdj = None + # construit en tant que CO('...') + # 0 : assd normal, 1 : type CO, 2 : type CO typé + self._as_co = 0 + + def _get_sdj(self): + """Retourne le catalogue de SD associé au concept.""" + if self.ptr_sdj is None: + cata_sdj = getattr(self, 'cata_sdj', None) + assert cata_sdj, "The attribute 'cata_sdj' must be defined in the class %s" \ + % self.__class__.__name__ + assert self.nom, "The attribute 'nom' has not been filled!" + if self.ptr_class_sdj is None: + self.ptr_class_sdj = import_object(cata_sdj) + self.ptr_sdj = self.ptr_class_sdj(nomj=self.nom) + return self.ptr_sdj + + def _del_sdj(self): + """Suppression du catalogue de SD.""" + if self.ptr_sdj is not None: + self.ptr_sdj.supprime(True) + self.ptr_sdj = None + self.ptr_class_sdj = None + + sdj = property(_get_sdj, None, _del_sdj) + + def __getitem__(self, key): + text_error = "ASSD.__getitem__ est déprécié car la référence a l'objet ETAPE parent sera supprimée." + from warnings import warn + warn(text_error, DeprecationWarning, stacklevel=2) + return self.etape[key] + + def set_name(self, nom): + """Positionne le nom de self (et appelle sd_init) + """ + self.nom = nom + + def is_typco(self): + """Permet de savoir si l'ASSD est issu d'un type CO. + Retourne: + 0 : ce n'est pas un type CO + 1 : c'est un type CO, non encore typé + 2 : c'est un type CO retypé + """ + return self._as_co + + def change_type(self, new_type): + """Type connu a posteriori (type CO).""" + self.__class__ = new_type + assert self._as_co != 0, 'it should only be called on CO object.' + self._as_co = 2 + + def get_name(self): + """ + Retourne le nom de self, éventuellement en le demandant au JDC + """ + if not self.nom: + try: + self.nom = self.parent.get_name(self) or self.id + except: + self.nom = "" + if self.nom.find('sansnom') != -1 or self.nom == '': + self.nom = self.id + return self.nom + + def supprime(self, force=False): + """ + Cassage des boucles de références pour destruction du JDC. + 'force' est utilisée pour faire des suppressions complémentaires + (voir les formules dans N_FONCTION). + """ + self.supprime_sd() + self.etape = None + self.sd = None + self.jdc = None + self.parent = None + + def supprime_sd(self): + """Supprime la partie du catalogue de SD.""" + # 'del self.sdj' appellerait la méthode '_get_sdj()'... + self._del_sdj() + + + def accept(self, visitor): + """ + Cette methode permet de parcourir l'arborescence des objets + en utilisant le pattern VISITEUR + """ + visitor.visitASSD(self) + + def __getstate__(self): + """ + Cette methode permet de pickler les objets ASSD + Ceci est possible car on coupe les liens avec les objets + parent, etape et jdc qui conduiraient a pickler de nombreux + objets inutiles ou non picklables. + En sortie, l'objet n'est plus tout a fait le même ! + """ + d = self.__dict__.copy() + for key in ('parent', 'etape', 'jdc'): + if key in d : + del d[key] + for key in list(d.keys()): + if key in ('_as_co', ): + continue + if key[0] == '_': + del d[key] + return d + + def accessible(self): + """Dit si on peut acceder aux "valeurs" (jeveux) de l'ASSD. + """ + if CONTEXT.debug: + print(('| accessible ?', self.nom)) + is_accessible = CONTEXT.get_current_step().sd_accessible() + if CONTEXT.debug: + print((' `- is_accessible =', repr(is_accessible))) + return is_accessible + + def filter_context(self, context): + """Filtre le contexte fourni pour retirer (en gros) ce qui vient du catalogue.""" + from .N_ENTITE import ENTITE + import types + ctxt = {} + for key, value in list(context.items()): + if type(value) is type: + continue + if type(value) is types.ModuleType and value.__name__.startswith('Accas'): + continue + if issubclass(type(value), type): + continue + if isinstance(value, ENTITE): + continue + ctxt[key] = value + return ctxt + + def par_lot(self): + """Conserver uniquement pour la compatibilite avec le catalogue v9 dans eficas.""" + # XXX eficas + if not hasattr(self, 'jdc') or self.jdc == None: + val = None + else: + val = self.jdc.par_lot + return val == 'OUI' + + def rebuild_sd(self): + """Conserver uniquement pour la compatibilite avec le catalogue v10 dans eficas.""" class assd(ASSD): - def __convert__(cls,valeur): - return valeur - __convert__=classmethod(__convert__) + + def __convert__(cls, valeur): + # On accepte les vraies ASSD et les objets 'entier' et 'reel' + # qui font tout pour se faire passer pour de vrais entiers/réels. + if isinstance(valeur, ASSD) or type(valeur) in (int, float): + return valeur + raise ValueError(_(u"On attend un objet concept.")) + __convert__ = classmethod(__convert__) + + +class not_checked(ASSD): + + def __convert__(cls, valeur): + return valeur + __convert__ = classmethod(__convert__)