]> SALOME platform Git repositories - tools/eficas.git/blob - Noyau/N_ENTITE.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Noyau / N_ENTITE.py
1 #@ MODIF N_ENTITE Noyau  DATE 30/08/2011   AUTEUR COURTOIS M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 # RESPONSABLE COURTOIS M.COURTOIS
4 #            CONFIGURATION MANAGEMENT OF EDF VERSION
5 # ======================================================================
6 # COPYRIGHT (C) 1991 - 2011  EDF R&D                  WWW.CODE-ASTER.ORG
7 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
8 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
9 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
10 # (AT YOUR OPTION) ANY LATER VERSION.
11 #
12 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
13 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
14 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
15 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
16 #
17 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
18 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
19 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
20 #
21 #
22 # ======================================================================
23
24
25 """
26     Ce module contient la classe ENTITE qui est la classe de base
27     de toutes les classes de definition d'EFICAS.
28 """
29
30 import re
31 import N_CR
32 import N_VALIDATOR
33
34 class ENTITE:
35    """
36       Classe de base pour tous les objets de definition : mots cles et commandes
37       Cette classe ne contient que des methodes utilitaires
38       Elle ne peut etre instanciee et doit d abord etre specialisee
39    """
40    CR=N_CR.CR
41    factories={'validator':N_VALIDATOR.validatorFactory}
42
43    def __init__(self,validators=None):
44       """
45          Initialise les deux attributs regles et entites d'une classe derivee
46           : pas de regles et pas de sous-entites.
47
48          L'attribut regles doit contenir la liste des regles qui s'appliquent
49          sur ses sous-entites
50
51          L'attribut entites doit contenir le dictionnaires des sous-entites
52          (cle = nom, valeur=objet)
53       """
54       self.regles=()
55       self.entites={}
56       if validators:
57          self.validators=self.factories['validator'](validators)
58       else:
59          self.validators=validators
60
61    def affecter_parente(self):
62       """
63           Cette methode a pour fonction de donner un nom et un pere aux
64           sous entites qui n'ont aucun moyen pour atteindre leur parent
65           directement
66           Il s'agit principalement des mots cles
67       """
68       for k,v in self.entites.items():
69         v.pere = self
70         v.nom = k
71
72    def verif_cata(self):
73       """
74           Cette methode sert a valider les attributs de l'objet de definition
75       """
76       raise "La methode verif_cata de la classe %s doit etre implementee" % self.__class__.__name__
77
78    def __call__(self):
79       """
80           Cette methode doit retourner un objet derive de la classe OBJECT
81       """
82       raise "La methode __call__ de la classe %s doit etre implementee" % self.__class__.__name__
83
84    def report(self):
85       """
86          Cette methode construit pour tous les objets derives de ENTITE un
87          rapport de validation de la definition portee par cet objet
88       """
89       self.cr = self.CR()
90       self.verif_cata()
91       for k,v in self.entites.items() :
92          try :
93             cr = v.report()
94             cr.debut = "Debut "+v.__class__.__name__+ ' : ' + k
95             cr.fin = "Fin "+v.__class__.__name__+ ' : ' + k
96             self.cr.add(cr)
97          except:
98             self.cr.fatal("Impossible d'obtenir le rapport de %s %s" %(k,`v`))
99             print "Impossible d'obtenir le rapport de %s %s" %(k,`v`)
100             print "pere =",self
101       return self.cr
102
103    def verif_cata_regles(self):
104       """
105          Cette methode verifie pour tous les objets derives de ENTITE que
106          les objets REGLES associes ne portent que sur des sous-entites
107          existantes
108       """
109       for regle in self.regles :
110         l=[]
111         for mc in regle.mcs :
112           if not self.entites.has_key(mc) :
113             l.append(mc)
114         if l != [] :
115           txt = str(regle)
116           self.cr.fatal("Argument(s) non permis : %s pour la regle : %s" %(`l`,txt))
117
118    def check_definition(self, parent):
119       """Verifie la definition d'un objet composite (commande, fact, bloc)."""
120       args = self.entites.copy()
121       mcs = set()
122       for nom, val in args.items():
123          if val.label == 'SIMP':
124             mcs.add(nom)
125             #XXX
126             #if val.max != 1 and val.type == 'TXM':
127                 #print "#CMD", parent, nom
128          elif val.label == 'FACT':
129             val.check_definition(parent)
130             #PNPNPN surcharge
131             # CALC_SPEC !
132             #assert self.label != 'FACT', \
133             #   'Commande %s : Mot-clef facteur present sous un mot-clef facteur : interdit !' \
134             #   % parent
135          else:
136             continue
137          del args[nom]
138       # seuls les blocs peuvent entrer en conflit avec les mcs du plus haut niveau
139       for nom, val in args.items():
140          if val.label == 'BLOC':
141             mcbloc = val.check_definition(parent)
142             #XXX
143             #print "#BLOC", parent, re.sub('\s+', ' ', val.condition)
144             #assert mcs.isdisjoint(mcbloc), "Commande %s : Mot(s)-clef(s) vu(s) plusieurs fois : %s" \
145             #   % (parent, tuple(mcs.intersection(mcbloc)))
146       return mcs
147