]> SALOME platform Git repositories - modules/eficas.git/commitdiff
Salome HOME
CCAR: mise a niveau Aster 9.1.22
authorChristian Caremoli <>
Fri, 30 Nov 2007 13:25:21 +0000 (13:25 +0000)
committerChristian Caremoli <>
Fri, 30 Nov 2007 13:25:21 +0000 (13:25 +0000)
Noyau/N_CONVERT.py [new file with mode: 0644]
Noyau/N_GEOM.py
Noyau/N_JDC.py
Noyau/N_MACRO_ETAPE.py
Noyau/N_MCSIMP.py
Noyau/ascheckers.py
Noyau/asojb.py

diff --git a/Noyau/N_CONVERT.py b/Noyau/N_CONVERT.py
new file mode 100644 (file)
index 0000000..4d1af5a
--- /dev/null
@@ -0,0 +1,78 @@
+#@ MODIF N_CONVERT Noyau  DATE 19/11/2007   AUTEUR COURTOIS M.COURTOIS 
+# -*- coding: iso-8859-1 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2007  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.                                                  
+#                                                                       
+# 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.        
+# ======================================================================
+
+"""
+   Module de conversion des valeurs saisies par l'utilisateur après vérification.
+"""
+
+# -----------------------------------------------------------------------------
+class ConversionError(Exception):
+   pass
+
+# -----------------------------------------------------------------------------
+def is_int(real):
+   """Est-ce que 'real' a une valeur entière ?
+   """
+   return abs(int(real) - real) < 1.e-12
+
+# -----------------------------------------------------------------------------
+class TypeConversion:
+   """Conversion de type
+   """
+   def __init__(self, name, typ=None):
+      self.name = name
+      self.typ = typ
+
+   def convert(self, obj):
+      """Filtre liste
+      """
+      in_type = type(obj)
+      is_simple = in_type not in (list, tuple)
+      if is_simple:
+         obj = (obj,)
+      
+      result = []
+      for o in obj:
+         result.append(self.defaut(o))
+      
+      if is_simple:
+         return result[0]
+      else:
+         return in_type(result)
+
+   def defaut(self, obj):
+      """Conversion de obj si c'est possible.
+      """
+      for type_permis in self.typ:
+         # attention si plusieurs types sont permis, l'ordre de self.typ peut influer sur le résultat.
+         if type_permis == 'R':
+            if type(obj) in (int, float, long):
+               return float(obj)
+         elif type_permis == 'I':
+            if type(obj) in (int, float, long):
+               if is_int(obj):
+                  return int(obj)
+               else:
+                  raise ConversionError("%s (%s) ne peut pas être considéré comme entier" % (repr(obj), type(obj)))
+
+      # autres types : pas de conversion, la validation arrêtera si obj est incorrect.
+      return obj
+
+
index 44d5a4f94ea10b363f7ddf9f1d550d277ffd1d2b..8a1fddaad7b6ab3695ca3734403c16bc66d4e7e1 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF N_GEOM Noyau  DATE 16/05/2006   AUTEUR DURAND C.DURAND 
+#@ MODIF N_GEOM Noyau  DATE 19/11/2007   AUTEUR COURTOIS M.COURTOIS 
 # -*- coding: iso-8859-1 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
@@ -57,7 +57,7 @@ class GEOM(ASSD):
 
    def __convert__(cls,valeur):
       if isinstance(valeur, (str,unicode)):
-       return valeur
+         return valeur
       raise ValueError, 'On attend un chaine de caractères'
    __convert__=classmethod(__convert__)
 
index af1a3c07dd11d257222b196333dce98d21a8410b..28720a1971186643fb1bea0647334fbf1f7e2b23 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF N_JDC Noyau  DATE 30/05/2007   AUTEUR COURTOIS M.COURTOIS 
+#@ MODIF N_JDC Noyau  DATE 28/11/2007   AUTEUR COURTOIS M.COURTOIS 
 # -*- coding: iso-8859-1 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
@@ -98,6 +98,7 @@ NONE = None
       # Dictionnaire pour stocker tous les concepts du JDC (acces rapide par le nom)
       self.sds_dict={}
       self.etapes=[]
+      self.index_etapes = {}
       self.mc_globaux={}
       self.current_context={}
       self.condition_context={}
@@ -112,13 +113,23 @@ NONE = None
          compte-rendu self.cr
       """
       try:
-        if self.appli != None : 
-           self.appli.affiche_infos('Compilation du fichier de commandes en cours ...')
-        self.proc_compile=compile(self.procedure,self.nom,'exec')
-      except SyntaxError,e:
-        if CONTEXT.debug : traceback.print_exc()
-        l=traceback.format_exception_only(SyntaxError,e)
-        self.cr.exception("Compilation impossible : "+string.join(l))
+         if self.appli != None : 
+            self.appli.affiche_infos('Compilation du fichier de commandes en cours ...')
+         self.proc_compile=compile(self.procedure,self.nom,'exec')
+      except SyntaxError, e:
+         if CONTEXT.debug : traceback.print_exc()
+         l=traceback.format_exception_only(SyntaxError,e)
+         self.cr.exception("Compilation impossible : "+string.join(l))
+      except SystemError, e:
+         erreurs_connues = """
+Causes possibles :
+ - offset too large : liste trop longue derrière un mot-clé.
+   Solution : liste = (valeurs, ..., )
+              MOT_CLE = *liste,
+"""
+         l=traceback.format_exception_only(SystemError,e)
+         l.append(erreurs_connues)
+         self.cr.exception("Compilation impossible : " + ''.join(l))
       return
 
    def exec_compile(self):
@@ -241,6 +252,7 @@ NONE = None
          et retourne un numéro d'enregistrement
       """
       self.etapes.append(etape)
