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