Salome HOME
0f8a2b602053162813cd2a250f80897064b47666
[tools/eficas.git] / Noyau / N_BLOC.py
1 #@ MODIF N_BLOC Noyau  DATE 29/05/2002   AUTEUR DURAND C.DURAND 
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR   
8 # (AT YOUR OPTION) ANY LATER VERSION.                                 
9 #
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT 
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF          
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU    
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                            
14 #
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE   
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,       
17 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
18 #                                                                       
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
33 class BLOC(N_ENTITE.ENTITE):
34    """
35     Classe pour definir un bloc de mots-cles
36
37     Cette classe a deux attributs de classe :
38
39           - class_instance qui indique la classe qui devra etre utilisée 
40             pour créer l'objet qui servira à controler la conformité d'un 
41             bloc de mots-clés avec sa définition
42
43           - label qui indique la nature de l'objet de définition (ici, BLOC)
44
45    """
46    class_instance = N_MCBLOC.MCBLOC
47    label = 'BLOC'
48
49    def __init__(self,fr="",ang="",docu="",regles=(),statut='f',condition=None,
50                      **args):
51      
52       """
53           Un bloc est caractérisé par les attributs suivants :
54
55              - fr   : chaine de caractere commentaire pour aide en ligne (en francais)
56              - ang : chaine de caractere commentaire pour aide en ligne (en anglais)
57              - regles : liste d'objets de type REGLE pour vérifier la cohérence des sous-objets
58              - statut : obligatoire ('o') ou facultatif ('f')
59              - condition : chaine de caractère evaluable par l'interpreteur Python
60              - entites : dictionnaire contenant les sous-objets de self (mots-clés). La clé du dictionnaire 
61                      est le nom du mot-clé et la valeur l'objet de définition correspondant. Cet attribut
62                      est initialisé avec l'argument args de la méthode __init__
63
64       """
65       # Initialisation des attributs
66       self.fr=fr
67       self.ang=ang
68       self.docu=docu
69       if type(regles)== types.TupleType:
70           self.regles=regles
71       else:
72           self.regles=(regles,)
73       self.statut=statut
74       self.condition=condition
75       self.entites=args
76       self.affecter_parente()
77
78    def __call__(self,val,nom,parent=None):
79       """
80           Construit un objet MCBLOC a partir de sa definition (self)
81           de sa valeur (val), de son nom (nom) et de son parent dans l arboresence (parent)
82       """
83       return self.class_instance(nom=nom,definition=self,val=val,parent=parent)
84
85    def verif_cata(self):
86       """
87          Cette méthode vérifie si les attributs de définition sont valides.
88          Les éventuels messages d'erreur sont écrits dans l'objet compte-rendu (self.cr).
89       """
90       if type(self.fr) != types.StringType :
91         self.cr.fatal("L'attribut 'fr' doit etre une chaine de caractères : %s" %`self.fr`)
92       if type(self.docu) != types.StringType :
93         self.cr.fatal("L'attribut 'docu' doit etre une chaine de caractères : %s" %`self.docu`)
94       if type(self.regles) != types.TupleType :
95         self.cr.fatal("L'attribut 'regles' doit etre un tuple : %s" %`self.regles` )
96       if self.statut not in ['f','o'] :
97         self.cr.fatal("L'attribut 'statut' doit valoir 'o' ou 'f' : %s" %`self.statut` )
98       if self.condition != None :
99         if type(self.condition) != types.StringType :
100           self.cr.fatal("L'attribut 'condition' doit etre une chaine de caractères : %s" %`self.condition`)
101       else:
102         self.cr.fatal("La condition ne doit pas valoir None !")
103       self.verif_cata_regles()
104
105    def verif_presence(self,dict,globs):
106       """
107          Cette méthode vérifie si le dictionnaire passé en argument (dict)
108          est susceptible de contenir un bloc de mots-clés conforme à la 
109          définition qu'il porte.
110
111          Si la réponse est oui, la méthode retourne 1
112
113          Si la réponse est non, la méthode retourne 0
114  
115          Le dictionnaire dict a pour clés les noms des mots-clés et pour valeurs
116          les valeurs des mots-clés
117       """
118       # On recopie le dictionnaire pour protéger l'original 
119       dico=dict.copy()
120       if self.condition != None :
121         try:
122           test = eval(self.condition,globs,dico)
123           return test
124         except NameError:
125           # erreur 'normale' : un mot-clé n'est pas présent et on veut l'évaluer dans la condition
126           if CONTEXT.debug:
127              l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
128              print "WARNING : Erreur a l'evaluation de la condition "+string.join(l)
129           return 0
130         except SyntaxError:
131           # le texte de la condition n'est pas du Python correct --> faute de catalogue
132           l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
133           raise AsException("Catalogue entite : ", self.nom,", de pere : ", self.pere.nom,
134                      '\n',"Erreur dans la condition : ", self.condition,string.join(l))
135         except:
136           l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
137           raise AsException("Catalogue entite : ", self.nom,", de pere : ", self.pere.nom,
138                      '\n',"Erreur dans la condition : ", self.condition,string.join(l))
139       else :
140         return 0
141