Salome HOME
CCAR: Modification principale : ajout de la possibilité d'afficher les noms de
[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
57           - ang : chaine de caractere commentaire pour aide en ligne (en anglais)
58
59           - regles : liste d'objets de type REGLE pour vérifier la cohérence des sous-objets
60
61           - statut : obligatoire ('o') ou facultatif ('f')
62
63           - condition : chaine de caractère evaluable par l'interpreteur Python
64
65           - entites : dictionnaire contenant les sous-objets de self (mots-clés). La clé du dictionnaire 
66                      est le nom du mot-clé et la valeur l'objet de définition correspondant. Cet attribut
67                      est initialisé avec l'argument args de la méthode __init__
68
69       """
70       # Initialisation des attributs
71       self.fr=fr
72       self.ang=ang
73       self.docu=docu
74       if type(regles)== types.TupleType:
75           self.regles=regles
76       else:
77           self.regles=(regles,)
78       self.statut=statut
79       self.condition=condition
80       self.entites=args
81       self.affecter_parente()
82
83    def __call__(self,val,nom,parent=None):
84       """
85           Construit un objet MCBLOC a partir de sa definition (self)
86           de sa valeur (val), de son nom (nom) et de son parent dans l arboresence (parent)
87       """
88       return self.class_instance(nom=nom,definition=self,val=val,parent=parent)
89
90    def verif_cata(self):
91       """
92          Cette méthode vérifie si les attributs de définition sont valides.
93          Les éventuels messages d'erreur sont écrits dans l'objet compte-rendu (self.cr).
94       """
95       if type(self.fr) != types.StringType :
96         self.cr.fatal("L'attribut 'fr' doit etre une chaine de caractères : %s" %`self.fr`)
97       if type(self.docu) != types.StringType :
98         self.cr.fatal("L'attribut 'docu' doit etre une chaine de caractères : %s" %`self.docu`)
99       if type(self.regles) != types.TupleType :
100         self.cr.fatal("L'attribut 'regles' doit etre un tuple : %s" %`self.regles` )
101       if self.statut not in ['f','o'] :
102         self.cr.fatal("L'attribut 'statut' doit valoir 'o' ou 'f' : %s" %`self.statut` )
103       if self.condition != None :
104         if type(self.condition) != types.StringType :
105           self.cr.fatal("L'attribut 'condition' doit etre une chaine de caractères : %s" %`self.condition`)
106       else:
107         self.cr.fatal("La condition ne doit pas valoir None !")
108       self.verif_cata_regles()
109
110    def verif_presence(self,dict,globs):
111       """
112          Cette méthode vérifie si le dictionnaire passé en argument (dict)
113          est susceptible de contenir un bloc de mots-clés conforme à la 
114          définition qu'il porte.
115
116          Si la réponse est oui, la méthode retourne 1
117
118          Si la réponse est non, la méthode retourne 0
119  
120          Le dictionnaire dict a pour clés les noms des mots-clés et pour valeurs
121          les valeurs des mots-clés
122       """
123       # On recopie le dictionnaire pour protéger l'original 
124       dico=dict.copy()
125       if self.condition != None :
126         try:
127           test = eval(self.condition,globs,dico)
128           return test
129         except NameError:
130           # erreur 'normale' : un mot-clé n'est pas présent et on veut l'évaluer dans la condition
131           if CONTEXT.debug:
132              l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
133              print "WARNING : Erreur a l'evaluation de la condition "+string.join(l)
134           return 0
135         except SyntaxError:
136           # le texte de la condition n'est pas du Python correct --> faute de catalogue
137           l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
138           raise AsException("Catalogue entite : ", self.nom,", de pere : ", self.pere.nom,
139                      '\n',"Erreur dans la condition : ", self.condition,string.join(l))
140         except:
141           l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
142           raise AsException("Catalogue entite : ", self.nom,", de pere : ", self.pere.nom,
143                      '\n',"Erreur dans la condition : ", self.condition,string.join(l))
144       else :
145         return 0
146