]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
CCAR: ajout de tests elementaires et globaux dans Tests
authoreficas <>
Wed, 11 Jan 2006 17:35:31 +0000 (17:35 +0000)
committereficas <>
Wed, 11 Jan 2006 17:35:31 +0000 (17:35 +0000)
Un test de construction de az.comm a ete cree
ajout d'un objet application sans IHM pour les tests elementaires
correction d'un bug dans comploader
remplacement du parseur python par un autre parseur fonde sur tokenize.py
correction d'un probleme dans la destruction des objets (methode supprime et include)
amelioration de la prise en compte des parametres

56 files changed:
Accas/A_ASSD.py
Editeur/Objecttreeitem.py
Editeur/appli.py
Editeur/comploader.py
Editeur/compobase.py [new file with mode: 0644]
Editeur/compooper.py
Editeur/compoparam.py
Extensions/jdc_include.py
Extensions/param2.py
Extensions/parametre.py
Ihm/I_ASSD.py
Ihm/I_ETAPE.py
Ihm/I_FONCTION.py
Ihm/I_FORM_ETAPE.py
Ihm/I_JDC.py
Ihm/I_MACRO_ETAPE.py
Ihm/I_MCSIMP.py
Tests/config.py [new file with mode: 0644]
Tests/run.py
Tests/testcomm/a.11 [new file with mode: 0644]
Tests/testcomm/a.com0 [new file with mode: 0644]
Tests/testcomm/a.comm [new file with mode: 0644]
Tests/testcomm/aa.comm [new file with mode: 0644]
Tests/testcomm/b.comm [new file with mode: 0644]
Tests/testcomm/c.comm [new file with mode: 0644]
Tests/testcomm/d.comm [new file with mode: 0644]
Tests/testcomm/efica01a.11 [new file with mode: 0644]
Tests/testcomm/efica01a.com0 [new file with mode: 0755]
Tests/testcomm/efica01a.comm [new file with mode: 0755]
Tests/testcomm/efica01b.11 [new file with mode: 0644]
Tests/testcomm/efica01b.comm [new file with mode: 0755]
Tests/testcomm/incmat.comm [new file with mode: 0644]
Tests/testcomm/parseur.comm [new file with mode: 0644]
Tests/testcomm/testaster1.py [new file with mode: 0644]
Tests/testcomm/testaster10.py [new file with mode: 0644]
Tests/testcomm/testaster2.py [new file with mode: 0644]
Tests/testcomm/testaster3.py [new file with mode: 0644]
Tests/testcomm/testaster4.py [new file with mode: 0644]
Tests/testcomm/testaster5.py [new file with mode: 0644]
Tests/testcomm/testaster6.py [new file with mode: 0644]
Tests/testcomm/testaster7.py [new file with mode: 0644]
Tests/testcomm/testaster8.py [new file with mode: 0644]
Tests/testcomm/testaster9.py [new file with mode: 0644]
Tests/testcomm/testcomm.py [new file with mode: 0644]
Tests/testcomm/titi.comm [new file with mode: 0644]
Tests/testelem/az.comm [new file with mode: 0644]
Tests/testelem/testitem1.py [new file with mode: 0644]
Tests/testelem/testjdc1.py [new file with mode: 0644]
Tests/testelem/testjdc3.py [new file with mode: 0644]
Tests/testelem/testsimp3.py
Tests/testelem/testvalidator2.py
Tests/testelem/toto.comm [new file with mode: 0644]
convert/autre_parseur.py [new file with mode: 0644]
convert/convert_python.py
convert/parseur_python.py
generator/generator_python.py

index 06e2566f992f654c5864077828cda927edfee95c..e8669988ae12df79e1832f709f00d9278338afc7 100644 (file)
@@ -44,7 +44,7 @@ class FONCTION(N_FONCTION.FONCTION,I_FONCTION.FONCTION,ASSD):
       N_FONCTION.FONCTION.__init__(self,etape=etape,sd=sd,reg=reg)
       I_FONCTION.FONCTION.__init__(self,etape=etape,sd=sd,reg=reg)
 
-class formule(N_FONCTION.formule,I_FONCTION.formule,ASSD):
+class formule(I_FONCTION.formule,N_FONCTION.formule,ASSD):
    def __init__(self,etape=None,sd=None,reg='oui'):
       N_FONCTION.formule.__init__(self,etape=etape,sd=sd,reg=reg)
       I_FONCTION.formule.__init__(self,etape=etape,sd=sd,reg=reg)
index 6e7670f308d0fea3338234018af60a333acae691..ae365327156a49f73f0513f66b0677d9ba7b4165 100644 (file)
@@ -26,7 +26,7 @@ from repr import Repr
 from copy import copy,deepcopy
 
 # import du chargeur de composants
-from comploader import gettreeitem,make_objecttreeitem
+from comploader import make_objecttreeitem
 import treewidget
 from Ihm import CONNECTOR
 
@@ -247,6 +247,14 @@ class ObjectTreeItem(TreeItem,Delegate):
         return self.object.get_genealogie()
 
     def get_index_child(self,nom_fils):
+        """
+        Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
+        Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
+        le nouveau mot-clé
+        """
+        return self.object.get_index_child(nom_fils)
+
+    def get_index_child_old(self,nom_fils):
         """
         Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
         Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
@@ -418,8 +426,7 @@ class ObjectTreeItem(TreeItem,Delegate):
            Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
            de type item associé à l'object passé en argument.
         """
-        c = gettreeitem(object)
-        return c(appli,labeltext, object, setfunction)
+        return make_objecttreeitem(appli,labeltext,object,setfunction)
 
     #def __del__(self):
     #    print "__del__",self
index 83309694a9c4f17705258f000d052ce12e899562..0df698555645f405b4394eefb6ed5bc7082e5b81 100644 (file)
@@ -26,6 +26,7 @@
 """
 # Modules Python
 import os
+import string
 import sys
 import types
 import Pmw
@@ -40,6 +41,10 @@ from styles import style
 import fontes
 import tooltip
 import properties
+import convert,generator
+import comploader
+from utils import extension_fichier,stripPath
+
 from widgets import Fenetre
 from Misc import MakeNomComplet
 import session
@@ -294,3 +299,114 @@ class APPLI:
       f.wait()
 
 
+class valeur:
+   def __init__(self,v=None):
+      self.v=v
+   def set(self,v):
+      self.v=v
+   def get(self):
+      return self.v
+
+class STANDALONE(APPLI):
+   def __init__ (self,code=prefs.code,fichier=None,version='v8.2') :
+      self.code=code
+      self.top=None
+      self.format_fichier=valeur()
+
+      self.dict_reels={}
+      self.liste_simp_reel=[]
+      # L'attribut test doit valoir 1 si on ne veut pas creer les fenetres
+      self.test=1
+
+      # Lecture des parametres de configuration (fichier global editeur.ini
+      # et utilisateur eficas.ini)
+      self.lecture_parametres()
+
+      self.message=''
+      # Avant la creation du bureau qui lit le catalogue
+      self.version_code=version
+      import readercata
+      self.readercata=readercata.READERCATA(self,None)
+
+      self.dir=None
+
+   def affiche_infos(self,message):
+      return
+
+   def get_text_JDC(self,JDC,format):
+      if generator.plugins.has_key(format):
+         # Le generateur existe on l'utilise
+         g=generator.plugins[format]()
+         jdc_formate=g.gener(JDC,format='beautifie')
+         return jdc_formate
+      else:
+         # Il n'existe pas c'est une erreur
+         return
+
+   def newJDC(self):
+      CONTEXT.unset_current_step()
+      J=self.readercata.cata[0].JdC(procedure="",
+                                    appli=self,
+                                    cata=self.readercata.cata,
+                                    cata_ord_dico=self.readercata.cata_ordonne_dico,
+                                    rep_mat=self.CONFIGURATION.rep_mat,
+                                   )
+      J.analyse()
+      return J
+
+   def openJDC(self,file):
+      self.fileName = file
+      e=extension_fichier(file)
+      self.JDCName=stripPath(file)
+      self.initialdir = os.path.dirname(os.path.abspath(file))
+      format=self.format_fichier.get()
+      # Il faut convertir le contenu du fichier en fonction du format
+      if convert.plugins.has_key(format):
+         # Le convertisseur existe on l'utilise
+         p=convert.plugins[format]()
+         p.readfile(file)
+         text=p.convert('exec',self)
+      # On se met dans le repertoire ou se trouve le fichier de commandes
+      # pour trouver les eventuels fichiers include ou autres
+      # localises a cote du fichier de commandes
+      os.chdir(self.initialdir)
+      CONTEXT.unset_current_step()
+      J=self.readercata.cata[0].JdC(procedure=text,
+                                    appli=self,
+                                    cata=self.readercata.cata,
+                                    cata_ord_dico=self.readercata.cata_ordonne_dico,
+                                    nom=self.JDCName,
+                                    rep_mat=self.CONFIGURATION.rep_mat,
+                                   )
+      J.analyse()
+      return J
+
+   def create_item(self,obj):
+      return comploader.make_objecttreeitem(self,getattr(obj,"nom","item"),obj)
+
+   def get_file(self,unite=None,fic_origine = ''):
+      """
+          Retourne le nom du fichier correspondant a l unite logique unite (entier)
+          ou d'un fichier poursuite
+      """
+      f,ext=os.path.splitext(fic_origine)
+      if unite :
+          #include
+          finclude=f+".%d" % unite
+      else:
+          #poursuite
+          n=ext[-1]
+          if n == '0':
+             ext=".comm"
+          else: 
+             ext=".com%d" % (string.atoi(n)-1)
+             if ext == '.com0' and not os.path.isfile(f+".com0"):
+                ext=".comm"
+          finclude=f+ext
+      ff=open(finclude)
+      text=ff.read()
+      ff.close()
+      return finclude,text
+
+   def affiche_alerte(self,titre,message):
+      print titre+ "\n\n" + message
index 1b9ddaa93299e75c91cf7ba7c6e26504428761d1..7a86c91550cde49848e9c147883760984cdc0b31 100644 (file)
@@ -58,41 +58,28 @@ def gettreeitem(object):
       Cette classe item dépend bien sûr de la nature de object, d'où
       l'interrogation du dictionnaire composants
     """
+    # Si la definition de l'objet a un attribut itemeditor, il indique 
+    # la classe a utiliser pour l'item
+    try:
+       return object.definition.itemeditor
+    except:
+       pass
 
-
-    if type(object) == types.InstanceType:
-       # Si la definition de l'objet a un attribut itemeditor, il indique 
-       # la classe a utiliser pour l'item
-       try:
-          return object.definition.itemeditor
-       except:
-          pass
-
-       # On cherche ensuite dans les composants (plugins)
-       try:
-           itemtype= composants[object.__class__]
-           return itemtype
-       except:
-           pass
-
-       try :
-           for e in composants.keys():
-              if isinstance(object,e):
-                 itemtype= composants[e]
-                 return itemtype
-       except :
-           pass
+    # On cherche ensuite dans les composants (plugins)
+    try:
+       itemtype= composants[object.__class__]
+       return itemtype
+    except:
+       pass
 
     # Puis une eventuelle classe heritee (aleatoire car sans ordre)
     for e in composants.keys():
-       if isinstance(object,e):
-          itemtype= composants[e]
-          return itemtype
+        if e and isinstance(object,e):
+           itemtype= composants[e]
+           return itemtype
 
-    # Apres poum ??? Les lignes suivantes sont elles utiles ?
     # Si on n'a rien trouve dans les composants on utilise l'objet par defaut
-    print itemtype
-    itemtype=ObjectTreeItem
+    itemtype=composants[None]
     return itemtype
 
 def make_objecttreeitem(appli,labeltext, object, setfunction=None):
diff --git a/Editeur/compobase.py b/Editeur/compobase.py
new file mode 100644 (file)
index 0000000..df539df
--- /dev/null
@@ -0,0 +1,3 @@
+import Objecttreeitem
+treeitem = Objecttreeitem.ObjectTreeItem
+objet = None
index 945baceeac30a997b350e73e74c2f285267682db..f6c56171e6031268e6464fa7b610d07ced01221a 100644 (file)
@@ -279,6 +279,15 @@ class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
       return self.object.get_noms_sd_oper_reentrant()
 
   def get_objet_commentarise(self):
+      """
+          Cette méthode retourne un objet commentarisé
+          représentatif de self.object
+      """
+      # Format de fichier utilisé
+      format=self.appli.format_fichier.get()
+      return self.object.get_objet_commentarise(format)
+
+  def get_objet_commentarise_BAK(self):
       """
           Cette méthode retourne un objet commentarisé
           représentatif de self.object
index 64a1b15a9a7d84386aa3bb54797f71caed8bda16..a96c2d32451a77fb0372e7fc5ba954d198efef3a 100644 (file)
@@ -216,7 +216,8 @@ class PARAMTreeItem(Objecttreeitem.ObjectTreeItem):
       """
       Renomme le paramètre
       """
-      self.object.set_attribut('nom',new_nom)
+      self.object.set_nom(new_nom)
+      #self.object.set_attribut('nom',new_nom)
 
     def get_fr(self):
       """
index deb6c55874861b8f388135be430e755cd3de42eb..e02f1dccea0f292448f3f86c3959cd73bf1c20b8 100644 (file)
@@ -183,6 +183,10 @@ class JDC_POURSUITE(JDC):
       JDC.supprime(self)
       self.jdc_pere=None
       self.etape_include=None
+   #   self.cata_ordonne_dico={}
+      self.appli=None
+   #   self.context_ini={}
+   #   self.procedure=None
 
    def get_contexte_avant(self,etape):
       """
index 74ac889c97617dbcb1f09c37f4e933233763402a..61c6e3ae6c0145ec923d97459a5922e4230de30d 100644 (file)
@@ -1,5 +1,6 @@
 from __future__ import division
 import math
+import Numeric
 
 def mkf(value):
     if type(value) in (type(1), type(1L), type(1.5), type(1j),type("hh")):
@@ -43,12 +44,12 @@ class Binop(Formula):
         self.values = mkf(value1), mkf(value2)
     def __str__(self):
         if self.op == '[]':
-           return "(%s[%s])" % (self.values[0], self.values[1])
+           return "%s[%s]" % (self.values[0], self.values[1])
         else:
            return "(%s %s %s)" % (self.values[0], self.op, self.values[1])
     def __repr__(self):
         if self.op == '[]':
-           return "(%s[%s])" % (self.values[0], self.values[1])
+           return "%s[%s]" % (self.values[0], self.values[1])
         else:
            return "(%s %s %s)" % (self.values[0], self.op, self.values[1])
     def eval(self):
@@ -58,18 +59,53 @@ class Binop(Formula):
               result=result.eval()
         return result
 
+original_cos=math.cos
+original_sin=math.sin
+original_ncos=Numeric.cos
+original_nsin=Numeric.sin
+
 class Unop(Formula):
     opmap = { '-': lambda x: -x,
               'sin': lambda x: math.sin(x),
-              'cos': lambda x: math.cos(x) }
+              'cos': lambda x: original_cos(x) ,
+              'ncos': lambda x: original_ncos(x),
+              'nsin': lambda x: original_nsin(x),
+             }
     def __init__(self, op, arg):
         self._op = op
         self._arg = mkf(arg)
     def __str__(self):
         return "%s(%s)" % (self._op, self._arg)
+    def __repr__(self):
+        return "%s(%s)" % (self._op, self._arg)
     def eval(self):
         return self.opmap[self._op](self._arg.eval())
 
+class Unop2(Unop):
+    def __init__(self, nom, op, arg):
+        self._nom = nom
+        self._op = op
+        self._arg=[]
+        for a in arg:
+           self._arg.append(mkf(a))
+    def __str__(self):
+        s="%s(" % self._nom
+        for a in self._arg:
+           s=s+str(a)+','
+        s=s+")"
+        return s
+    def __repr__(self):
+        s="%s(" % self._nom
+        for a in self._arg:
+           s=s+str(a)+','
+        s=s+")"
+        return s
+    def eval(self):
+        l=[]
+        for a in self._arg:
+          l.append(a.eval())
+        return self._op(*l)
+
 class Constant(Formula):
     def __init__(self, value): self._value = value
     def eval(self): return self._value
@@ -83,5 +119,11 @@ class Variable(Formula):
     def __repr__(self): return "Variable('%s',%s)" % (self._name, self._value)
     def __str__(self): return self._name
 
+def cos(f): return Unop('ncos', f)
+def sin(f): return Unop('nsin', f)
+Numeric.cos=cos
+Numeric.sin=sin
 def cos(f): return Unop('cos', f)
 def sin(f): return Unop('sin', f)
+math.cos=cos
+math.sin=sin
index 28b6bd8732add689e687e7c9811aef0e66f62947..bb525091d8673603bf402b0d3b9ebccfb268cee3 100644 (file)
@@ -29,6 +29,7 @@
 # import de modules Python
 import string,types
 from math import *
+import traceback
 
 # import de modules Eficas
 from Noyau.N_CR import CR
@@ -48,23 +49,23 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
   idracine = 'param'
 
   def __init__(self,nom,valeur=None):
-    # parent ne peut être qu'un objet de type JDC
-    self.dict_valeur=[]
-    self.valeur = self.interprete_valeur(valeur)
-    self.val=valeur
     self.nom = nom
     # La classe PARAMETRE n'a pas de définition : on utilise self pour
     # complétude
     self.definition=self
+    # parent ne peut être qu'un objet de type JDC
     self.jdc = self.parent = CONTEXT.get_current_step()
     self.niveau=self.parent.niveau
     self.actif=1
     self.state='undetermined'
     self.register()
+    self.dict_valeur=[]
+    self.valeur = self.interprete_valeur(valeur)
+    self.val=valeur
 
-  def __getitem__(self,key):
-    param_item=ITEM_PARAMETRE(self,key)
-    return param_item
+#  def __getitem__(self,key):
+#    param_item=ITEM_PARAMETRE(self,key)
+#    return param_item
 
 #  def __neg__(self):
 #    try:
@@ -233,25 +234,37 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
     - une liste d'items d'un type qui précède
     Retourne la valeur interprétée
     """
-    if not val : return None
+    #if not val : return None
     valeur = None
     #  on vérifie si val est un entier
-    try :
-        valeur = string.atoi(val)       # on a un entier
-        return valeur
-    except :
-        pass
+    #try :
+    #    valeur = string.atoi(val)       # on a un entier
+    #    print "int",valeur
+    #    return valeur
+    #except :
+    #    traceback.print_exc()
+    #    pass
+    #print val,valeur
     #  on vérifie si val est un réel
-    try:
-        valeur = string.atof(val)   # on a un réel
-        return valeur
-    except :
-        pass
-    # on vérifie si val est un tuple
-    try :
-        valeur = eval(val)
-    except:
-        pass
+    #try:
+    #    valeur = string.atof(val)   # on a un réel
+    #    print "float",valeur
+    #    return valeur
+    #except :
+    #    traceback.print_exc()
+    #    pass
+    #print val,valeur
+
+    if type(val) == types.StringType:
+       # on tente l'evaluation (dans quel contexte ?)
+       if self.parent:
+          valeur=self.parent.eval_in_context(val,self)
+       else:
+          try :
+              valeur = eval(val)
+          except:
+              traceback.print_exc()
+              pass
     #PN je n ose pas modifier je rajoute
     if valeur != None :
         if type(valeur) == types.TupleType:
@@ -274,12 +287,13 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
             # on a réussi à évaluer val en autre chose qu'un tuple ...
             #print "on a réussi à évaluer %s en autre chose qu'un tuple ..." %val
             #print 'on trouve : ',str(valeur),' de type : ',type(valeur)
