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