Salome HOME
travail sur monPlusieurs
[tools/eficas.git] / Noyau / asnom.py
1 # -*- coding: iso-8859-1 -*-
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
21 """
22 Description des types de base aster
23
24 version 2 - réécrite pour essayer de simplifier
25 le problème des instances/types et instances/instances
26
27 le type de base ASBase permet de représenter une structure
28 de donnée. Une instance de ASBase comme attribut d'une classe
29 dérivée de ASBase représente une sous-structure nommée.
30
31 une instance de ASBase 'libre' représente une instance de la
32 structure de donnée complète.
33
34 c'est ce comportement qui est capturé dans la classe StructType
35 """
36
37 from basetype import Type
38
39 class SDNom(Type):
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__( nomj=nomj, debut=debut, fin=fin, just=just, **kwargs )
64         self.update( (nomj, debut, fin, just) )
65
66     def __call__(self):
67         if self._parent is None or self._parent._parent is None:
68             debut = self.debut or 0
69             prefix = ' '*debut
70         else:
71             # normalement
72             # assert self._parent.nomj is self
73             nomparent = self._parent._parent.nomj
74             prefix = nomparent()
75             debut = self.debut or nomparent.fin or len(prefix)
76         fin = self.fin or 24
77         nomj = self.nomj or ''
78         nomj = self.just( nomj, fin-debut )
79         prefix = prefix.ljust(24)
80         res = prefix[:debut]+nomj+prefix[fin:]
81         return res[:24]
82
83     def fcata(self):
84         return self.just(self.nomj,self.fin-self.debut).replace(' ','?')
85
86     def __repr__(self):
87         return "<SDNom(%r,%s,%s)>" % (self.nomj,self.debut,self.fin)
88
89     # On utilise pickle pour les copies, et pickle ne sait pas gérer la
90     # sauvegarde de str.ljust ou str.rjust (c'est une méthode non liée)
91
92     def __getstate__(self):
93         return (self.nomj, self.debut, self.fin, self.justtype )
94
95     def __setstate__( self, (nomj,debut,fin,just) ):
96         self.nomj = nomj
97         self.debut = debut
98         self.fin = fin
99         if just=='l' or just is None:
100             self.just = str.ljust
101         elif just=='r':
102             self.just = str.rjust
103         else:
104             raise ValueError("Justification '%s' invalide" % just )
105         self.justtype = just
106
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
132
133