-    # on retourne val comme une string car on n'a pas su l'interpréter
     if valeur != None :
        if type(valeur).__name__ == 'list':
           self.dict_valeur=[]
           for i in range(len(valeur)):
-             self.dict_valeur.append(valeur[i])
+             self.dict_valeur.append(valeur[i])
+       return valeur
+    # on retourne val comme une string car on n'a pas su l'interpréter
     return val
 
   def get_valeurs(self):
@@ -298,6 +312,14 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
     self.valeur = self.interprete_valeur(new_valeur)
     self.init_modif()
 
+  def set_nom(self,new_nom):
+    """
+    Change le nom du parametre
+    """
+    self.init_modif()
+    self.nom=new_nom
+    self.fin_modif()
+
   def init_modif(self):
     """
     Méthode qui déclare l'objet courant comme modifié et propage
@@ -361,6 +383,7 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
     self.parent = None
     self.jdc = None
     self.definition=None
+    self.niveau=None
 
   def active(self):
     """
@@ -413,7 +436,10 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
     """
         Donne un echo de self sous la forme nom = valeur
     """
-    return self.nom+' = '+str(self.valeur)
+    if type(self.valeur) == types.StringType:
+       return self.nom+' = '+ repr(self.valeur)
+    else:
+       return self.nom+' = '+ str(self.valeur)
 
   def __str__(self):
     """
@@ -477,7 +503,10 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
       pass
 
   def eval(self):
-      return self.valeur
+      if isinstance(self.valeur,Formula):
+         return self.valeur.eval()
+      else:
+         return self.valeur
 
 class COMBI_PARAMETRE :
   def __init__(self,chainevaleur,valeur):
index 277424241fba2dddbea9b8f747c7d69b3acca53f..f7bd493ea6f213c4e28215ec13e4dcabcf5a769c 100644 (file)
@@ -22,3 +22,5 @@
 class ASSD:
    def __repr__(self):
       return "concept %s de type %s" % (self.get_name(),self.__class__.__name__)
+   #def __del__(self):
+   #   print "__del__",self
index 6ad4ee814a7384e76c5b637afc38b67a18bf46ef..eb3d20bfc36b8638ca4d7aca4a5da7ad1973bebe 100644 (file)
@@ -38,6 +38,7 @@ from Noyau.N_Exception import AsException
 # Modules EFICAS
 import I_MCCOMPO
 import CONNECTOR
+from Extensions import commande_comm
 
 class ETAPE(I_MCCOMPO.MCCOMPO):
 
@@ -226,6 +227,7 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
       """
       if self.actif:return
       self.actif = 1
+      self.init_modif()
       if self.sd :
         try:
           self.jdc.append_sdprod(self.sd)
@@ -241,6 +243,7 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
           et de la liste des sd
       """
       self.actif = 0
+      self.init_modif()
       if self.sd :
          self.jdc.del_sdprod(self.sd)
          self.jdc.delete_concept_after_etape(self,self.sd)
@@ -395,6 +398,30 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
         Realise l'update des blocs conditionnels fils de self
      """
      self._update_condition_bloc()
+
+   def get_objet_commentarise(self,format):
+      """
+          Cette méthode retourne un objet commande commentarisée
+          representant la commande self
+      """
+      import generator
+      g=generator.plugins[format]()
+      texte_commande = g.gener(self,format='beautifie')
+      # Il faut enlever la première ligne vide de texte_commande que
+      # rajoute le generator
+      rebut,texte_commande = string.split(texte_commande,'\n',1)
+      # on construit l'objet COMMANDE_COMM repésentatif de self mais non
+      # enregistré dans le jdc (pas ajouté dans jdc.etapes)
+      parent=self.parent
+      pos=self.parent.etapes.index(self)
+      commande_comment = commande_comm.COMMANDE_COMM(texte=texte_commande,
+                                                     reg='non',
+                                                     parent=parent)
+      self.parent.suppentite(self)
+      parent.addentite(commande_comment,pos)
+
+      return commande_comment
+
      
 #ATTENTION SURCHARGE: a garder en synchro ou a reintegrer dans le Noyau
    def Build_sd(self,nom):
index 46bc19ab638c9b0ac647a7fa9b6740c57f7bc58c..04879d4f04ada91ce2f0be3d0e7ab1f9dfd490e9 100644 (file)
@@ -18,6 +18,7 @@
 #
 #
 # ======================================================================
+import string
 from I_ASSD import ASSD
 
 class FONCTION(ASSD):
@@ -41,5 +42,27 @@ class FONCTION(ASSD):
 # modification de C Durand sur la gestion des formules dans le superviseur
 # On conserve l'ancienne classe fonction (ceinture et bretelles)
 class fonction(FONCTION) : pass
-class formule(FONCTION) : pass
+
+from Extensions import param2
+class formule(FONCTION) : 
+   def __call__(self,*val):
+      return param2.Unop2(self.nom,self.real_call,val)
+
+   def real_call(self,*val):
+      if hasattr(self.parent,'contexte_fichier_init'):
+                        context=self.parent.contexte_fichier_init
+      else            : context={}
+      i=0
+      for param in self.nompar :
+         context[param]=val[i]
+         i=i+1
+      try :
+       res=eval(self.expression,self.jdc.const_context, context)
+      except :
+       print 75*'!'
+       print '! '+string.ljust('Erreur evaluation formule '+self.nom,72)+'!'
+       print 75*'!'
+       raise
+      return res
+
 
index 75cad81c75c0d3ba79e26b1cd0489b23f02b9bcb..c7a035f270ad0cc102d76bbd61f4f12e5bad16af 100644 (file)
@@ -282,9 +282,9 @@ class FORM_ETAPE(MACRO_ETAPE):
           return O
         arguments=formule[3]
        if arguments[0] == '(' :
-          arguments=[1,-1 ]
-       if arguments[-1] == '(' :
-          arguments=[0,-2 ]
+          arguments=arguments[1:]
+       if arguments[-1] == ')' :
+          arguments=arguments[:-1]
        self.arguments=tuple(arguments.split(','))
 
        i=1
@@ -313,6 +313,7 @@ class FORM_ETAPE(MACRO_ETAPE):
         Il faut ajouter la formule au contexte global du JDC
         """
         self.actif = 1
+        self.init_modif()
         nom = self.get_nom()
         if nom == '' : return
         try:
@@ -326,6 +327,7 @@ class FORM_ETAPE(MACRO_ETAPE):
         Il faut supprimer la formule du contexte global du JDC
         """
         self.actif = 0
+        self.init_modif()
         if not self.sd : return
         self.jdc.del_fonction(self.sd)
 
index 7baa03536e55bf61fe2d8c321fc293453805bf70..17de72e29d26d2978cb8c2459e87553c4eee0737 100644 (file)
@@ -696,6 +696,45 @@ class JDC(I_OBJECT.OBJECT):
    def changefichier(self,fichier):
        self.fin_modif()
 
+   def eval_in_context(self,valeur,etape):
+      """ Tente d'evaluer valeur dans le contexte courant de etape
+          Retourne le parametre valeur inchange si l'evaluation est impossible
+      """
+      #contexte initial du jdc
+      context=self.condition_context.copy()
+      #contexte courant des concepts
+      context.update(self.get_contexte_avant(etape))
+      #contexte des parametres 
+      for e in self.etapes:
+         if e is etape:break
+         if not e.isactif():continue
+         e.update_context(context)
+      try :
+         objet = eval(valeur,context)
+         return objet
+      except:
+         pass
+      return valeur
+
+#ATTENTION SURCHARGE : cette methode doit etre gardée en synchronisation avec celle de Noyau
+   def supprime(self):
+      #print "supprime",self
+      Noyau.N_JDC.JDC.supprime(self)
+   #   self.appli=None
+   #   self.g_context={}
+   #   self.const_context={}
+   #   self.sds=[]
+   #   self.sds_dict={}
+   #   self.mc_globaux={}
+   #   self.current_context={}
+   #   self.condition_context={}
+   #   self.etapes_niveaux=[]
+   #   self.niveau=None
+   #   self.params=[]
+   #   self.fonctions=[]
+   #   self._etape_context=None
+   #   self.etapes=[]
+       
 #ATTENTION SURCHARGE : cette methode doit etre gardée en synchronisation avec celle de Noyau
    def register(self,etape):
       """
index 0ca98ea425baa380cbce7d1ce3db81d3232b598d..e351b006dd45e153ea04c7afca82e185afb3d867 100644 (file)
@@ -90,6 +90,10 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
        # de prendre cette precaution mais ce n'est pas vrai partout.
        old_recorded_units=self.recorded_units.copy()
 
+       # on supprime l'ancien jdc_aux s'il existe
+       if hasattr(self,'jdc_aux') and self.jdc_aux:
+          self.jdc_aux.supprime_aux()
+
        if fichier is None:fichier="SansNom"
        j=self.JdC_aux( procedure=text, nom=fichier,
                                 appli=self.jdc.appli,
@@ -132,6 +136,8 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
     # On recupere le contexte de l'include verifie
     try:
        j_context=j.get_verif_contexte()
+       #print j_context.keys()
+       #print j.g_context.keys()
     except:
        # On retablit l'etape courante step
        CONTEXT.unset_current_step()
@@ -491,7 +497,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
         Cette méthode sert à créer un contexte en interprétant un texte source
         Python
     """
-    #print "make_contexte_include"
+    #print "make_contexte_include",fichier
     # on récupère le contexte d'un nouveau jdc dans lequel on interprete text
     contexte = self.get_contexte_jdc(fichier,text)
     if contexte == None :
@@ -676,6 +682,12 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
          self.jdc_aux.supprime_aux()
          self.jdc_aux=None
       Noyau.N_MACRO_ETAPE.MACRO_ETAPE.supprime(self)
+  #    self.contexte_fichier_init={}
+  #    self.old_contexte_fichier_init={}
+  #    self.g_context={}
+  #    self.current_context={}
+  #    self.etapes=[]
+  #    self.mc_liste=[]
 
 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
   def get_file(self,unite=None,fic_origine=''):
