Salome HOME
chgt noyau pour aster
[tools/eficas.git] / Noyau / N_FACT.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
21 """ Ce module contient la classe de definition FACT
22     qui permet de spécifier les caractéristiques des mots clés facteurs
23 """
24
25 import types
26
27 import N_ENTITE
28 import N_MCFACT
29 import N_MCLIST
30 from N__F import _F
31 from N_types import is_sequence
32 from strfunc import ufmt
33
34 import N_OBJECT
35
36
37 class FACT(N_ENTITE.ENTITE):
38
39     """
40      Classe pour definir un mot cle facteur
41
42      Cette classe a trois attributs de classe
43
44        - class_instance qui indique la classe qui devra etre utilisée
45          pour créer l'objet qui servira à controler la conformité d'un
46          mot-clé facteur avec sa définition
47
48        - list_instance
49
50        - label qui indique la nature de l'objet de définition (ici, FACT)
51     """
52     class_instance = N_MCFACT.MCFACT
53     list_instance = N_MCLIST.MCList
54     label = 'FACT'
55
56     def __init__(self, fr="", docu="", regles=(), statut='f', defaut=None,ang="",
57                  min=0, max=1, validators=None, **args):
58         """
59             Un mot-clé facteur est caractérisé par les attributs suivants :
60
61               - fr   :
62               - statut :
63               - defaut :
64               - regles
65               - min
66               - max
67               - position
68               - docu
69         """
70         N_ENTITE.ENTITE.__init__(self, validators)
71         # Initialisation des attributs
72         self.fr = fr
73         self.ang=ang
74         self.docu = docu
75         if type(regles) == types.TupleType:
76             self.regles = regles
77         else:
78             self.regles = (regles,)
79         self.statut = statut
80         self.defaut = defaut
81         self.min = min
82         self.max = max
83         self.entites = args
84         self.position = None
85         self.affecter_parente()
86
87     def __call__(self, val, nom, parent):
88         """
89             Construit la structure de donnee pour un mot cle facteur a partir
90             de sa definition (self) de sa valeur (val), de son nom (nom) et de
91             son parent dans l arboresence (parent)
92
93             Suivant le type de la valeur on retournera soit un objet de type
94             MCFACT soit une liste de type MCLIST.
95
96             La creation d un mot cle facteur depend de son statut
97               - Si statut ='o'   il est obligatoire
98               - Si statut == 'd' il est facultatif mais ses sous mots cles avec
99                 defaut sont visibles
100               - Si statut == 'f' il est facultatif et ses sous mots avec defaut ne
101                 sont pas visibles
102               - Si statut == 'c' il est cache ???
103               - Si defaut != None, on utilise cette valeur pour calculer la valeur
104                 par defaut du mot cle facteur
105         """
106         if val is None:
107             if self.defaut == None:
108                 val = {}
109             elif type(self.defaut) == types.TupleType:
110                 val = self.defaut
111                     # Est ce utile ? Le défaut pourrait etre uniquement un dict
112             elif type(self.defaut) == types.DictType or isinstance(self.defaut, _F):
113                 val = self.defaut
114             else:
115                 # On ne devrait jamais passer par la
116                 print "On ne devrait jamais passer par la"
117                 return None
118         elif is_sequence(val) and len(val) == 0 and self.statut == 'o':
119                 # On est dans le cas où le mcfact est présent mais est une liste/tuple
120                 # vide. Il est obligatoire donc on l'initialise. Les règles, mots-clés
121                 # obligatoires diront si un mcfact vide est accepté.
122             val = {}
123
124         # On cree toujours une liste de mcfact
125         l = self.list_instance()
126         l.init(nom=nom, parent=parent)
127         if type(val) in (types.TupleType, types.ListType, self.list_instance):
128             for v in val:
129                 if type(v) == types.DictType or isinstance(v, _F):
130                     objet = self.class_instance(
131                         nom=nom, definition=self, val=v, parent=parent)
132                     l.append(objet)
133                 elif isinstance(v, self.class_instance):
134                     l.append(v)
135                 else:
136                     l.append(N_OBJECT.ErrorObj(self, v, parent, nom))
137         elif type(val) == types.DictType or isinstance(val, _F):
138             objet = self.class_instance(
139                 nom=nom, definition=self, val=val, parent=parent)
140             l.append(objet)
141         elif isinstance(val, self.class_instance):
142             l.append(val)
143         else:
144             l.append(N_OBJECT.ErrorObj(self, val, parent, nom))
145
146         return l
147
148     def verif_cata(self):
149         self.check_min_max()
150         self.check_fr()
151         self.check_regles()
152         self.check_statut()
153         self.check_docu()
154         self.check_validators()
155         self.verif_cata_regles()