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.
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.
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 # ======================================================================
21 Description des OJB jeveux
23 from basetype import Type
24 from asnom import SDNom
25 from ascheckers import CheckLog
29 # pour utilisation dans eficas
32 from Utilitai.Utmess import UTMESS
36 # -----------------------------------------------------------------------------
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):
48 elif isinstance(nomj, SDNom):
49 self.nomj.update(nomj.__getstate__())
51 def set_name(self, nomj):
52 """Positionne le nomj de self
54 assert isinstance(self.nomj.nomj, str), "uniquement pour les concepts"
57 def check(self, checker=None):
61 # vérif déjà faite ? (en tenant compte du type)
62 if checker.checkedAsBase(self):
64 checker.visitAsBase(self)
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)):
73 for name in dir(self):
74 if name.startswith('check_'):
75 v = getattr(self, name)
80 mess = 60 * '-' + '\n'
82 'Erreur SDVERI (Attention : vérification incomplète)' + \
85 traceback.format_tb(sys.exc_traceback))
86 checker.err(self, mess)
88 checker.optional = optional
91 def dump(self, indent=""):
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_"):
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)
118 def short_repr(self):
119 return "<%s(%x,%r)>" % (self.__class__.__name__, id(self), self.nomj())
122 if not hasattr(self, "accessible") or not self.accessible():
123 # hors Aster ou en par_lot='oui'
124 return self.short_repr()
126 from Cata.cata import IMPR_CO, _F
127 IMPR_CO(CONCEPT=_F(NOM=self.nom), UNITE=6)
131 # par défaut, on fait court !
132 return self.short_repr()
135 # -----------------------------------------------------------------------------
136 class JeveuxAttr(object):
138 """Un attribut jeveux"""
140 def __init__(self, name):
143 def __get__(self, obj, klass):
144 raise NotImplementedError
146 def check(self, attrname, obj, log):
147 checker = getattr(obj, "_" + attrname, None)
150 val = self.__get__(obj, obj.__class__)
151 if callable(checker):
152 return checker(obj, attrname, val, log)
156 log.err(obj, "Attribut incorrect %s %r!=%r" %
157 (self.name, val, checker))
160 # -----------------------------------------------------------------------------
163 class JeveuxExists(JeveuxAttr):
168 def __get__(self, obj, klass):
173 raise AssertionError(repr(nomj))
174 return aster.jeveux_exists(nomj.ljust(24))
176 # -----------------------------------------------------------------------------
179 class JeveuxIntAttr(JeveuxAttr):
181 def __get__(self, obj, klass):
185 if aster.jeveux_exists(nomj):
186 return aster.jeveux_getattr(nomj, self.name)[0]
190 # -----------------------------------------------------------------------------
193 class JeveuxStrAttr(JeveuxAttr):
195 def __get__(self, obj, klass):
199 if aster.jeveux_exists(nomj):
200 return aster.jeveux_getattr(nomj, self.name)[1].strip()
204 # -----------------------------------------------------------------------------
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()
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)
230 def setattribute(self, name, prop, attrs):
233 setattr(self, _name, attrs[name])
237 if aster.jeveux_exists(nomj):
238 obj_simple = aster.jeveux_getattr(nomj, 'XOUS')[1].strip() == 'S'
240 return aster.getvectjev(nomj)
242 return aster.getcolljev(nomj)
246 def changeJeveuxValues(self, nbval, indices, reel, imag, num = 1):
247 """Modify values of existing data structures"""
249 if aster.jeveux_exists(nomj):
250 obj_simple = aster.jeveux_getattr(nomj, 'XOUS')[1].strip() == 'S'
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)
256 def get_stripped(self):
257 """Fonction utilitaire, renvoie une liste de chaines 'strippées'"""
260 return [x.strip() for x in data]
264 def foreachattr(self, callback, *args, **kwargs):
265 klass = self.__class__
267 v = getattr(klass, k)
268 if isinstance(v, JeveuxAttr):
269 callback(k, v, *args, **kwargs)
271 def check(self, checker=None):
274 # l'objet a déjà été vérifié, on ne fait rien
275 if checker.checkedOJB(self):
277 checker.visitOJB(self)
279 self.foreachattr(lambda k, v, obj, c: v.check(k, obj, c),
282 if not self.optional and not checker.optional:
283 checker.err(self, "n'existe pas (%r)" % self._parent)
286 def dump(self, indent=""):
291 return f + " " + self.nomj() + " " + str(self.exists)
293 # -----------------------------------------------------------------------------
300 # -----------------------------------------------------------------------------
304 lonmax = JeveuxIntAttr("LONMAX")
305 lonuti = JeveuxIntAttr("LONUTI")
309 # -----------------------------------------------------------------------------
313 nommax = JeveuxIntAttr("NOMMAX")
314 nomuti = JeveuxIntAttr("NOMUTI")
319 # -----------------------------------------------------------------------------
322 class OJBCollec(OJB):
323 stockage = JeveuxStrAttr("STOCKAGE")
324 nutioc = JeveuxIntAttr("NUTIOC")
325 acces = JeveuxStrAttr("ACCES")
326 modelong = JeveuxStrAttr("MODELONG")
327 nmaxoc = JeveuxIntAttr("NMAXOC")
329 # -----------------------------------------------------------------------------
335 # -----------------------------------------------------------------------------
341 # -----------------------------------------------------------------------------
347 # -----------------------------------------------------------------------------
353 # -----------------------------------------------------------------------------
359 # -----------------------------------------------------------------------------
362 class AsVK8(OJBVect):
366 # -----------------------------------------------------------------------------
369 class AsVK16(OJBVect):
373 # -----------------------------------------------------------------------------
376 class AsVK24(OJBVect):
380 # -----------------------------------------------------------------------------
383 class AsVK32(OJBVect):
387 # -----------------------------------------------------------------------------
390 class AsVK80(OJBVect):