@@ -758,6 +770,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
         en interprétant un texte source Python
         Elle est appelee par la fonction sd_prd d'INCLUDE_MATERIAU
     """
+    #print "make_contexte",fichier
     # On supprime l'attribut mat qui bloque l'evaluation du source de l'INCLUDE_MATERIAU
     # car on ne s'appuie pas sur lui dans EFICAS mais sur l'attribut fichier_ini
     if hasattr(self,'mat'):del self.mat
index 7ed2b556318b1480c47271a659c212d2fb61a0eb..6dedfca25ec3abe21945d20f2a067849a811f836 100644 (file)
@@ -313,6 +313,50 @@ class MCSIMP(I_OBJECT.OBJECT):
         if CONTEXT.debug : traceback.print_exc()
         return None,0
 
+  def eval_val(self,new_valeur):
+    """
+       Tente d'evaluer new_valeur comme un objet du jdc (par appel a eval_val_item)
+       ou comme une liste de ces memes objets
+       Si new_valeur contient au moins un separateur (,), tente l'evaluation sur
+       la chaine splittee
+    """
+    if type(new_valeur) in (types.ListType,types.TupleType):
+       valeurretour=[]
+       for item in new_valeur :
+          valeurretour.append(self.eval_val_item(item))
+       return valeurretour
+    else:
+       valeur=self.eval_val_item(new_valeur)
+       if valeur == new_valeur and new_valeur.find(',') > 0:
+          valeurretour=[]
+          for item in new_valeur.split(',') :
+             valeurretour.append(self.eval_val_item(item))
+          return valeurretour
+       return valeur
+
+  def eval_val_item(self,new_valeur):
+    """
+       Tente d'evaluer new_valeur comme un concept, un parametre, un objet Python
+       Si c'est impossible retourne new_valeur inchange
+       argument new_valeur : string (nom de concept, de parametre, expression ou simple chaine)
+    """
+    # concept ?
+    sd = self.jdc.get_sd_avant_etape(new_valeur,self.etape)
+    if sd :
+      return sd
+    # expression ou item parametre ?
+    d={}
+    # On veut EVAL avec tous ses comportements. On utilise Accas. Perfs ??
+    d['EVAL']=Accas.EVAL
+    for p in self.jdc.params:
+       d[p.nom]=p
+    try :
+      objet = eval(new_valeur,d)
+      return objet
+    except:
+      pass
+    return new_valeur
+
   def cherche_item_parametre (self,new_valeur):
         try:
          nomparam=new_valeur[0:new_valeur.find("[")]
@@ -491,6 +535,12 @@ class MCSIMP(I_OBJECT.OBJECT):
         if self.jdc:
            self.jdc.mc_globaux[self.nom]=self
 
+  def nbrColonnes(self):
+     genea = self.get_genealogie()
+     if "VALE_C" in genea and "DEFI_FONCTION" in genea : return 3
+     if "VALE" in genea and "DEFI_FONCTION" in genea : return 2
+     return 0
+
 #--------------------------------------------------------------------------------
  
 #ATTENTION SURCHARGE : toutes les methodes ci apres sont des surcharges du Noyau et de Validation
@@ -534,7 +584,7 @@ class MCSIMP(I_OBJECT.OBJECT):
              verif_type=self.verif_type(val=v,cr=None)
              # cas des tuples avec un ITEM_PARAMETRE
               if verif_type == 0:
-                 if type(v) == types.TupleType :
+                 if type(v) in ( types.TupleType ,types.ListType):
                   new_val=[]
                   for i in v:
                     if ((issubclass(i.__class__,param2.Formula)) or
@@ -577,7 +627,8 @@ class MCSIMP(I_OBJECT.OBJECT):
          val.eval()
         return 1
       except :
-       pass
+         traceback.print_exc()
+        pass
       return self.verif_type(val,cr)
 
   def verif_typeliste(self,val,cr='non') :
@@ -585,4 +636,4 @@ class MCSIMP(I_OBJECT.OBJECT):
       for v in val :
        verif=verif+self.verif_typeihm(v,cr)
       return verif
-                                                                           
+
diff --git a/Tests/config.py b/Tests/config.py
new file mode 100644 (file)
index 0000000..195b32e
--- /dev/null
@@ -0,0 +1,6 @@
+
+import sys
+sys.path.insert(0,"../Aster")
+import prefs
+ASTERDIR="/local/chris/ASTER/instals/STA8.2/astest"
+
index e1a5dce412ac423a7c9939e38fcc8a2e3890764f..de323f1e0eda6f02b3aca3e00bf49e9a926c9254 100644 (file)
@@ -3,11 +3,12 @@ import sre
 import unittest
 from optparse import OptionParser
 
-sys.path[:0]=[".."]
+import config
 
 testMatch = sre.compile(r'^[Tt]est')
 
 class TestSuite(unittest.TestSuite):
+    ignore=[]
     loader = unittest.defaultTestLoader
 
     def __init__(self, names=[]):
@@ -23,40 +24,54 @@ class TestSuite(unittest.TestSuite):
             mod = getattr(mod,comp)
         return mod
 
+    def importdir(self,rep,path):
+        init = os.path.abspath(os.path.join(path,'__init__.py'))
+        if os.path.isfile(init):
+           package=self._import(rep)
+           if package:
+              return TestPackageSuite(package)
+        else:
+           return TestDirectorySuite(path)
+
+    def importfile(self,item,path):
+        root, ext = os.path.splitext(item)
+        if ext != '.py':
+           return  
+        if root.find('/') >= 0:
+           dirname, file = os.path.split(path)
+           root, ext = os.path.splitext(file)
+           sys.path.insert(0,dirname)
+           mod=self._import(root)
+           sys.path.remove(dirname)
+        else:
+           mod=self._import(root)
+        return ModuleTestSuite(mod)
+
     def collectTests(self):
         if self.names:
            entries=self.names
         else:
            entries = [ item for item in os.listdir(os.getcwd())
                         if item.lower().find('test') >= 0 ]
+        self.path=os.getcwd()
+        return self._collectTests(entries)
 
+    def _collectTests(self,entries):
         tests=[]
         for item in entries:
-            path=os.path.abspath(os.path.join(os.getcwd(),item))
-            if os.path.isfile(item):
-                root, ext = os.path.splitext(item)
-                if ext == '.py':
-                    if root.find('/') >= 0:
-                       dirname, file = os.path.split(path)
-                       root, ext = os.path.splitext(file)
-                       sys.path.insert(0,dirname)
-                       mod=self._import(root)
-                       sys.path.remove(dirname)
-                    else:
-                       mod=self._import(root)
-                    tests.append(ModuleTestSuite(mod))
-            elif os.path.isdir(item):
-                init = os.path.abspath(os.path.join(item,'__init__.py'))
-                if os.path.isfile(init):
-                   package=self._import(item)
-                   if package:
-                      tests.append(TestPackageSuite(package))
-                else:
-                   tests.append(TestDirectorySuite(path))
+            if (item[0] == '.'
+                or item in self.ignore
+                or not testMatch.search(item)):
+                continue
+            path=os.path.abspath(os.path.join(self.path,item))
+            if os.path.isfile(path):
+               t=self.importfile(item,path)
+               if t:tests.append(t)
+            elif os.path.isdir(path):
+               tests.append(self.importdir(item,path))
         return tests
 
 class TestDirectorySuite(TestSuite):
-    ignore=[]
     def __init__(self,path):
         self.path=path
         super(TestDirectorySuite,self).__init__()
@@ -67,33 +82,7 @@ class TestDirectorySuite(TestSuite):
             sys.path.insert(0,self.path)
             entries = os.listdir(self.path)
             entries.sort()
-            for item in entries:
-                if (item[0] == '.'
-                    or item in self.ignore
-                    or not testMatch.search(item)):
-                    continue
-                item_path = os.path.abspath(os.path.join(self.path,item))
-                if os.path.isfile(item_path):
-                    root, ext = os.path.splitext(item)
-                    if ext != '.py':
-                        continue
-                    if root.find('/') >= 0:
-                       dirname, file = os.path.split(item_path)
-                       root, ext = os.path.splitext(file)
-                       sys.path.insert(0,dirname)
-                       mod=self._import(root)
-                       sys.path.remove(dirname)
-                    else:
-                       mod=self._import(root)
-                    tests.append(ModuleTestSuite(mod))
-                elif os.path.isdir(item_path):
-                    init = os.path.abspath(os.path.join(item_path,'__init__.py'))
-                    if os.path.isfile(init):
-                        package=self._import(item)
-                        if package:
-                           tests.append(TestPackageSuite(package))
-                    else:
-                        tests.append(TestDirectorySuite(item_path))
+            tests=self._collectTests(entries)
             sys.path.remove(self.path)
         return tests
 
@@ -103,37 +92,23 @@ class TestPackageSuite(TestDirectorySuite):
         path=os.path.abspath(os.path.dirname(self.package.__file__))
         super(TestPackageSuite,self).__init__(path)
 
-    def collectTests(self):
-        tests=[]
-        if self.path:
-            sys.path.insert(0,self.path)
-            entries = os.listdir(self.path)
-            entries.sort()
-            for item in entries:
-                if (item[0] == '.'
-                    or item in self.ignore
-                    or not testMatch.search(item)):
-                    continue
-                item_path = os.path.abspath(os.path.join(self.path,item))
-                if os.path.isfile(item_path):
-                    root, ext = os.path.splitext(item)
-                    if ext != '.py':
-                        continue
-                    name="%s.%s" % (self.package.__name__,root)
-                    mod=self._import(name)
-                    tests.append(ModuleTestSuite(mod))
-                elif os.path.isdir(item_path):
-                    init = os.path.abspath(os.path.join(item_path,'__init__.py'))
-                    if os.path.isfile(init):
-                        name="%s.%s" % (self.package.__name__,item)
-                        package=self._import(name)
-                        if package:
-                           tests.append(TestPackageSuite(package))
-                    else:
-                        tests.append(TestDirectorySuite(item_path))
-            sys.path.remove(self.path)
-        return tests
-
+    def importdir(self,item,path):
+        init = os.path.abspath(os.path.join(path,'__init__.py'))
+        if os.path.isfile(init):
+           name="%s.%s" % (self.package.__name__,item)
+           package=self._import(name)
+           if package:
+              return TestPackageSuite(package)
+        else:
+           return TestDirectorySuite(path)
+
+    def importfile(self,item,path):
+        root, ext = os.path.splitext(item)
+        if ext != '.py':
+           return
+        name="%s.%s" % (self.package.__name__,root)
+        mod=self._import(name)
+        return ModuleTestSuite(mod)
 
 class ModuleTestSuite(TestSuite):
 
diff --git a/Tests/testcomm/a.11 b/Tests/testcomm/a.11
new file mode 100644 (file)
index 0000000..1723fcb
--- /dev/null
@@ -0,0 +1 @@
+MM=LIRE_MAILLAGE()
diff --git a/Tests/testcomm/a.com0 b/Tests/testcomm/a.com0
new file mode 100644 (file)
index 0000000..04d1cc2
--- /dev/null
@@ -0,0 +1,3 @@
+POURSUITE()
+MA=LIRE_MAILLAGE(INFO=inf)
+FIN()
diff --git a/Tests/testcomm/a.comm b/Tests/testcomm/a.comm
new file mode 100644 (file)
index 0000000..812f1bc
--- /dev/null
@@ -0,0 +1,3 @@
+DEBUT()
+inf=1
+FIN()
diff --git a/Tests/testcomm/aa.comm b/Tests/testcomm/aa.comm
new file mode 100644 (file)
index 0000000..124141b
--- /dev/null
@@ -0,0 +1,8 @@
+DEBUT()    
+inf1=1
+MA=LIRE_MAILLAGE(INFO=inf1)
+INCLUDE_MATERIAU(   NOM_AFNOR='18MND5',      TYPE_MODELE='REF',
+                      VARIANTE='A',          TYPE_VALE='NOMI',
+                     NOM_MATER='MAT3',       INFO=1               )
+
+FIN()
diff --git a/Tests/testcomm/b.comm b/Tests/testcomm/b.comm
new file mode 100644 (file)
index 0000000..478973d
--- /dev/null
@@ -0,0 +1,9 @@
+DEBUT()
+a=1
+fmt_raison='-'*80+"""
+
+   Exception erreur_Fatale interceptee
+   Raison : %s
+
+"""+'-'*80+'\n'
+FIN()
diff --git a/Tests/testcomm/c.comm b/Tests/testcomm/c.comm
new file mode 100644 (file)
index 0000000..e4dfab3
--- /dev/null
@@ -0,0 +1,35 @@
+from Numeric import cos
+DEBUT()
+RAYCRA=1.
+EPCRA=0.1
+S_CR=3.1415*(RAYCRA**2-(RAYCRA-EPCRA)**2)
+T_CR=3.1415
+n=2
+
+MA=LIRE_MAILLAGE(  )
+
+MO=AFFE_MODELE(  MAILLAGE=MA,
+                 AFFE=(_F(GROUP_MA = ('LI1'),
+                          PHENOMENE = 'MECANIQUE',
+                          MODELISATION = 'DIS_TR'),
+                                ),
+                  INFO=2,);
+
+carel=[0.]*78
+
+CAREG=AFFE_CARA_ELEM(MODELE=MO,
+                     DISCRET=_F(GROUP_MA=('LI1'),
+                                CARA = 'K_TR_L',
+                                VALE = carel,
+                                REPERE='LOCAL' , ),
+                                ORIENTATION=(_F(GROUP_MA=('LI1',),
+                                CARA='VECT_Y',
+                                VALE=(0.,0.,1.),),),
+               AFFE_FIBRE =( _F(GROUP_MA='CRAYON', COOR_AXE_POUTRE = (0.,0.,), CARA='SURFACE', VALE=( 0.,S_CR/4,)),
+                             _F(GROUP_MA='CRAYON', COOR_AXE_POUTRE = (0.,0.,), CARA='SURFACE', VALE=( 0.,T_CR,)),
+                             _F(GROUP_MA='CRAYON', COOR_AXE_POUTRE = (0.,sin(n*22.5*pi/180),), CARA='SURFACE', VALE=( 0.,T_CR/4,)),
+                             _F(GROUP_MA='CRAYON', COOR_AXE_POUTRE = (0.,(cos(n*22.5*pi/180)),), CARA='SURFACE', VALE=( 0.,T_CR/4,)),
+                           ),
+                        );
+
+FIN()
diff --git a/Tests/testcomm/d.comm b/Tests/testcomm/d.comm
new file mode 100644 (file)
index 0000000..06bd240
--- /dev/null
@@ -0,0 +1,4 @@
+DEBUT()
+a=1
+MA=LIRE_MAILLAGE()
+FIN()
diff --git a/Tests/testcomm/efica01a.11 b/Tests/testcomm/efica01a.11
new file mode 100644 (file)
index 0000000..cda7b74
--- /dev/null
@@ -0,0 +1,19 @@
+DEPL2 = FORMULE(NOM_PARA='INST',VALE='sin(OMEGAA*INST)/(OMEGAA**xx)')
+DEPLACE2=CALC_FONC_INTERP( FONCTION=DEPL2,
+                           LIST_PARA=L_INST,
+                          NOM_PARA='INST',
+                           PROL_DROITE='LINEAIRE',
+                           PROL_GAUCHE='LINEAIRE',
+                           NOM_RESU='DEPL'       )
+
+MONO_X=CALC_CHAR_SEISME(  MATR_MASS=MASSE,
+                          DIRECTION=( 1., 0., 0.,),
+                          MONO_APPUI='OUI' )
+
+
+MACRO_PROJ_BASE(BASE=MODE_MEC,MATR_ASSE_GENE=(
+                _F( MATRICE = CO("MASS_GEN"), MATR_ASSE = MASSE),
+                _F( MATRICE = CO("RIGI_GEN"), MATR_ASSE = RIGIDITE)),
+                VECT_ASSE_GENE=_F( VECTEUR = CO("VECT_X"), VECT_ASSE = MONO_X)
+               )
+
diff --git a/Tests/testcomm/efica01a.com0 b/Tests/testcomm/efica01a.com0
new file mode 100755 (executable)
index 0000000..25134e9
--- /dev/null
@@ -0,0 +1,49 @@
+POURSUITE(CODE=_F(  NOM = 'EFICA01A'))
+
+INCLUDE_MATERIAU(   NOM_AFNOR='18MND5',      TYPE_MODELE='REF',
+                      VARIANTE='A',          TYPE_VALE='NOMI',
+                     NOM_MATER='MAT3',       INFO=1               )
+
+CHMAT3=AFFE_MATERIAU(  MAILLAGE=MAILLA3,
+                       AFFE=_F(  TOUT='OUI', MATER = MAT3, TEMP_REF = 20.))
+
+riginor = 2.88E7 
+
+TRAN_GE2=DYNA_TRAN_MODAL(  MASS_GENE=MGEN_BIC,   RIGI_GENE=RGEN_BIC,
+                 METHODE='EULER',
+                 AMOR_REDUIT=( 0.07,  0.07, ),
+                MODE_STAT=MSTA_BIC,EXCIT=(
+                _F(  VECT_GENE = VECT_X1,  ACCE = ACCELER1,
+                       MULT_APPUI = 'OUI',
+                       DIRECTION = ( 1., 0., 0.,), NOEUD = 'NO1',
+                       VITE = VITESSE1, DEPL = DEPLACE1), 
+                _F(  VECT_GENE = VECT_X2,  ACCE = ACCELER2,
+                       MULT_APPUI = 'OUI',
+                       DIRECTION = ( 1., 0., 0.,), NOEUD = 'NO11',
+                       VITE = VITESSE2, DEPL = DEPLACE2)), 
+                CHOC=_F(  GROUP_NO_1 = 'MASSES1',
+                       GROUP_NO_2 = 'MASSES2',
+                       OBSTACLE = GRILLE,
+                       INTITULE = 'NO2/NO12',
+                       NORM_OBST = (0., 0., 1.,),
+                       DIST_1 = 0.4495,
+                       DIST_2 = 0.4495,
+                       RIGI_NOR = riginor,
+                       AMOR_NOR = 0.,
+                       RIGI_TAN = 0.,
+                       COULOMB = 0.),
+                 INCREMENT=_F( INST_INIT = 0.,  INST_FIN = 1.,  PAS = 0.00025),
+                ARCHIVAGE=_F(  PAS_ARCH = 8)
+                )
+
+LISTIMP=DEFI_LIST_REEL(  DEBUT=0.,
+                    INTERVALLE=_F(  JUSQU_A = 1.,  NOMBRE = 500))
+
+RESUA1=REST_BASE_PHYS(  RESU_GENE=TRAN_GE1,
+                        LIST_INST=LISTIMP,
+                        INTERPOL='LIN',
+                        NOM_CHAM='DEPL',
+                        MULT_APPUI='OUI'
+                       )
+
+FIN()
diff --git a/Tests/testcomm/efica01a.comm b/Tests/testcomm/efica01a.comm
new file mode 100755 (executable)
index 0000000..20eea86
--- /dev/null
@@ -0,0 +1,275 @@
+# MODIF  DATE 20/09/2004   AUTEUR DURAND C.DURAND 
+# TITRE TEST DE NON REGRESSION DE L IHM EFICAS - DERIVE DE SDND102A
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2001  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.      
+# ======================================================================
+# Ce cas test est gere en configuration dans la base ASTER, il sert de
+# modele pour prononcer la recette de l IHM d EFICAS : l objectif est de
+# pouvoir recreer ce test a l identique dans EFICAS a partir d une page
+# blanche.
+# On a donc essaye d y placer toutes les commandes un peu particulieres
+# du langage de commandes d ASTER
+#
+# Il s agit en fait du test SDND102A auquel on a ajoute :
+#      la definition d un parametre (VAL)
+#      l inclusion d un fichier (INCLUDE)
+#      une poursuite (POURSUITE)
+# Il contient ainsi :
+# des parametres, des formules, des macros, des mots cles facteurs repetes
+# (y compris conditionnes par des regles : calc_fonction / COMB),
+# des blocs  (mode_iter_simult,calc_char_seisme), un defi_valeur, un parametre.
+#
+#
+# Il faudra y associer quelques recommandations pour la recette :
+# - verifier qu en ouvrant le .com0, il demande bien a browser le .comm puis, en cascade, le .11
+# - verifier qu on peut bien supprimer une commande, un mot cle simple et facteur
+# - verifier les acces a la doc
+#
+#
+
+
+DEBUT(CODE=_F(NOM='EFICA01A',NIV_PUB_WEB='INTERNET',VISU_EFICAS='NON'),)
+
+MAILLAGE=LIRE_MAILLAGE()
+
+MAILLAGE=DEFI_GROUP(reuse=MAILLAGE,
+                    MAILLAGE=MAILLAGE,
+                    CREA_GROUP_NO=(_F(NOEUD='NO2',
+                                      NOM='MASSES',),
+                                   _F(NOEUD='NO1',
+                                      NOM='ENCASTRE',),),)
+
+MAILLA2=LIRE_MAILLAGE(UNITE=21,)
+
+MODELE=AFFE_MODELE(MAILLAGE=MAILLAGE,
+                   AFFE=(_F(GROUP_MA='RESSORT',
+                            PHENOMENE='MECANIQUE',
+                            MODELISATION='DIS_T',),
+                         _F(GROUP_NO='MASSES',
+                            PHENOMENE='MECANIQUE',
+                            MODELISATION='DIS_T',),),)
+
+BICHOC=AFFE_MODELE(MAILLAGE=MAILLA2,
+                   AFFE=(_F(GROUP_MA='RESSORTS',
+                            PHENOMENE='MECANIQUE',
+                            MODELISATION='DIS_T',),
+                         _F(GROUP_NO=('MASSES1','MASSES2',),
+                            PHENOMENE='MECANIQUE',
+                            MODELISATION='DIS_T',),),)
+VAL = 98696.0
+
+
+CARA_ELE=AFFE_CARA_ELEM(MODELE=MODELE,
+                        DISCRET=(_F(GROUP_MA='RESSORT',
+                                    REPERE='GLOBAL',
+                                    CARA='K_T_D_L',
+                                    VALE=(VAL,0.0,0.0,),),
+                                 _F(GROUP_NO='MASSES',
+                                    CARA='M_T_D_N',
+                                    VALE=25.0,),),)
+
+CARA_BIC=AFFE_CARA_ELEM(MODELE=BICHOC,
+                        DISCRET=(_F(GROUP_MA='RESSORTS',
+                                    REPERE='GLOBAL',
+                                    CARA='K_T_D_L',
+                                    VALE=(VAL,0.0,0.0,),),
+                                 _F(GROUP_NO='MASSES1',
+                                    CARA='M_T_D_N',
+                                    VALE=25.0,),
+                                 _F(GROUP_NO='MASSES2',
+                                    CARA='M_T_D_N',
+                                    VALE=25.0,),),)
+
+CON_LIM=AFFE_CHAR_MECA(MODELE=MODELE,
+                       DDL_IMPO=(_F(GROUP_NO='ENCASTRE',
+                                    DX=0.0,
+                                    DY=0.0,
+                                    DZ=0.0,),
+                                 _F(GROUP_NO='MASSES',
+                                    DY=0.0,
+                                    DZ=0.0,),),)
+
+CL_BICHO=AFFE_CHAR_MECA(MODELE=BICHOC,
+                        DDL_IMPO=(_F(GROUP_NO='ENCBICHO',
+                                     DX=0.0,
+                                     DY=0.0,
+                                     DZ=0.0,),
+                                  _F(GROUP_NO=('MASSES1','MASSES2',),
+                                     DY=0.0,
+                                     DZ=0.0,),),)
+
+MACRO_MATR_ASSE(MODELE=MODELE,
+                CARA_ELEM=CARA_ELE,
+                CHARGE=CON_LIM,
+                NUME_DDL=CO('NUMEDDL'),
+                MATR_ASSE=(_F(MATRICE=CO('RIGIDITE'),
+                              OPTION='RIGI_MECA',),
+                           _F(MATRICE=CO('MASSE'),
+                              OPTION='MASS_MECA',),),)
+
+MACRO_MATR_ASSE(MODELE=BICHOC,
+                CARA_ELEM=CARA_BIC,
+                CHARGE=CL_BICHO,
+                NUME_DDL=CO('NUMDDLC'),
+                MATR_ASSE=(_F(MATRICE=CO('RIGI_BIC'),
+                              OPTION='RIGI_MECA',),
+                           _F(MATRICE=CO('MASS_BIC'),
+                              OPTION='MASS_MECA',),),)
+
+MODE_MEC=MODE_ITER_SIMULT(MATR_A=RIGIDITE,
+                          MATR_B=MASSE,)
+
+MODE_MEC=NORM_MODE(reuse =MODE_MEC,
+                   MODE=MODE_MEC,
+                   NORME='MASS_GENE',)
+
+MODE_BIC=MODE_ITER_SIMULT(MATR_A=RIGI_BIC,
+                          MATR_B=MASS_BIC,
+                          METHODE='JACOBI',
+                          OPTION='SANS',
+                          CALC_FREQ=_F(OPTION='BANDE',
+                                       FREQ=(1.0,10.0,),),)
+
+MODE_BIC=NORM_MODE(reuse =MODE_BIC,
+                   MODE=MODE_BIC,
+                   NORME='MASS_GENE',)
+
+MODE_STA=MODE_STATIQUE(MATR_RIGI=RIGIDITE,
+                       MATR_MASS=MASSE,
+                       MODE_STAT=_F(TOUT='OUI',
+                                    AVEC_CMP='DX',),)
+
+MSTA_BIC=MODE_STATIQUE(MATR_RIGI=RIGI_BIC,
+                       MATR_MASS=MASS_BIC,
+                       MODE_STAT=_F(TOUT='OUI',
+                                    AVEC_CMP='DX',),)
+
+L_INST=DEFI_LIST_REEL(DEBUT=0.0,
+                      INTERVALLE=_F(JUSQU_A=1.0,
+                                    PAS=1.E-4,),)
+
+OMEGAA=2.*pi*10.
+
+ACCE1 = FORMULE(VALE = 'sin(OMEGAA*INST)',
+                NOM_PARA='INST')
+
+ACCELER1=CALC_FONC_INTERP(FONCTION=ACCE1,
+                          NOM_RESU='ACCE',
+                          LIST_PARA=L_INST,
+                          NOM_PARA = 'INST',
+                          PROL_DROITE='LINEAIRE',
+                          PROL_GAUCHE='LINEAIRE',)
+
+ACCE2 = FORMULE(VALE = '-sin(OMEGAA*INST)',
+                NOM_PARA='INST')
+
+ACCELER2=CALC_FONC_INTERP(FONCTION=ACCE2,
+                          NOM_RESU='ACCE',
+                          LIST_PARA=L_INST,
+                          NOM_PARA = 'INST',
+                          PROL_DROITE='LINEAIRE',
+                          PROL_GAUCHE='LINEAIRE',)
+
+VITE1 = FORMULE(VALE = '-cos(OMEGAA*INST)/OMEGAA',
+                NOM_PARA='INST')
+
+VITESSE1=CALC_FONC_INTERP(FONCTION=VITE1,
+                          NOM_RESU='VITE',
+                          LIST_PARA=L_INST,
+                          NOM_PARA = 'INST',
+                          PROL_DROITE='LINEAIRE',
+                          PROL_GAUCHE='LINEAIRE',)
+
+DEPL1 = FORMULE(VALE = '-sin(OMEGAA*INST)/(OMEGAA**2)',
+                NOM_PARA='INST')
+
+DEPLACE1=CALC_FONC_INTERP(FONCTION=DEPL1,
+                          NOM_RESU='DEPL',
+                          LIST_PARA=L_INST,
+                          NOM_PARA = 'INST',
+                          PROL_DROITE='LINEAIRE',
+                          PROL_GAUCHE='LINEAIRE',)
+
+VITE2 = FORMULE(VALE = 'cos(OMEGAA*INST)/OMEGAA',
+                NOM_PARA='INST')
+
+VITESSE2=CALC_FONC_INTERP(FONCTION=VITE2,
+                          NOM_RESU='VITE',
+                          LIST_PARA=L_INST,
+                          NOM_PARA = 'INST',
+                          PROL_DROITE='LINEAIRE',
+                          PROL_GAUCHE='LINEAIRE',)
+
+xx=2
+
+INCLUDE(UNITE=11,
+        INFO=1,)
+
+MUR=DEFI_OBSTACLE(TYPE='PLAN_Z',)
+
+TRAN_GE1=DYNA_TRAN_MODAL(METHODE='EULER',
+                         MASS_GENE=MASS_GEN,
+                         RIGI_GENE=RIGI_GEN,
+                         AMOR_REDUIT=0.07,
+                         MODE_STAT=MODE_STA,
+                         INCREMENT=_F(INST_INIT=0.0,
+                                      INST_FIN=1.0,
+                                      PAS=2.0E-4,),
+                         ARCHIVAGE=_F(PAS_ARCH=8,),
+                         EXCIT=_F(VECT_GENE=VECT_X,
+                                  ACCE=ACCELER1,
+                                  VITE=VITESSE1,
+                                  DEPL=DEPLACE1,
+                                  MULT_APPUI='OUI',
+                                  DIRECTION=(1.0,0.0,0.0,),
+                                  NOEUD='NO1',),
+                         CHOC=_F(INTITULE='NO2/MUR',
+                                 GROUP_NO_1='MASSES',
+                                 OBSTACLE=MUR,
+                                 ORIG_OBST=(-1.0,0.0,0.0,),
+                                 NORM_OBST=(0.0,0.0,1.0,),
+                                 JEU=1.1005,
+                                 RIGI_NOR=5.76E7,
+                                 AMOR_NOR=0.0,
+                                 RIGI_TAN=0.0,
+                                 COULOMB=0.0,),)
+
+MULT_X1=CALC_CHAR_SEISME(MATR_MASS=MASS_BIC,
+                         DIRECTION=(1.0,0.0,0.0,),
+                         MODE_STAT=MSTA_BIC,
+                         NOEUD='NO1',)
+
+MULT_X2=CALC_CHAR_SEISME(MATR_MASS=MASS_BIC,
+                         DIRECTION=(1.0,0.0,0.0,),
+                         MODE_STAT=MSTA_BIC,
+                         NOEUD='NO11',)
+
+MACRO_PROJ_BASE(BASE=MODE_BIC,
+                MATR_ASSE_GENE=(_F(MATRICE=CO('MGEN_BIC'),
+                                   MATR_ASSE=MASS_BIC,),
+                                _F(MATRICE=CO('RGEN_BIC'),
+                                   MATR_ASSE=RIGI_BIC,),),
+                VECT_ASSE_GENE=(_F(VECTEUR=CO('VECT_X1'),
+                                   VECT_ASSE=MULT_X1,),
+                                _F(VECTEUR=CO('VECT_X2'),
+                                   VECT_ASSE=MULT_X2,),),)
+
+GRILLE=DEFI_OBSTACLE(TYPE='BI_PLAN_Z',)
+
+MAILLA3=LIRE_MAILLAGE(UNITE=22,)
+
+FIN()
diff --git a/Tests/testcomm/efica01b.11 b/Tests/testcomm/efica01b.11
new file mode 100644 (file)
index 0000000..cda7b74
--- /dev/null
@@ -0,0 +1,19 @@
+DEPL2 = FORMULE(NOM_PARA='INST',VALE='sin(OMEGAA*INST)/(OMEGAA**xx)')
+DEPLACE2=CALC_FONC_INTERP( FONCTION=DEPL2,
+                           LIST_PARA=L_INST,
+                          NOM_PARA='INST',
+                           PROL_DROITE='LINEAIRE',
+                           PROL_GAUCHE='LINEAIRE',
+                           NOM_RESU='DEPL'       )
+
+MONO_X=CALC_CHAR_SEISME(  MATR_MASS=MASSE,
+                          DIRECTION=( 1., 0., 0.,),
+                          MONO_APPUI='OUI' )
+
+
+MACRO_PROJ_BASE(BASE=MODE_MEC,MATR_ASSE_GENE=(
+                _F( MATRICE = CO("MASS_GEN"), MATR_ASSE = MASSE),
+                _F( MATRICE = CO("RIGI_GEN"), MATR_ASSE = RIGIDITE)),
+                VECT_ASSE_GENE=_F( VECTEUR = CO("VECT_X"), VECT_ASSE = MONO_X)
+               )
+
diff --git a/Tests/testcomm/efica01b.comm b/Tests/testcomm/efica01b.comm
new file mode 100755 (executable)
index 0000000..20eea86
--- /dev/null
@@ -0,0 +1,275 @@
+# MODIF  DATE 20/09/2004   AUTEUR DURAND C.DURAND 
+# TITRE TEST DE NON REGRESSION DE L IHM EFICAS - DERIVE DE SDND102A
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2001  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.      
+# ======================================================================
+# Ce cas test est gere en configuration dans la base ASTER, il sert de
+# modele pour prononcer la recette de l IHM d EFICAS : l objectif est de
+# pouvoir recreer ce test a l identique dans EFICAS a partir d une page
+# blanche.
+# On a donc essaye d y placer toutes les commandes un peu particulieres
+# du langage de commandes d ASTER
+#
+# Il s agit en fait du test SDND102A auquel on a ajoute :
+#      la definition d un parametre (VAL)
+#      l inclusion d un fichier (INCLUDE)
+#      une poursuite (POURSUITE)
+# Il contient ainsi :
+# des parametres, des formules, des macros, des mots cles facteurs repetes
+# (y compris conditionnes par des regles : calc_fonction / COMB),
+# des blocs  (mode_iter_simult,calc_char_seisme), un defi_valeur, un parametre.
+#
+#
+# Il faudra y associer quelques recommandations pour la recette :
+# - verifier qu en ouvrant le .com0, il demande bien a browser le .comm puis, en cascade, le .11
+# - verifier qu on peut bien supprimer une commande, un mot cle simple et facteur
+# - verifier les acces a la doc
+#
+#
+
+
+DEBUT(CODE=_F(NOM='EFICA01A',NIV_PUB_WEB='INTERNET',VISU_EFICAS='NON'),)
+
+MAILLAGE=LIRE_MAILLAGE()
+
+MAILLAGE=DEFI_GROUP(reuse=MAILLAGE,
+                    MAILLAGE=MAILLAGE,
+                    CREA_GROUP_NO=(_F(NOEUD='NO2',
+                                      NOM='MASSES',),
+                                   _F(NOEUD='NO1',
+                                      NOM='ENCASTRE',),),)
+
+MAILLA2=LIRE_MAILLAGE(UNITE=21,)
+
+MODELE=AFFE_MODELE(MAILLAGE=MAILLAGE,
+                   AFFE=(_F(GROUP_MA='RESSORT',
+                            PHENOMENE='MECANIQUE',
+                            MODELISATION='DIS_T',),
+                         _F(GROUP_NO='MASSES',
+                            PHENOMENE='MECANIQUE',
+                            MODELISATION='DIS_T',),),)
+
+BICHOC=AFFE_MODELE(MAILLAGE=MAILLA2,
+                   AFFE=(_F(GROUP_MA='RESSORTS',
+                            PHENOMENE='MECANIQUE',
+                            MODELISATION='DIS_T',),
+                         _F(GROUP_NO=('MASSES1','MASSES2',),
+                            PHENOMENE='MECANIQUE',
+                            MODELISATION='DIS_T',),),)
+VAL = 98696.0
+
+
+CARA_ELE=AFFE_CARA_ELEM(MODELE=MODELE,
+                        DISCRET=(_F(GROUP_MA='RESSORT',
+                                    REPERE='GLOBAL',
+                                    CARA='K_T_D_L',
+                                    VALE=(VAL,0.0,0.0,),),
+                                 _F(GROUP_NO='MASSES',
+                                    CARA='M_T_D_N',
+                                    VALE=25.0,),),)
+
+CARA_BIC=AFFE_CARA_ELEM(MODELE=BICHOC,
+                        DISCRET=(_F(GROUP_MA='RESSORTS',
+                                    REPERE='GLOBAL',
+                                    CARA='K_T_D_L',
+                                    VALE=(VAL,0.0,0.0,),),
+                                 _F(GROUP_NO='MASSES1',
+                                    CARA='M_T_D_N',
+                                    VALE=25.0,),
+                                 _F(GROUP_NO='MASSES2',
+                                    CARA='M_T_D_N',
+                                    VALE=25.0,),),)
+
+CON_LIM=AFFE_CHAR_MECA(MODELE=MODELE,
+                       DDL_IMPO=(_F(GROUP_NO='ENCASTRE',
+                                    DX=0.0,
+                                    DY=0.0,
+                                    DZ=0.0,),
+                                 _F(GROUP_NO='MASSES',
+                                    DY=0.0,
+                                    DZ=0.0,),),)
+
+CL_BICHO=AFFE_CHAR_MECA(MODELE=BICHOC,
+                        DDL_IMPO=(_F(GROUP_NO='ENCBICHO',
+                                     DX=0.0,
+                                     DY=0.0,
+                                     DZ=0.0,),
+                                  _F(GROUP_NO=('MASSES1','MASSES2',),
+                                     DY=0.0,
+                                     DZ=0.0,),),)
+
+MACRO_MATR_ASSE(MODELE=MODELE,
+                CARA_ELEM=CARA_ELE,
+                CHARGE=CON_LIM,
+                NUME_DDL=CO('NUMEDDL'),
+                MATR_ASSE=(_F(MATRICE=CO('RIGIDITE'),
+                              OPTION='RIGI_MECA',),
+                           _F(MATRICE=CO('MASSE'),
+                              OPTION='MASS_MECA',),),)
+
+MACRO_MATR_ASSE(MODELE=BICHOC,
+                CARA_ELEM=CARA_BIC,
+                CHARGE=CL_BICHO,
+                NUME_DDL=CO('NUMDDLC'),
+                MATR_ASSE=(_F(MATRICE=CO('RIGI_BIC'),
+                              OPTION='RIGI_MECA',),
+                           _F(MATRICE=CO('MASS_BIC'),
+                              OPTION='MASS_MECA',),),)
+
+MODE_MEC=MODE_ITER_SIMULT(MATR_A=RIGIDITE,
+                          MATR_B=MASSE,)
+
+MODE_MEC=NORM_MODE(reuse =MODE_MEC,
+                   MODE=MODE_MEC,
+                   NORME='MASS_GENE',)
+
+MODE_BIC=MODE_ITER_SIMULT(MATR_A=RIGI_BIC,
+                          MATR_B=MASS_BIC,
+                          METHODE='JACOBI',
+                          OPTION='SANS',
+                          CALC_FREQ=_F(OPTION='BANDE',
+                                       FREQ=(1.0,10.0,),),)
+
+MODE_BIC=NORM_MODE(reuse =MODE_BIC,
+                   MODE=MODE_BIC,
+                   NORME='MASS_GENE',)
+
+MODE_STA=MODE_STATIQUE(MATR_RIGI=RIGIDITE,
+                       MATR_MASS=MASSE,
+                       MODE_STAT=_F(TOUT='OUI',
+                                    AVEC_CMP='DX',),)
+
+MSTA_BIC=MODE_STATIQUE(MATR_RIGI=RIGI_BIC,
+                       MATR_MASS=MASS_BIC,
+                       MODE_STAT=_F(TOUT='OUI',
+                                    AVEC_CMP='DX',),)
+
+L_INST=DEFI_LIST_REEL(DEBUT=0.0,
+                      INTERVALLE=_F(JUSQU_A=1.0,
+                                    PAS=1.E-4,),)
+
+OMEGAA=2.*pi*10.
+
+ACCE1 = FORMULE(VALE = 'sin(OMEGAA*INST)',
+                NOM_PARA='INST')
+
+ACCELER1=CALC_FONC_INTERP(FONCTION=ACCE1,
+                          NOM_RESU='ACCE',
+                          LIST_PARA=L_INST,
+                          NOM_PARA = 'INST',
+                          PROL_DROITE='LINEAIRE',
+                          PROL_GAUCHE='LINEAIRE',)
+
+ACCE2 = FORMULE(VALE = '-sin(OMEGAA*INST)',
+                NOM_PARA='INST')
+
+ACCELER2=CALC_FONC_INTERP(FONCTION=ACCE2,
+                          NOM_RESU='ACCE',
+                          LIST_PARA=L_INST,
+                          NOM_PARA = 'INST',
+                          PROL_DROITE='LINEAIRE',
+                          PROL_GAUCHE='LINEAIRE',)
+
+VITE1 = FORMULE(VALE = '-cos(OMEGAA*INST)/OMEGAA',
+                NOM_PARA='INST')
+
+VITESSE1=CALC_FONC_INTERP(FONCTION=VITE1,
+                          NOM_RESU='VITE',
+                          LIST_PARA=L_INST,
+                          NOM_PARA = 'INST',
+                          PROL_DROITE='LINEAIRE',
+                          PROL_GAUCHE='LINEAIRE',)
+
+DEPL1 = FORMULE(VALE = '-sin(OMEGAA*INST)/(OMEGAA**2)',
+                NOM_PARA='INST')
+
+DEPLACE1=CALC_FONC_INTERP(FONCTION=DEPL1,
+                          NOM_RESU='DEPL',
+                          LIST_PARA=L_INST,
+                          NOM_PARA = 'INST',
+                          PROL_DROITE='LINEAIRE',
+                          PROL_GAUCHE='LINEAIRE',)
+
+VITE2 = FORMULE(VALE = 'cos(OMEGAA*INST)/OMEGAA',
+                NOM_PARA='INST')
+
+VITESSE2=CALC_FONC_INTERP(FONCTION=VITE2,
+                          NOM_RESU='VITE',
+                          LIST_PARA=L_INST,
+                          NOM_PARA = 'INST',
+                          PROL_DROITE='LINEAIRE',
+                          PROL_GAUCHE='LINEAIRE',)
+
+xx=2
+
+INCLUDE(UNITE=11,
+        INFO=1,)
+
+MUR=DEFI_OBSTACLE(TYPE='PLAN_Z',)
+
+TRAN_GE1=DYNA_TRAN_MODAL(METHODE='EULER',
+                         MASS_GENE=MASS_GEN,
+                         RIGI_GENE=RIGI_GEN,
+                         AMOR_REDUIT=0.07,
+                         MODE_STAT=MODE_STA,
+                         INCREMENT=_F(INST_INIT=0.0,
+                                      INST_FIN=1.0,
+                                      PAS=2.0E-4,),
+                         ARCHIVAGE=_F(PAS_ARCH=8,),
+                         EXCIT=_F(VECT_GENE=VECT_X,
+                                  ACCE=ACCELER1,
+                                  VITE=VITESSE1,
+                                  DEPL=DEPLACE1,
+                                  MULT_APPUI='OUI',
+                                  DIRECTION=(1.0,0.0,0.0,),
+                                  NOEUD='NO1',),
+                         CHOC=_F(INTITULE='NO2/MUR',
+                                 GROUP_NO_1='MASSES',
+                                 OBSTACLE=MUR,
+                                 ORIG_OBST=(-1.0,0.0,0.0,),
+                                 NORM_OBST=(0.0,0.0,1.0,),
+                                 JEU=1.1005,
+                                 RIGI_NOR=5.76E7,
+                                 AMOR_NOR=0.0,
+                                 RIGI_TAN=0.0,
+                                 COULOMB=0.0,),)
+
+MULT_X1=CALC_CHAR_SEISME(MATR_MASS=MASS_BIC,
+                         DIRECTION=(1.0,0.0,0.0,),
+                         MODE_STAT=MSTA_BIC,
+                         NOEUD='NO1',)
+
+MULT_X2=CALC_CHAR_SEISME(MATR_MASS=MASS_BIC,
+                         DIRECTION=(1.0,0.0,0.0,),
+                         MODE_STAT=MSTA_BIC,
+                         NOEUD='NO11',)
+
+MACRO_PROJ_BASE(BASE=MODE_BIC,
+                MATR_ASSE_GENE=(_F(MATRICE=CO('MGEN_BIC'),
+                                   MATR_ASSE=MASS_BIC,),
+                                _F(MATRICE=CO('RGEN_BIC'),
+                                   MATR_ASSE=RIGI_BIC,),),
+                VECT_ASSE_GENE=(_F(VECTEUR=CO('VECT_X1'),
+                                   VECT_ASSE=MULT_X1,),
+                                _F(VECTEUR=CO('VECT_X2'),
+                                   VECT_ASSE=MULT_X2,),),)
+
+GRILLE=DEFI_OBSTACLE(TYPE='BI_PLAN_Z',)
+
+MAILLA3=LIRE_MAILLAGE(UNITE=22,)
+
+FIN()
diff --git a/Tests/testcomm/incmat.comm b/Tests/testcomm/incmat.comm
new file mode 100644 (file)
index 0000000..705a1cb
--- /dev/null
@@ -0,0 +1,7 @@
+DEBUT()
+MA=LIRE_MAILLAGE()
+INCLUDE_MATERIAU(   NOM_AFNOR='18MND5',      TYPE_MODELE='REF',
+                      VARIANTE='A',          TYPE_VALE='NOMI',
+                     NOM_MATER='MAT3',       INFO=1               )
+
+FIN()
diff --git a/Tests/testcomm/parseur.comm b/Tests/testcomm/parseur.comm
new file mode 100644 (file)
index 0000000..8f61fd0
--- /dev/null
@@ -0,0 +1,71 @@
+DEBUT()
+P1 = 9.8;
+
+P2 = 8.8;
+
+P3 = 7;
+
+P5 = P3*P1;
+
+P6 = P1-3;
+
+P4 = [2,3,4];
+
+a = 1.
+b=3
+c= 3 * 5
+cc="b+3"
+d= 4 + \
+ 5 \
+ -4
+e=LIRE_MAILLAGE()
+##MA=LIRE_MAILLAGE()
+x=(1,2)
+y=[3,
+#comme
+4]
+z="a"
+zz='v'
+u='''aaaa
+bbbb'''
+if 1:
+  a=45
+else:
+  a=5.6
+d={"a":0}
+e={"a":0,
+#comme
+"d":4}
+a==1
+s="-"*80
+fmt_raison='-'*80+'''
+
+   Exception erreur_Fatale interceptee
+   Raison : %s
+
+'''+'-'*80+'xxxxxxxxxxxxxxxx\n'
+
+# commen """
+# commen '''
+# commen '
+# commen "
+BETA=3.41557E-08
+
+C_0=105.7
+
+C_EQ_I05=69.1
+
+C_EQ_E05=69.1
+
+C_EQ_I10=51.6
+
+C_EQ_E10=69.1
+
+FL_INT05 = FORMULE(NOM_PARA='TEMP',VALE='''
+(0.5*BETA / ((C_0 - C_EQ_I05 )**2)
+  * (TEMP - (2.*C_0 - C_EQ_I05 ))*(TEMP - C_EQ_I05 ))''')
+
+zz=8.9;
+zz=8.9;aa=10
+
+FIN()
diff --git a/Tests/testcomm/testaster1.py b/Tests/testcomm/testaster1.py
new file mode 100644 (file)
index 0000000..b3c8f1d
--- /dev/null
@@ -0,0 +1,39 @@
+import os,glob,sys
+import unittest
+
+from Editeur import appli
+
+from config import ASTERDIR
+
+class TestCase(unittest.TestCase):
+   app=None
+   def setUp(self):
+      if self.app == None:
+         self.app=appli.STANDALONE(version='v8.2')
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   i=0
+   for f in glob.glob(os.path.join(ASTERDIR,"[a-l]*.comm")):
+      ff=open(f)
+      text=ff.read()
+      ff.close()
+      if text.find("VISU_EFICAS") != -1:continue
+      for o in ('3','2','1','0','m'):
+       f=f[:-1]+o
+       if os.path.isfile(f):break
+      i=i+1
+      exec """def test%s(self,file="%s"):
+                  self.commtest(file)
+""" % (i,f)
+   del i,f,ff,text,o
+
+   def commtest(self,file):
+      """ Test generique"""
+      print file
+      j=self.app.openJDC(file=file)
+      assert j.isvalid(),j.report()
+      j.supprime()
+      assert sys.getrefcount(j) == 2,sys.getrefcount(j)
diff --git a/Tests/testcomm/testaster10.py b/Tests/testcomm/testaster10.py
new file mode 100644 (file)
index 0000000..850a651
--- /dev/null
@@ -0,0 +1,42 @@
+import os,glob,sys
+import unittest
+
+from Editeur import appli
+
+from config import ASTERDIR
+
+class TestCase(unittest.TestCase):
+   app=None
+   def setUp(self):
+      if self.app == None:
+         self.app=appli.STANDALONE(version='v8.2')
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   i=0
+   for f in glob.glob(os.path.join(ASTERDIR,"z*.comm")):
+      if f == os.path.join(ASTERDIR,"zzzz118c.comm"):continue
+      if f == os.path.join(ASTERDIR,"zzzz118d.comm"):continue
+      ff=open(f)
+      text=ff.read()
+      ff.close()
+      if text.find("VISU_EFICAS") != -1:continue
+      for o in ('3','2','1','0','m'):
+       f=f[:-1]+o
+       if os.path.isfile(f):break
+      i=i+1
+      exec """def test%s(self,file="%s"):
+                  self.commtest(file)
+""" % (i,f)
+   del i,f,o,ff,text
+
+   def commtest(self,file):
+      """ Test generique"""
+      print file
+      j=self.app.openJDC(file=file)
+      assert j.isvalid(),j.report()
+      j.supprime()
+      assert sys.getrefcount(j) == 2,sys.getrefcount(j)
+
diff --git a/Tests/testcomm/testaster2.py b/Tests/testcomm/testaster2.py
new file mode 100644 (file)
index 0000000..97de2be
--- /dev/null
@@ -0,0 +1,40 @@
+import os,glob,sys
+import unittest
+
+from Editeur import appli
+
+from config import ASTERDIR
+
+class TestCase(unittest.TestCase):
+   app=None
+   def setUp(self):
+      if self.app == None:
+         self.app=appli.STANDALONE(version='v8.2')
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   i=0
+   for f in glob.glob(os.path.join(ASTERDIR,"[m-r]*.comm")):
+      ff=open(f)
+      text=ff.read()
+      ff.close()
+      if text.find("VISU_EFICAS") != -1:continue
+      for o in ('3','2','1','0','m'):
+       f=f[:-1]+o
+       if os.path.isfile(f):break
+      i=i+1
+      exec """def test%s(self,file="%s"):
+                  self.commtest(file)
+""" % (i,f)
+   del i,f,o,ff,text
+
+   def commtest(self,file):
+      """ Test generique"""
+      print file
+      j=self.app.openJDC(file=file)
+      assert j.isvalid(),j.report()
+      j.supprime()
+      assert sys.getrefcount(j) == 2,sys.getrefcount(j)
+
diff --git a/Tests/testcomm/testaster3.py b/Tests/testcomm/testaster3.py
new file mode 100644 (file)
index 0000000..85d4d0d
--- /dev/null
@@ -0,0 +1,40 @@
+import os,glob,sys
+import unittest
+
+from Editeur import appli
+
+from config import ASTERDIR
+
+class TestCase(unittest.TestCase):
+   app=None
+   def setUp(self):
+      if self.app == None:
+         self.app=appli.STANDALONE(version='v8.2')
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   i=0
+   for f in glob.glob(os.path.join(ASTERDIR,"s[a-d]*.comm")):
+      ff=open(f)
+      text=ff.read()
+      ff.close()
+      if text.find("VISU_EFICAS") != -1:continue
+      for o in ('3','2','1','0','m'):
+       f=f[:-1]+o
+       if os.path.isfile(f):break
+      i=i+1
+      exec """def test%s(self,file="%s"):
+                  self.commtest(file)
+""" % (i,f)
+   del i,f,o,ff,text
+
+   def commtest(self,file):
+      """ Test generique"""
+      print file
+      j=self.app.openJDC(file=file)
+      assert j.isvalid(),j.report()
+      j.supprime()
+      assert sys.getrefcount(j) == 2,sys.getrefcount(j)
+
diff --git a/Tests/testcomm/testaster4.py b/Tests/testcomm/testaster4.py
new file mode 100644 (file)
index 0000000..66fcd82
--- /dev/null
@@ -0,0 +1,40 @@
+import os,glob,sys
+import unittest
+
+from Editeur import appli
+
+from config import ASTERDIR
+
+class TestCase(unittest.TestCase):
+   app=None
+   def setUp(self):
+      if self.app == None:
+         self.app=appli.STANDALONE(version='v8.2')
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   i=0
+   for f in glob.glob(os.path.join(ASTERDIR,"s[e-r]*.comm")):
+      ff=open(f)
+      text=ff.read()
+      ff.close()
+      if text.find("VISU_EFICAS") != -1:continue
+      for o in ('3','2','1','0','m'):
+       f=f[:-1]+o
+       if os.path.isfile(f):break
+      i=i+1
+      exec """def test%s(self,file="%s"):
+                  self.commtest(file)
+""" % (i,f)
+   del i,f,o,ff,text
+
+   def commtest(self,file):
+      """ Test generique"""
+      print file
+      j=self.app.openJDC(file=file)
+      assert j.isvalid(),j.report()
+      j.supprime()
+      assert sys.getrefcount(j) == 2,sys.getrefcount(j)
+
diff --git a/Tests/testcomm/testaster5.py b/Tests/testcomm/testaster5.py
new file mode 100644 (file)
index 0000000..91d9917
--- /dev/null
@@ -0,0 +1,40 @@
+import os,glob,sys
+import unittest
+
+from Editeur import appli
+
+from config import ASTERDIR
+
+class TestCase(unittest.TestCase):
+   app=None
+   def setUp(self):
+      if self.app == None:
+         self.app=appli.STANDALONE(version='v8.2')
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   i=0
+   for f in glob.glob(os.path.join(ASTERDIR,"ssl[a-l]*.comm")):
+      ff=open(f)
+      text=ff.read()
+      ff.close()
+      if text.find("VISU_EFICAS") != -1:continue
+      for o in ('3','2','1','0','m'):
+       f=f[:-1]+o
+       if os.path.isfile(f):break
+      i=i+1
+      exec """def test%s(self,file="%s"):
+                  self.commtest(file)
+""" % (i,f)
+   del i,f,o,ff,text
+
+   def commtest(self,file):
+      """ Test generique"""
+      print file
+      j=self.app.openJDC(file=file)
+      assert j.isvalid(),j.report()
+      j.supprime()
+      assert sys.getrefcount(j) == 2,sys.getrefcount(j)
+
diff --git a/Tests/testcomm/testaster6.py b/Tests/testcomm/testaster6.py
new file mode 100644 (file)
index 0000000..cb47f3a
--- /dev/null
@@ -0,0 +1,40 @@
+import os,glob,sys
+import unittest
+
+from Editeur import appli
+
+from config import ASTERDIR
+
+class TestCase(unittest.TestCase):
+   app=None
+   def setUp(self):
+      if self.app == None:
+         self.app=appli.STANDALONE(version='v8.2')
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   i=0
+   for f in glob.glob(os.path.join(ASTERDIR,"ssl[m-z]*.comm")):
+      ff=open(f)
+      text=ff.read()
+      ff.close()
+      if text.find("VISU_EFICAS") != -1:continue
+      for o in ('3','2','1','0','m'):
+       f=f[:-1]+o
+       if os.path.isfile(f):break
+      i=i+1
+      exec """def test%s(self,file="%s"):
+                  self.commtest(file)
+""" % (i,f)
+   del i,f,o,ff,text
+
+   def commtest(self,file):
+      """ Test generique"""
+      print file
+      j=self.app.openJDC(file=file)
+      assert j.isvalid(),j.report()
+      j.supprime()
+      assert sys.getrefcount(j) == 2,sys.getrefcount(j)
+
diff --git a/Tests/testcomm/testaster7.py b/Tests/testcomm/testaster7.py
new file mode 100644 (file)
index 0000000..5ade987
--- /dev/null
@@ -0,0 +1,40 @@
+import os,glob,sys
+import unittest
+
+from Editeur import appli
+
+from config import ASTERDIR
+
+class TestCase(unittest.TestCase):
+   app=None
+   def setUp(self):
+      if self.app == None:
+         self.app=appli.STANDALONE(version='v8.2')
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   i=0
+   for f in glob.glob(os.path.join(ASTERDIR,"ss[m-z]*.comm")):
+      ff=open(f)
+      text=ff.read()
+      ff.close()
+      if text.find("VISU_EFICAS") != -1:continue
+      for o in ('3','2','1','0','m'):
+       f=f[:-1]+o
+       if os.path.isfile(f):break
+      i=i+1
+      exec """def test%s(self,file="%s"):
+                  self.commtest(file)
+""" % (i,f)
+   del i,f,o,ff,text
+
+   def commtest(self,file):
+      """ Test generique"""
+      print file
+      j=self.app.openJDC(file=file)
+      assert j.isvalid(),j.report()
+      j.supprime()
+      assert sys.getrefcount(j) == 2,sys.getrefcount(j)
+
diff --git a/Tests/testcomm/testaster8.py b/Tests/testcomm/testaster8.py
new file mode 100644 (file)
index 0000000..91a0448
--- /dev/null
@@ -0,0 +1,40 @@
+import os,glob,sys
+import unittest
+
+from Editeur import appli
+
+from config import ASTERDIR
+
+class TestCase(unittest.TestCase):
+   app=None
+   def setUp(self):
+      if self.app == None:
+         self.app=appli.STANDALONE(version='v8.2')
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   i=0
+   for f in glob.glob(os.path.join(ASTERDIR,"s[t-z]*.comm")):
+      ff=open(f)
+      text=ff.read()
+      ff.close()
+      if text.find("VISU_EFICAS") != -1:continue
+      for o in ('3','2','1','0','m'):
+       f=f[:-1]+o
+       if os.path.isfile(f):break
+      i=i+1
+      exec """def test%s(self,file="%s"):
+                  self.commtest(file)
+""" % (i,f)
+   del i,f,o,ff,text
+
+   def commtest(self,file):
+      """ Test generique"""
+      print file
+      j=self.app.openJDC(file=file)
+      assert j.isvalid(),j.report()
+      j.supprime()
+      assert sys.getrefcount(j) == 2,sys.getrefcount(j)
+
diff --git a/Tests/testcomm/testaster9.py b/Tests/testcomm/testaster9.py
new file mode 100644 (file)
index 0000000..60841bd
--- /dev/null
@@ -0,0 +1,40 @@
+import os,glob,sys
+import unittest
+
+from Editeur import appli
+
+from config import ASTERDIR
+
+class TestCase(unittest.TestCase):
+   app=None
+   def setUp(self):
+      if self.app == None:
+         self.app=appli.STANDALONE(version='v8.2')
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   i=0
+   for f in glob.glob(os.path.join(ASTERDIR,"[t-y]*.comm")):
+      ff=open(f)
+      text=ff.read()
+      ff.close()
+      if text.find("VISU_EFICAS") != -1:continue
+      for o in ('3','2','1','0','m'):
+       f=f[:-1]+o
+       if os.path.isfile(f):break
+      i=i+1
+      exec """def test%s(self,file="%s"):
+                  self.commtest(file)
+""" % (i,f)
+   del i,f,o,ff,text
+
+   def commtest(self,file):
+      """ Test generique"""
+      print file
+      j=self.app.openJDC(file=file)
+      assert j.isvalid(),j.report()
+      j.supprime()
+      assert sys.getrefcount(j) == 2,sys.getrefcount(j)
+
diff --git a/Tests/testcomm/testcomm.py b/Tests/testcomm/testcomm.py
new file mode 100644 (file)
index 0000000..9622ffb
--- /dev/null
@@ -0,0 +1,54 @@
+import os,glob,sys
+import unittest
+import difflib
+
+import prefs
+from Editeur import appli
+
+def add_param(j,pos,nom,valeur):
+    co=j.addentite("PARAMETRE",pos)
+    co.set_nom(nom)
+    co.set_valeur(valeur)
+    return co
+
+def add_mcsimp(obj,nom,valeur):
+    mcs=obj.get_child(nom,restreint='oui')
+    if mcs is None:
+       pos=obj.get_index_child(nom)
+       mcs=obj.addentite(nom,pos)
+    mcs.set_valeur(mcs.eval_val(valeur))
+    return mcs
+
+def cdiff(text1,text2):
+    return " ".join(difflib.context_diff(text1.splitlines(1),text2.splitlines(1)))
+
+class TestCase(unittest.TestCase):
+   app=None
+   def setUp(self):
+      if self.app == None:
+         self.app=appli.STANDALONE(version='v8.2')
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   i=0
+   for f in glob.glob(os.path.join(prefs.INSTALLDIR,"Tests/testcomm/*.comm")):
+      for o in ('3','2','1','0','m'):
+       f=f[:-1]+o
+       if os.path.isfile(f):break
+
+      i=i+1
+      exec """def test%s(self,file="%s"):
+                  self.commtest(file)
+""" % (i,f)
+   del i
+
+   def commtest(self,file):
+      """ Test generique"""
+      print file
+      j=self.app.openJDC(file=file)
+      assert j.isvalid(),j.report()
+      CONTEXT.unset_current_step()
+      j.supprime()
+      assert sys.getrefcount(j) == 2,sys.getrefcount(j)
diff --git a/Tests/testcomm/titi.comm b/Tests/testcomm/titi.comm
new file mode 100644 (file)
index 0000000..6207761
--- /dev/null
@@ -0,0 +1,91 @@
+DEBUT()
+YOUNG = DEFI_PARA_SENSI(VALE=1.)
+FORC = DEFI_PARA_SENSI(VALE=1.)
+MA=LIRE_MAILLAGE()
+MA=DEFI_GROUP( reuse=MA,   MAILLAGE=MA,
+                           CREA_GROUP_NO=_F(
+                         GROUP_MA = ( 'LP9P10',  'LP9P10B',
+                                      'LP8P9',   'LP8P9B',
+                                         ))
+                       )
+
+MO=AFFE_MODELE( MAILLAGE=MA,
+                             AFFE=_F(  TOUT = 'OUI',
+                                    PHENOMENE = 'MECANIQUE',
+                                    MODELISATION = 'C_PLAN')
+                       )
+ZERO =    DEFI_CONSTANTE(VALE=0.)
+NU =    DEFI_CONSTANTE(VALE=0.3)
+ALPHA =    DEFI_CONSTANTE(VALE=0.)
+
+MAT=DEFI_MATERIAU(ELAS_FO=_F(  E = YOUNG, NU = NU,
+                                TEMP_DEF_ALPHA =20.,
+                               ALPHA = ALPHA, RHO=7800.,))
+
+CHMAT=AFFE_MATERIAU(    MAILLAGE=MA,
+                                  AFFE=_F(  TOUT = 'OUI',
+                                         MATER = MAT)
+                          )
+
+CH=AFFE_CHAR_MECA_F(           MODELE=MO,
+                       FORCE_INTERNE=_F(TOUT='OUI',FY=FORC,),
+                               DDL_IMPO=(
+                                    _F(  GROUP_NO = 'LP8P9',
+                                               DX = ZERO),
+                                             _F(  GROUP_NO = 'LP8P9B',
+                                               DX = ZERO),
+                                             _F(  GROUP_NO = 'P11',
+                                               DY = ZERO))
+                            )
+
+DEP=MECA_STATIQUE(   MODELE=MO,   CHAM_MATER=CHMAT,
+                      SENSIBILITE = (FORC),
+                              EXCIT=_F( CHARGE = CH),
+                     )
+
+DEP=CALC_ELEM(reuse=DEP,RESULTAT=DEP,
+                          SENSIBILITE = (FORC),
+              OPTION=('EPSI_ELGA_DEPL','SIEF_ELGA_DEPL',),)
+
+FOND=DEFI_FOND_FISS(    MAILLAGE=MA,
+                              FOND_FISS=_F( GROUP_NO = ('P0',)),
+                           NORMALE=(0., 1., 0.,)
+                      )
+
+THETA0=CALC_THETA(       MODELE=MO,
+                         THETA_2D=_F(  GROUP_NO = ('P0',),
+                                    MODULE = 1.,
+                                    R_INF = 3.75E-5,
+                                    R_SUP = 7.50E-5),
+                        DIRECTION=(1., 0., 0.,)
+                     )
+
+G0=CALC_G_THETA_T(      RESULTAT=DEP,
+                        THETA=THETA0,
+                        SYME_CHAR='SANS',
+                        COMP_ELAS=_F( RELATION = 'ELAS',
+                                      DEFORMATION = 'PETIT')
+                      )
+
+DG0=CALC_G_THETA_T(     RESULTAT=DEP,
+                        SENSIBILITE = (FORC),
+                        THETA=THETA0,
+                        SYME_CHAR='SANS',
+                        COMP_ELAS=_F( RELATION = 'ELAS',
+                                      DEFORMATION = 'PETIT')
+                      )
+
+TEST_TABLE(       TABLE=DG0,
+                       NOM_PARA='G',
+                          SENSIBILITE = (FORC),
+                           VALE=1.06E-2,
+                      REFERENCE='ANALYTIQUE',
+                      PRECISION=0.0005    )
+
+
+FIN()
+MA1=LIRE_MAILLAGE()
+MO1=AFFE_MODELE( MAILLAGE=MA1, AFFE=_F(  TOUT = 'OUI',
+                 PHENOMENE = 'MECANIQUE', MODELISATION = 'C_PLAN'))
+
+FIN()
diff --git a/Tests/testelem/az.comm b/Tests/testelem/az.comm
new file mode 100644 (file)
index 0000000..188fe70
--- /dev/null
@@ -0,0 +1,106 @@
+
+
+DEBUT();
+P1 = 9.8;
+
+P2 = 8.8;
+
+P3 = 7;
+
+P5 = (P3 * P1);
+
+P6 = (P1 - 3);
+
+P4 = [2, 3, 4];
+
+#Pas trouve            shellpanel
+
+MAILLA2=LIRE_MAILLAGE(UNITE=P4[1],);
+
+aaa = FORMULE(VALE='a+z',
+              NOM_PARA=('a','z',),);
+
+MAIL=LIRE_MAILLAGE(UNITE=P3,);
+# 'LIRE_MAILLAGE', 'UNITE'            --> uniquebasepanel
+
+az = FORMULE(VALE='aaaaa',
+             NOM_PARA=('ae','inst',),);
+
+AFFE1=AFFE_MODELE(MAILLAGE=MAIL,
+                  AFFE=(_F(GROUP_MA=('RESSORT','eee',),
+                           PHENOMENE='MECANIQUE',
+                           MODELISATION='DIS_T',),
+                        _F(GROUP_MA='MASSES',
+                           PHENOMENE='MECANIQUE',
+                           MODELISATION='DIS_T',),
+                        _F(GROUP_NO=('GNP3','GNP5','GNP6','GNP7','GNP8','GNP9','GNP10','GNP11','GNP12',),
+                           PHENOMENE='ACOUSTIQUE',
+                           MODELISATION='PLAN',),),);
+
+MOD=AFFE_MODELE(MAILLAGE=MAIL,
+                AFFE=(_F(GROUP_MA='RESSORT',
+                         PHENOMENE='MECANIQUE',
+                         MODELISATION='DIS_T',),
+                      _F(GROUP_MA='MASSES',
+                         PHENOMENE='MECANIQUE',
+                         MODELISATION='DIS_T',),
+                      _F(TOUT='OUI',
+                         PHENOMENE='THERMIQUE',
+                         MODELISATION='COQUE',),),);
+
+CARA=AFFE_CARA_ELEM(MODELE=MOD,
+                    POUTRE=_F(GROUP_MA='MA',
+                              SECTION='CERCLE',
+                              CARA='R',
+                              VALE=(3.0,P6,),),);
+# 'AFFE_MODELE', 'MAILLAGE'           --> uniqueassdpanel
+#  AFFE_MODELE', 'AFFE', 'GROUP_MA'   --> plusieursbasepanel 
+# 'AFFE_MODELE', 'AFFE', 'PHENOMENE'  --> uniqueintopanel
+# 'AFFE_MODELE', 'AFFE', 'b_mecanique'--> plusieursintopanel
+
+F1=DEFI_FONCTION(NOM_PARA='DX',
+                 VALE=(5.0,3.0,P4[1],P3,),);
+
+F3=DEFI_FONCTION(NOM_PARA='DRX',
+                 VALE_C=(5.0,7.0,9.0,9.0,8.0,7.0,),);
+# 'DEFI_FONCTION', 'VALE'             --> fonctionpanel  
+
+MATER2=DEFI_MATERIAU(ELAS=_F(E=100000000000.0,
+                             NU=0.0,),
+                     ECRO_ASYM_LINE=_F(DC_SIGM_EPSI=0.0,
+                                       SY_C=200000000.0,
+                                       DT_SIGM_EPSI=0.0,
+                                       SY_T=50000000.0,),);
+
+PS1=DEFI_PARA_SENSI(VALE=1.0,);
+
+PS2=DEFI_PARA_SENSI(VALE=1.0,);
+
+PS3=DEFI_PARA_SENSI(VALE=1.0,);
+
+CHMAT2=AFFE_MATERIAU(MAILLAGE=MAIL,
+                     AFFE=_F(TOUT='OUI',
+                             MATER=MATER2,),);
+
+AAAZ=AFFE_CHAR_THER(MODELE=AFFE1,
+                    TEMP_IMPO=_F(TOUT='OUI',
+                                 TEMP=0.0,),);
+
+TH1=THER_LINEAIRE(MODELE=AFFE1,
+                  CHAM_MATER=CHMAT2,
+                  EXCIT=_F(CHARGE=AAAZ,),
+                  SENSIBILITE=(PS1,PS2,),);
+# 'THER_LINEAIRE', 'SENSIBILITE'       --> plusieursassdpanel
+
+ACA1=AFFE_CHAR_ACOU(MODELE=AFFE1,
+                    PRES_IMPO=_F(TOUT='OUI',
+                                 PRES=('RI',3.0,3.0,),),);
+# 'AFFE_CHAR_ACOU', 'PRES_IMPO', 'PRES' --> uniquecomppanel
+
+MACRO_MATR_ASSE(MODELE=AFFE1,
+                NUME_DDL=CO('DDL1'),
+                MATR_ASSE=_F(MATRICE=CO('MAT1'),
+                             OPTION='RIGI_THER',),);
+# 'MACRO_MATR_ASSE', 'MATR_ASSE', 'MATRICE'  --> uniquesdcopanel
+
+FIN();
diff --git a/Tests/testelem/testitem1.py b/Tests/testelem/testitem1.py
new file mode 100644 (file)
index 0000000..bfe1a5e
--- /dev/null
@@ -0,0 +1,69 @@
+import os
+import unittest
+import difflib
+
+import prefs
+from Editeur import appli
+from Editeur import comploader
+from Editeur import Objecttreeitem
+
+def add_param(j,pos,nom,valeur):
+    co=j.addentite("PARAMETRE",pos)
+    co.set_nom(nom)
+    co.set_valeur(valeur)
+    return co
+
+def add_mcsimp(obj,nom,valeur):
+    mcs=obj.get_child(nom,restreint='oui')
+    if mcs is None:
+       pos=obj.get_index_child(nom)
+       mcs=obj.addentite(nom,pos)
+    mcs.set_valeur(mcs.eval_val(valeur))
+    return mcs
+
+def cdiff(text1,text2):
+    return " ".join(difflib.context_diff(text1.splitlines(1),text2.splitlines(1)))
+
+class TestCase(unittest.TestCase):
+   """ Tests sur des items """
+   def setUp(self):
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   def test001(self):
+      """Test comploader"""
+      composants=comploader.charger_composants()
+      itemtype=comploader.gettreeitem({'a':1})
+      assert itemtype is Objecttreeitem.ObjectTreeItem
+
+   def test002(self):
+      """ Test de commentarisation/decommentarisation a partir d'un item jdc """
+      app=appli.STANDALONE(version='v8.2')
+      file=os.path.join(prefs.INSTALLDIR,"Tests/testelem/az.comm")
+      j=app.openJDC(file=file)
+      item=app.create_item(j)
+      assert item.isvalid(),item.report()
+      # on commente la commande LIRE_MAILLAGE
+      commands=item.GetSubList()
+      for it in commands:
+        if it.nom == "LIRE_MAILLAGE" and it.sd.nom == "MAIL":break
+      pos=commands.index(it)
+      cco=it.get_objet_commentarise()
+      commands=item.GetSubList()
+      commands[pos].uncomment()
+      commands=item.GetSubList()
+      # on reaffecte l'objet MAIL
+      for it in commands:
+        if it.nom in ("AFFE_MODELE","AFFE_MATERIAU") :
+           for mc in it.GetSubList():
+              if mc.nom == "MAILLAGE":
+                 valeur,validite=mc.eval_valeur("MAIL")
+                 test = mc.set_valeur(valeur)
+      text1=app.get_text_JDC(j,'python')
+      f=open(file)
+      text2=f.read()
+      f.close()
+      assert text1 == text2 , cdiff(text1,text2)
+
diff --git a/Tests/testelem/testjdc1.py b/Tests/testelem/testjdc1.py
new file mode 100644 (file)
index 0000000..d904bb6
--- /dev/null
@@ -0,0 +1,356 @@
+import os
+import unittest
+import difflib
+
+import prefs
+from Editeur import appli
+
+def add_param(j,pos,nom,valeur):
+    co=j.addentite("PARAMETRE",pos)
+    co.set_nom(nom)
+    co.set_valeur(valeur)
+    return co
+
+def add_mcsimp(obj,nom,valeur):
+    mcs=obj.get_child(nom,restreint='oui')
+    if mcs is None:
+       pos=obj.get_index_child(nom)
+       mcs=obj.addentite(nom,pos)
+    mcs.set_valeur(mcs.eval_val(valeur))
+    return mcs
+
+def cdiff(text1,text2):
+    return " ".join(difflib.context_diff(text1.splitlines(1),text2.splitlines(1)))
+
+class TestCase(unittest.TestCase):
+   def setUp(self):
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   def test001(self):
+      """ Test d'insertion de commandes dans fichier toto.comm"""
+      app=appli.STANDALONE(version='v8.2')
+      file=os.path.join(prefs.INSTALLDIR,"Tests/testelem/toto.comm")
+      j=app.openJDC(file=file)
+      expected="""DEBUT CR validation : toto.comm
+FIN CR validation :toto.comm
+"""
+      cr=str(j.report())
+      assert cr == expected, cr + "!=" + expected
+      co=j.etapes[1]
+      mcs=co.addentite("INFO")
+      
+      cr=app.get_text_JDC(j,'python')
+      expected="""
+
+DEBUT();
+
+MA=LIRE_MAILLAGE(INFO=1,);
+
+FIN();
+"""
+      assert cr == expected, cr + "!=" + expected
+      co=j.addentite("LIRE_MAILLAGE",2)
+      test,mess=co.nomme_sd("MA2")
+      assert test == 1
+
+      cr=app.get_text_JDC(j,'python')
+      expected="""
+
+DEBUT();
+
+MA=LIRE_MAILLAGE(INFO=1,);
+
+MA2=LIRE_MAILLAGE();
+
+FIN();
+"""
+      assert cr == expected, cr + "!=" + expected
+
+   def test002(self):
+      """ Test de construction du fichier de commandes az.comm de zero"""
+
+      app=appli.STANDALONE(version='v8.2')
+      j=app.newJDC()
+# commande DEBUT
+      co=j.addentite("DEBUT",0)
+# commande FIN
+      co=j.addentite("FIN",1)
+# parametres
+      pos=0
+      pos=pos+1
+      co=add_param(j,pos,"P1","9.8")
+      pos=pos+1
+      co=add_param(j,pos,"P2","8.8")
+      pos=pos+1
+      co=add_param(j,pos,"P3","7")
+      pos=pos+1
+      co=add_param(j,pos,"P5","P3*P1")
+      pos=pos+1
+      co=add_param(j,pos,"P6","P1-3")
+      pos=pos+1
+      co=add_param(j,pos,"P4","[2,3,4]")
+# commentaire
+      pos=pos+1
+      co=j.addentite("COMMENTAIRE",pos)
+      co.set_valeur("Pas trouve                shellpanel")
+# commande LIRE_MAILLAGE
+      pos=pos+1
+      co=j.addentite("LIRE_MAILLAGE",pos)
+      test,mess=co.nomme_sd("MAILLA2")
+      mcs=co.addentite("UNITE")
+      valeur=mcs.eval_val("P4[1]")
+      test=mcs.set_valeur(valeur)
+# formule
+      pos=pos+1
+      co=j.addentite("FORMULE",pos)
+      co.update_formule_python(("aaa","REEL","a+z","(a,z)"))
+# commande LIRE_MAILLAGE
+      pos=pos+1
+      ma=co=j.addentite("LIRE_MAILLAGE",pos)
+      test,mess=co.nomme_sd("MAIL")
+      mcs=co.addentite("UNITE")
+      valeur,validite=mcs.eval_valeur("P3")
+      test=mcs.set_valeur(valeur)
+#
+      pos=pos+1
+      co=j.addentite("COMMENTAIRE",pos)
+      co.set_valeur(" 'LIRE_MAILLAGE', 'UNITE'            --> uniquebasepanel")
+# formule
+      pos=pos+1
+      co=j.addentite("FORMULE",pos)
+      co.update_formule_python(("az","REEL","aaaaa","(ae,inst)"))
+# commande AFFE_MODELE
+      pos=pos+1
+      co=j.addentite("AFFE_MODELE",pos)
+      mcs=co.get_child("MAILLAGE")
+      valeur,validite=mcs.eval_valeur("MAIL")
+      assert valeur == ma.sd
+      test=mcs.set_valeur(valeur)
+      assert valeur == co["MAILLAGE"]
+      mcf=co.addentite("AFFE")
+      mcs=mcf[0].get_child("PHENOMENE")
+      valeur=mcs.eval_val_item('MECANIQUE')
+      assert valeur=='MECANIQUE',str(valeur)
+      test=mcs.set_valeur(valeur)
+      assert mcf["PHENOMENE"] == 'MECANIQUE'
+      mcs=mcf[0].get_child("b_mecanique").get_child("MODELISATION")
+      mcs.set_valeur(mcs.eval_val_item('DIS_T'))
+      assert mcf["MODELISATION"] == 'DIS_T'
+      mcs=add_mcsimp(mcf[0],"GROUP_MA",('RESSORT','eee',))
+
+      mcf=co.addentite("AFFE")
+      mcs=mcf[1].get_child("PHENOMENE")
+      mcs.set_valeur(mcs.eval_val_item('MECANIQUE'))
+      mcs=mcf[1].get_child("b_mecanique").get_child("MODELISATION")
+      mcs.set_valeur(mcs.eval_val_item('DIS_T'))
+      mcs=add_mcsimp(mcf[1],"GROUP_MA",'MASSES')
+
+      mcf=co.addentite("AFFE")
+      mcs=mcf[2].get_child("PHENOMENE")
+      mcs.set_valeur(mcs.eval_val_item('ACOUSTIQUE'))
+      mcs=mcf[2].get_child("b_acoustique").get_child("MODELISATION")
+      mcs.set_valeur(mcs.eval_val_item('PLAN'))
+      mcs=add_mcsimp(mcf[2],"GROUP_NO",'GNP3,GNP5,GNP6,GNP7,GNP8,GNP9,GNP10,GNP11,GNP12')
+
+      co.nomme_sd("AFFE1")
+# commande AFFE_MODELE
+      pos=pos+1
+      co=j.addentite("AFFE_MODELE",pos)
+      mcs=co.get_child("MAILLAGE")
+      mcs.set_valeur(mcs.eval_val("MAIL"))
+
+      mcf=co.addentite("AFFE")
+      mcs=mcf[0].get_child("PHENOMENE")
+      valeur=mcs.eval_val_item('MECANIQUE')
+      test=mcs.set_valeur(valeur)
+      mcs=mcf[0].get_child("b_mecanique").get_child("MODELISATION")
+      mcs.set_valeur(mcs.eval_val_item('DIS_T'))
+      mcs=add_mcsimp(mcf[0],"GROUP_MA",'RESSORT')
+
+      mcf=co.addentite("AFFE")
+      mcs=mcf[1].get_child("PHENOMENE")
+      mcs.set_valeur(mcs.eval_val_item('MECANIQUE'))
+      mcs=mcf[1].get_child("b_mecanique").get_child("MODELISATION")
+      mcs.set_valeur(mcs.eval_val_item('DIS_T'))
+      mcs=add_mcsimp(mcf[1],"GROUP_MA",'MASSES')
+
+      mcf=co.addentite("AFFE")
+      mcs=mcf[2].get_child("PHENOMENE")
+      mcs.set_valeur(mcs.eval_val_item('THERMIQUE'))
+      mcs=mcf[2].get_child("b_thermique").get_child("MODELISATION")
+      mcs.set_valeur(mcs.eval_val_item('COQUE'))
+      mcs=add_mcsimp(mcf[2],"TOUT",'OUI')
+
+      co.nomme_sd("MOD")
+#CARA=AFFE_CARA_ELEM(MODELE=MOD,
+#                    POUTRE=_F(GROUP_MA='MA',
+#                              SECTION='CERCLE',
+#                              CARA='R',
+#                              VALE=(3.0,P6,),),);
+      pos=pos+1
+      co=j.addentite("AFFE_CARA_ELEM",pos)
+      mcs=co.get_child("MODELE")
+      mcs.set_valeur(mcs.eval_val("MOD"))
+      mcf=co.addentite("POUTRE")
+      mcs=mcf[0].get_child("SECTION")
+      mcs.set_valeur(mcs.eval_val('CERCLE'))
+      assert mcf[0]["SECTION"] == 'CERCLE'
+      mcs=add_mcsimp(mcf[0],"GROUP_MA",'MA')
+      mcs=mcf[0].get_child("b_cercle").get_child("b_constant").get_child("CARA")
+      mcs.set_valeur(mcs.eval_val('R'))
+      mcs=mcf[0].get_child("b_cercle").get_child("b_constant").get_child("VALE")
+      mcs.set_valeur(mcs.eval_val('3.0,P6'))
+      co.nomme_sd("CARA")
+# commentaire
+      pos=pos+1
+      co=j.addentite("COMMENTAIRE",pos)
+      text=""" 'AFFE_MODELE', 'MAILLAGE'           --> uniqueassdpanel
+  AFFE_MODELE', 'AFFE', 'GROUP_MA'   --> plusieursbasepanel 
+ 'AFFE_MODELE', 'AFFE', 'PHENOMENE'  --> uniqueintopanel
+ 'AFFE_MODELE', 'AFFE', 'b_mecanique'--> plusieursintopanel"""
+      co.set_valeur(text)
+#F1=DEFI_FONCTION(NOM_PARA='DX',
+#                 VALE=(5.0,3.0,P4[1],P3,),);
+      pos=pos+1
+      co=j.addentite("DEFI_FONCTION",pos)
+      mcs=co.get_child("NOM_PARA")
+      mcs.set_valeur(mcs.eval_val("DX"))
+      mcs=co.addentite("VALE")
+      mcs.set_valeur(mcs.eval_val("5.0,3.0,P4[1],P3"))
+      co.nomme_sd("F1")
+#F3=DEFI_FONCTION(NOM_PARA='DRX',
+#                 VALE_C=(5.0,7.0,9.0,9.0,8.0,7.0,),);
+      pos=pos+1
+      co=j.addentite("DEFI_FONCTION",pos)
+      mcs=co.get_child("NOM_PARA")
+      mcs.set_valeur(mcs.eval_val("DRX"))
+      mcs=co.addentite("VALE_C")
+      mcs.set_valeur(mcs.eval_val("5.0,7.0,9.0,9.0,8.0,7.0"))
+      co.nomme_sd("F3")
+# commentaire
+      pos=pos+1
+      co=j.addentite("COMMENTAIRE",pos)
+      co.set_valeur(" 'DEFI_FONCTION', 'VALE'             --> fonctionpanel  ")
+#MATER2=DEFI_MATERIAU(ELAS=_F(E=100000000000.0,
+#                             NU=0.0,),
+#                     ECRO_ASYM_LINE=_F(DC_SIGM_EPSI=0.0,
+#                                       SY_C=200000000.0,
+#                                       DT_SIGM_EPSI=0.0,
+#                                       SY_T=50000000.0,),);
+      pos=pos+1
+      co=j.addentite("DEFI_MATERIAU",pos)
+      mcf=co.addentite("ELAS")
+      mcs=mcf[0].get_child("E")
+      mcs.set_valeur(mcs.eval_val("100000000000.0"))
+      mcs=mcf[0].get_child("NU")
+      mcs.set_valeur(mcs.eval_val("0.0"))
+      mcf=co.addentite("ECRO_ASYM_LINE")
+      mcs=mcf[0].get_child("DC_SIGM_EPSI")
+      mcs.set_valeur(mcs.eval_val("0.0"))
+      mcs=mcf[0].get_child("DT_SIGM_EPSI")
+      mcs.set_valeur(mcs.eval_val("0.0"))
+      mcs=mcf[0].get_child("SY_C")
+      mcs.set_valeur(mcs.eval_val("200000000.0"))
+      mcs=mcf[0].get_child("SY_T")
+      mcs.set_valeur(mcs.eval_val("50000000.0"))
+      co.nomme_sd("MATER2")
+#PS1=DEFI_PARA_SENSI(VALE=1.0,);
+#PS2=DEFI_PARA_SENSI(VALE=1.0,);
+#PS3=DEFI_PARA_SENSI(VALE=1.0,);
+      pos=pos+1
+      co=j.addentite("DEFI_PARA_SENSI",pos)
+      mcs=co.get_child("VALE")
+      mcs.set_valeur(mcs.eval_val("1.0"))
+      co.nomme_sd("PS1")
+      pos=pos+1
+      co=j.addentite("DEFI_PARA_SENSI",pos)
+      mcs=co.get_child("VALE")
+      mcs.set_valeur(mcs.eval_val("1.0"))
+      co.nomme_sd("PS2")
+      pos=pos+1
+      co=j.addentite("DEFI_PARA_SENSI",pos)
+      mcs=co.get_child("VALE")
+      mcs.set_valeur(mcs.eval_val("1.0"))
+      co.nomme_sd("PS3")
+#CHMAT2=AFFE_MATERIAU(MAILLAGE=MAIL,
+#                     AFFE=_F(TOUT='OUI',
+#                             MATER=MATER2,),);
+      pos=pos+1
+      co=j.addentite("AFFE_MATERIAU",pos)
+      add_mcsimp(co,"MAILLAGE","MAIL")
+      mcf=co.get_child("AFFE")
+      add_mcsimp(mcf[0],"TOUT","OUI")
+      add_mcsimp(mcf[0],"MATER","MATER2")
+      co.nomme_sd("CHMAT2")
+#AAAZ=AFFE_CHAR_THER(MODELE=AFFE1,
+#                    TEMP_IMPO=_F(TOUT='OUI',
+#                                 TEMP=0.0,),);
+      pos=pos+1
+      co=j.addentite("AFFE_CHAR_THER",pos)
+      add_mcsimp(co,"MODELE","AFFE1")
+      mcf=co.addentite("TEMP_IMPO")
+      add_mcsimp(mcf[0],"TOUT","OUI")
+      add_mcsimp(mcf[0],"TEMP","0.0")
+      co.nomme_sd("AAAZ")
+#TH1=THER_LINEAIRE(MODELE=AFFE1,
+#                  CHAM_MATER=CHMAT2,
+#                  EXCIT=_F(CHARGE=AAAZ,),
+#                  SENSIBILITE=(PS1,PS2,),);
+      pos=pos+1
+      co=j.addentite("THER_LINEAIRE",pos)
+      add_mcsimp(co,"MODELE","AFFE1")
+      add_mcsimp(co,"CHAM_MATER","CHMAT2")
+      mcf=co.get_child("EXCIT")
+      add_mcsimp(mcf[0],"CHARGE","AAAZ")
+      add_mcsimp(co,"SENSIBILITE","PS1,PS2")
+      co.nomme_sd("TH1")
+# commentaire
+      pos=pos+1
+      co=j.addentite("COMMENTAIRE",pos)
+      co.set_valeur(" 'THER_LINEAIRE', 'SENSIBILITE'       --> plusieursassdpanel")
+#ACA1=AFFE_CHAR_ACOU(MODELE=AFFE1,
+#                    PRES_IMPO=_F(TOUT='OUI',
+#                                 PRES=('RI',3.0,3.0,),),);
+      pos=pos+1
+      co=j.addentite("AFFE_CHAR_ACOU",pos)
+      add_mcsimp(co,"MODELE","AFFE1")
+      mcf=co.addentite("PRES_IMPO")
+      add_mcsimp(mcf[0],"TOUT","OUI")
+      add_mcsimp(mcf[0],"PRES","'RI',3.0,3.0")
+      co.nomme_sd("ACA1")
+# commentaire
+      pos=pos+1
+      co=j.addentite("COMMENTAIRE",pos)
+      co.set_valeur(" 'AFFE_CHAR_ACOU', 'PRES_IMPO', 'PRES' --> uniquecomppanel")
+
+# 'AFFE_CHAR_ACOU', 'PRES_IMPO', 'PRES' --> uniquecomppanel
+
+#MACRO_MATR_ASSE(MODELE=AFFE1,
+#                NUME_DDL=CO('DDL1'),
+#                MATR_ASSE=_F(MATRICE=CO('MAT1'),
+#                             OPTION='RIGI_THER',),);
+      pos=pos+1
+      co=j.addentite("MACRO_MATR_ASSE",pos)
+      add_mcsimp(co,"MODELE","AFFE1")
+      mcs=co.get_child("NUME_DDL")
+      mcs.set_valeur_co('DDL1')
+      mcf=co.get_child("MATR_ASSE")
+      mcs=mcf[0].get_child("MATRICE")
+      mcs.set_valeur_co('MAT1')
+      add_mcsimp(mcf[0],"OPTION","RIGI_THER")
+# commentaire
+      pos=pos+1
+      co=j.addentite("COMMENTAIRE",pos)
+      co.set_valeur(" 'MACRO_MATR_ASSE', 'MATR_ASSE', 'MATRICE'  --> uniquesdcopanel")
+
+      assert j.isvalid()
+
+      text1=app.get_text_JDC(j,'python')
+      file=os.path.join(prefs.INSTALLDIR,"Tests/testelem/az.comm")
+      f=open(file)
+      text2=f.read()
+      f.close()
+      assert text1 == text2 , cdiff(text1,text2)
diff --git a/Tests/testelem/testjdc3.py b/Tests/testelem/testjdc3.py
new file mode 100644 (file)
index 0000000..8c980e8
--- /dev/null
@@ -0,0 +1,54 @@
+import os
+import unittest
+import difflib
+
+import prefs
+from Editeur import appli
+
+def add_param(j,pos,nom,valeur):
+    co=j.addentite("PARAMETRE",pos)
+    co.set_nom(nom)
+    co.set_valeur(valeur)
+    return co
+
+def add_mcsimp(obj,nom,valeur):
+    mcs=obj.get_child(nom,restreint='oui')
+    if mcs is None:
+       pos=obj.get_index_child(nom)
+       mcs=obj.addentite(nom,pos)
+    mcs.set_valeur(mcs.eval_val(valeur))
+    return mcs
+
+def cdiff(text1,text2):
+    return " ".join(difflib.context_diff(text1.splitlines(1),text2.splitlines(1)))
+
+class TestCase(unittest.TestCase):
+   def setUp(self):
+      pass
+
+   def tearDown(self):
+      CONTEXT.unset_current_step()
+
+   def test001(self):
+      """ Test de commentarisation/decommentarisation de commandes dans fichier az.comm"""
+      app=appli.STANDALONE(version='v8.2')
+      file=os.path.join(prefs.INSTALLDIR,"Tests/testelem/az.comm")
+      j=app.openJDC(file=file)
+      assert j.isvalid(),j.report()
+      # on commente la commande LIRE_MAILLAGE
+      for co in j.etapes:
+        if co.nom == "LIRE_MAILLAGE" and co.sd.nom == "MAIL":break
+      cco=co.get_objet_commentarise(format=app.format_fichier.get())
+      # on decommente la commande LIRE_MAILLAGE
+      commande,nom = cco.uncomment()
+      # on reaffecte l'objet MAIL
+      for co in j.etapes:
+        if co.nom in ("AFFE_MODELE","AFFE_MATERIAU") :
+           add_mcsimp(co,"MAILLAGE",'MAIL')
+
+      text1=app.get_text_JDC(j,'python')
+      f=open(file)
+      text2=f.read()
+      f.close()
+      assert text1 == text2 , cdiff(text1,text2)
+
index 20c6670157cf889523896246c600ae652e816ffd..de100f3219c9730513b54d871499cfb757c31305 100644 (file)
@@ -27,10 +27,10 @@ class TestSimpCase(unittest.TestCase):
        self.assertEqual(b.eval(),2.56)
        c=Variable('q',[1,a,3])
        d=c[1]/3