+      self.index_etapes[etape] = len(self.etapes) - 1
       return self.g_register(etape)
 
    def o_register(self,sd):
@@ -418,7 +430,7 @@ NONE = None
       # Si on insère des commandes (par ex, dans EFICAS), il faut préalablement
       # remettre ce pointeur à 0
       if etape:
-         index_etape=self.etapes.index(etape)
+         index_etape = self.index_etapes[etape]
       else:
          index_etape=len(self.etapes)
       if index_etape >= self.index_etape_courante:
@@ -429,7 +441,8 @@ NONE = None
          liste_etapes=self.etapes[self.index_etape_courante:index_etape]
       else:
          d=self.current_context={}
-         if self.context_ini:d.update(self.context_ini)
+         if self.context_ini:
+            d.update(self.context_ini)
          liste_etapes=self.etapes
 
       for e in liste_etapes:
@@ -459,5 +472,6 @@ NONE = None
           et remet à jour la parenté de l'étape et des concepts
        """
        self.etapes.append(etape)
+       self.index_etapes[etape] = len(self.etapes) - 1
        etape.reparent(self)
        etape.reset_jdc(self)
index 28940f2c2e9febd931f404946d0d6e8bdcf9d01f..c2a53700ed11ff79c22b1c223c37e0857e0c83fa 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF N_MACRO_ETAPE Noyau  DATE 16/05/2007   AUTEUR COURTOIS M.COURTOIS 
+#@ MODIF N_MACRO_ETAPE Noyau  DATE 28/11/2007   AUTEUR COURTOIS M.COURTOIS 
 # -*- coding: iso-8859-1 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
@@ -76,6 +76,7 @@ class MACRO_ETAPE(N_ETAPE.ETAPE):
       self.current_context={}
       self.index_etape_courante=0
       self.etapes=[]
+      self.index_etapes={}
       self.sds=[]
       #  Dans le cas d'une macro écrite en Python, l'attribut Outputs est un 
       #  dictionnaire qui contient les concepts produits de sortie 
@@ -268,7 +269,7 @@ Causes possibles :
       # Si on insère des commandes (par ex, dans EFICAS), il faut
       # préalablement remettre ce pointeur à 0
       if etape:
-         index_etape=self.etapes.index(etape)
+         index_etape = self.index_etapes[etape]
       else:
          index_etape=len(self.etapes)
 
@@ -426,6 +427,7 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" %(t,co
           et demande d enregistrement global aupres du JDC
       """
       self.etapes.append(etape)
+      self.index_etapes[etape] = len(self.etapes) - 1
       idetape=self.jdc.g_register(etape)
       return idetape
 
