Salome HOME
bugs + translator
[tools/eficas.git] / Noyau / asnom.py
1 # coding=utf-8
2 # Copyright (C) 2007-2013   EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 """
20 Description des types de base aster
21
22 version 2 - réécrite pour essayer de simplifier
23 le problème des instances/types et instances/instances
24
25 le type de base ASBase permet de représenter une structure
26 de donnée. Une instance de ASBase comme attribut d'une classe
27 dérivée de ASBase représente une sous-structure nommée.
28
29 une instance de ASBase 'libre' représente une instance de la
30 structure de donnée complète.
31
32 c'est ce comportement qui est capturé dans la classe StructType
33 """
34
35 from basetype import Type
36
37
38 class SDNom(Type):
39
40     """Objet représentant une sous-partie de nom
41     d'objet jeveux"""
42     nomj = None
43     debut = None
44     fin = None
45     just = None
46     justtype = None
47
48     def __init__(self, nomj=None, debut=None, fin=None, just='l', **kwargs):
49         """
50         Configure un objet nom
51         nomj : la partie du nom fixée (par ex .TITR) ou '' si non précisée
52         debut, fin : la partie du K24 concernée
53         just : la justification a droite ou a gauche ('l' ou 'r')
54         kwargs : inutilisé, juste par simplicité
55
56         Note:
57         On utilise cet objet comme attribut d'instance ou de classe.
58         En attribut de classe pour les noms de structure, cela permet
59         de définir la position du nom d'objet dans le nom jeveux, l'attribut
60         nom est alors la valeur du suffixe pour une sous-structure ou None pour
61         une structure principale.
62         """
63         super(SDNom, self).__init__(
64             nomj=nomj, debut=debut, fin=fin, just=just, **kwargs)
65         self.update((nomj, debut, fin, just))
66
67     def __call__(self):
68         if self._parent is None or self._parent._parent is None:
69             debut = self.debut or 0
70             prefix = ' ' * debut
71         else:
72             # normalement
73             # assert self._parent.nomj is self
74             nomparent = self._parent._parent.nomj
75             prefix = nomparent()
76             debut = self.debut or nomparent.fin or len(prefix)
77         fin = self.fin or 24
78         nomj = self.nomj or ''
79         nomj = self.just(nomj, fin - debut)
80         prefix = prefix.ljust(24)
81         res = prefix[:debut] + nomj + prefix[fin:]
82         return res[:24]
83
84     def fcata(self):
85         return self.just(self.nomj, self.fin - self.debut).replace(' ', '?')
86
87     def __repr__(self):
88         return "<SDNom(%r,%s,%s)>" % (self.nomj, self.debut, self.fin)
89
90     # On utilise pickle pour les copies, et pickle ne sait pas gérer la
91     # sauvegarde de str.ljust ou str.rjust (c'est une méthode non liée)
92
93     def __getstate__(self):
94         return (self.nomj, self.debut, self.fin, self.justtype)
95
96     def __setstate__(self, (nomj, debut, fin, just)):
97         self.nomj = nomj
98         self.debut = debut
99         self.fin = fin
100         if just == 'l' or just is None:
101             self.just = str.ljust
102         elif just == 'r':
103             self.just = str.rjust
104         else:
105             raise ValueError("Justification '%s' invalide" % just)
106         self.justtype = just
107
108     def update(self, (nomj, debut, fin, just)):
109         if nomj is not None:
110             self.nomj = nomj
111         if self.debut is None:
112             self.debut = debut
113         if self.fin is None:
114             self.fin = fin
115         if self.justtype is None and just is not None:
116             if just == 'l':
117                 self.just = str.ljust
118             elif just == 'r':
119                 self.just = str.rjust
120             else:
121                 raise ValueError("Justification '%s' invalide" % just)
122             self.justtype = just
123
124     def reparent(self, parent, new_name):
125         self._parent = parent
126         self._name = new_name
127         for nam in self._subtypes:
128             obj = getattr(self, nam)
129             obj.reparent(self, nam)
130         if self.nomj is None and self._parent._name is not None:
131             self.nomj = "." + self._parent._name