-       self.assertEqual(str(d),'((q[1]) / 3)')
+       self.assertEqual(str(d),'(q[1] / 3)')
        self.assertEqual(d.eval(),25.6/3)
        f=cos(d)
-       self.assertEqual(str(f),'cos(((q[1]) / 3))')
+       self.assertEqual(str(f),'cos((q[1] / 3))')
        self.assertEqual(f.eval(),-0.628288791022798)
        g=a**2
        self.assertEqual(str(g),'(n ** 2)')
@@ -41,12 +41,14 @@ class TestSimpCase(unittest.TestCase):
        self.assertEqual(g.eval(),429496.72960000008)
 
    def test003(self):
+       """ Validation d'un parametre (instance de la classe Variable)
+       """
        cata=SIMP(statut='o',typ='R',max=3)
        liste=((1,1),(Variable('x',(0.,1.)),1), (1.,1),(Variable('x',(0.,1.)),1), (('RI',1,0),0),
               (1+0j,0), ("('RI',1,0)",0), ("toto",0), (None,0),
              )
        for valeur,valid in liste:
            o=cata(valeur,'mcs',None)
-           print o.val,o.valeur
+           #print o.val,o.valeur
            msg="erreur sur le test %s %s" % (valeur,valid)+'\n'+str(o.report())
            self.assertEqual(o.isvalid(),valid,msg=msg)
