Salome HOME
pour pytel
[tools/eficas.git] / Noyau / asojb.py
1 # coding=utf-8
2 # person_in_charge: mathieu.courtois at edf.fr
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2015  EDF R&D                  WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
9 #
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 #
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
18 # ======================================================================
19
20 """
21    Description des OJB jeveux
22 """
23 from basetype import Type
24 from asnom import SDNom
25 from ascheckers import CheckLog
26 import traceback
27 import 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
38
39 class AsBase(Type):
40     nomj = SDNom()
41     optional = False
42
43     def __init__(self, nomj=None, *args, **kwargs):
44         super(AsBase, self).__init__(nomj, *args, **kwargs)
45         assert self.nomj is not self.__class__.nomj
46         if isinstance(nomj, str):
47             self.nomj.nomj = nomj
48         elif isinstance(nomj, SDNom):
49             self.nomj.update(nomj.__getstate__())
50
51     def set_name(self, nomj):
52         """Positionne le nomj de self
53         """
54         assert isinstance(self.nomj.nomj, str), "uniquement pour les concepts"
55         self.nomj.nomj = nomj
56
57     def check(self, checker=None):
58         if checker is None:
59             checker = CheckLog()
60
61         # vérif déjà faite ? (en tenant compte du type)
62         if checker.checkedAsBase(self):
63             return checker
64         checker.visitAsBase(self)
65
66         # vérifie les enfants :
67         optional = checker.optional
68         checker.optional = checker.optional or self.optional
69         for name in self._subtypes:
70             v = getattr(self, name)
71             if isinstance(v, (OJB, AsBase)):
72                 v.check(checker)
73         for name in dir(self):
74             if name.startswith('check_'):
75                 v = getattr(self, name)
76                 if callable(v):
77                     try:
78                         v(checker)
79                     except:
80                         mess = 60 * '-' + '\n'
81                         mess = mess + \
82                             'Erreur SDVERI (Attention : vérification incomplète)' + \
83                             '\n'
84                         mess = mess.join(
85                             traceback.format_tb(sys.exc_traceback))
86                         checker.err(self, mess)
87
88         checker.optional = optional
89         return checker
90
91     def dump(self, indent=""):
92         import pydoc
93         l = []
94         checkers = []
95         nomj = self.nomj()
96         if self.optional:
97             f = "(f)"
98         else:
99             f = "(o)"
100         l.append(f + " " + nomj)
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
138     """Un attribut jeveux"""
139
140     def __init__(self, name):
141         self.name = name
142
143     def __get__(self, obj, klass):
144         raise NotImplementedError
145
146     def check(self, attrname, obj, log):
147         checker = getattr(obj, "_" + attrname, None)
148         if checker is None:
149             return True
150         val = self.__get__(obj, obj.__class__)
151         if callable(checker):
152             return checker(obj, attrname, val, log)
153         elif val == checker:
154             return True
155         else:
156             log.err(obj, "Attribut incorrect %s %r!=%r" %
157                     (self.name, val, checker))
158             return False
159
160 # -----------------------------------------------------------------------------
161
162
163 class JeveuxExists(JeveuxAttr):
164
165     def __init__(self):
166         pass
167
168     def __get__(self, obj, klass):
169         if obj is None:
170             return self
171         nomj = obj.nomj()
172         if len(nomj) != 24:
173             raise AssertionError(repr(nomj))
174         return aster.jeveux_exists(nomj.ljust(24))
175
176 # -----------------------------------------------------------------------------
177
178
179 class JeveuxIntAttr(JeveuxAttr):
180
181     def __get__(self, obj, klass):
182         if obj is None:
183             return self
184         nomj = obj.nomj()
185         if aster.jeveux_exists(nomj):
186             return aster.jeveux_getattr(nomj, self.name)[0]
187         else:
188             return None
189
190 # -----------------------------------------------------------------------------
191
192
193 class JeveuxStrAttr(JeveuxAttr):
194
195     def __get__(self, obj, klass):
196         if obj is None:
197             return self
198         nomj = obj.nomj()
199         if aster.jeveux_exists(nomj):
200             return aster.jeveux_getattr(nomj, self.name)[1].strip()
201         else:
202             return None
203
204 # -----------------------------------------------------------------------------
205
206
207 class OJB(AsBase):
208     _clas = None
209     _genr = None
210     _type = None
211     _ltyp = None
212     _xous = None
213     _docu = None
214     _exists = True
215
216     clas = JeveuxStrAttr("CLAS")
217     genr = JeveuxStrAttr("GENR")
218     type = JeveuxStrAttr("TYPE")
219     ltyp = JeveuxIntAttr("LTYP")
220     xous = JeveuxStrAttr("XOUS")
221     docu = JeveuxStrAttr("DOCU")
222     exists = JeveuxExists()
223     nomj = SDNom()
224
225     def __init__(self, nomj=None, **attrs):
226         super(OJB, self).__init__(nomj, **attrs)
227         self.foreachattr(self.setattribute, attrs)
228         self.optional = attrs.get('optional', False)
229
230     def setattribute(self, name, prop, attrs):
231         _name = "_" + name
232         if name in attrs:
233             setattr(self, _name, attrs[name])
234
235     def get(self):
236         nomj = self.nomj()
237         if aster.jeveux_exists(nomj):
238             obj_simple = aster.jeveux_getattr(nomj, 'XOUS')[1].strip() == 'S'
239             if obj_simple:
240                 return aster.getvectjev(nomj)
241             else:
242                 return aster.getcolljev(nomj)
243         else:
244             return None
245
246     def changeJeveuxValues(self, nbval, indices, reel, imag, num = 1):
247         """Modify values of existing data structures"""
248         nomj = self.nomj()
249         if aster.jeveux_exists(nomj):
250             obj_simple = aster.jeveux_getattr(nomj, 'XOUS')[1].strip() == 'S'
251             if obj_simple:
252                 assert num==1,"""For vectors last argument must be set to 1"""
253             # aster.putvectjev can be used for vectors (num=1) and collections
254             aster.putvectjev(nomj, nbval, indices, reel, imag, num)
255
256     def get_stripped(self):
257         """Fonction utilitaire, renvoie une liste de chaines 'strippées'"""
258         data = self.get()
259         if data is not None:
260             return [x.strip() for x in data]
261         else:
262             return []
263
264     def foreachattr(self, callback, *args, **kwargs):
265         klass = self.__class__
266         for k in dir(klass):
267             v = getattr(klass, k)
268             if isinstance(v, JeveuxAttr):
269                 callback(k, v, *args, **kwargs)
270
271     def check(self, checker=None):
272         if checker is None:
273             checker = CheckLog()
274         # l'objet a déjà été vérifié, on ne fait rien
275         if checker.checkedOJB(self):
276             return checker
277         checker.visitOJB(self)
278         if self.exists:
279             self.foreachattr(lambda k, v, obj, c: v.check(k, obj, c),
280                              self, checker)
281         else:
282             if not self.optional and not checker.optional:
283                 checker.err(self, "n'existe pas (%r)" % self._parent)
284         return checker
285
286     def dump(self, indent=""):
287         if self.optional:
288             f = "(f)"
289         else:
290             f = "(o)"
291         return f + " " + self.nomj() + " " + str(self.exists)
292
293 # -----------------------------------------------------------------------------
294
295
296 def Facultatif(ojb):
297     ojb.optional = True
298     return ojb
299
300 # -----------------------------------------------------------------------------
301
302
303 class OJBVect(OJB):
304     lonmax = JeveuxIntAttr("LONMAX")
305     lonuti = JeveuxIntAttr("LONUTI")
306     _xous = "S"
307     _genr = "V"
308
309 # -----------------------------------------------------------------------------
310
311
312 class OJBPtnom(OJB):
313     nommax = JeveuxIntAttr("NOMMAX")
314     nomuti = JeveuxIntAttr("NOMUTI")
315     _xous = "S"
316     _genr = "N"
317     _type = "K"
318
319 # -----------------------------------------------------------------------------
320
321
322 class OJBCollec(OJB):
323     stockage = JeveuxStrAttr("STOCKAGE")
324     nutioc = JeveuxIntAttr("NUTIOC")
325     acces = JeveuxStrAttr("ACCES")
326     modelong = JeveuxStrAttr("MODELONG")
327     nmaxoc = JeveuxIntAttr("NMAXOC")
328
329 # -----------------------------------------------------------------------------
330
331
332 class AsVI(OJBVect):
333     _type = "I"
334
335 # -----------------------------------------------------------------------------
336
337
338 class AsVS(OJBVect):
339     _type = "S"
340
341 # -----------------------------------------------------------------------------
342
343
344 class AsVR(OJBVect):
345     _type = "R"
346
347 # -----------------------------------------------------------------------------
348
349
350 class AsVC(OJBVect):
351     _type = "C"
352
353 # -----------------------------------------------------------------------------
354
355
356 class AsVL(OJBVect):
357     _type = "L"
358
359 # -----------------------------------------------------------------------------
360
361
362 class AsVK8(OJBVect):
363     _type = "K"
364     _ltyp = 8
365
366 # -----------------------------------------------------------------------------
367
368
369 class AsVK16(OJBVect):
370     _type = "K"
371     _ltyp = 16
372
373 # -----------------------------------------------------------------------------
374
375
376 class AsVK24(OJBVect):
377     _type = "K"
378     _ltyp = 24
379
380 # -----------------------------------------------------------------------------
381
382
383 class AsVK32(OJBVect):
384     _type = "K"
385     _ltyp = 32
386
387 # -----------------------------------------------------------------------------
388
389
390 class AsVK80(OJBVect):
391     _type = "K"
392     _ltyp = 80
393
394 # Pour compatibilite
395 AsObject = OJB
396 AsColl = OJBCollec
397 AsPn = OJBPtnom
398 AsVect = OJBVect