Salome HOME
travail sur monPlusieurs
[tools/eficas.git] / Noyau / N_BLOC.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     Ce module contient la classe de definition BLOC
23     qui permet de spécifier les caractéristiques des blocs de mots clés
24 """
25
26 import types,string,sys
27 import traceback
28
29 import N_ENTITE
30 import N_MCBLOC
31 from N_Exception import AsException
32 from N_types import force_list
33 from strfunc import ufmt
34
35 class BLOC(N_ENTITE.ENTITE):
36    """
37     Classe pour definir un bloc de mots-cles
38
39     Cette classe a deux attributs de classe :
40
41       - class_instance qui indique la classe qui devra etre utilisée
42         pour créer l'objet qui servira à controler la conformité d'un
43         bloc de mots-clés avec sa définition
44       - label qui indique la nature de l'objet de définition (ici, BLOC)
45
46    """
47    class_instance = N_MCBLOC.MCBLOC
48    label = 'BLOC'
49
50    def __init__(self,fr="",ang="",docu="",regles=(),statut='f',condition=None,
51                      **args):
52
53       """
54           Un bloc est caractérisé par les attributs suivants :
55
56             - fr   : chaine de caractere commentaire pour aide en ligne (en francais)
57             - ang : chaine de caractere commentaire pour aide en ligne (en anglais)
58             - regles : liste d'objets de type REGLE pour vérifier la cohérence des sous-objets
59             - statut : obligatoire ('o') ou facultatif ('f')
60             - condition : chaine de caractère evaluable par l'interpreteur Python
61             - entites : dictionnaire contenant les sous-objets de self (mots-clés).
62               La clé du dictionnaire est le nom du mot-clé et la valeur l'objet de
63               définition correspondant. Cet attribut est initialisé avec l'argument
64               args de la méthode __init__
65
66       """
67       # Initialisation des attributs
68       self.fr=fr
69       self.ang=ang
70       self.docu=docu
71       if type(regles)== types.TupleType:
72           self.regles=regles
73       else:
74           self.regles=(regles,)
75       self.statut=statut
76       self.condition=condition
77       self.entites=args
78       self.affecter_parente()
79
80    def __call__(self,val,nom,parent=None):
81       """
82           Construit un objet MCBLOC a partir de sa definition (self)
83           de sa valeur (val), de son nom (nom) et de son parent dans l arboresence (parent)
84       """
85       return self.class_instance(nom=nom,definition=self,val=val,parent=parent)
86
87    def verif_cata(self):
88       """
89          Cette méthode vérifie si les attributs de définition sont valides.
90          Les éventuels messages d'erreur sont écrits dans l'objet compte-rendu (self.cr).
91       """
92       self.check_fr()
93       self.check_docu()
94       self.check_regles()
95       self.check_statut(into=('f', 'o'))
96       self.check_condition()
97       self.verif_cata_regles()
98
99    def verif_presence(self,dict,globs):
100       """
101          Cette méthode vérifie si le dictionnaire passé en argument (dict)
102          est susceptible de contenir un bloc de mots-clés conforme à la
103          définition qu'il porte.
104
105          Si la réponse est oui, la méthode retourne 1
106
107          Si la réponse est non, la méthode retourne 0
108
109          Le dictionnaire dict a pour clés les noms des mots-clés et pour valeurs
110          les valeurs des mots-clés
111       """
112       # On recopie le dictionnaire pour protéger l'original
113       dico = bloc_utils()
114       dico.update(dict)
115       if self.condition != None :
116         try:
117           test = eval(self.condition,globs,dico)
118           return test
119         except NameError:
120           # erreur 'normale' : un mot-clé n'est pas présent et on veut l'évaluer dans la condition
121           if CONTEXT.debug:
122              l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
123              print "WARNING : Erreur a l'evaluation de la condition "+string.join(l)
124           return 0
125         except SyntaxError:
126           # le texte de la condition n'est pas du Python correct --> faute de catalogue
127           l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
128           raise AsException("Catalogue entite : ", self.nom,", de pere : ", self.pere.nom,
129                      '\n',"Erreur dans la condition : ", self.condition,string.join(l))
130         except:
131           l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
132           raise AsException("Catalogue entite : ", self.nom,", de pere : ", self.pere.nom,
133                      '\n',"Erreur dans la condition : ", self.condition,string.join(l))
134       else :
135         return 0
136
137
138 def bloc_utils():
139     """Définit un ensemble de fonctions utilisables pour écrire les
140     conditions de BLOC."""
141     def au_moins_un(mcsimp, valeurs):
142         """Valide si la (ou une) valeur de 'mcsimp' est au moins une fois dans
143         la ou les 'valeurs'. Similaire à la règle AU_MOINS_UN, 'mcsimp' peut
144         contenir plusieurs valeurs."""
145         test = set(force_list(mcsimp))
146         valeurs = set(force_list(valeurs))
147         return not test.isdisjoint(valeurs)
148
149     def aucun(mcsimp, valeurs):
150         """Valide si aucune des valeurs de 'mcsimp' n'est dans 'valeurs'."""
151         return not au_moins_un(mcsimp, valeurs)
152
153     return locals()
154