index 31b3b1bf8fe567cf787e9f338b1a306a8399f5bf..ce843908e605561732ee3213a94ed3d138fd19f5 100644 (file)
@@ -22,7 +22,7 @@ class TestValidCase(unittest.TestCase):
            valid=compare.check(rep,report)
            if not valid:
               msg="le rapport d'erreur est incorrect.\n valeur = %s\n expected =\n%s\n got =\n%s " % (valeur,report,rep)
-              print msg
+              #print msg
            self.assert_(valid,msg=msg)
 
    def test001(self):
diff --git a/Tests/testelem/toto.comm b/Tests/testelem/toto.comm
new file mode 100644 (file)
index 0000000..99c02a4
--- /dev/null
@@ -0,0 +1,3 @@
+DEBUT()
+MA=LIRE_MAILLAGE()
+FIN()
diff --git a/convert/autre_parseur.py b/convert/autre_parseur.py
new file mode 100644 (file)
index 0000000..74bd9ef
--- /dev/null
@@ -0,0 +1,586 @@
+# -*- coding: utf-8 -*-
+#            CONFIGURATION MANAGEMENT OF EDF VERSION
+# ======================================================================
+# COPYRIGHT (C) 1991 - 2002  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.
+#
+#
+# ======================================================================
+import sys,string,re,tokenize
+import cStringIO
+
+class ENTITE_JDC :
+    def __init__(self):
+        self.texte = ''
+
+    def set_text(self,texte):
+        self.texte = texte
+
+    def append_text(self,texte):
+        """
+        """
+        self.texte = self.texte +texte
+
+class COMMENTAIRE(ENTITE_JDC):
+
+    def __str__(self):
+        """
+        Retourne une chaîne de caractères représentant self
+        sous une forme interprétable par EFICAS
+        """
+        t=repr(self.texte)
+        return "COMMENTAIRE("+t+")\n"
+
+    def append_text(self,texte):
+        """
+        Ajoute texte à self.texte en enlevant le # initial
+        """
+        if texte[0] == '#':
+            self.texte = self.texte+texte[1:]
+        else:
+            # le dièse n'est pas sur le premier caractère
+            amont,aval = string.split(texte,'#',1) # on découpe suivant la première occurrence de #
+            self.texte = self.texte +amont + aval
+        
+class AFFECTATION(ENTITE_JDC):
+
+    def append_text(self,texte):
+        """
+        Ajoute texte à self.texte en enlevant tout retour chariot et tout point virgule
+        """
+        self.texte = self.texte+texte
+        
+    def __str__(self):
+        """
+        Retourne une expression de l'affectation compréhensible par ACCAS
+        et exploitable par EFICAS
+        """
+        t=repr(self.texte)
+        t=self.texte
+        return "PARAMETRE(nom='"+self.name+"',valeur="+t+")"
+
+class COMMANDE_COMMENTARISEE(ENTITE_JDC):
+
+    def append_text(self,texte):
+        """
+        Ajoute texte à self.texte en enlevant les doubles commentaires
+        """
+        texte = string.strip(texte)
+        texte = string.strip(texte[2:])
+        self.texte = self.texte+(len(self.texte)>0)*'\n'+texte
+
+    def __str__(self):
+        """
+        Retourne une expression de la commande commentarisée compréhensible par ACCAS
+        et exploitable par EFICAS
+        """
+        return "COMMANDE_COMM(texte="+repr(self.texte)+")\n"
+
+        
+next = {}
+next['if'] = next['elif'] = 'elif', 'else', 'end'
+next['while'] = next['for'] = 'else', 'end'
+next['try'] = 'except', 'finally'
+next['except'] = 'except', 'else', 'end'
+next['else'] = next['finally'] = next['def'] = next['class'] = 'end'
+next['end'] = ()
+start = 'if', 'while', 'for', 'try', 'def', 'class'
+
+class PARSEUR_PYTHON:
+    """
+    Cette classe sert à créer un objet PARSEUR_PYTHON qui réalise l'analyse d'un texte 
+    représentant un JDC Python en distinguant :
+      - les commentaires inter commandes
+      - les affectations
+      - les commandes
+    """
+    # au moins 1 caractère non blanc ou non tabulation
+    pattern_ligne_non_blanche = re.compile(r'^[\w\t]+')
+    kwprog = re.compile(
+                r'^\s*(?P<kw>[a-z]+)'
+                r'(\s+(?P<id>[a-zA-Z_]\w*))?'
+                r'[^\w]')
+    endprog = re.compile(
+                r'^\s*#?\s*end\s+(?P<kw>[a-z]+)'
+                r'(\s+(?P<id>[a-zA-Z_]\w*))?'
+                r'[^\w]')
+    wsprog = re.compile(r'^[ \t]*')
+
+    def __init__(self,texte):
+        # on verifie que le texte fourni se compile correctement
+        compile(texte,"<string>",'exec')
+        self.texte = cStringIO.StringIO(texte)
+        self.line=''
+        self.out=""
+        self.lastcol = 0
+        self.lastrow = 1
+        self.please_indent = 1
+        self.indent_list = []
+        self.indentation=0
+        self.paren_level=0
+        self.affectation=0
+        for i in range(5):
+          self.indent_list.append(' '*i)
+        self.objet_courant=None
+        self.stack=[]
+
+    def readline(self):
+        self.line= self.texte.readline()
+        #print "line:",self.line
+        self.indentation=len(self.stack)
+        m = self.kwprog.match(self.line)
+        if m:
+           kw = m.group('kw')
+           if kw in start:
+              self.stack.append((kw, kw))
+           elif next.has_key(kw) and self.stack:
+              kwa,kwb=self.stack[-1]
+              self.stack.append((kwa, kw))
+        return self.line
+
+    def get_texte(self,appli=None):
+        """
+           Retourne le texte issu de l'analyse
+        """
+        for tk in tokenize.generate_tokens(self.readline):
+            self.process_token(tk)
+        return self.out
+
+    def process_token(self, tk):
+        """
+        """
+        ttype, tstring, spos, epos, line = tk
+        thisrow, thiscol = spos
+        #print spos, epos,tokenize.tok_name[ttype]
+
+        if thisrow > self.lastrow:
+            # si plusieurs lignes (>1)
+            self.out=self.out+"\n" * (thisrow - self.lastrow - 1)
+            self.lastcol = 0
+
+        #if thiscol > self.lastcol :
+        #    self.out=self.out+ " " * (thiscol - self.lastcol)
+        #    self.please_indent = None
+
+        self.thiscol=thiscol
+        #self.nextrow, self.nextcol = epos
+
+        try:
+            fn = getattr(self, tokenize.tok_name[ttype])
+        except AttributeError:
+            print >>sys.stderr, "No match!", tokenize.tok_name[ttype], tstring
+            return
+
+        if ttype != tokenize.DEDENT and ttype != tokenize.INDENT and ttype != tokenize.COMMENT and self.please_indent:
+            self.do_indent()
+
+        fn(tstring)
+        self.lastrow, self.lastcol = epos
+
+    def output(self,tstring):
+        #print "output",tstring
+        #if self.thiscol > self.lastcol :
+        #    self.out=self.out+ " " * (self.thiscol - self.lastcol)
+        #    self.please_indent = None
+        #self.thiscol=0
+        #self.lastrow, self.lastcol=self.nextrow, self.nextcol
+        if self.objet_courant:
+           #print str(self.objet_courant)
+           self.out=self.out+self.indent_list[self.indentation]
+           self.out= self.out+ str(self.objet_courant)
+           self.objet_courant=None
+           self.lastcol=self.thiscol
+
+        if self.thiscol > self.lastcol :
+           # print self.thiscol,self.lastcol
+            self.out=self.out+ " " * (self.thiscol - self.lastcol)
+            self.lastcol=self.thiscol
+
+        self.out=self.out+tstring
+
+    def output_com(self,tstring):
+        self.out=self.out+tstring
+
+    def do_indent(self):
+        #print "indentation=",self.indentation
+        if self.objet_courant:
+           self.out=self.out+self.indent_list[self.indentation]
+           #self.out=self.out+self.indent_list[-1]
+           self.out= self.out+ str(self.objet_courant)
+           self.objet_courant=None
+
+        #self.lastcol=len(self.indent_list[-1])
+        #self.lastcol=self.indentation
+        self.lastcol=self.thiscol
+        self.out=self.out+self.indent_list[self.indentation]
+        #self.out=self.out+self.indent_list[-1]
+        self.please_indent = None
+
+    def NL(self, tstring):
+        if self.affectation:
+           if self.paren_level == 0:
+              # affectation en cours mais complète
+              self.out= self.out+ str(self.affectation_courante)
+              self.affectation_courante=None
+              self.affectation=0
+           else:
+              # affectation en cours, on ajoute
+              self.affectation_courante.append_text(tstring)
+              return
+           
+        self.output(tstring)
+        self.please_indent = 1
+
+    def COMMENT(self, tstring):
+        liste= string.split(self.line,"##",1)
+        if len(liste) > 1:
+           # On a trouve un double commentaire
+           before,after=liste
+           if self.affectation:
+              # affectation en cours, on ignore
+              #self.affectation_courante.append_text(tstring)
+              pass
+           elif self.paren_level > 0:
+              self.output(tstring)
+           elif not self.pattern_ligne_non_blanche.match(before):
+              # il s'agit d'une commande commentarisée
+              if self.objet_courant == None:
+                 self.objet_courant=COMMANDE_COMMENTARISEE()
+                 self.objet_courant.append_text(tstring)
+              elif isinstance(self.objet_courant,COMMENTAIRE):
+                 self.output_com(str(self.objet_courant))
+                 self.objet_courant=COMMANDE_COMMENTARISEE()
+                 self.objet_courant.append_text(tstring)
+              else:
+                 self.objet_courant.append_text(tstring)
+           else:
+              # commentaire inline
+              self.output(tstring)
+              self.please_indent = 1
+           return
+
+        else:
+           # On a un commentaire simple
+           new_line = string.split(self.line,'#')[0]
+           if self.affectation:
+              # affectation en cours, on ignore
+              #self.affectation_courante.append_text(tstring)
+              pass
+           elif self.paren_level > 0:
+              self.output(tstring)
+           elif not self.pattern_ligne_non_blanche.match(new_line):
+              # commentaire précédé de blancs
+              if self.objet_courant == None:
+                 self.objet_courant=COMMENTAIRE()
+                 self.objet_courant.append_text(tstring)
+              elif isinstance(self.objet_courant,COMMANDE_COMMENTARISEE):
+                 self.output_com(str(self.objet_courant))
+                 self.objet_courant=COMMENTAIRE()
+                 self.objet_courant.append_text(tstring)
+              else:
+                 self.objet_courant.append_text(tstring)
+           else:
+              # commentaire inline
+              self.output(tstring)
+              self.please_indent = 1
+           return
+
+    def ERRORTOKEN(self, tstring):
+        print "ERRORTOKEN",tstring
+
+    def NAME(self, tstring):
+        if self.affectation ==1:
+           # on ne veut pas des expressions qui commencent par NAME=NAME(NAME
+           # on en prend le chemin : on met affectation a 3 pour le signaler
+           # on attend d'en savoir plus
+           self.affectation_courante.append_text(tstring)
+           self.affectation=3
+           return
+        elif self.affectation ==4:
+           # on a une expression qui commence par NAME=NAME(NAME
+           # il s'agit tres probablement d'une commande
+           # on annule l'affectation en cours
+           self.out= self.out+ self.affectation_courante.texte
+           self.affectation_courante=None
+           self.affectation=0
+        elif self.affectation == 2:
+           # affectation en cours, on ajoute
+           self.affectation_courante.append_text(tstring)
+           self.affectation=2
+           return
+        self.affectation=0
+        self.name=None
+        if self.paren_level == 0: self.name=tstring
+        self.output(tstring)
+
+    def ident(self, tstring):
+        self.affectation=0
+        self.output(tstring)
+
+    def NUMBER(self, tstring):
+        if self.affectation>=1:
+           # affectation en cours, on ajoute
+           self.affectation_courante.append_text(tstring)
+           self.affectation=2
+           return
+        self.output(tstring)
+
+    def OP(self,tstring):
+        if tstring in ('(','[','{'): self.paren_level=self.paren_level+1
+        if tstring in (')',']','}'): self.paren_level=self.paren_level-1
+
+        if tstring == ')' and self.affectation ==4:
+           # on a une expression qui commence par NAME=NAME()
+           # il peut s'agir d'une commande
+           # on annule l'affectation en cours
+           self.out= self.out+ self.affectation_courante.texte
+           self.affectation_courante=None
+           self.affectation=0
+        elif tstring == '(' and self.affectation == 3:
+           # on a deja trouve NAME=NAME
+           # on passe affectation a 4
+           self.affectation_courante.append_text(tstring)
+           self.affectation=4
+           return
+        elif tstring == ';' and self.affectation>=1:
+           # l'affectation est terminee
+           self.out= self.out+ str(self.affectation_courante)
+           self.affectation_courante=None
+           self.affectation=0
+        elif self.affectation>=1:
+           # on complete l'affectation
+           self.affectation_courante.append_text(tstring)
+           self.affectation=2
+           return
+
+        self.affectation=0
+        if self.name and tstring=='=': 
+           self.affectation=1
+           self.affectation_courante=AFFECTATION()
+           self.affectation_courante.name=self.name
+        self.output(tstring)
+
+    ENDMARKER = ident
+    NEWLINE=NL
+
+    def INDENT(self, tstring):
+#        self.indent_list.append(tstring) 
+        self.affectation=0
+        self.do_indent()
+
+    def DEDENT(self, tstring):
+        self.affectation=0
+        if self.objet_courant:
+           self.out=self.out+self.indent_list[self.indentation]
+           self.out= self.out+ str(self.objet_courant)
+           self.objet_courant=None
+        del self.stack[0]
+        self.indentation=self.indentation-1
+#        self.indent_list = self.indent_list[:-1] 
+
+    def STRING(self, tstring):
+        if self.affectation>=1:
+           # affectation en cours, on ajoute
+           self.affectation_courante.append_text(tstring)
+           self.affectation=2
+           return
+        self.output(tstring)
+
+if __name__ == "__main__" :
+    import sys
+    import cStringIO
+    text='''
+#
+#   comment
+#   comment
+#   comment
+#
+
+import sys,os
+
+# commentaire
+# commentaire
+# commentaire
+
+DEBUT();
+##toto = FORMULE(REEL='(REEL:A) = A',);
+
+x=2*cos(90.)/34.
+
+a=1.
+if a != 0:
+  a=+1
+
+b=2.
+c=a+b
+#if 1:
+#  d=3
+#  e=5
+#try:
+#  a=1/2
+#except KeyError:
+#  pass
+
+if 1:
+  a=2
+  b=3
+               # commenta
+else:
+  # commen
+  # commen
+  a=3
+          # qqqqqqqqqqqqqqqq
+  c=5
+
+b=5
+          # commentaire
+toto = FORMULE(REEL='(REEL:A) = A',);
+titi = FORMULE(REEL='(REEL:A) = A',) # commentaire inline
+tutu = FORMULE(REEL='(REEL:A) = A',) ## commentaire inline
+
+TEST_TABLE( TABLE=RELV[k],
+               FILTRE=(
+                        _F( NOM_PARA = 'QUANTITE',
+                            VALE_K = 'MAXIMUM'),),
+        # commentaire 
+               NOM_PARA='VMIS',  # comm
+               VALE=1.9669824189084E9,
+               REFERENCE='NON_REGRESSION',
+               VERSION='8.1.0'  )
+
+if 1:
+   a=fff(a=1,
+         b=2)
+if 1:
+  a=2
+  b=3
+               # commenta
+else:
+  # commen
+  # commen
+  a=3
+
+for k in range(1,10):
+
+   # Appel a GMSH pour le maillage
+
+   f=open("coque.geo","w")
+
+'''
+    text="""
+
+a = 1.
+b=3
+c= 3 * 5
+d= 4 + \
+ 5 \
+ -4
+e=toto(a=1)
+x=(1,2)
+y=[3,
+#comme
+4]
+z="a"
+zz='v'
+u='''aaaa
+bbbb'''
+if 1:
+  a=45
+else:
+  a=5.6
+d={"a":0}
+e={"a":0,
+#comme
+"d":4}
+a==1
+x=a==1
+s="-"*80
+fmt_raison='-'*80+'''
+
+   Exception erreur_Fatale interceptee
+   Raison : %s
+
+'''+'-'*80+'xxxxxxxxxxxxxxxx'
+q=30*cos(12)
+f=cos(12)
+#commen'''
+#commen'''
+y=a[1]
+y=["x"]*10
+
+##toto = FORMULE(REEL='(REEL:A) = A',
+##               X=2
+##              );
+#
+#   comment
+#   comment
+#   comment
+#
+zz=8.9;
+zz=8.9;aa=10
+P1 = 9.8;
+
+P2 = 8.8;
+
+P3 = 7;
+
+P5 = P3*P1;
+
+P6 = P1-3;
+
+P4 = [2,3,4];
+
+P7=P4[1]
+MA=LIRE_MAILLAGE()
+MA=LIRE_MAILLAGE(#comment
+)
+xyz=cos(10)
+MA=LIRE_MAILLAGE(INFO=1)
+MA=LIRE_MAILLAGE(
+INFO=1)
+MA=LIRE_MAILLAGE(#comme
+INFO=1)
+MA=\
+LIRE_MAILLAGE(INFO=1)
+MA= LIRE_MAILLAGE()
+TFIN = 1.790     # Temps fin pour le calcul
+
+PAS = 0.001      # pas de temps du calcul
+DS1=[None]*5
+DS2=[None]*5
+DS3=[None]*5
+DS4=[None]*5
+CHS1=[None]*5
+CHS2=[None]*5
+
+
+
+for k in range(1,5):
+  DS1[k] = CREA_CHAMP( OPERATION='EXTR', TYPE_CHAM='NOEU_DEPL_R',
+                  RESULTAT= MODESTA1, NUME_ORDRE=k, NOM_CHAM = 'DEPL');
+
+
+"""
+
+    if len(sys.argv)== 2:
+       progname, input = sys.argv
+       f=open(input)
+       t=f.read()
+       f.close()
+    else:
+       t=text
+    txt = PARSEUR_PYTHON(t).get_texte()
+    print txt
+    compile(txt,"<string>",'exec')
index 999dac50291dd84bf325bd5f6777256349e5277b..2d90a9f1df7fcbffa011901dda2c9e29e8a70aca 100644 (file)
@@ -50,7 +50,7 @@
 """
 import sys,string,traceback
 
-import parseur_python
+from autre_parseur import PARSEUR_PYTHON
 from Noyau import N_CR
 
 def entryPoint():
@@ -106,15 +106,15 @@ class PythonParser:
    def convert(self,outformat,appli=None):
       if outformat == 'exec':
          try:
-            return parseur_python.PARSEUR_PYTHON(self.text).get_texte(appli)
+            return PARSEUR_PYTHON(self.text).get_texte(appli)
          except:
             # Erreur lors de la conversion
             l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],
                                          sys.exc_info()[2])
-            self.cr.exception("Impossible de convertir le fichier python \
-                               qui doit contenir des erreurs.\n \
-                               On retourne le fichier non converti \n \
-                               Prévenir la maintenance. \n" + string.join(l))
+            self.cr.exception("Impossible de convertir le fichier python 
+                              "qui doit contenir des erreurs.\n" 
+                              "On retourne le fichier non converti.\n" 
+                              "Prévenir la maintenance. \n" + string.join(l))
             # On retourne néanmoins le source initial non converti (au cas où)
             return self.text
       elif outformat == 'execnoparseur':
index 7f4395a43666ca5acc3d24879eae3ee881582242..1d2146fde41a834098b86b63affb996c8d515dc1 100644 (file)
@@ -19,6 +19,7 @@
 #
 # ======================================================================
 import sys,string,re
+import traceback
 
 class ENTITE_JDC :
     def __init__(self,pere):
@@ -34,6 +35,8 @@ class ENTITE_JDC :
         """
         texte = texte+'\n'
         self.texte = self.texte +texte
