2 # Copyright (C) 2007-2013 EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 Ce module contient la classe ENTITE qui est la classe de base
23 de toutes les classes de definition d'EFICAS.
31 from strfunc import ufmt
37 Classe de base pour tous les objets de definition : mots cles et commandes
38 Cette classe ne contient que des methodes utilitaires
39 Elle ne peut être instanciee et doit d abord être specialisee
42 factories = {'validator': N_VALIDATOR.validatorFactory}
44 def __init__(self, validators=None):
46 Initialise les deux attributs regles et entites d'une classe dérivée
47 à : pas de règles et pas de sous-entités.
49 L'attribut regles doit contenir la liste des regles qui s'appliquent
52 L'attribut entités doit contenir le dictionnaires des sous-entités
53 (clé = nom, valeur=objet)
58 self.validators = self.factories['validator'](validators)
60 self.validators = validators
62 def affecter_parente(self):
64 Cette methode a pour fonction de donner un nom et un pere aux
65 sous entités qui n'ont aucun moyen pour atteindre leur parent
67 Il s'agit principalement des mots cles
69 for k, v in self.entites.items():
75 Cette methode sert à valider les attributs de l'objet de définition
77 raise NotImplementedError("La méthode verif_cata de la classe %s doit être implémentée"
78 % self.__class__.__name__)
82 Cette methode doit retourner un objet dérivé de la classe OBJECT
84 raise NotImplementedError("La méthode __call__ de la classe %s doit être implémentée"
85 % self.__class__.__name__)
89 Cette méthode construit pour tous les objets dérivés de ENTITE un
90 rapport de validation de la définition portée par cet objet
94 for k, v in self.entites.items():
97 cr.debut = u"Début " + v.__class__.__name__ + ' : ' + k
98 cr.fin = u"Fin " + v.__class__.__name__ + ' : ' + k
102 _(u"Impossible d'obtenir le rapport de %s %s"), k, `v`)
103 print "Impossible d'obtenir le rapport de %s %s" % (k, `v`)
107 def verif_cata_regles(self):
109 Cette méthode vérifie pour tous les objets dérivés de ENTITE que
110 les objets REGLES associés ne portent que sur des sous-entités
113 for regle in self.regles:
116 if not self.entites.has_key(mc):
121 _(u"Argument(s) non permis : %r pour la règle : %s"), l, txt)
123 def check_definition(self, parent):
124 """Verifie la definition d'un objet composite (commande, fact, bloc)."""
125 args = self.entites.copy()
127 for nom, val in args.items():
128 if val.label == 'SIMP':
131 # if val.max != 1 and val.type == 'TXM':
132 # print "#CMD", parent, nom
133 elif val.label == 'FACT':
134 val.check_definition(parent)
136 # assert self.label != 'FACT', \
137 #'Commande %s : Mot-clef facteur present sous un mot-clef facteur : interdit !' \
142 # seuls les blocs peuvent entrer en conflit avec les mcs du plus haut
144 for nom, val in args.items():
145 if val.label == 'BLOC':
146 mcbloc = val.check_definition(parent)
148 # print "#BLOC", parent, re.sub('\s+', ' ', val.condition)
149 assert mcs.isdisjoint(mcbloc), "Commande %s : Mot(s)-clef(s) vu(s) plusieurs fois : %s" \
150 % (parent, tuple(mcs.intersection(mcbloc)))
153 def check_op(self, valmin=-9999, valmax=9999):
154 """Vérifie l'attribut op."""
155 if self.op is not None and \
156 (type(self.op) is not int or self.op < valmin or self.op > valmax):
157 self.cr.fatal(_(u"L'attribut 'op' doit être un entier "
158 u"compris entre %d et %d : %r"), valmin, valmax, self.op)
160 def check_proc(self):
161 """Vérifie l'attribut proc."""
162 if self.proc is not None and not isinstance(self.proc, N_OPS.OPS):
164 _(u"L'attribut op doit être une instance d'OPS : %r"), self.proc)
166 def check_regles(self):
167 """Vérifie l'attribut regles."""
168 if type(self.regles) is not tuple:
169 self.cr.fatal(_(u"L'attribut 'regles' doit être un tuple : %r"),
173 """Vérifie l'attribut fr."""
174 if type(self.fr) not in (str, unicode):
176 _(u"L'attribut 'fr' doit être une chaine de caractères : %r"),
179 def check_docu(self):
180 """Vérifie l'attribut docu."""
181 if type(self.docu) not in (str, unicode):
183 _(u"L'attribut 'docu' doit être une chaine de caractères : %r"),
187 """Vérifie l'attribut proc."""
188 if type(self.nom) != types.StringType:
190 _(u"L'attribut 'nom' doit être une chaine de caractères : %r"),
193 def check_reentrant(self):
194 """Vérifie l'attribut reentrant."""
195 if self.reentrant not in ('o', 'n', 'f'):
197 _(u"L'attribut 'reentrant' doit valoir 'o','n' ou 'f' : %r"),
200 def check_statut(self, into=('o', 'f', 'c', 'd')):
201 """Vérifie l'attribut statut."""
202 if self.statut not in into:
203 self.cr.fatal(_(u"L'attribut 'statut' doit être parmi %s : %r"),
206 def check_condition(self):
207 """Vérifie l'attribut condition."""
208 if self.condition != None:
209 if type(self.condition) != types.StringType:
211 _(u"L'attribut 'condition' doit être une chaine de caractères : %r"),
214 self.cr.fatal(_(u"La condition ne doit pas valoir None !"))
216 def check_min_max(self):
217 """Vérifie les attributs min/max."""
218 if type(self.min) != types.IntType:
221 _(u"L'attribut 'min' doit être un entier : %r"), self.min)
222 if type(self.max) != types.IntType:
225 _(u"L'attribut 'max' doit être un entier : %r"), self.max)
226 if self.min > self.max:
228 _(u"Nombres d'occurrence min et max invalides : %r %r"),
231 def check_validators(self):
232 """Vérifie les validateurs supplémentaires"""
233 if self.validators and not self.validators.verif_cata():
234 self.cr.fatal(_(u"Un des validateurs est incorrect. Raison : %s"),
235 self.validators.cata_info)
237 def check_homo(self):
238 """Vérifie l'attribut homo."""
239 if self.homo != 0 and self.homo != 1:
241 _(u"L'attribut 'homo' doit valoir 0 ou 1 : %r"), self.homo)
243 def check_into(self):
244 """Vérifie l'attribut into."""
245 if self.into != None:
246 if type(self.into) != types.TupleType:
248 _(u"L'attribut 'into' doit être un tuple : %r"), self.into)
250 def check_position(self):
251 """Vérifie l'attribut position."""
252 if self.position not in ('local', 'global', 'global_jdc'):
253 self.cr.fatal(_(u"L'attribut 'position' doit valoir 'local', 'global' "
254 u"ou 'global_jdc' : %r"), self.position)