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