+    def __str__(self):
+        return self.texte
 
 class COMMENTAIRE(ENTITE_JDC):
 
@@ -86,8 +89,8 @@ class AFFECTATION(ENTITE_JDC):
         """
         Ajoute texte à self.texte en enlevant tout retour chariot et tout point virgule
         """
-        if texte[-1] == '\n' : texte = string.strip(texte[0:-1])\r
-        if texte[-1] == ';' : texte = string.strip(texte[0:-1])
+        if texte[-1] == '\n' : texte = string.rstrip(texte[0:-1])
+        if texte[-1] == ';' : texte = string.rstrip(texte[0:-1])
         self.texte = self.texte+texte
         
     def __str__(self):
@@ -96,16 +99,18 @@ class AFFECTATION(ENTITE_JDC):
         et exploitable par EFICAS
         """
         nom,valeur = string.split(self.texte,'=',1)
-        nom = string.strip(nom)
+      #  print nom,valeur
+        n = string.rstrip(nom)
+        nom = string.lstrip(n)
         if valeur[-1] == '\n': valeur = valeur[:-1]
-        valeur = string.strip(valeur)
+#        valeur = string.strip(valeur)
        ## traitement des "
-       if valeur[0]=='"':
-          valeur=valeur[1:-1]
-       if valeur[-1]=='"':
-          valeur=valeur[0:-2]
+#      if valeur[0]=='"':
+#         valeur=valeur[1:-1]
+#      if valeur[-1]=='"':
+#         valeur=valeur[0:-2]
 
-        return nom+' = PARAMETRE(nom=\''+nom+'\',valeur="'+valeur+'")\n\n'
+        return n + ' = PARAMETRE(nom=\''+nom+'\',valeur='+valeur+')\n'
 
 class COMMANDE_COMMENTARISEE(ENTITE_JDC):
 
@@ -155,6 +160,7 @@ class PARSEUR_PYTHON:
     pattern_commande   = re.compile(r'^([A-Z][A-Z0-9_]+)([ \t\r\f\v]*)\(([\w\W]*)')
     pattern_eval       = re.compile(r'^(EVAL)([ \t\r\f\v]*)\(([\w\W]*)')
     pattern_ligne_vide = re.compile(r'^[\t\r\f\v\n]+')
+    pattern_name       = re.compile(r'[a-zA-Z_]\w*')
     
     def __init__(self,texte):
         self.texte = texte
@@ -175,6 +181,12 @@ class PARSEUR_PYTHON:
         if self.pattern_commande.match(aval):
             return 0
         else:
+            s= string.strip(amont)
+            m= self.pattern_name.match(s)
+            if m is None : return 0
+            if m.start() != 0 :return 0
+            if m.end() != len(s):return 0
+            #print texte,amont,aval
             return 1
 
     def is_eval(self,texte):
@@ -271,11 +283,13 @@ class PARSEUR_PYTHON:
                     elif commentaire_courant :
                         # il s'agit de la nième ligne d'un commentaire entre deux commandes
                         # --> on ajoute cette ligne au commentaire courant
+                        #print "ici1",ligne
                         commentaire_courant.append_text(ligne)
                     else :
                         # il s'agit d'un commentaire entre deux commandes
                         # --> on le crée et il devient le commentaire courant
                         commentaire_courant = COMMENTAIRE(self)
+                        #print "ici2",ligne
                         commentaire_courant.append_text(ligne)
                 else:
                     # la ligne contient des données autre qu'un éventuel commentaire
@@ -314,11 +328,23 @@ class PARSEUR_PYTHON:
                                 self.analyse_reel(commande_courante.texte)
                                 commande_courante = None
                         else:
-                            #--> poursuite d'une affectation
-                           # PN -- pour Empecher une erreur pas propre
-                           if affectation_courante != None :
-                               affectation_courante.append_text(ligne)
-                            #affectation_courante.append_text(ligne)
+                            if commande_courante:
+                               # commande en cours
+                               commande_courante.append_text(ligne)
+                               affectation_courante = None
+                               if commande_courante.get_nb_par() == 0:
+                                  # la commande courante est terminée (autant de parenthèses fermantes qu'ouvrantes)
+                                  self.analyse_reel(commande_courante.texte)
+                                  commande_courante = None
+                            else:
+                              #print 'ici3',ligne
+                              #e=ENTITE_JDC(self)
+                              #e.append_text(ligne)
+                              #--> poursuite d'une affectation
+                             # PN -- pour Empecher une erreur pas propre
+                             if affectation_courante != None :
+                                 affectation_courante.append_text(ligne)
+                              #affectation_courante.append_text(ligne)
 
 
     def enleve (self,texte) :
@@ -430,7 +456,13 @@ class PARSEUR_PYTHON:
 if __name__ == "__main__" :
     #fichier = 'D:/Eficas_dev/Tests/zzzz100a.comm'
     fichier = 'U:/Eficas_dev/Tests/test_eval.comm'
+    fichier = '/local/chris/ASTER/Eficas/Eficas1_10/EficasV1/Tests/testcomm/b.comm'
+    fichier = '/local/chris/ASTER/instals/STA8.2/astest/forma11d.comm'
     texte = open(fichier,'r').read()
-    txt = PARSEUR_PYTHON(texte).get_texte()
+    class appli:
+       dict_reels={}
+       liste_simp_reel=[]
+    txt = PARSEUR_PYTHON(texte).get_texte(appli())
     print txt
+    compile(txt, '<string>', 'exec')
     
index bebd399f7384fd1c58a66cc2fc4201bc0e643857..cce4eb6aa5bcbbe162944b4f3726788f214256ee 100644 (file)
@@ -32,6 +32,7 @@ import Accas
 import Extensions
 from Extensions.parametre import ITEM_PARAMETRE
 from Formatage import Formatage
+from Extensions.param2 import Formula
 
 def entryPoint():
    """
