Salome HOME
Modif V6_4_°
[tools/eficas.git] / Noyau / N_ENTITE.py
index 5db7f21661d4bd4e39d10153ee66ffcff1994b6e..eafce7ad2808ca7750dba6f66f92b0cc9ee7a98b 100644 (file)
@@ -1,32 +1,33 @@
-#@ MODIF N_ENTITE Noyau  DATE 07/09/2009   AUTEUR COURTOIS M.COURTOIS 
+#@ MODIF N_ENTITE Noyau  DATE 30/08/2011   AUTEUR COURTOIS M.COURTOIS 
 # -*- coding: iso-8859-1 -*-
 # RESPONSABLE COURTOIS M.COURTOIS
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
-# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
+# COPYRIGHT (C) 1991 - 2011  EDF R&D                  WWW.CODE-ASTER.ORG
 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
-# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR   
-# (AT YOUR OPTION) ANY LATER VERSION.                                 
+# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
+# (AT YOUR OPTION) ANY LATER VERSION.
+#
+# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
+# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
+# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+#
+# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
+# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
+#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
 #
-# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT 
-# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF          
-# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU    
-# GENERAL PUBLIC LICENSE FOR MORE DETAILS.                            
 #
-# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE   
-# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,       
-#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
-#                                                                       
-#                                                                       
 # ======================================================================
 
 
-""" 
+"""
     Ce module contient la classe ENTITE qui est la classe de base
     de toutes les classes de definition d'EFICAS.
 """
 
+import re
 import N_CR
 import N_VALIDATOR
 
@@ -41,14 +42,14 @@ class ENTITE:
 
    def __init__(self,validators=None):
       """
-         Initialise les deux attributs regles et entites d'une classe dérivée
-         à : pas de règles et pas de sous-entités.
-        
-         L'attribut regles doit contenir la liste des regles qui s'appliquent 
-         sur ses sous-entités
+         Initialise les deux attributs regles et entites d'une classe derivee
+          : pas de regles et pas de sous-entites.
+
+         L'attribut regles doit contenir la liste des regles qui s'appliquent
+         sur ses sous-entites
 
-         L'attribut entités doit contenir le dictionnaires des sous-entités 
-         (clé = nom, valeur=objet)
+         L'attribut entites doit contenir le dictionnaires des sous-entites
+         (cle = nom, valeur=objet)
       """
       self.regles=()
       self.entites={}
@@ -60,9 +61,9 @@ class ENTITE:
    def affecter_parente(self):
       """
           Cette methode a pour fonction de donner un nom et un pere aux
-          sous entités qui n'ont aucun moyen pour atteindre leur parent 
+          sous entites qui n'ont aucun moyen pour atteindre leur parent
           directement
-          Il s'agit principalement des mots cles 
+          Il s'agit principalement des mots cles
       """
       for k,v in self.entites.items():
         v.pere = self
@@ -70,39 +71,39 @@ class ENTITE:
 
    def verif_cata(self):
       """
-          Cette methode sert à valider les attributs de l'objet de définition
+          Cette methode sert a valider les attributs de l'objet de definition
       """
-      raise "La méthode verif_cata de la classe %s doit etre implémentée" % self.__class__.__name__
+      raise "La methode verif_cata de la classe %s doit etre implementee" % self.__class__.__name__
 
    def __call__(self):
       """
-          Cette methode doit retourner un objet dérivé de la classe OBJECT
+          Cette methode doit retourner un objet derive de la classe OBJECT
       """
-      raise "La méthode __call__ de la classe %s doit etre implémentée" % self.__class__.__name__
+      raise "La methode __call__ de la classe %s doit etre implementee" % self.__class__.__name__
 
    def report(self):
       """
-         Cette méthode construit pour tous les objets dérivés de ENTITE un 
-         rapport de validation de la définition portée par cet objet
+         Cette methode construit pour tous les objets derives de ENTITE un
+         rapport de validation de la definition portee par cet objet
       """
       self.cr = self.CR()
       self.verif_cata()
       for k,v in self.entites.items() :
          try :
             cr = v.report()
-            cr.debut = "Début "+v.__class__.__name__+ ' : ' + k
+            cr.debut = "Debut "+v.__class__.__name__+ ' : ' + k
             cr.fin = "Fin "+v.__class__.__name__+ ' : ' + k
             self.cr.add(cr)
          except:
             self.cr.fatal("Impossible d'obtenir le rapport de %s %s" %(k,`v`))
             print "Impossible d'obtenir le rapport de %s %s" %(k,`v`)
-            print "père =",self
+            print "pere =",self
       return self.cr
 
    def verif_cata_regles(self):
       """
-         Cette méthode vérifie pour tous les objets dérivés de ENTITE que 
-         les objets REGLES associés ne portent que sur des sous-entités 
+         Cette methode verifie pour tous les objets derives de ENTITE que
+         les objets REGLES associes ne portent que sur des sous-entites
          existantes
       """
       for regle in self.regles :
@@ -112,6 +113,35 @@ class ENTITE:
             l.append(mc)
         if l != [] :
           txt = str(regle)
-          self.cr.fatal("Argument(s) non permis : %s pour la règle : %s" %(`l`,txt))
+          self.cr.fatal("Argument(s) non permis : %s pour la regle : %s" %(`l`,txt))
 
+   def check_definition(self, parent):
+      """Verifie la definition d'un objet composite (commande, fact, bloc)."""
+      args = self.entites.copy()
+      mcs = set()
+      for nom, val in args.items():
+         if val.label == 'SIMP':
+            mcs.add(nom)
+            #XXX
+            #if val.max != 1 and val.type == 'TXM':
+                #print "#CMD", parent, nom
+         elif val.label == 'FACT':
+            val.check_definition(parent)
+            #PNPNPN surcharge
+            # CALC_SPEC !
+            #assert self.label != 'FACT', \
+            #   'Commande %s : Mot-clef facteur present sous un mot-clef facteur : interdit !' \
+            #   % parent
+         else:
+            continue
+         del args[nom]
+      # seuls les blocs peuvent entrer en conflit avec les mcs du plus haut niveau
+      for nom, val in args.items():
+         if val.label == 'BLOC':
+            mcbloc = val.check_definition(parent)
+            #XXX
+            #print "#BLOC", parent, re.sub('\s+', ' ', val.condition)
+            #assert mcs.isdisjoint(mcbloc), "Commande %s : Mot(s)-clef(s) vu(s) plusieurs fois : %s" \
+            #   % (parent, tuple(mcs.intersection(mcbloc)))
+      return mcs