@@ -651,6 +653,7 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" %(t,co
           passée en argument (etape)
       """
       self.etapes=[]
+      self.index_etapes={}
       for etp in etape.etapes:
           new_etp=etp.copy()
           new_etp.copy_reuse(etp)
@@ -665,6 +668,8 @@ Le type demande (%s) et le type du concept (%s) devraient etre derives""" %(t,co
                 self.NommerSdprod(new_sd,etp.sd.nom)
           new_etp.copy_intern(etp)
           self.etapes.append(new_etp)
+          self.index_etapes[new_etp] = len(self.etapes) - 1
+          
 
    def reset_jdc(self,new_jdc):
        """
index d85eda44b94ded7a1b2f9eb94692cff8be5a42ca..8d2e939a5d3762e8baef2960535b2a0adc627fc3 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF N_MCSIMP Noyau  DATE 16/05/2007   AUTEUR COURTOIS M.COURTOIS 
+#@ MODIF N_MCSIMP Noyau  DATE 19/11/2007   AUTEUR COURTOIS M.COURTOIS 
 # -*- coding: iso-8859-1 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
@@ -32,6 +32,7 @@ from copy import copy
 from Noyau.N_ASSD import ASSD,assd
 from Noyau.N_CO import CO
 import N_OBJECT
+from N_CONVERT import TypeConversion
 
 class MCSIMP(N_OBJECT.OBJECT):
    """
@@ -58,6 +59,7 @@ class MCSIMP(N_OBJECT.OBJECT):
       self.nom=nom
       self.val = val
       self.parent = parent
+      self.convProto = TypeConversion('type', typ=self.definition.type)
       self.valeur = self.GETVAL(self.val)
       if parent :
          self.jdc = self.parent.jdc
@@ -68,16 +70,16 @@ class MCSIMP(N_OBJECT.OBJECT):
          self.jdc = None
          self.niveau = None
          self.etape = None
-         
+
    def GETVAL(self,val):
       """ 
           Retourne la valeur effective du mot-clé en fonction
           de la valeur donnée. Defaut si val == None
       """
       if (val is None and hasattr(self.definition,'defaut')) :
-        return self.definition.defaut
-      else:
-        return val
+         val = self.definition.defaut
+      val = self.convProto.convert(val)
+      return val
 
    def get_valeur(self):
       """
index cfd3f131761ce633b8eefe8fdff8d2618234cab1..0f1912467250483ff0252ee044a8db02883e15ec 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF ascheckers Noyau  DATE 23/05/2007   AUTEUR PELLET J.PELLET 
+#@ MODIF ascheckers Noyau  DATE 28/11/2007   AUTEUR COURTOIS M.COURTOIS 
 # -*- coding: iso-8859-1 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
@@ -39,12 +39,18 @@ class Parmi(object):
         return "".join( l )
 
 class CheckLog(object):
-    """Un validateur qui enregistre toutes
-    les erreurs trouvées"""
+    """Un validateur qui enregistre toutes les erreurs trouvées.
+    checkedXXX répond True si la "marq" courante est inférieure ou égale
+    à la celle de la dernière vérification.
+    Si on incrémentait "marq" à chaque étape, on revérifie à chaque fois.
+    """
     def __init__(self):
-        self.msg = []
-        self.names = {}
-        self.optional = False
+        self.msg       = []
+        self.names     = {}
+        self.optional  = False
+        self._marq     = 1
+        self._lastmarq = self._marq
+        self._debug    = False
 
     def log(self, level, obj, msg ):
         if obj :
@@ -58,8 +64,40 @@ class CheckLog(object):
     def warn(self, obj, msg ):
         self.log( 1, obj, msg )
 
-    def visit(self, obj ):
-        self.names[obj.nomj()] = 1
+    def visitOJB(self, obj):
+        key = obj.nomj()
+        self.names[key] = self._marq
+
+    def visitAsBase(self, obj):
+        key = (obj.nomj(), obj.__class__.__name__)
+        self.names[key] = self._marq
+
+    def force(self, force=False):
+        if not force:
+           self._marq = 1
+        else:
+           self._lastmarq += 1
+           self._marq = self._lastmarq
+
+    def checkedOJB(self, obj):
+        key = obj.nomj()
+        res = self.names.get(key, 0) >= self._marq
+        self.help_dbg([key,], res)
+        return res
+
+    def checkedAsBase(self, obj):
+        key = (obj.nomj(), obj.__class__.__name__)
+        res = self.names.get(key, 0) >= self._marq
+        self.help_dbg(key, res)
+        return res
+
+    def help_dbg(self, key, res):
+        if self._debug:
+            if res:
+               s = 'ignore'
+            else:
+               s = 'check '
+            print '#DBG %6d %s : %s' % (self._marq, s, ', '.join(key))
 
     def __str__(self):
         d = { 0: "E", 1:"W" }
index f0a09601e8b0e23fcd2acf98aced6163d7b47c3c..d3eba3298c6a4d6d1cb5fb24bc2c38394f047cbe 100644 (file)
@@ -1,4 +1,4 @@
-#@ MODIF asojb Noyau  DATE 16/10/2007   AUTEUR REZETTE C.REZETTE 
+#@ MODIF asojb Noyau  DATE 28/11/2007   AUTEUR COURTOIS M.COURTOIS 
 # -*- coding: iso-8859-1 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
@@ -56,6 +56,11 @@ class AsBase(Type):
         if checker is None:
             checker = CheckLog()
 
+        # vérif déjà faite ? (en tenant compte du type)
+        if checker.checkedAsBase(self):
+            return checker
+        checker.visitAsBase( self )
+        
         # vérifie les enfants :
         optional = checker.optional
         checker.optional = checker.optional or self.optional
@@ -112,7 +117,7 @@ class AsBase(Type):
     def short_repr(self):
         return "<%s(%x,%r)>" % (self.__class__.__name__, id(self), self.nomj() )
 
-    def __repr__(self):
+    def long_repr(self):
         if not hasattr(self, "par_lot") or self.par_lot():
            # hors Aster ou en par_lot='oui'
            return self.short_repr()
@@ -121,6 +126,10 @@ class AsBase(Type):
            IMPR_CO(CONCEPT=_F(NOM=self.nom), UNITE=6)
            return ''
 
+    def __repr__(self):
+        # par défaut, on fait court !
+        return self.short_repr()
+
 
 # -----------------------------------------------------------------------------
 class JeveuxAttr(object):
@@ -239,9 +248,9 @@ class OJB(AsBase):
         if checker is None:
             checker = CheckLog()
         # l'objet a déjà été vérifié, on ne fait rien
-        if checker.names.has_key(self.nomj()):
-            return checker
-        checker.visit( self )
+        if checker.checkedOJB(self):
+           return checker
+        checker.visitOJB( self )
         if self.exists:
             self.foreachattr( lambda k,v,obj,c: v.check(k, obj, c),
                               self, checker )