@@ -149,6 +150,8 @@ class PythonGenerator:
          return self.generMCNUPLET(obj)
       elif isinstance(obj,ITEM_PARAMETRE):
          return self.generITEM_PARAMETRE(obj)
+      elif isinstance(obj,Formula):
+         return self.generFormula(obj)
       else:
          raise "Type d'objet non prévu",obj
 
@@ -237,17 +240,15 @@ class PythonGenerator:
    def generITEM_PARAMETRE(self,obj):
        return repr(obj) 
 
+   def generFormula(self,obj):
+       return repr(obj) 
+
    def generPARAMETRE(self,obj):
       """
          Cette méthode convertit un PARAMETRE
          en une liste de chaines de caractères à la syntaxe python
       """
-      if type(obj.valeur) == types.StringType:
-        # PN pour corriger le bug a='3+4' au lieu de a= 3+4
-        #return obj.nom + " = '" + obj.valeur + "';\n"
-        return obj.nom + " = " + obj.valeur + ";\n"
-      else:
-        return obj.nom + ' = ' + str(obj.valeur) + ';\n'
+      return repr(obj) + ";\n"
 
    def generETAPE_NIVEAU(self,obj):
       """
@@ -451,6 +452,42 @@ class PythonGenerator:
           l.append(data)
       return l
 
+   def format_item(self,valeur,etape):
+      if type(valeur) == types.InstanceType :
+         if valeur.__class__.__name__ == 'CO' or hasattr(etape,'sdprods') and valeur in etape.sdprods :
+            s = "CO('"+ self.generator(valeur) +"')"
+         elif isinstance(valeur,Accas.PARAMETRE):
+            # il ne faut pas prendre la string que retourne gener
+            # mais seulement le nom dans le cas d'un paramètre
+            s = valeur.nom
+         else:
+            s = self.generator(valeur)
+      elif type(valeur) == types.FloatType :
+         # Pour un flottant on utilise str
+         # ou la notation scientifique
+         s = str(valeur)
+         try :
+            clefobj=obj.GetNomConcept()
+            if self.appli.dict_reels.has_key(clefobj):
+               if self.appli.dict_reels[clefobj].has_key(valeur):
+                  s=self.appli.dict_reels[clefobj][valeur]
+         except:
+            pass
+      elif type(valeur) == types.StringType :
+         if valeur.find('\n') == -1:
+            # pas de retour chariot, on utilise repr
+            s = repr(valeur)
+         elif valeur.find('"""') == -1:
+            # retour chariot mais pas de triple ", on formatte
+            s='"""'+valeur+'"""'
+         else:
+            s = repr(valeur)
+      else :
+         # Pour les autres types on utilise repr
+         s = repr(valeur)
+      return s
+
+
    def generMCSIMP(self,obj) :
       """
           Convertit un objet MCSIMP en une liste de chaines de caractères à la
@@ -459,68 +496,11 @@ class PythonGenerator:
       if type(obj.valeur) in (types.TupleType,types.ListType) :
          s = ''
          for val in obj.valeur :
-            if type(val) == types.InstanceType :
-               if hasattr(obj.etape,'sdprods') and val in obj.etape.sdprods :
-                  s = s + "CO('"+ self.generator(val) +"')"
-               elif val.__class__.__name__ == 'CO':
-                  s = s + "CO('"+ self.generator(val) +"')"
-               elif isinstance(val,Accas.PARAMETRE):
-                  # il ne faut pas prendre la string que retourne gener
-                  # mais seulement le nom dans le cas d'un paramètre
-                  s = s + val.nom
-               else:
-                  s = s + self.generator(val)
-            elif type(val) == types.FloatType :
-               # Pour un flottant on utilise str qui a une precision de
-               # "seulement" 12 chiffres : evite les flottants du genre 0.599999999999998
-               s2=str(val)
-               try :
-                 clefobj=obj.GetNomConcept()
-                 if self.appli.dict_reels.has_key(clefobj):
-                    if self.appli.dict_reels[clefobj].has_key(val):
-                       s2=self.appli.dict_reels[clefobj][val]
-               except:
-                  pass
-               s = s + s2
-            else :
-               # Pour les autres types on utilise repr
-               s = s + `val`
-            s = s + ','
+            s =s +self.format_item(val,obj.etape) + ','
          if len(obj.valeur) > 1:
             s = '(' + s + '),'
       else :
-         val=obj.valeur
-         if type(val) == types.InstanceType :
-            if hasattr(obj.etape,'sdprods') and val in obj.etape.sdprods :
-               s = "CO('"+ self.generator(val) +"')"
-            elif val.__class__.__name__ == 'CO':
-               s = "CO('"+ self.generator(val) +"')"
-            elif isinstance(val,Accas.PARAMETRE):
-               # il ne faut pas prendre la string que retourne gener
-               # mais seulement le nom dans le cas d'un paramètre
-               s = val.nom
-            elif isinstance(val,Extensions.parametre.PARAMETRE):
-              s = val.nom
-            else:
-               s = self.generator(val)
-         elif type(val) == types.FloatType :
-            # Pour un flottant on utilise str 
-            # ou la notation scientifique
-            s = str(val)
-            try :
-              clefobj=obj.GetNomConcept()
-              if self.appli.dict_reels.has_key(clefobj):
-                 if self.appli.dict_reels[clefobj].has_key(val):
-                    s=self.appli.dict_reels[clefobj][val]
-            except:
-              pass
-         else :
-            # Pour les autres types on utilise repr
-            if isinstance(val,Extensions.parametre.PARAMETRE):
-              s = val.nom
-            else:
-               s = `val`
-         s= s + ','
+         s=self.format_item(obj.valeur,obj.etape) + ','
       return s