]> SALOME platform Git repositories - tools/eficas.git/blob - Noyau/asojb.py
Salome HOME
eaf091ec1edc063eef06459aa0f52fa5a808c4c2
[tools/eficas.git] / Noyau / asojb.py
1 #@ MODIF asojb Noyau  DATE 04/06/2007   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 U2MESS as 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érifie les enfants :
60         optional = checker.optional
61         checker.optional = checker.optional or self.optional
62         for name in self._subtypes:
63             v = getattr(self, name)
64             if isinstance( v, (OJB,AsBase) ):
65                 v.check(checker)
66         for name in dir(self):
67             if name.startswith( 'check_' ):
68                 v = getattr(self, name)
69                 if callable(v):
70                     try :
71                         v( checker )
72                     except :
73                         UTMESS("E", 'SDVERI_45')
74                         print 40*'-'
75                         traceback.print_exc(file=sys.stdout)
76
77         checker.optional = optional
78         return checker
79
80     def members( self ):
81         pass
82
83     def dump(self, indent=""):
84         import pydoc
85         l = []
86         checkers = []
87         nomj = self.nomj()
88         if self.optional:
89             f = "(f)"
90         else:
91             f = "(o)"
92         l.append( f+" "+nomj )
93         #l.append( '-'*(len(nomj)+3) )
94         for name in self._subtypes:
95             obj = getattr(self, name)
96             if isinstance(obj,(AsBase,OJB)):
97                 l.append( obj.dump(indent) )
98         for name in dir(self):
99             if name.startswith( 'check_' ):
100                 obj = getattr(self, name)
101                 if callable(obj) and name.startswith("check_"):
102                     checkers.append( obj )
103
104         indent = " "*len(nomj)
105         for checker in checkers:
106             doc = pydoc.text.document( checker )
107             for line in doc.splitlines():
108                 l.append( indent + line )
109         return "\n".join( l )
110
111     def __repr__(self):
112         return "<%s(%x,%r)>" % (self.__class__.__name__, id(self), self.nomj() )
113
114
115 # -----------------------------------------------------------------------------
116 class JeveuxAttr(object):
117     """Un attribut jeveux"""
118     def __init__(self, name):
119         self.name = name
120
121     def __get__(self, obj, klass):
122         raise NotImplementedError
123
124     def check(self, attrname, obj, log ):
125         checker = getattr(obj, "_"+attrname, None )
126         if checker is None:
127             return True
128         val = self.__get__( obj, obj.__class__ )
129         if callable( checker ):
130             return checker( obj, attrname, val, log )
131         else:
132             test = val == checker
133             if not test:
134                 log.err( obj, "Attribut incorrect %s %r!=%r" % (self.name, val, checker ) )
135             return test
136
137 # -----------------------------------------------------------------------------
138 class JeveuxExists(JeveuxAttr):
139     def __init__(self):
140         pass
141
142     def __get__(self, obj, klass):
143         if obj is None:
144             return self
145         nomj = obj.nomj()
146         if len(nomj)!=24:
147             raise AssertionError(repr(nomj))
148         return aster.jeveux_exists( nomj.ljust(24) )
149
150 # -----------------------------------------------------------------------------
151 class JeveuxIntAttr(JeveuxAttr):
152     def __get__(self, obj, klass):
153         if obj is None:
154             return self
155         return aster.jeveux_getattr( obj.nomj(), self.name )[0]
156
157 # -----------------------------------------------------------------------------
158 class JeveuxStrAttr(JeveuxAttr):
159     def __get__(self, obj, klass):
160         if obj is None:
161             return self
162         return aster.jeveux_getattr( obj.nomj(), self.name )[1].strip()
163
164 # -----------------------------------------------------------------------------
165 class OJB(AsBase):
166     _clas = None
167     _genr = None
168     _type = None
169     _ltyp = None
170     _xous = None
171     _docu = None
172     _exists = True
173
174     clas = JeveuxStrAttr("CLAS")
175     genr = JeveuxStrAttr("GENR")
176     type = JeveuxStrAttr("TYPE")
177     ltyp = JeveuxIntAttr("LTYP")
178     xous = JeveuxStrAttr("XOUS")
179     docu = JeveuxStrAttr("DOCU")
180     exists = JeveuxExists()
181     #optional = False
182     nomj = SDNom()
183
184     def __init__(self, nomj=None, **attrs):
185         super(OJB,self).__init__( nomj, **attrs )
186         self.foreachattr( self.setattribute, attrs )
187         self.optional = attrs.get('optional', False)
188
189     def setattribute( self, name, prop, attrs ):
190         _name = "_"+name
191         if name in attrs:
192             setattr( self, _name, attrs[name] )
193
194     def get(self):
195         nomj = self.nomj()
196         if aster.jeveux_exists( nomj ):
197             obj_simple = aster.jeveux_getattr( nomj, 'XOUS')[1].strip() == 'S'
198             if obj_simple :
199                 return aster.getvectjev( nomj )
200             else :
201                 return aster.getcolljev( nomj )
202         else:
203             return None
204
205     def get_stripped(self):
206         """Fonction utilitaire, renvoie une liste de chaines 'strippées'"""
207         data = self.get()
208         if data is not None:
209             return [ x.strip() for x in self.get() ]
210         else:
211             return []
212
213     def foreachattr(self, callable, *args, **kwargs):
214         klass = self.__class__
215         for k in dir(klass):
216             v = getattr( klass, k )
217             if isinstance(v, JeveuxAttr):
218                 callable( k, v, *args, **kwargs )
219
220     def check(self, checker=None):
221         if checker is None:
222             checker = CheckLog()
223         # l'objet a déjà été vérifié, on ne fait rien
224         if self.nomj() in checker.names.keys():
225             return checker
226         checker.visit( self )
227         if self.exists:
228             self.foreachattr( lambda k,v,obj,c: v.check(k, obj, c),
229                               self, checker )
230         else:
231             if not self.optional and not checker.optional :
232                 checker.err( self, "n'existe pas (%r)" %self._parent )
233         return checker
234
235     def dump(self, indent=""):
236         if self.optional:
237             f = "(f)"
238         else:
239             f = "(o)"
240         return f +" "+ self.nomj() +" "+ str(self.exists)
241
242 # -----------------------------------------------------------------------------
243 def Facultatif( ojb ):
244     ojb.optional = True
245     return ojb
246
247 # -----------------------------------------------------------------------------
248 class OJBVect(OJB):
249     lonmax = JeveuxIntAttr("LONMAX")
250     lonuti = JeveuxIntAttr("LONUTI")
251
252 # -----------------------------------------------------------------------------
253 class OJBCollec(OJB):
254     stockage = JeveuxStrAttr("STOCKAGE")
255     nutioc = JeveuxIntAttr( "NUTIOC" )
256     acces = JeveuxStrAttr( "ACCES" )
257     modelong = JeveuxStrAttr( "MODELONG" )
258     nmaxoc = JeveuxIntAttr( "NMAXOC" )
259
260 # -----------------------------------------------------------------------------
261 class AsVI(OJBVect):
262     _type = "I"
263
264 # -----------------------------------------------------------------------------
265 class AsVR(OJBVect):
266     _type = "R"
267
268 # -----------------------------------------------------------------------------
269 class AsVC(OJBVect):
270     _type = "C"
271
272 # -----------------------------------------------------------------------------
273 class AsVL(OJBVect):
274     _type = "L"
275
276 # -----------------------------------------------------------------------------
277 class AsVK8(OJBVect):
278     _type = "K"
279     _ltyp = 8
280
281 # -----------------------------------------------------------------------------
282 class AsVK16(OJBVect):
283     _type = "K"
284     _ltyp = 16
285
286 # -----------------------------------------------------------------------------
287 class AsVK24(OJBVect):
288     _type = "K"
289     _ltyp = 24
290
291 # -----------------------------------------------------------------------------
292 class AsVK32(OJBVect):
293     _type = "K"
294     _ltyp = 32
295
296 # -----------------------------------------------------------------------------
297 class AsVK80(OJBVect):
298     _type = "K"
299     _ltyp = 80
300
301 # Pour compatibilite
302 AsColl = OJBCollec
303 AsObject = OJB