Salome HOME
Modif V6_4_°
[tools/eficas.git] / Noyau / asojb.py
1 #@ MODIF asojb Noyau  DATE 28/06/2011   AUTEUR COURTOIS M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 # RESPONSABLE COURTOIS M.COURTOIS
4 #            CONFIGURATION MANAGEMENT OF EDF VERSION
5 # ======================================================================
6 # COPYRIGHT (C) 1991 - 2011  EDF R&D                  WWW.CODE-ASTER.ORG
7 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
8 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
9 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
10 # (AT YOUR OPTION) ANY LATER VERSION.
11 #
12 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
13 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
14 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
15 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
16 #
17 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
18 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
19 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
20 # ======================================================================
21
22 """
23    Description des OJB jeveux
24 """
25 from basetype import Type
26 from asnom import SDNom
27 from ascheckers import CheckLog
28 import traceback,sys
29
30 # pour utilisation dans eficas
31 try:
32    import aster
33    from Utilitai.Utmess import UTMESS
34 except:
35    pass
36
37 # -----------------------------------------------------------------------------
38 class AsBase(Type):
39     nomj = SDNom()
40     optional = False
41
42     def __init__(self, nomj=None, *args, **kwargs ):
43         super(AsBase,self).__init__( nomj, *args, **kwargs )
44         assert self.nomj is not self.__class__.nomj
45         if isinstance( nomj, str ):
46             self.nomj.nomj = nomj
47         elif isinstance( nomj, SDNom ):
48             self.nomj.update( nomj.__getstate__() )
49
50     def set_name(self, nomj):
51         """Positionne le nomj de self
52         """
53         assert isinstance( self.nomj.nomj, str ), "uniquement pour les concepts"
54         self.nomj.nomj = nomj
55
56     def check(self, checker=None):
57         if checker is None:
58             checker = CheckLog()
59
60         # vérif déjà faite ? (en tenant compte du type)
61         if checker.checkedAsBase(self):
62             return checker
63         checker.visitAsBase( self )
64
65         # vérifie les enfants :
66         optional = checker.optional
67         checker.optional = checker.optional or self.optional
68         for name in self._subtypes:
69             v = getattr(self, name)
70             if isinstance( v, (OJB,AsBase) ):
71                 v.check(checker)
72         for name in dir(self):
73             if name.startswith( 'check_' ):
74                 v = getattr(self, name)
75                 if callable(v):
76                     try :
77                         v( checker )
78                     except :
79                         mess=60*'-'+'\n'
80                         mess=mess+'Erreur SDVERI (Attention : vérification incomplète)'+'\n'
81                         mess=mess.join(traceback.format_tb(sys.exc_traceback))
82                         checker.err(self,mess)
83
84         checker.optional = optional
85         return checker
86
87     def members( self ):
88         pass
89
90     def dump(self, indent=""):
91         import pydoc
92         l = []
93         checkers = []
94         nomj = self.nomj()
95         if self.optional:
96             f = "(f)"
97         else:
98             f = "(o)"
99         l.append( f+" "+nomj )
100         #l.append( '-'*(len(nomj)+3) )
101         for name in self._subtypes:
102             obj = getattr(self, name)
103             if isinstance(obj,(AsBase,OJB)):
104                 l.append( obj.dump(indent) )
105         for name in dir(self):
106             if name.startswith( 'check_' ):
107                 obj = getattr(self, name)
108                 if callable(obj) and name.startswith("check_"):
109                     checkers.append( obj )
110
111         indent = " "*len(nomj)
112         for checker in checkers:
113             doc = pydoc.text.document( checker )
114             for line in doc.splitlines():
115                 l.append( indent + line )
116         return "\n".join( l )
117
118     def short_repr(self):
119         return "<%s(%x,%r)>" % (self.__class__.__name__, id(self), self.nomj() )
120
121     def long_repr(self):
122         if not hasattr(self, "accessible") or not self.accessible():
123            # hors Aster ou en par_lot='oui'
124            return self.short_repr()
125         else:
126            from Cata.cata import IMPR_CO, _F
127            IMPR_CO(CONCEPT=_F(NOM=self.nom), UNITE=6)
128            return ''
129
130     def __repr__(self):
131         # par défaut, on fait court !
132         return self.short_repr()
133
134
135 # -----------------------------------------------------------------------------
136 class JeveuxAttr(object):
137     """Un attribut jeveux"""
138     def __init__(self, name):
139         self.name = name
140
141     def __get__(self, obj, klass):
142         raise NotImplementedError
143
144     def check(self, attrname, obj, log ):
145         checker = getattr(obj, "_"+attrname, None )
146         if checker is None:
147             return True
148         val = self.__get__( obj, obj.__class__ )
149         if callable( checker ):
150             return checker( obj, attrname, val, log )
151         else:
152             test = val == checker
153             if not test:
154                 log.err( obj, "Attribut incorrect %s %r!=%r" % (self.name, val, checker ) )
155             return test
156
157 # -----------------------------------------------------------------------------
158 class JeveuxExists(JeveuxAttr):
159     def __init__(self):
160         pass
161
162     def __get__(self, obj, klass):
163         if obj is None:
164             return self
165         nomj = obj.nomj()
166         if len(nomj)!=24:
167             raise AssertionError(repr(nomj))
168         return aster.jeveux_exists( nomj.ljust(24) )
169
170 # -----------------------------------------------------------------------------
171 class JeveuxIntAttr(JeveuxAttr):
172     def __get__(self, obj, klass):
173         if obj is None:
174             return self
175         nomj = obj.nomj()
176         if aster.jeveux_exists( nomj ):
177             return aster.jeveux_getattr( nomj, self.name )[0]
178         else :
179             return None
180
181 # -----------------------------------------------------------------------------
182 class JeveuxStrAttr(JeveuxAttr):
183     def __get__(self, obj, klass):
184         if obj is None:
185             return self
186         nomj = obj.nomj()
187         if aster.jeveux_exists( nomj ):
188             return aster.jeveux_getattr( nomj, self.name )[1].strip()
189         else :
190             return None
191
192 # -----------------------------------------------------------------------------
193 class OJB(AsBase):
194     _clas = None
195     _genr = None
196     _type = None
197     _ltyp = None
198     _xous = None
199     _docu = None
200     _exists = True
201
202     clas = JeveuxStrAttr("CLAS")
203     genr = JeveuxStrAttr("GENR")
204     type = JeveuxStrAttr("TYPE")
205     ltyp = JeveuxIntAttr("LTYP")
206     xous = JeveuxStrAttr("XOUS")
207     docu = JeveuxStrAttr("DOCU")
208     exists = JeveuxExists()
209     #optional = False
210     nomj = SDNom()
211
212     def __init__(self, nomj=None, **attrs):
213         super(OJB,self).__init__( nomj, **attrs )
214         self.foreachattr( self.setattribute, attrs )
215         self.optional = attrs.get('optional', False)
216
217     def setattribute( self, name, prop, attrs ):
218         _name = "_"+name
219         if name in attrs:
220             setattr( self, _name, attrs[name] )
221
222     def get(self):
223         nomj = self.nomj()
224         if aster.jeveux_exists( nomj ):
225             obj_simple = aster.jeveux_getattr( nomj, 'XOUS')[1].strip() == 'S'
226             if obj_simple :
227                 return aster.getvectjev( nomj )
228             else :
229                 return aster.getcolljev( nomj )
230         else:
231             return None
232
233     def get_stripped(self):
234         """Fonction utilitaire, renvoie une liste de chaines 'strippées'"""
235         data = self.get()
236         if data is not None:
237             return [ x.strip() for x in data ]
238         else:
239             return []
240
241     def foreachattr(self, callable, *args, **kwargs):
242         klass = self.__class__
243         for k in dir(klass):
244             v = getattr( klass, k )
245             if isinstance(v, JeveuxAttr):
246                 callable( k, v, *args, **kwargs )
247
248     def check(self, checker=None):
249         if checker is None:
250             checker = CheckLog()
251         # l'objet a déjà été vérifié, on ne fait rien
252         if checker.checkedOJB(self):
253            return checker
254         checker.visitOJB( self )
255         if self.exists:
256             self.foreachattr( lambda k,v,obj,c: v.check(k, obj, c),
257                               self, checker )
258         else:
259             if not self.optional and not checker.optional :
260                 checker.err( self, "n'existe pas (%r)" %self._parent )
261         return checker
262
263     def dump(self, indent=""):
264         if self.optional:
265             f = "(f)"
266         else:
267             f = "(o)"
268         return f +" "+ self.nomj() +" "+ str(self.exists)
269
270 # -----------------------------------------------------------------------------
271 def Facultatif( ojb ):
272     ojb.optional = True
273     return ojb
274
275 # -----------------------------------------------------------------------------
276 class OJBVect(OJB):
277     lonmax = JeveuxIntAttr("LONMAX")
278     lonuti = JeveuxIntAttr("LONUTI")
279     _xous = "S"
280     _genr = "V"
281
282 # -----------------------------------------------------------------------------
283 class OJBPtnom(OJB):
284     nommax = JeveuxIntAttr("NOMMAX")
285     nomuti = JeveuxIntAttr("NOMUTI")
286     _xous = "S"
287     _genr = "N"
288     _type = "K"
289
290 # -----------------------------------------------------------------------------
291 class OJBCollec(OJB):
292     stockage = JeveuxStrAttr("STOCKAGE")
293     nutioc = JeveuxIntAttr( "NUTIOC" )
294     acces = JeveuxStrAttr( "ACCES" )
295     modelong = JeveuxStrAttr( "MODELONG" )
296     nmaxoc = JeveuxIntAttr( "NMAXOC" )
297
298 # -----------------------------------------------------------------------------
299 class AsVI(OJBVect):
300     _type = "I"
301
302 # -----------------------------------------------------------------------------
303 class AsVS(OJBVect):
304     _type = "S"
305
306 # -----------------------------------------------------------------------------
307 class AsVR(OJBVect):
308     _type = "R"
309
310 # -----------------------------------------------------------------------------
311 class AsVC(OJBVect):
312     _type = "C"
313
314 # -----------------------------------------------------------------------------
315 class AsVL(OJBVect):
316     _type = "L"
317
318 # -----------------------------------------------------------------------------
319 class AsVK8(OJBVect):
320     _type = "K"
321     _ltyp = 8
322
323 # -----------------------------------------------------------------------------
324 class AsVK16(OJBVect):
325     _type = "K"
326     _ltyp = 16
327
328 # -----------------------------------------------------------------------------
329 class AsVK24(OJBVect):
330     _type = "K"
331     _ltyp = 24
332
333 # -----------------------------------------------------------------------------
334 class AsVK32(OJBVect):
335     _type = "K"
336     _ltyp = 32
337
338 # -----------------------------------------------------------------------------
339 class AsVK80(OJBVect):
340     _type = "K"
341     _ltyp = 80
342
343 # Pour compatibilite
344 AsObject = OJB
345 AsColl   = OJBCollec
346 AsPn     = OJBPtnom
347 AsVect   = OJBVect