]> SALOME platform Git repositories - modules/eficas.git/commitdiff
Salome HOME
merge branche CC avec V1_9p1
authorChristian Caremoli <>
Fri, 3 Mar 2006 14:24:40 +0000 (14:24 +0000)
committerChristian Caremoli <>
Fri, 3 Mar 2006 14:24:40 +0000 (14:24 +0000)
75 files changed:
Accas/A_ASSD.py
Accas/A_VALIDATOR.py
Accas/__init__.py
Aster/Cata/cataSTA81/__init__.py
Aster/Cata/cataSTA81/cata.py
Aster/style.py
Editeur/Objecttreeitem.py
Editeur/appli.py
Editeur/comploader.py
Editeur/compobase.py [new file with mode: 0644]
Editeur/compooper.py
Editeur/compoparam.py
Editeur/composimp.py
Editeur/styles.py
Editeur/uniqueassdpanel.py
Extensions/commande_comm.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
Ihm/I_VALIDATOR.py
Noyau/N_JDC.py
Noyau/N_VALIDATOR.py
Tests/HTMLTestRunner.py [new file with mode: 0644]
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/e.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/f.comm [new file with mode: 0644]
Tests/testcomm/g.comm [new file with mode: 0644]
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/params.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/testjdc4.py [new file with mode: 0644]
Tests/testelem/testsimp1.py
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..2968709f2a2310a1edd705efa725c3d764ea6e24 100644 (file)
@@ -37,14 +37,14 @@ class ASSD(N_ASSD.ASSD,I_ASSD.ASSD):pass
 #class LASSD(I_LASSD.LASSD,N_LASSD.LASSD):pass
 class LASSD(I_LASSD.LASSD):pass
 
-class assd(N_ASSD.assd,I_ASSD.ASSD,ASSD):pass
+class assd(N_ASSD.assd,I_ASSD.assd,ASSD):pass
 
 class FONCTION(N_FONCTION.FONCTION,I_FONCTION.FONCTION,ASSD):
    def __init__(self,etape=None,sd=None,reg='oui'):
       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)
@@ -56,6 +56,6 @@ class fonction(N_FONCTION.formule,I_FONCTION.fonction,ASSD):
       N_FONCTION.formule.__init__(self,etape=etape,sd=sd,reg=reg)
       I_FONCTION.fonction.__init__(self,etape=etape,sd=sd,reg=reg)
 
-class GEOM(N_GEOM.GEOM,I_ASSD.ASSD,ASSD):pass
-class geom(N_GEOM.geom,I_ASSD.ASSD,ASSD):pass
-class CO(N_CO.CO,I_ASSD.ASSD,ASSD):pass
+class GEOM(N_GEOM.GEOM,I_ASSD.GEOM,ASSD):pass
+class geom(N_GEOM.geom,I_ASSD.geom,ASSD):pass
+class CO(N_CO.CO,I_ASSD.CO,ASSD):pass
index c127c965c8b4fee62c6a1413af6ecc94fc0670f9..2f0d29787596e8ead479558a17531b0b9ddbe35d 100644 (file)
@@ -2,6 +2,7 @@
 import types
 from Noyau import N_VALIDATOR
 from Ihm import I_VALIDATOR
+from Ihm.I_VALIDATOR import ValidException
 
 class FunctionVal(I_VALIDATOR.FunctionVal,N_VALIDATOR.FunctionVal):pass
 class OrVal(I_VALIDATOR.OrVal,N_VALIDATOR.OrVal):pass
index 28d0e17905d17ea0bfc5196ac78ced2770d32c0c..1eb50497f05a8ba86f2ba3d84a5f757c17e3e418 100644 (file)
@@ -77,6 +77,7 @@ from Noyau.N_utils import AsType
 from A_VALIDATOR import OrdList,NoRepeat,LongStr,OrVal,AndVal
 from A_VALIDATOR import RangeVal, EnumVal, TypeVal, PairVal
 from A_VALIDATOR import CardVal, InstanceVal
+from A_VALIDATOR import ValidException
 
 # On remplace la factory des validateurs initialement dans Noyau par celle
 # de A_VALIDATOR
index 6ee2cdebc37500f399bd1eee0928ecc2880ad607..d35c1bb0dffdb11cd774671aacb65f51d359f207 100644 (file)
@@ -4,3 +4,6 @@ import sys
 rep_macro = os.path.join(prefs.REPINI,'Cata/cataSTA81')
 sys.path.insert(0,rep_macro)
 from cata import *
+from math import ceil
+from Extensions import param2
+pi=param2.Variable('pi',pi)
index caa1ac5648f77f62755459706cc4e100daf4f9c8..1d33463aa4191a09256e2851da638f77a54e619a 100755 (executable)
@@ -34,8 +34,8 @@ except:
   pass
 
 #
-__version__="$Name:  $"
-__Id__="$Id: cata_aster_v6.py,v 1.12 2001/01/16 15:55:05 iliade Exp $"
+__version__="$Name: BR_dev_mars_06 $"
+__Id__="$Id: cata.py,v 1.3 2005/12/12 09:30:13 eficas Exp $"
 #
 JdC = JDC_CATA(code='ASTER',
                execmodul=None,
@@ -47,6 +47,9 @@ class entier   (ASSD):
    def __init__(self,valeur=None,**args):
       ASSD.__init__(self,**args)
       self.valeur=valeur
+   def __adapt__(self,validator):
+      return validator(self.valeur)
+
 
 # Type geometriques
 class no  (GEOM):pass
@@ -8697,7 +8700,12 @@ def DEFIC_prod(self,ACTION,UNITE,**args):
   else :
     raise AsException("ACTION non prevue : %s" % ACTION)
 
+def DEFI_FICHIER_ops(self,d):
+  if self.sd is not None:
+     self.sd.valeur=1
+
 DEFI_FICHIER=MACRO(nom="DEFI_FICHIER",op=ops.build_DEFI_FICHIER,sd_prod=DEFIC_prod,reentrant='n',
+                   op_init=DEFI_FICHIER_ops,
                   UIinfo={"groupes":("Gestion du travail",)},
                   fr="Ouvre ou ferme un fichier associé à un numéro d'unité logique",
 
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..841c4f3ad3aaf97df8874d766085fbed47eb93f5 100644 (file)
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+"""
+Pour modifier le style d'EFICAS  il faut ajouter un fichier style.py qui contiendra les
+informations sur le style voulu dans son repertoire Eficas_install.
+
+La methode la plus simple consiste à modifier directement les attributs de l'objet style dans le 
+fichier style.py d'Eficas_install. Exemple::
+
+    style.background='yellow'
+
+pour modifier la couleur du background.
+
+Il existe une autre méthode qui peut être utilisée quand on veut modifier plusieurs propriétés à la fois.
+
+Le fichier style.py doit définir une nouvelle classe qui dérive de la classe de base STYLE avec des attributs
+de classe qui définiront le nouveau style (par exemple, si on veut modifier le background)::
+
+   class STYLE(STYLE):
+       background='yellow'
+
+Il faut ensuite instancier cette classe, dans ce meme fichier, en donnant le nom style à l'objet cree::
+
+   style=STYLE()
+
+Tous les attributs de classe possibles sont visibles dans le module Editeur/basestyle.py::
+
+    background='gray90'
+    foreground='black'
+    entry_background='white'
+    list_background='white'
+    list_select_background='#00008b'
+    list_select_foreground='grey'
+    tooltip_background="yellow"
+
+    standard = ("Helvetica",12)
+    standard_italique = ("Helvetica",12,'italic')
+    standard_gras = ("Helvetica",12,'bold')
+    standard_gras_souligne = ("Helvetica",12,'bold','underline')
+
+    canvas = ('Helvetica',10)
+    canvas_italique = ('Helvetica',10,'italic')
+    canvas_gras = ("Helvetica",10,'bold')
+    canvas_gras_italique = ("Helvetica",12,'bold','italic')
+
+    standard12 = ("Helvetica",14)
+    standard12_gras = ("Helvetica",14,'bold')
+    standard12_gras_italique = ( "Helvetica",14,'bold','italic')
+
+    standardcourier10 = ("Courier",14)
+
+
+Le fichier style.py contenu dans le répertoire Aster permet de spécifier des propriétés globales pour une installation.
+Les modifications de style contenues dans ce fichier et dans le fichier style.py d'Eficas_install
+sont prises en compte dans cet ordre.
+"""
+
+   
+
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..97fdba1a55861ca6e74e75686ede06ef0e914479 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,131 @@ 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()
+      txt= J.cr.get_mess_exception()
+      if txt:raise ValueError(txt)
+      return J
+
+   def openTXT(self,text):
+      self.JDCName="TEXT"
+      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()
+      txt= J.cr.get_mess_exception()
+      if txt:raise ValueError(txt)
+      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..e3aaac35f2637cf7fa8c317c27396c4ba103e7bf 100644 (file)
@@ -198,7 +198,8 @@ class PARAMTreeItem(Objecttreeitem.ObjectTreeItem):
       """
       Retourne la valeur de l'objet PARAMETRE cad son texte
       """
-      return self.object.valeur or ''
+      if self.object.valeur is None: return ''
+      else: return self.object.valeur 
 
     def get_nom(self):
       """
@@ -216,7 +217,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 cf8eae081d760410ac5d51fd05ccdefae0a27003..101239dc93f99a07072d5bd6ea068d74653fae44 100644 (file)
@@ -524,6 +524,14 @@ class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
   # traite_reel
 
   def eval_valeur(self,valeur):
+      """ Lance l'interprétation de 'valeur' (chaîne de caractères) comme valeur de self :
+             - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
+             - retourne 'valeur' (chaîne de caractères) sinon
+      """
+      newvaleur=self.eval_val(valeur)
+      return newvaleur,1
+
+  def eval_valeur_BAK(self,valeur):
       """ Lance l'interprétation de 'valeur' (chaîne de caractères) comme valeur
       de l'objet pointé par self :
         - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
index 669e6d7227e3fb0ad40b029d3613f43af8313fb3..dd90ee60d29a0929ac8a889a427251183d4676fe 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 import os
 import prefs
 import basestyle
index 6bff4bdf12dbcb76c8b4a0c208a049cbfd82f9f0..b90b532aed91e7c5f7692f9315790584dd5df2b9 100644 (file)
@@ -188,7 +188,7 @@ class UNIQUE_ASSD_Panel(UNIQUE_Panel):
       """
       valeur = self.node.item.get_valeur()
       if valeur == None or valeur == '' : return # pas de valeur à afficher ...
-      self.valeur_choisie.set(valeur.nom)
+      self.valeur_choisie.set(getattr(valeur,"nom","unknown"))
 
   def erase_valeur(self):
       pass
index 2d7950c20a9cb98939d29fae6c86e68b6949fcec..d54060a40dd5dae92ede09304c6b55aa08f99dc7 100644 (file)
@@ -207,6 +207,7 @@ class COMMANDE_COMM(N_OBJECT.OBJECT,I_OBJECT.OBJECT) :
         #print "uncomment",new_etape.sd
 
         pos=self.parent.etapes.index(self)
+        # L'ordre d'appel est important : suppentite fait le menage des concepts dans les etapes suivantes
         self.parent.addentite(new_etape,pos)
         self.parent.suppentite(self)
         return new_etape,nom_sd
index deb6c55874861b8f388135be430e755cd3de42eb..8a74ee420e15527518299a11873666a1ce63b1ad 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):
       """
@@ -299,6 +303,7 @@ class JDC_POURSUITE(JDC):
       #Regularise les etapes du jdc apres l'etape etape
       self.control_jdc_context_apres(etape)
       if self.etape_include:
+         #print "CONTROL_INCLUDE:",self.etape_include,self.etape_include.nom
          # il existe un jdc pere. On propage la regularisation
          self.etape_include.parent.control_context_apres(self.etape_include)
 
index 74ac889c97617dbcb1f09c37f4e933233763402a..5d307aace04e7d17d2f8f18184f422c6318ca7d1 100644 (file)
@@ -1,16 +1,27 @@
 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")):
+    if type(value) in (type(1), type(1L), type(1.5), type(1j),type("hh")) :
         return Constant(value)
     elif isinstance(value, Formula):
         return value
+    elif type(value) == type([]):
+        return Constant(value)
     else:
+#        return Constant(value)
         raise TypeError, ("Can't make formula from", value)
 
 #class Formula(object):
 class Formula:
+    def __len__(self):
+        val=self.eval()
+        if val is None:return 0
+        try:
+           return len(val)
+        except:
+           return 1
     def __complex__(self): return complex(self.eval())
     def __int__(self): return int(self.eval())
     def __long__(self): return long(self.eval())
@@ -43,12 +54,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):
@@ -57,23 +68,68 @@ class Binop(Formula):
         while isinstance(result,Formula):
               result=result.eval()
         return result
+    def __adapt__(self,validator):
+        return validator(self.eval())
+
+original_sqrt=math.sqrt
+original_ceil=math.ceil
+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) }
+              'sqrt': lambda x: original_sqrt(x),
+              'ceil': lambda x: original_ceil(x),
+              'sin': lambda x: original_sin(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())
+    def __adapt__(self,validator):
+        return validator(self.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
     def __str__(self): return str(self._value)
+    def __adapt__(self,validator):
+        return validator(self._value)
 
 class Variable(Formula):
     def __init__(self,name,value):
@@ -82,6 +138,18 @@ class Variable(Formula):
     def eval(self): return self._value
     def __repr__(self): return "Variable('%s',%s)" % (self._name, self._value)
     def __str__(self): return self._name
+    def __adapt__(self,validator):
+        return validator(self._value)
 
+def cos(f): return Unop('ncos', f)
+def sin(f): return Unop('nsin', f)
+Numeric.cos=cos
+Numeric.sin=sin
+def sqrt(f): return Unop('sqrt', f)
+def ceil(f): return Unop('ceil', f)
 def cos(f): return Unop('cos', f)
 def sin(f): return Unop('sin', f)
+math.cos=cos
+math.sin=sin
+math.sqrt=sqrt
+math.ceil=ceil
index 28b6bd8732add689e687e7c9811aef0e66f62947..7ca8ca641bf2eda8746ad5a5f4aa251281568de9 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,182 +49,22 @@ 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
+    self.valeur = valeur
+    self.val=repr(valeur)
 
-  def __getitem__(self,key):
-    param_item=ITEM_PARAMETRE(self,key)
-    return param_item
-
-#  def __neg__(self):
-#    try:
-#      return -1*self.valeur
-#    except:
-#      print "******* Probleme : pas de valeur négative"
-#      return None
-    
-#  def __add__(self,a):
-#    try :
-#      return self.valeur+a.valeur
-#    except :
-#      print "******* Probleme : a l addition"
-#      return None
-
-#  def __radd__(self,a):
-#    try :
-#      return self.valeur+a.valeur
-#    except :
-#      print "******* Probleme : a l addition"
-#      return None
-
-#  def __sub__(self,a):
-#    try :
-#      return self.valeur  - a.valeur
-#    except :
-#      print "******* Probleme : a la soustraction"
-#      return None
-
-#  def __rsub__(self,a):
-#    try :
-#      return a.valeur - self.valeur
-#    except :
-#      print "******* Probleme : a la soustraction"
-#      return None
-
-
-#  def __mul__(self,a):
-#    try :
-#      return self.valeur*a.valeur
-#    except :
-#      print "******* Probleme : a la multiplication"
-#      return None
-
-#  def __rmul__(self,a):
-#    try :
-#      return self.valeur*a.valeur
-#    except :
-#      print "******* Probleme : a la multiplication"
-#      return None
-
-#  def __add__(self,other):
-#    try :
-#      return self.valeur+other
-#    except :
-#      print "******* Probleme : a l addition"
-#      return None
-
-#  def __radd__(self,other):
-#    try :
-#      return self.valeur+other
-#    except :
-#      print "******* Probleme : a l addition"
-#      return None
-
-#  def __sub__(self,other):
-#    try :
-#      return self.valeur  - other
-#    except :
-#      print "******* Probleme : a la soustraction"
-#      return None
-
-#  def __rsub__(self,other):
-#    try :
-#      return other - self.valeur
-#    except :
-#      print "******* Probleme : a la soustraction"
-#      return None
-
-#  def  __mul__ (self,other):
-#    retour=None
-#    try :
-#      retour = eval(self.valeur) * other
-#    except :
-#      try :
-#         retour = self.valeur * other
-#      except :
-#         try :
-#         retour = eval(self.valeur) * eval(other)
-#       except :
-#         try :
-#           retour = self.valeur * eval(other)
-#         except :
-#           print other
-#             print "******* Probleme : a la multiplication _mul__"
-#    return retour
-#
-#  def __rmul__ (self,other):
-#    retour=None
-#    try :
-#      retour = eval(self.valeur) * other
-#    except :
-#      try :
-#         retour = self.valeur * other
-#      except :
-#         try :
-#          retour = eval(self.valeur) * eval(other)
-#       except :
-#            print "******* Probleme : a la multiplication __rmul__"
-#    return retour
-#
-#
-#  def __div__(self,other):
-#    retour=None
-#    try:
-#      retour = eval(self.valeur) / other
-#    except :
-#      try :
-#      retour = self.valeur / other
-#      except :
-#      print "******* Probleme : a la division"
-#    return retour
-#
-#
-#  def cos(self):
-#      try :
-#              retour=cos(self.valeur)
-#        return retour
-#      except:
-#        print "pb pour cosinus"
-#
-#  def sin(self):
-#      try :
-#              retour=sin(self.valeur)
-#        return retour
-#      except:
-#        print "pb pour sinus"
-#
-#  def tan(self):
-#      try :
-#              retour=tan(self.valeur)
-#        return retour
-#      except:
-#        print "pb pour tangente"
-#
-#  def log(self):
-#      try :
-#              retour=log(self.valeur)
-#        return retour
-#      except:
-#        print "pb pour log"
-#
-#  def sqrt(self):
-#      try :
-#              retour=sqrt(self.valeur)
-#        return retour
-#      except:
-#        print "pb pour sqrt"
-#
   def interprete_valeur(self,val):
     """
     Essaie d'interpréter val (chaîne de caractères)comme :
@@ -233,26 +74,21 @@ 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
-    #  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
+
+    if type(val) == types.StringType:
+       # on tente l'evaluation dans un contexte fourni par le parent s'il existe
+       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
+    # refus des listes heterogenes : ne dvrait pas etre la
     if valeur != None :
         if type(valeur) == types.TupleType:
             l_new_val = []
@@ -269,17 +105,14 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) :
                         return val
                 l_new_val.append(v)
             return tuple(l_new_val)
-       # PN : commente le print
-        #else:
-            # 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 +131,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 +202,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 +255,17 @@ 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:
+         if self.valeur.find('\n') == -1:
+            # pas de retour chariot, on utilise repr
+            return self.nom+' = '+ repr(self.valeur)
+         elif self.valeur.find('"""') == -1:
+            # retour chariot mais pas de triple ", on formatte
+            return self.nom+' = """'+self.valeur+'"""'
+         else:
+            return self.nom+' = '+ repr(self.valeur)
+    else:
+       return self.nom+' = '+ str(self.valeur)
 
   def __str__(self):
     """
@@ -477,7 +329,13 @@ 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
+
+  def __adapt__(self,validator):
+      return validator(self.eval())
 
 class COMBI_PARAMETRE :
   def __init__(self,chainevaleur,valeur):
index 277424241fba2dddbea9b8f747c7d69b3acca53f..15b7e162ae69abb44db521f30e535db43c69d6a8 100644 (file)
 #
 # ======================================================================
 
+from I_VALIDATOR import ValidException
+
 class ASSD:
    def __repr__(self):
       return "concept %s de type %s" % (self.get_name(),self.__class__.__name__)
+   #def __del__(self):
+   #   print "__del__",self
+
+class assd(ASSD):
+   def __convert__(cls,valeur):
+      return valeur
+   __convert__=classmethod(__convert__)
+
+class GEOM(ASSD):
+   def __convert__(cls,valeur):
+      return valeur
+   __convert__=classmethod(__convert__)
+
+class geom(GEOM):pass
+
+class CO(ASSD):
+   def __convert__(cls,valeur):
+      if hasattr(valeur,'_etape') :
+         # valeur est un concept CO qui a ete transforme par type_sdprod
+         if valeur.etape == valeur._etape:
+             # le concept est bien produit par l'etape
+             return valeur
+      raise ValidException("Pas un concept CO")
+   __convert__=classmethod(__convert__)
+
index 6ad4ee814a7384e76c5b637afc38b67a18bf46ef..167524971d72e2fe371b828804bf13fe07e37268 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):
 
@@ -84,12 +85,14 @@ class ETAPE(I_MCCOMPO.MCCOMPO):
       """
       #print "fin_modif",self,self.parent
       if self.nom == "DETRUIRE":
+         traceback.print_stack(limit=8)
          #Il n'est pas conseillé de mettre des traitements dans fin_modif. Ceci est une
          # exception qu'il faut supprimer à terme.
          #une commande DETRUIRE a été modifiée. Il faut verifier les commandes
          #suivantes
          #ATTENTION: aux eventuelles recursions
          self.parent.control_context_apres(self)
+         pass
 
       CONNECTOR.Emit(self,"valid")
       if self.parent:
@@ -226,6 +229,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 +245,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 +400,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..18f66362a0addc4871886b5d36b1f3187f88b962 100644 (file)
@@ -18,6 +18,7 @@
 #
 #
 # ======================================================================
+import string
 from I_ASSD import ASSD
 
 class FONCTION(ASSD):
@@ -41,5 +42,29 @@ 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):
+      if len(val) != len(self.nompar):
+         raise TypeError(" %s() takes exactly %d argument (%d given)" % (self.nom,len(self.nompar),len(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..26e13e44fe157a6255a8820b49869c9b34664e8f 100644 (file)
@@ -696,6 +696,41 @@ 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. Il contient les parametres
+      context.update(self.get_contexte_avant(etape))
+      try :
+         objet = eval(valeur,context)
+         return objet
+      except:
+         #traceback.print_exc()
+         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..6be22b1242a3b063aedc8d6177f5f126af64a371 100644 (file)
@@ -28,6 +28,7 @@ import traceback,types,string
 import I_ETAPE
 import Noyau
 from Noyau.N_ASSD import ASSD
+import convert
 
 # import rajoutés suite à l'ajout de Build_sd --> à résorber
 import Noyau, Validation.V_MACRO_ETAPE
@@ -90,7 +91,20 @@ 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"
+
+       # Il faut convertir le texte inclus en fonction du format
+       format=self.jdc.appli.format_fichier.get()
+       if convert.plugins.has_key(format):
+          # Le convertisseur existe on l'utilise
+          p=convert.plugins[format]()
+          p.text=text
+          text=p.convert('exec',self)
+
        j=self.JdC_aux( procedure=text, nom=fichier,
                                 appli=self.jdc.appli,
                                 cata=self.jdc.cata,
@@ -106,6 +120,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
        self.etapes=j.etapes
        self.jdc_aux=j
     except:
+       traceback.print_exc()
        # On retablit l'etape courante step
        CONTEXT.unset_current_step()
        CONTEXT.set_current_step(step)
@@ -132,6 +147,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 +508,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 :
@@ -670,12 +687,26 @@ class MACRO_ETAPE(I_ETAPE.ETAPE):
       #print "update_context.fin",d.keys()
 
 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
+  def copy(self):
+      etape=Noyau.N_MACRO_ETAPE.MACRO_ETAPE.copy(self)
+      if hasattr(etape,"etapes") :etape.etapes=[]
+      if hasattr(etape,"jdc_aux") : 
+         etape.jdc_aux=None
+         del etape.fichier_ini
+      return etape
+
   def supprime(self):
       #print "supprime",self
       if hasattr(self,"jdc_aux") and self.jdc_aux:
          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,33 +789,39 @@ 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
-    self.fichier_ini =fichier
-    self.fichier_unite =fichier
-    self.fichier_text=text
-    self.fichier_err=None 
-    self.contexte_fichier_init={}
-    # On specifie la classe a utiliser pour le JDC auxiliaire
-    try:
-      import Extensions.jdc_include
-    except:
-      traceback.print_exc()
-      raise
-    self.JdC_aux=Extensions.jdc_include.JdC_include
-    try:
-       self.make_contexte_include(self.fichier_ini ,self.fichier_text)
-       #self.parent.record_unit(self.fichier_unite,self)
-    except:
-       l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
-       self.fichier_err = string.join(l)
-       #self.parent.record_unit(self.fichier_unite,self)
-       self.g_context={}
-       self.etapes=[]
-       self.jdc_aux=None
+    if not hasattr(self,'fichier_ini') or self.fichier_ini != fichier or self.fichier_mater != self.nom_mater: 
+       # le fichier est nouveau ou change
+       self.fichier_ini =fichier
+       self.fichier_unite =fichier
+       self.fichier_mater=self.nom_mater
+       self.fichier_text=text
+       self.fichier_err=None 
        self.contexte_fichier_init={}
-       raise
+       # On specifie la classe a utiliser pour le JDC auxiliaire
+       try:
+         import Extensions.jdc_include
+         self.JdC_aux=Extensions.jdc_include.JdC_include
+       except:
+         traceback.print_exc()
+         raise
+       try:
+          self.make_contexte_include(self.fichier_ini ,self.fichier_text)
+       except:
+          l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
+          self.fichier_err = string.join(l)
+          self.g_context={}
+          self.etapes=[]
+          self.jdc_aux=None
+          self.contexte_fichier_init={}
+          raise
+    else:
+       # le fichier est le meme on ne le reevalue pas
+       # et on leve une exception si une erreur a été enregistrée
+       if self.fichier_err is not None: raise Exception(self.fichier_err)
 
 #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro)
   def update_sdprod(self,cr='non'):
index c2d771fc7ee08671bf87b509b87cc50619e446d3..3e549ce7ac49819ccfe1f92424149b5ceeab9db0 100644 (file)
@@ -48,6 +48,8 @@ from Extensions import param2
 import I_OBJECT
 import CONNECTOR
 
+from I_VALIDATOR import ValidException
+
 class MCSIMP(I_OBJECT.OBJECT):
 
   def GetNomConcept(self):
@@ -290,7 +292,7 @@ class MCSIMP(I_OBJECT.OBJECT):
     sd = self.jdc.get_sd_avant_etape(new_valeur,self.etape)
     #sd = self.jdc.get_contexte_avant(self.etape).get(new_valeur,None)
     #print sd
-    if sd :
+    if sd is not None:
       return sd,1
     lsd = self.jdc.cherche_list_avant(self.etape,new_valeur) 
     if lsd :
@@ -313,6 +315,40 @@ 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)
+       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)
+    """
+    if self.etape and self.etape.parent:
+       valeur=self.etape.parent.eval_in_context(new_valeur,self.etape)
+       return valeur
+    else:
+       try :
+           valeur = eval(val)
+           return valeur
+       except:
+           #traceback.print_exc()
+           return new_valeur
+           pass
+
   def cherche_item_parametre (self,new_valeur):
         try:
          nomparam=new_valeur[0:new_valeur.find("[")]
@@ -420,11 +456,11 @@ class MCSIMP(I_OBJECT.OBJECT):
       self.init_modif()
       self.valeur = new_objet
       self.val = new_objet
-      self.fin_modif()
-      step.reset_context()
       # On force l'enregistrement de new_objet en tant que concept produit 
       # de la macro en appelant get_type_produit avec force=1
       self.etape.get_type_produit(force=1)
+      self.fin_modif()
+      step.reset_context()
       #print "set_valeur_co",new_objet
       return 1,"Concept créé"
        
@@ -435,21 +471,24 @@ class MCSIMP(I_OBJECT.OBJECT):
      """
      #print "verif_existence_sd"
      # Attention : possible probleme avec include
+     # A priori il n'y a pas de raison de retirer les concepts non existants
+     # avant etape. En fait il s'agit uniquement eventuellement de ceux crees par une macro
      l_sd_avant_etape = self.jdc.get_contexte_avant(self.etape).values()  
      if type(self.valeur) in (types.TupleType,types.ListType) :
        l=[]
-       self.init_modif()
        for sd in self.valeur:
          if isinstance(sd,ASSD) :
-           if sd in l_sd_avant_etape :
+           if sd in l_sd_avant_etape or self.etape.get_sdprods(sd.nom) is sd:
               l.append(sd)
         else:
            l.append(sd)
-       self.valeur=tuple(l)
-       self.fin_modif()
+       if len(l) < len(self.valeur):
+          self.init_modif()
+          self.valeur=tuple(l)
+          self.fin_modif()
      else:
        if isinstance(self.valeur,ASSD) :
-         if self.valeur not in l_sd_avant_etape :
+         if self.valeur not in l_sd_avant_etape and self.etape.get_sdprods(self.valeur.nom) is None:
              self.init_modif()
             self.valeur = None
              self.fin_modif()
@@ -495,7 +534,6 @@ class MCSIMP(I_OBJECT.OBJECT):
      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
-     print dir(self)
      return 0
 
 #--------------------------------------------------------------------------------
@@ -504,6 +542,262 @@ class MCSIMP(I_OBJECT.OBJECT):
 # Elles doivent etre reintegrees des que possible
 
 
+  def convert_card(self,valeur):
+      """
+          Cette methode verifie que la cardinalite de valeur est correcte (comprise entre min et max)
+          Si c'est le cas elle retourne valeur eventuellement convertie
+          Si ce n'est pas le cas, elle leve une exception
+      """
+
+      adapt = getattr(valeur, '__adapt__', None)
+      if adapt is not None:
+         # l'objet valeur peut se verifier lui meme
+         return adapt(self.convert_card)
+
+      min=self.definition.min
+      max=self.definition.max
+
+      if type(valeur) == types.TupleType and valeur[0] in ('RI','MP'):
+         #il s'agit d'un complexe ancienne mode. La cardinalite vaut 1
+         length=1
+      elif valeur == None :
+         # pas de valeur affecte. La cardinalite vaut 0
+         length=0
+      elif type(valeur) == types.StringType :
+         #il s'agit d'une chaine. La cardinalite vaut 1
+         length=1
+      else:
+         try:
+            # si l'objet supporte len, on a la cardinalite
+            length=len(valeur)
+         except:
+            # sinon elle vaut 1
+            length=1
+         
+      if length < min or length >max:
+         raise ValidException("Nombre d'arguments de %s incorrect pour %s (min = %s, max = %s)" % (repr(valeur),self.nom,min,max) )
+
+      return valeur
+      
+  def verif_card(self,cr='non'):
+      """
+         un mot-clé simple ne peut etre répété :
+           la cardinalité ici s'entend par la vérification que le nombre d'arguments de self.valeur
+           est bien compris entre self.min et self.max dans le cas où il s'agit d'une liste
+      """
+      card = 1
+      try:
+         self.convert_card(self.valeur)
+      except ValidException,e:
+         if cr == 'oui': self.cr.fatal(str(e))
+         card = 0
+      return card
+
+  def convert_into(self,valeur):
+      """
+          Cette methode verifie que valeur est dans la liste des valeurs possibles donnée
+          dans la definition (attribut into) ou dans un intervalle donné dans la definition (attributs
+          val_min, val_max)
+          Si c'est le cas elle retourne valeur eventuellement convertie
+          Si ce n'est pas le cas, elle leve une exception
+      """
+      adapt = getattr(valeur, '__adapt__', None)
+      if adapt is not None:
+         # l'objet valeur peut se verifier lui meme
+         return adapt(self.convert_into)
+
+      if type(valeur) == types.TupleType and not valeur[0] in ('RI','MP') or type(valeur) == types.ListType:
+        # Cas d'une liste de valeurs
+        # on s'arrete a la premiere erreur
+        for val in valeur:
+           self.convert_into(val)
+        return valeur
+
+      # Cas d'un scalaire
+      if self.definition.into == None :
+        #on est dans le cas d'un ensemble continu de valeurs possibles (intervalle)
+        if type(valeur) in (types.IntType,types.FloatType,types.LongType) :
+           min = self.definition.val_min
+           max = self.definition.val_max
+           if min == '**': min = valeur -1
+           if max == '**': max = valeur +1
+           if valeur < min or valeur > max :
+              raise ValidException("La valeur : %s  du mot-clé  %s  est en dehors du domaine de validité [ %s , %s ]" % (repr(valeur),self.nom,min,max) )
+        return valeur
+      else :
+        # on est dans le cas d'un ensemble discret de valeurs possibles (into)
+        if valeur not in self.definition.into:
+           raise ValidException("La valeur : %s  n'est pas permise pour le mot-clé : %s" % (repr(valeur),self.nom) )
+        return valeur
+
+  def verif_into(self,cr='non'):
+      """
+      Vérifie si la valeur de self est bien dans l'ensemble discret de valeurs
+      donné dans le catalogue derrière l'attribut into ou vérifie que valeur est bien compris
+      entre val_min et val_max
+      """
+      into = 1
+      try:
+         self.convert_into(self.valeur)
+      except ValidException,e:
+         if cr == 'oui': self.cr.fatal(str(e))
+         into = 0
+      return into
+
+  def convert_type(self,valeur):
+      """
+          Cette methode verifie que valeur est du bon type
+          Si c'est le cas elle retourne valeur eventuellement convertie
+          Si ce n'est pas le cas, elle leve une exception
+      """
+      if self.definition.type is None: return valeur
+
+      if valeur == None :
+         raise ValidException("None n'est pas une valeur autorisée")
+
+      adapt = getattr(valeur, '__adapt__', None)
+      if adapt is not None:
+         # l'objet valeur peut se verifier lui meme
+         return adapt(self.convert_type)
+
+      if type(valeur) == types.TupleType and not valeur[0] in ('RI','MP') or type(valeur) == types.ListType:
+        # Cas d'une liste de valeurs
+        # on s'arrete a la premiere erreur
+        for val in valeur:
+           self.convert_type(val)
+        return valeur
+
+      # Ici, valeur est un scalaire ...il faut tester sur tous les types ou les valeurs possibles
+      for type_permis in self.definition.type:
+          if self.check_type(valeur,type_permis) : return valeur
+      # si on sort de la boucle précédente par ici c'est que l'on n'a trouvé aucun type valable --> valeur refusée
+      raise ValidException("%s n'est pas d'un type autorisé" % repr(valeur))
+
+  def check_type(self,valeur,type_permis):
+      """
+          Fonction booléenne qui retourne 1 si valeur est du type type_permis, 0 sinon
+      """
+      if type_permis == 'R':
+        return self.is_reel(valeur)
+      elif type_permis == 'I':
+        return self.is_entier(valeur)
+      elif type_permis == 'C':
+        return self.is_complexe(valeur)
+      elif type_permis == 'TXM':
+        return type(valeur)==types.StringType
+      elif type(type_permis) == types.ClassType:
+        return self.is_object_from(valeur,type_permis)
+      elif type(type_permis) == types.InstanceType:
+        try:
+           return type_permis.__convert__(valeur) is not None
+        except:
+           return 0
+      elif type_permis == 'shell':
+        return self.is_shell(valeur)
+      else:
+        print "Type non encore géré %s" %`type_permis`
+        print self.nom,self.parent.nom,self.jdc.fichier
+        return 0
+
+  def is_complexe(self,valeur):
+      """ Retourne 1 si valeur est un complexe, 0 sinon """
+      if type(valeur) in (types.ComplexType,types.IntType,types.FloatType,types.LongType):
+      # Pour permettre l'utilisation de complexes Python
+        return 1
+      elif type(valeur) != types.TupleType :
+        # On n'autorise pas les listes pour les complexes
+        return 0
+      elif len(valeur) != 3:return 0
+      else:
+          # Un complexe doit etre un tuple de longueur 3 avec 'RI' ou 'MP' comme premiere
+          # valeur suivie de 2 reels.
+          if string.strip(valeur[0]) in ('RI','MP'):
+             try:
+                v1=self.convert_reel(valeur[1]),self.convert_reel(valeur[2])
+                return 1
+             except:
+                return 0
+          else:
+             return 0
+
+  def convert_reel(self,valeur):
+      try:
+         return float(valeur)
+      except:
+         adapt = getattr(valeur, '__adapt__', None)
+         if adapt is not None:
+            # l'objet valeur peut se verifier lui meme
+            return adapt(self.convert_reel)
+      raise ValidException("%s n'est pas un reel" % repr(valeur))
+         
+  def is_reel(self,valeur):
+      """
+      Retourne 1 si valeur est un reel, 0 sinon
+      """
+      if type(valeur) not in (types.IntType,types.FloatType,types.LongType):
+        # ce n'est pas un réel
+        return 0
+      else:
+        return 1
+
+  def is_entier(self,valeur):
+      """ Retourne 1 si valeur est un entier, 0 sinon """
+      if type(valeur) not in (types.IntType,types.LongType):
+        # ce n'est pas un entier
+        return 0
+      else:
+        return 1
+
+  def is_shell(self,valeur):
+      """
+          Retourne 1 si valeur est un shell, 0 sinon
+          Pour l'instant aucune vérification n'est faite
+          On impose juste que valeur soit une string
+      """
+      if type(valeur) != types.StringType:
+        return 0
+      else:
+        return 1
+
+  def is_object_from(self,objet,classe):
+      """
+           Retourne 1 si objet est une instance de la classe classe, 0 sinon
+      """
+      convert = getattr(classe, '__convert__', None)
+      if convert is not None:
+         # classe verifie les valeurs
+         try:
+            v=  convert(objet)
+            if v is None:return 0
+            else:return 1
+         except:
+            return 0
+      if type(objet) != types.InstanceType :
+        return 0
+      if isinstance(objet,classe) :
+        # On accepte les instances de la classe et des classes derivees
+        return 1
+
+      return 0
+
+  def verif_type(self,val=None,cr='non'):
+      """
+        FONCTION :
+         Cette methode verifie que le type de l'argument val est en conformite avec celui
+         qui est declare dans la definition du mot cle simple.
+         Elle a plusieurs modes de fonctionnement liés à la valeur de cr.
+         Si cr vaut 'oui' : elle remplit le compte-rendu self.cr sinon elle ne le remplit pas.
+        PARAMETRE DE RETOUR :
+         Cette méthode retourne une valeur booléenne qui vaut 1 si le type de val est correct ou 0 sinon
+
+      """
+      try:
+         self.convert_type(val)
+         return 1
+      except ValidException,e:
+         if cr == 'oui': self.cr.fatal(str(e))
+         return 0
+
   def isvalid(self,cr='non'):
       """
          Cette méthode retourne un indicateur de validité de l'objet de type MCSIMP
@@ -532,49 +826,19 @@ class MCSIMP(I_OBJECT.OBJECT):
               self.cr.fatal("None n'est pas une valeur autorisée")
         else:
            # type,into ...
-          #PN ??? je n ose pas y toucher ???
-          #if v.__class__.__name__ in ('PARAMETRE','EVAL', 'ITEM_PARAMETRE','PARAMETRE_EVAL'):
-          if ((issubclass(v.__class__,param2.Formula)) or
-               (v.__class__.__name__  in ('EVAL', 'ITEM_PARAMETRE','PARAMETRE_EVAL'))): 
-             verif_type=self.verif_typeihm(v)
-          else:
-             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 :
-                  new_val=[]
-                  for i in v:
-                    if ((issubclass(i.__class__,param2.Formula)) or
-                        (i.__class__.__name__  in ('EVAL', 'ITEM_PARAMETRE','PARAMETRE_EVAL'))): 
-                         if self.verif_typeihm(val=i,cr=cr) == 0:
-                            verif_type = 0
-                            break
-                    else:
-                         new_val.append(i)
-                  if new_val != [] :
-                    verif_type=self.verif_type(val=new_val,cr=cr)
-                  else :
-                    # Cas d une liste de paramétre
-                    verif_type=self.verif_typeliste(val=v,cr=cr)
-                else:
-                    verif_type=self.verif_type(val=v,cr=cr)
-           valid = verif_type*self.verif_into(cr=cr)*self.verif_card(cr=cr)
+           valid = self.verif_type(val=v,cr=cr)*self.verif_into(cr=cr)*self.verif_card(cr=cr)
            #
            # On verifie les validateurs s'il y en a et si necessaire (valid == 1)
            #
-           if valid and self.definition.validators and not self.definition.validators.verif(self.valeur):
-              if cr == 'oui' :
-                 self.cr.fatal(string.join(("Mot-clé : ",self.nom,"devrait avoir ",self.definition.validators.info())))
-              valid=0
+           if valid and self.definition.validators:
+              try:
+                 self.definition.validators.convert(self.valeur)
+              except ValidException,e:
+                 if cr == 'oui' :
+                    self.cr.fatal(string.join(("Mot-clé : ",self.nom,"devrait avoir ",self.definition.validators.info())))
+                 valid=0
            # fin des validateurs
            #
-       # cas d un item Parametre
-       if self.valeur.__class__.__name__ == 'ITEM_PARAMETRE':
-          valid=self.valeur.isvalid()
-          if valid == 0:
-              if cr == 'oui' :
-                self.cr.fatal(string.join( repr (self.valeur), " a un indice incorrect"))
-
         self.set_valid(valid)
         return self.valid
 
@@ -584,7 +848,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') :
@@ -592,4 +857,4 @@ class MCSIMP(I_OBJECT.OBJECT):
       for v in val :
        verif=verif+self.verif_typeihm(v,cr)
       return verif
-                                                                           
+
index 3e6aa3aca74218c54c3ab4e0e167b2f16d733124..23c34f7c6e6606712d7639ded22be2677147aec0 100644 (file)
@@ -9,8 +9,10 @@
    Ces comportements pourront etre rapatries dans le Noyau quand leur
    interface sera stabilisée.
 """
+class ValidException(Exception):pass
 
 import types
+from I_MCSIMP import ValidException
 
 class Valid:
    """
@@ -18,21 +20,215 @@ class Valid:
         que l'on trouve dans Ihm.
    """
 
-class ListVal(Valid):pass
+class ListVal(Valid):
+   """
+       Cette classe sert de classe mère pour tous les validateurs qui acceptent
+       des listes.
+   """
+   def is_list(self):
+       return 1
+
+   def get_into(self,liste_courante=None,into_courant=None):
+       """
+          Cette méthode get_into effectue un traitement général qui consiste
+          a filtrer la liste de choix into_courant, si elle existe, en ne
+          conservant que les valeurs valides (appel de la méthode valid).
+       """
+       if into_courant is None:
+          return None
+       else:
+          liste_choix=[]
+          for e in into_courant:
+              if self.verif(e):
+                 liste_choix.append(e)
+          return liste_choix
+
+   def convert(self,valeur):
+       """
+          Méthode verif pour les validateurs de listes. Cette méthode
+          fait appel à la méthode verif_item sur chaque élément de la
+          liste. Si valeur est un paramètre, on utilise sa valeur effective
+          valeur.valeur.
+       """
+       if type(valeur) in (types.ListType,types.TupleType):
+          for val in valeur:
+              self.convert_item(val)
+          return valeur
+       else:
+          return self.convert_item(valeur)
+
+
+class RangeVal(ListVal):
+      def convert_item(self,valeur):
+          if valeur > self.low and valeur < self.high:return valeur
+          raise ValidException("%s devrait etre comprise entre %s et %s" %(valeur,self.low,self.high))
+
+
+class CardVal(Valid):
+      def convert(self,valeur):
+          if type(valeur) in (types.ListType,types.TupleType):
+             l=len(valeur)
+          elif valeur is None:
+             l=0
+          else:
+             l=1
+          if self.max != '**' and l > self.max:raise ValidException("%s devrait etre de longueur inferieure a %s" %(valeur,self.max))
+          if self.min != '**' and l < self.min:raise ValidException("%s devrait etre de longueur superieure a %s" %(valeur,self.min))
+          return valeur
 
-class RangeVal(ListVal):pass
 
-class CardVal(Valid):pass
+class PairVal(ListVal):
+      def convert(self,valeur):
+          if type(valeur) in (types.ListType,types.TupleType):
+             for val in valeur:
+                if val % 2 != 0:raise ValidException("%s contient des valeurs non paires" % repr(valeur))
+          else:
+             if valeur % 2 != 0:raise ValidException("%s n'est pas pair" % repr(valeur))
+          return valeur
 
-class PairVal(ListVal):pass
 
-class EnumVal(ListVal):pass
+
+class EnumVal(ListVal):
+      def convert_item(self,valeur):
+          if valeur in self.into:return valeur
+          raise ValidException("%s contient des valeurs hors des choix possibles: %s " %(valeur,self.into))
+
           
-class NoRepeat(ListVal):pass
+class NoRepeat(ListVal):
+      """
+          Verification d'absence de doublons dans la liste.
+      """
+      def __init__(self):
+          self.cata_info=""
+
+      def info(self):
+          return ": pas de présence de doublon dans la liste"
+
+      def info_erreur_liste(self):
+          return "Les doublons ne sont pas permis"
 
-class LongStr(ListVal):pass
+      def verif_item(self,valeur):
+          return 1
+
+      def verif(self,valeur):
+          if type(valeur) in (types.ListType,types.TupleType):
+             liste=list(valeur)
+             for val in liste:
+                if liste.count(val)!=1 : return 0
+             return 1
+          else:
+             return 1
+
+      def convert_item(self,valeur):
+          if valeur in self.liste : raise ValidException("%s est un doublon" % valeur)
+          return valeur
+          
+      def convert(self,valeur):
+          adapt = getattr(valeur, '__adapt__', None)
+          if adapt is not None:
+             # l'objet valeur peut se verifier lui meme
+             return adapt(self.convert)
+
+          if type(valeur) == types.TupleType and not valeur[0] in ('RI','MP') or type(valeur) == types.ListType:
+            # Cas d'une liste de valeurs
+            # on s'arrete a la premiere erreur
+            self.liste=[]
+            for val in valeur:
+               adapt = getattr(val, '__adapt__', None)
+               if adapt is not None: 
+                  v=adapt(self.convert_item)
+               else:
+                  v=self.convert_item(val)
+               self.liste.append(v)
+          return valeur
+
+      def get_into(self,liste_courante=None,into_courant=None):
+          """
+          Methode get_into spécifique pour validateur NoRepeat, on retourne
+          une liste de choix qui ne contient aucune valeur de into_courant
+          déjà contenue dans liste_courante
+          """
+          if into_courant is None:
+             liste_choix=None
+          else:
+             liste_choix=[]
+             for e in into_courant:
+                 if e in liste_choix: continue
+                 if liste_courante is not None and e in liste_courante: continue
+                 liste_choix.append(e)
+          return liste_choix
+
+
+class LongStr(ListVal):
+      """
+          Verification de la longueur d une chaine
+      """
+      def __init__(self,low,high):
+          self.low=low
+          self.high=high
+          self.cata_info=""
+
+      def info(self):
+          return "longueur de la chaine entre %s et %s" %(self.low,self.high)
+
+      def info_erreur_item(self):
+          return "Longueur de la chaine incorrecte"
+
+      def verif_item(self,valeur):
+          low=self.low
+          high=self.high
+          if valeur[0]=="'" and valeur[-1]=="'" :
+             low=low+2
+             high=high+2
+          if len(valeur) < low :return 0
+          if len(valeur) > high:return 0
+          return 1
+
+      def convert(self,valeur):
+          adapt = getattr(valeur, '__adapt__', None)
+          if adapt is not None:
+             # l'objet valeur peut se verifier lui meme
+             return adapt(self.convert)
+
+          if type(valeur) == types.TupleType and not valeur[0] in ('RI','MP') or type(valeur) == types.ListType:
+            # Cas d'une liste de valeurs
+            # on s'arrete a la premiere erreur
+            for val in valeur:
+               self.convert_item(val)
+            return valeur
+          else:
+            return self.convert_item(valeur)
+
+      def convert_item(self,valeur):
+          low=self.low
+          high=self.high
+          if valeur[0]=="'" and valeur[-1]=="'" :
+             low=low+2
+             high=high+2
+          if len(valeur) < low or len(valeur) > high :
+             raise ValidException("%s n'est pas de la bonne longueur" % repr(valeur))
+          return valeur
+
+
+
+class OrdList(ListVal):
+      def convert(self,valeur):
+          if type(valeur) in (types.ListType,types.TupleType):
+             if self.ord=='croissant':
+                var=valeur[0]
+                for val in valeur[1:]:
+                   if val<var:raise ValidException("%s n'est pas par valeurs croissantes" % repr(valeur))
+                   var=val
+                return valeur
+             elif self.ord=='decroissant':
+                var=valeur[0]
+                for val in valeur[1:]:
+                   if val>var:raise ValidException("%s n'est pas par valeurs decroissantes" % repr(valeur))
+                   var=val
+                return valeur
+          else:
+             return valeur
 
-class OrdList(ListVal):pass
 
 CoercableFuncs = { types.IntType:     int,
                    types.LongType:    long,
@@ -40,13 +236,25 @@ CoercableFuncs = { types.IntType:     int,
                    types.ComplexType: complex,
                    types.UnicodeType: unicode }
 
-class TypeVal(ListVal):pass
+class TypeVal(ListVal):
+      def convert_item(self,valeur):
+          return   self.coerce(valeur)
 
 class InstanceVal(ListVal):pass
 
 class FunctionVal(Valid):pass
 
-class OrVal(Valid):pass
-
-class AndVal(Valid):pass
+class OrVal(Valid):
+      def convert(self,valeur):
+          for validator in self.validators:
+              try:
+                 return validator.verif(valeur)
+              except:
+                 pass
+          raise ValidException("%s n'est pas du bon type" % valeur)
 
+class AndVal(Valid):
+      def convert(self,valeur):
+          for validator in self.validators:
+              valeur=validator.convert(valeur)
+          return valeur
index 762dc3fe2030cfb202dd8bad8ef74ede40bfdd2c..b4f4539c95ca962a2bd8208602826d4143610920 100644 (file)
@@ -412,7 +412,7 @@ NONE = None
       # courante pendant le processus de construction des étapes.
       # Si on insère des commandes (par ex, dans EFICAS), il faut préalablement
       # remettre ce pointeur à 0
-      if etape:
+      if etape is not None:
          index_etape=self.etapes.index(etape)
       else:
          index_etape=len(self.etapes)
index 64d1fbac6e38c540d5170d7315ac2674baf9d500..d4fe3916752471aa9fe67fdba62e08c9b038d0fe 100644 (file)
@@ -178,7 +178,8 @@ class Valid:
            Cette méthode indique si valeur est un objet de type PARAMETRE
            dont on cherchera à evaluer la valeur (valeur.valeur)
        """
-       return type(valeur) == types.InstanceType and valeur.__class__.__name__ in ('PARAMETRE',)
+       #return type(valeur) == types.InstanceType and valeur.__class__.__name__ in ('PARAMETRE',)
+       return 0
 
    def is_unknown(self,valeur):
        """
diff --git a/Tests/HTMLTestRunner.py b/Tests/HTMLTestRunner.py
new file mode 100644 (file)
index 0000000..e59a8ef
--- /dev/null
@@ -0,0 +1,538 @@
+"""
+Copyright (c) 2004, Wai Yip Tung
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright notice,
+  this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+* Neither the name of the Wai Yip Tung nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+A TestRunner for use with the Python unit testing framework. It
+generates a HTML report to show the result at a glance.
+
+The simplest way to use this is to invoke its main method. E.g.
+
+    import unittest
+    import HTMLTestRunner
+
+    ... define your tests ...
+
+    if __name__ == '__main__':
+        HTMLTestRunner.main()
+
+It defines the class HTMLTestRunner, which is a counterpart of unittest's
+TextTestRunner. You can also instantiates a HTMLTestRunner object for
+finer control.
+"""
+
+# URL: http://tungwaiyip.info/software
+
+__author__ = "Wai Yip Tung"
+__version__ = "0.7"
+
+
+# TOOD: need to make sure all HTML and JavaScript blocks are properly escaped!
+# TODO: allow link to custom CSS
+# TODO: color stderr
+# TODO: simplify javascript using ,ore than 1 class in the class attribute?
+
+import datetime
+import string
+import StringIO
+import sys
+import time
+import unittest
+from xml.sax import saxutils
+
+
+# ------------------------------------------------------------------------
+# The redirectors below is used to capture output during testing. Output
+# sent to sys.stdout and sys.stderr are automatically captured. However
+# in some cases sys.stdout is already cached before HTMLTestRunner is
+# invoked (e.g. calling logging.basicConfig). In order to capture those
+# output, use the redirectors for the cached stream.
+#
+# e.g.
+#   >>> logging.basicConfig(stream=HTMLTestRunner.stdout_redirector)
+#   >>>
+
+class OutputRedirector(object):
+    """ Wrapper to redirect stdout or stderr """
+    def __init__(self, fp):
+        self.fp = fp
+
+    def write(self, s):
+        self.fp.write(s)
+
+    def writelines(self, lines):
+        self.fp.writelines(lines)
+
+    def flush(self):
+        self.fp.flush()
+
+stdout_redirector = OutputRedirector(sys.stdout)
+stderr_redirector = OutputRedirector(sys.stderr)
+
+
+
+# ----------------------------------------------------------------------
+# Template
+
+STATUS = {
+0: 'pass',
+1: 'fail',
+2: 'error',
+}
+
+
+CSS = """
+<style>
+body        { font-family: verdana, arial, helvetica, sans-serif; font-size: 80%; }
+table       { font-size: 100%; }
+pre         { }
+h1          { }
+.heading    {
+    margin-top: 0ex;
+    margin-bottom: 1ex;
+}
+#show_detail_line {
+    margin-top: 3ex;
+    margin-bottom: 1ex;
+}
+#result_table {
+    width: 80%;
+    border-collapse: collapse;
+    border: medium solid #777;
+}
+#result_table td {
+    border: thin solid #777;
+    padding: 2px;
+}
+#header_row {
+    font-weight: bold;
+    color: white;
+    background-color: #777;
+}
+#total_row  { font-weight: bold; }
+.passClass  { background-color: #6c6; }
+.failClass  { background-color: #c60; }
+.errorClass { background-color: #c00; }
+.passCase   { color: #6c6; }
+.failCase   { color: #c60; font-weight: bold; }
+.errorCase  { color: #c00; font-weight: bold; }
+.hiddenRow  { display: none; }
+.testcase   { margin-left: 2em; }
+#btm_filler { margin-top: 50%; }
+</style>
+"""
+
+# currently not used
+CSS_LINK = '<link rel="stylesheet" href="$url" type="text/css">\n'
+
+
+HTML_TMPL = string.Template(r"""
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html>
+<head>
+    <title>$title</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    $css
+</head>
+<body>
+<script>
+output_list = Array();
+
+/* level - 0:Summary; 1:Failed; 2:All */
+function showCase(level) {
+    trs = document.getElementsByTagName("tr");
+    for (var i = 0; i < trs.length; i++) {
+        tr = trs[i];
+        id = tr.id;
+        if (id.substr(0,2) == 'ft') {
+            if (level < 1) {
+                tr.className = 'hiddenRow';
+            }
+            else {
+                tr.className = '';
+            }
+        }
+        if (id.substr(0,2) == 'pt') {
+            if (level > 1) {
+                tr.className = '';
+            }
+            else {
+                tr.className = 'hiddenRow';
+            }
+        }
+    }
+}
+
+function showClassDetail(cid, count) {
+    var id_list = Array(count);
+    var toHide = 1;
+    for (var i = 0; i < count; i++) {
+        tid0 = 't' + cid.substr(1) + '.' + (i+1);
+        tid = 'f' + tid0;
+        tr = document.getElementById(tid);
+        if (!tr) {
+            tid = 'p' + tid0;
+            tr = document.getElementById(tid);
+        }
+        id_list[i] = tid;
+        if (tr.className) {
+            toHide = 0;
+        }
+    }
+    for (var i = 0; i < count; i++) {
+        tid = id_list[i];
+        if (toHide) {
+            document.getElementById(tid).className = 'hiddenRow';
+        }
+        else {
+            document.getElementById(tid).className = '';
+        }
+    }
+}
+
+function showOutput(id, name) {
+    w = window.open("", //url
+                    name,
+                    "resizable,status,width=800,height=450");
+    d = w.document;
+    d.write("<pre>");
+    d.write(output_list[id]);
+    d.write("\n");
+    d.write("<a href='javascript:window.close()'>close</a>\n");
+    d.write("</pre>\n");
+    d.close();
+}
+
+</script>
+
+<h1>$description</h1>
+<p class='heading'><strong>Time:</strong> $time</p>
+<p class='heading'><strong>Status:</strong> $status</p>
+<p id='show_detail_line'>Show
+<a href='javascript:showCase(0)'>Summary</a>
+<a href='javascript:showCase(1)'>Failed</a>
+<a href='javascript:showCase(2)'>All</a>
+</p>
+<table id='result_table'>
+<colgroup>
+<col align='left' />
+<col align='right' />
+<col align='right' />
+<col align='right' />
+<col align='right' />
+<col align='right' />
+</colgroup>
+<tr id='header_row'>
+    <td>Class/Test case</td>
+    <td>Count</td>
+    <td>Pass</td>
+    <td>Fail</td>
+    <td>Error</td>
+    <td>View</td>
+</tr>
+$tests
+<tr id='total_row'>
+    <td>Total</td>
+    <td>$count</td>
+    <td>$Pass</td>
+    <td>$fail</td>
+    <td>$error</td>
+    <td>&nbsp;</td>
+</tr>
+</table>
+<div id='btm_filler' />
+</body>
+</html>
+""")
+
+CLASS_TMPL = string.Template(r"""
+<tr class='$style'>
+    <td>$name</td>
+    <td>$count</td>
+    <td>$Pass</td>
+    <td>$fail</td>
+    <td>$error</td>
+    <td><a href="javascript:showClassDetail('$cid',$count)">Detail</a></td>
+</tr>
+""")
+
+TEST_TMPL = string.Template(r"""
+<tr id='$tid' class='$Class'>
+    <td class='$style'><div class='testcase'>$name<div></td>
+    <td colspan='5' align='center'><a href="javascript:showOutput('$tid', '$name')">$status</a></td>
+</tr>
+""")
+
+TEST_TMPL_NO_OUTPUT = string.Template(r"""
+<tr id='$tid' class='$Class'>
+    <td class='$style'><div class='testcase'>$name<div></td>
+    <td colspan='5' align='center'>$status</td>
+</tr>
+""")
+
+TEST_OUTPUT_TMPL = string.Template(r"""
+<script>output_list['$id'] = '$output';</script>
+""")
+
+
+# ----------------------------------------------------------------------
+
+TestResult = unittest.TestResult
+
+class _TestResult(TestResult):
+    # note: _TestResult is a pure representation of results.
+    # It lacks the output and reporting ability compares to unittest._TextTestResult.
+
+    def __init__(self, verbosity=1):
+        TestResult.__init__(self)
+        self.stdout0 = None
+        self.stderr0 = None
+        self.verbosity = verbosity
+
+        # result is a list of result in 4 tuple
+        # (
+        #   result code (0: success; 1: fail; 2: error),
+        #   TestCase object,
+        #   Test output (byte string),
+        #   stack trace,
+        # )
+        self.result = []
+
+
+    def startTest(self, test):
+        TestResult.startTest(self, test)
+        # just one buffer for both stdout and stderr
+        self.outputBuffer = StringIO.StringIO()
+        stdout_redirector.fp = self.outputBuffer
+        stderr_redirector.fp = self.outputBuffer
+        self.stdout0 = sys.stdout
+        self.stderr0 = sys.stderr
+        sys.stdout = stdout_redirector
+        sys.stderr = stderr_redirector
+
+
+    def complete_output(self):
+        """
+        Disconnect output redirection and return buffer.
+        Safe to call multiple times.
+        """
+        if self.stdout0:
+            sys.stdout = self.stdout0
+            sys.stderr = self.stderr0
+            self.stdout0 = None
+            self.stderr0 = None
+        return self.outputBuffer.getvalue()
+
+
+    def stopTest(self, test):
+        # Usually one of addSuccess, addError or addFailure would have been called.
+        # But there are some path in unittest that would bypass this.
+        # We must disconnect stdout in stopTest(), which is guaranteed to be called.
+        self.complete_output()
+
+
+    def addSuccess(self, test):
+        TestResult.addSuccess(self, test)
+        output = self.complete_output()
+        self.result.append((0, test, output, ''))
+        if self.verbosity > 1:
+            sys.stderr.write('ok ')
+            sys.stderr.write(str(test))
+            sys.stderr.write('\n')
+        else:
+            sys.stderr.write('.')
+
+    def addError(self, test, err):
+        TestResult.addError(self, test, err)
+        output = self.complete_output()
+        self.result.append((2, test, output, self._exc_info_to_string(err, test)))
+        if self.verbosity > 1:
+            sys.stderr.write('E  ')
+            sys.stderr.write(str(test))
+            sys.stderr.write('\n')
+        else:
+            sys.stderr.write('E')
+
+    def addFailure(self, test, err):
+        TestResult.addFailure(self, test, err)
+        output = self.complete_output()
+        self.result.append((1, test, output, self._exc_info_to_string(err, test)))
+        if self.verbosity > 1:
+            sys.stderr.write('F  ')
+            sys.stderr.write(str(test))
+            sys.stderr.write('\n')
+        else:
+            sys.stderr.write('F')
+
+
+class HTMLTestRunner:
+    """
+    """
+    def __init__(self, stream=sys.stdout, descriptions=1, verbosity=1, description='Test'):
+        # unittest itself has no good mechanism for user to define a
+        # description neither in TestCase nor TestSuite. Allow user to
+        # pass in the description as a parameter.
+
+        # note: this is different from unittest.TextTestRunner's
+        # 'descrpitions' parameter, which is an integer flag.
+
+        self.stream = stream
+        self.startTime = datetime.datetime.now()
+        self.description = description
+        self.verbosity = verbosity
+
+    def run(self, test):
+        "Run the given test case or test suite."
+        result = _TestResult(self.verbosity)
+        test(result)
+        self.stopTime = datetime.datetime.now()
+        self.generateReport(test, result)
+        print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)
+        return result
+
+    def sortResult(self, result_list):
+        # unittest does not seems to run in any particular order.
+        # Here at least we want to group them together by class.
+        rmap = {}
+        classes = []
+        for n,t,o,e in result_list:
+            cls = t.__class__
+            if not rmap.has_key(cls):
+                rmap[cls] = []
+                classes.append(cls)
+            rmap[cls].append((n,t,o,e))
+        r = [(cls, rmap[cls]) for cls in classes]
+        return r
+
+    def generateReport(self, test, result):
+        rows = []
+        npAll = nfAll = neAll = 0
+        sortedResult = self.sortResult(result.result)
+        for cid, (cls, cls_results) in enumerate(sortedResult):
+            # update counts
+            np = nf = ne = 0
+            for n,t,o,e in cls_results:
+                if n == 0: np += 1
+                elif n == 1: nf += 1
+                else: ne += 1
+            npAll += np
+            nfAll += nf
+            neAll += ne
+
+            row = CLASS_TMPL.safe_substitute(
+                style = ne > 0 and 'errorClass' or nf > 0 and 'failClass' or 'passClass',
+                name = "%s.%s" % (cls.__module__, cls.__name__),
+                count = np+nf+ne,
+                Pass = np,
+                fail = nf,
+                error = ne,
+                cid = 'c%s' % (cid+1),
+            )
+            rows.append(row)
+
+            for tid, (n,t,o,e) in enumerate(cls_results):
+                # e.g. 'pt1.1', 'ft1.1', etc
+                has_output = bool(o or e)
+                tid = (n == 0 and 'p' or 'f') + 't%s.%s' % (cid+1,tid+1)
+                name = t.id().split('.')[-1]
+                tmpl = has_output and TEST_TMPL or TEST_TMPL_NO_OUTPUT
+                row = tmpl.safe_substitute(
+                    tid = tid,
+                    Class = (n == 0 and 'hiddenRow' or ''),
+                    style = n == 2 and 'errorCase' or (n == 1 and 'failCase' or ''),
+                    name = name,
+                    status = STATUS[n],
+                )
+                rows.append(row)
+                if has_output:
+                    # o and e should be byte string because they are collected from stdout and stderr?
+                    if isinstance(o,str):
+# TODO: some problem with 'string_escape': it escape \n and mess up formating
+#                        uo = unicode(o.encode('string_escape'))
+                        uo = o.decode('latin-1')
+                    else:
+                        uo = o
+                    if isinstance(e,str):
+# TODO: some problem with 'string_escape': it escape \n and mess up formating
+#                        ue = unicode(e.encode('string_escape'))
+                        ue = e.decode('latin-1')
+                    else:
+                        ue = e
+                    row = TEST_OUTPUT_TMPL.safe_substitute(
+                        id = tid,
+                        output = saxutils.escape(uo+ue) \
+                            .replace("'", '&apos;') \
+                            .replace('"', '&quot;') \
+                            .replace('\\','\\\\') \
+                            .replace('\r','\\r') \
+                            .replace('\n','\\n'),
+                    )
+                    rows.append(row)
+
+        report = HTML_TMPL.safe_substitute(
+            title = self.description,
+            css = CSS,
+            description = self.description,
+            time = str(self.startTime)[:19],
+            status = result.wasSuccessful() and 'Passed' or 'Failed',
+            tests = ''.join(rows),
+            count = str(npAll+nfAll+neAll),
+            Pass = str(npAll),
+            fail = str(nfAll),
+            error = str(neAll),
+        )
+        self.stream.write(report.encode('utf8'))
+
+
+##############################################################################
+# Facilities for running tests from the command line
+##############################################################################
+
+# Note: Reuse unittest.TestProgram to launch test. In the future we may
+# build our own launcher to support more specific command line
+# parameters like test title, CSS, etc.
+class TestProgram(unittest.TestProgram):
+    """
+    A variation of the unittest.TestProgram. Please refer to the base
+    class for command line parameters.
+    """
+    def runTests(self):
+        # Pick HTMLTestRunner as the default test runner.
+        # base class's testRunner parameter is not useful because it means
+        # we have to instantiate HTMLTestRunner before we know self.verbosity.
+        if self.testRunner is None:
+            self.testRunner = HTMLTestRunner(verbosity=self.verbosity)
+        unittest.TestProgram.runTests(self)
+
+main = TestProgram
+
+##############################################################################
+# Executing this module from the command line
+##############################################################################
+
+if __name__ == "__main__":
+    main(module=None)
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..36e548ad0bf5a4d429958f7773d9dd14b121aef8 100644 (file)
@@ -1,13 +1,32 @@
+"""
+This program executes all unitest tests that are found in 
+    - directories with name test* or Test*
+    - files with name test* or Test*
+
+unitest tests are :
+    - functions and class with names test* or Test*
+    - methods with name test* or Test* from classes with name test* or Test*
+
+Typical uses are :
+   
+    - execute all tests with text output : python2.4 run.py 
+    - execute all tests with html output : python2.4 run.py --html
+    - execute some tests with text output : python2.4 run.py testelem
+    - execute one test with text output : python2.4 run.py testelem/testsimp1.py
+    - execute all tests with verbosity and html output : python2.4 run.py -v --html
+"""
+
 import sys,types,os
 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 +42,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 +100,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 +110,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):
 
@@ -167,13 +160,18 @@ class ModuleTestSuite(TestSuite):
           for test in func_tests ]
         return tests
 
+
 class TestProgram(unittest.TestProgram):
     USAGE="""
 """
-    def __init__(self,testRunner=None):
-        self.testRunner = testRunner
+    def __init__(self):
+        self.testRunner = None
         self.verbosity = 1
+        self.html=0
         self.parseArgs(sys.argv)
+        if self.html:
+           import HTMLTestRunner
+           self.testRunner = HTMLTestRunner.HTMLTestRunner(verbosity=self.verbosity)
         self.createTests()
         self.runTests()
 
@@ -182,9 +180,13 @@ class TestProgram(unittest.TestProgram):
         parser.add_option("-v","--verbose",action="count",
                           dest="verbosity",default=1,
                           help="Be more verbose. ")
+        parser.add_option("--html",action="store_true",
+                          dest="html",default=0,
+                          help="Produce HTML output ")
 
         options, args = parser.parse_args(argv)
         self.verbosity = options.verbosity
+        self.html=options.html
 
         if args:
             self.names = list(args)
@@ -194,9 +196,6 @@ class TestProgram(unittest.TestProgram):
     def createTests(self):
         self.test = TestSuite(self.names)
 
-
-main = TestProgram
-
 if __name__ == "__main__":
-    main()
+    TestProgram()
 
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..665f63f
--- /dev/null
@@ -0,0 +1,5 @@
+DEBUT()
+inf=1
+p2=inf+1
+p3=sin(p2)
+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..36906c5
--- /dev/null
@@ -0,0 +1,49 @@
+from Numeric import cos
+DEBUT()
+RAYCRA=1.
+EPCRA=0.1
+S_CR=3.1415*(RAYCRA**2-(RAYCRA-EPCRA)**2)
+T_CR=3.1415
+NOMF="nomfichier"
+n=2
+
+MA=LIRE_MAILLAGE(  )
+
+MO=AFFE_MODELE(  MAILLAGE=MA,
+          #test de validateur GEOM (typ=grma) avec grma derive de GEOM
+                 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,)),
+                           ),
+                        );
+
+DEFI_FICHIER(UNITE=50, FICHIER='./REPE_OUT/zzzz206a_resu.mail')
+#test de validateur LongStr avec parametre instance de PARAMETRE
+DEFI_FICHIER(UNITE=50, FICHIER=NOMF)
+#test de validateur LongStr avec parametre instance de Formula
+u=DEFI_FICHIER( FICHIER=NOMF*2)
+DEFI_FICHIER (ACTION='LIBERER',UNITE=50)
+#test de validateur d'objet entier (typ='I'), instance de la classe entier
+DEFI_FICHIER (ACTION='LIBERER',UNITE=u)
+
+# test de validateur qui accepte tout (typ=assd)
+IMPR_CO(CO=MA)
+
+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/e.comm b/Tests/testcomm/e.comm
new file mode 100644 (file)
index 0000000..ffd1185
--- /dev/null
@@ -0,0 +1,70 @@
+DEBUT()
+MAYA=LIRE_MAILLAGE()
+
+MAYA=DEFI_GROUP( reuse=MAYA,   MAILLAGE=MAYA,
+  CREA_GROUP_MA=_F(  NOM = 'TOUT', TOUT = 'OUI'))
+
+BARRE1=AFFE_MODELE(  MAILLAGE=MAYA,
+                            AFFE=_F( GROUP_MA='SS1',
+                                  MODELISATION = 'POU_D_E',
+                                  PHENOMENE = 'MECANIQUE'))
+#
+MATERIO1=DEFI_MATERIAU(  ELAS=_F( RHO = 1.E08,  NU = 0.3,  E = 1.E10))
+
+MATERIO2=DEFI_MATERIAU(  ELAS=_F( RHO = 0.,  NU = 0.,   E = 1.E15))
+#
+CHMAT=AFFE_MATERIAU(  MAILLAGE=MAYA,AFFE=(
+                              #_F( TOUT = 'OUI',      MATER = MATERIO1),
+                              _F( GROUP_MA = 'SS1',   MATER = MATERIO1),
+                              _F( GROUP_MA = 'SS2',   MATER = MATERIO1),
+                              _F( GROUP_MA = 'SS3',   MATER = MATERIO1),
+                              _F( GROUP_MA = 'RIGIDE', MATER = MATERIO2),
+)) # commentaire test
+
+CARA1=AFFE_CARA_ELEM(  MODELE=BARRE1,
+                           POUTRE=_F(
+                                    GROUP_MA = 'TOUT',
+                                    SECTION = 'CERCLE',
+                                    CARA = ('R', 'EP',),  
+                                    VALE = (0.1, 0.01,)))
+
+GUIDAGE1=AFFE_CHAR_MECA(    MODELE=BARRE1,DDL_IMPO=(
+                           _F( GROUP_MA='SS1',
+                                     DX = 0., DZ = 0., DRX = 0., DRY = 0.),
+                           _F( GROUP_NO = 'L1',  DY = 0., DRZ = 0.),
+                           ))
+
+K_ELEM1=CALC_MATR_ELEM(      MODELE=BARRE1,
+                             CARA_ELEM=CARA1,
+                            CHAM_MATER=CHMAT,
+                               OPTION='RIGI_MECA',
+                               CHARGE=GUIDAGE1)
+
+NUM1=NUME_DDL(  MATR_RIGI=K_ELEM1)
+
+#
+K_ASSE1=ASSE_MATRICE(  MATR_ELEM=K_ELEM1,
+                           NUME_DDL=NUM1)
+
+MODESTA1=MODE_STATIQUE(  MATR_RIGI=K_ASSE1,
+                     MODE_STAT=_F(
+                     GROUP_NO=('L12'),
+                     AVEC_CMP = ('DY','DRZ'),
+                                 ))
+
+# parse: -affectation
+
+DS1=[None]*5
+DS2=[None]*5
+DS3=[None]*5
+DS4=[None]*5
+CHS1=[None]*5
+CHS2=[None]*5
+
+# parse: +affectation
+
+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');
+
+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/f.comm b/Tests/testcomm/f.comm
new file mode 100644 (file)
index 0000000..d15a617
--- /dev/null
@@ -0,0 +1,18 @@
+from Numeric import size
+
+DEBUT()
+
+# Definition des parametres de l'excitation sinusoidale
+freq=1500.0
+periode=1.0/freq
+pas=periode/100.0
+
+LISTTM=DEFI_LIST_REEL(DEBUT=0.0*periode,
+                       INTERVALLE=_F(JUSQU_A=100.0*periode,
+                                     PAS=pas,),);
+
+LISTRD=DEFI_LIST_REEL(DEBUT=(98.0)*periode+pas,
+                       INTERVALLE=_F(JUSQU_A=(100.0)*periode,
+                                     PAS=pas,),);
+
+FIN()
diff --git a/Tests/testcomm/g.comm b/Tests/testcomm/g.comm
new file mode 100644 (file)
index 0000000..f839314
--- /dev/null
@@ -0,0 +1,11 @@
+DEBUT()
+sensible=[2.1E11, 0.3,  1.E-6,   1.E-6,   ]
+
+# parse: -affectation
+n=len(sensible)
+PS=[None]*n
+
+for i in range(n):
+    PS[i]=DEFI_PARA_SENSI(VALE=sensible[i])
+
+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..6984f60
--- /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='NON'") != -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..8e7a405
--- /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,"z*.comm")):
+      ff=open(f)
+      text=ff.read()
+      ff.close()
+      if text.find("VISU_EFICAS='NON'") != -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..729c663
--- /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='NON'") != -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..f0338b2
--- /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='NON'") != -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..9d34bdc
--- /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='NON'") != -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..8b4687f
--- /dev/null
@@ -0,0 +1,44 @@
+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='NON'") != -1:continue
+      for o in ('3','2','1','0','m'):
+       f=f[:-1]+o
+       if os.path.isfile(f):
+          ff=open(f)
+          text=ff.read()
+          ff.close()
+          if text.find("VISU_EFICAS='NON'") == -1: 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..c1c4583
--- /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='NON'") != -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..df4fab1
--- /dev/null
@@ -0,0 +1,44 @@
+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='NON'") != -1:continue
+      for o in ('3','2','1','0','m'):
+       f=f[:-1]+o
+       if os.path.isfile(f):
+          ff=open(f)
+          text=ff.read()
+          ff.close()
+          if text.find("VISU_EFICAS='NON'") == -1: 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..8111717
--- /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='NON'") != -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..890a42a
--- /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='NON'") != -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/params.comm b/Tests/testelem/params.comm
new file mode 100644 (file)
index 0000000..dba5239
--- /dev/null
@@ -0,0 +1,40 @@
+
+
+DEBUT();
+a = 1.0;
+
+b = 3;
+
+c = 15;
+
+d = 5;
+
+x = (1, 2);
+
+y = [3, 4];
+
+y2 = (y * 2);
+
+z = 'a';
+
+zz = 'v';
+
+t = a;
+
+v = """aaaa
+bbbb""";
+
+xx = ceil(sqrt(d));
+
+yy = cos(3.1);
+
+ax = sin(2);
+
+bx = cos(xx);
+
+cx = sin(xx);
+
+zy = y[1];
+
+
+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..3d57d64
--- /dev/null
@@ -0,0 +1,454 @@
+# coding=utf-8
+
+import os
+import unittest
+import difflib
+import compare
+
+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 test000(self):
+      app=appli.STANDALONE(version='v8.2')
+      j=app.newJDC()
+
+# commande DEBUT
+      co=j.addentite("DEBUT",0)
+      co=add_param(j,1,"P1",None)
+      x=co.valeur or "coucou"
+      assert x == "coucou"
+      assert len(co) == 0
+      co.set_valeur(1)
+      assert len(co) == 1
+      co.set_valeur([1,2])
+      assert len(co) == 2
+
+   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')
+      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")
+      add_mcsimp(mcf[0],"OPTION","RIGI_THER")
+      mcs=mcf[0].get_child("MATRICE")
+      mcs.set_valeur_co('MAT1')
+# commentaire
+      pos=pos+1
+      co=j.addentite("COMMENTAIRE",pos)
+      co.set_valeur(" 'MACRO_MATR_ASSE', 'MATR_ASSE', 'MATRICE'  --> uniquesdcopanel")
+
+      assert j.isvalid(),j.report()
+
+      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)
+
+   def test003(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)
+#parametre
+      pos=0
+      pos=pos+1
+      co=add_param(j,pos,"P1","9.8")
+      pos=pos+1
+      co=add_param(j,pos,"P2","sin(P1)")
+# formule
+      pos=pos+1
+      co=j.addentite("FORMULE",pos)
+      co.update_formule_python(("aaa","REEL","a+z","(a,z)"))
+#parametre de formule
+      pos=pos+1
+      co=add_param(j,pos,"P3","aaa(P1,2.)")
+#commande defi_list_reel
+      pos=pos+1
+      co=j.addentite("DEFI_LIST_REEL",pos)
+      add_mcsimp(co,"VALE","1.,2.,3.")
+      co.nomme_sd("LI1")
+#commande defi_list_reel
+      pos=pos+1
+      co=j.addentite("DEFI_LIST_REEL",pos)
+      add_mcsimp(co,"VALE","sin(1.)")
+      co.nomme_sd("LI2")
+#commande defi_list_reel
+      pos=pos+1
+      co=j.addentite("DEFI_LIST_REEL",pos)
+      add_mcsimp(co,"VALE","aaa(1.,2.)")
+      co.nomme_sd("LI3")
+#commande defi_list_reel
+      pos=pos+1
+      co=j.addentite("DEFI_LIST_REEL",pos)
+      add_mcsimp(co,"VALE","sin(1.,2)")
+      co.nomme_sd("LI4")
+#commande defi_list_reel
+      pos=pos+1
+      co=j.addentite("DEFI_LIST_REEL",pos)
+      add_mcsimp(co,"VALE","aaa(1.)")
+      co.nomme_sd("LI5")
+#commande defi_list_reel
+      pos=pos+1
+      co=j.addentite("DEFI_LIST_REEL",pos)
+      add_mcsimp(co,"VALE","1,sin(1.),2")
+      co.nomme_sd("LI6")
+
+      expected="""DEBUT CR validation : SansNom
+   Etape : DEFI_LIST_REEL    ligne : ...
+      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+      ! Concept retourné non défini !
+      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+      Mot-clé simple : VALE
+         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+         ! 'sin(1.,2)' n'est pas d'un type autorisé !
+         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+      Fin Mot-clé simple : VALE
+   Fin Etape : DEFI_LIST_REEL
+   Etape : DEFI_LIST_REEL    ligne : ...
+      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+      ! Concept retourné non défini !
+      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+      Mot-clé simple : VALE
+         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+         ! 'aaa(1.)' n'est pas d'un type autorisé !
+         !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+      Fin Mot-clé simple : VALE
+   Fin Etape : DEFI_LIST_REEL
+FIN CR validation :SansNom
+"""
+      msg=str( j.report())
+      assert compare.check(expected,msg),cdiff(expected,msg)
diff --git a/Tests/testelem/testjdc3.py b/Tests/testelem/testjdc3.py
new file mode 100644 (file)
index 0000000..3e6ae64
--- /dev/null
@@ -0,0 +1,138 @@
+# coding=utf-8
+import os
+import unittest
+import difflib
+import compare
+
+import prefs
+from Editeur import appli
+from Accas import AsException
+
+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)
+
+   def test002(self):
+      """ Test de commentarisation/decommentarisation de macro commande 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 MACRO_MATR_ASSE
+      for co in j.etapes:
+        if co.nom == "MACRO_MATR_ASSE" :break
+      cco=co.get_objet_commentarise(format=app.format_fichier.get())
+      # on decommente la commande MACRO_MATR_ASSE
+      commande,nom = cco.uncomment()
+      assert j.isvalid(),j.report()
+
+   def test003(self):
+      """ Test de commentarisation/decommentarisation de commandes dans fichier az.comm"""
+      app=appli.STANDALONE(version='v8.2')
+      text="""
+DEBUT()
+MA=LIRE_MAILLAGE()
+FIN()
+"""
+      j=app.openTXT(text)
+      assert j.isvalid(),j.report()
+      # on commente la commande LIRE_MAILLAGE
+      co=j.etapes[1]
+      cco=co.get_objet_commentarise(format=app.format_fichier.get())
+      co=j.addentite("LIRE_MAILLAGE",2)
+      test,mess=co.nomme_sd("MA")
+      # on decommente la commande LIRE_MAILLAGE
+      commande,nom = cco.uncomment()
+      expected="""DEBUT CR validation : TEXT
+   Etape : LIRE_MAILLAGE    ligne : ...
+      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+      ! Concept retourné non défini !
+      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   Fin Etape : LIRE_MAILLAGE
+FIN CR validation :TEXT
+"""
+      msg=str( j.report())
+      assert compare.check(expected,msg),cdiff(expected,msg)
+
+   def test004(self):
+      """ Test de commentarisation/decommentarisation de commandes dans fichier az.comm"""
+      app=appli.STANDALONE(version='v8.2')
+      text="""
+DEBUT()
+MA=LIRE_MAILLAGE()
+AFFE_MODELE(MAILLAGE=MA)
+FIN()
+"""
+      j=app.openTXT(text)
+      # on commente la commande LIRE_MAILLAGE
+      co=j.etapes[1]
+      cco=co.get_objet_commentarise(format=app.format_fichier.get())
+      # on commente la commande AFFE_MODELE
+      co=j.etapes[2]
+      cco2=co.get_objet_commentarise(format=app.format_fichier.get())
+      # on decommente la commande AFFE_MODELE
+      commande,nom = cco2.uncomment()
+      assert commande["MAILLAGE"] == None
+
+   def test005(self):
+      """ Test de commentarisation/decommentarisation de commandes dans fichier az.comm"""
+      app=appli.STANDALONE(version='v8.2')
+      text="""
+DEBUT()
+MA=LIRE_MAILLAGE()
+AFFE_MODELE(MAILLAGE=MA)
+FIN()
+"""
+      j=app.openTXT(text)
+      # on commente la commande AFFE_MODELE
+      co=j.etapes[2]
+      cco2=co.get_objet_commentarise(format=app.format_fichier.get())
+      # on commente la commande LIRE_MAILLAGE
+      co=j.etapes[1]
+      cco=co.get_objet_commentarise(format=app.format_fichier.get())
+      # on decommente la commande AFFE_MODELE
+      self.assertRaises(AsException, cco2.uncomment, )
+
diff --git a/Tests/testelem/testjdc4.py b/Tests/testelem/testjdc4.py
new file mode 100644 (file)
index 0000000..8351954
--- /dev/null
@@ -0,0 +1,56 @@
+# coding=utf-8
+import os
+import unittest
+import difflib
+import compare
+
+import prefs
+from Editeur import appli
+from Accas import AsException
+
+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()
+
+   i=0
+   for f in ("params.comm",):
+      file=os.path.join(prefs.INSTALLDIR,"Tests/testelem",f)
+      i=i+1
+      exec """def test%s(self,file="%s"):
+                  self.commtest(file)
+""" % (i,file)
+   del i
+
+   def commtest(self,file):
+      """ Test de lecture/ecriture de fichier .comm"""
+      print file
+      app=appli.STANDALONE(version='v8.2')
+      j=app.openJDC(file=file)
+      assert j.isvalid(),j.report()
+
+      text1=app.get_text_JDC(j,'python')
+      f=open(file)
+      text2=f.read()
+      f.close()
+      assert text1 == text2 , cdiff(text1,text2)
+
index c6f90a768f290a8ec97b5b65970d949f8ba70541..25cd7cae07ccefec79a47f5abc6d730ae828d566 100644 (file)
@@ -1,7 +1,9 @@
 # coding=utf-8
+import types
 from Accas import SIMP,ASSD
 class maillage(ASSD):pass
 class maillage_sdaster(ASSD):pass
+from Accas import ValidException
 
 import unittest
 
@@ -241,3 +243,25 @@ Fin Mot-cl
            self.assertEqual(o.isvalid(),valid,
                "erreur sur le test %s %s" % (valeur,valid)+'\n'+str(o.report()))
            if valid: self.assertEqual(o.get_valeur(),valeur)
+
+   def test014(self):
+       class LongStr:
+         def __init__(self,min,max):
+            self.min=min
+            self.max=max
+         def __convert__(self,valeur):
+            if type(valeur) == types.StringType:
+               if self.min < len(valeur) < self.max:return valeur
+            return None
+
+       cata=SIMP(typ=LongStr(5,8),statut='o')
+       liste=(("aaaaaa",1),
+              ("aaaaaaa",1),
+              ("aaaaaaaaaaaaaaa",0),
+              ("aa",0),
+             )
+       for valeur,valid in liste:
+           o=cata(valeur,'mcs',None)
+           self.assertEqual(o.isvalid(),valid,
+                     "erreur sur le test %s %s" % (valeur,valid)+'\n'+str(o.report()))
+           if valid: self.assertEqual(o.get_valeur(),valeur)
index 20c6670157cf889523896246c600ae652e816ffd..3d6caeec8b42f617c7237ec41c251ed618c813af 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,37 @@ 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)
+
+   def test004(self):
+       cata=SIMP(typ='C',statut='o',max=10)
+       liste=((1,1),("a",0), (1.,1),(('RI',1.,0.),1), (('RI',1,0),1), (1+0j,1),
+              (('RI',Variable('x',1.),0.),1),
+              (Variable('x',1.),1),
+              (Variable('x',1.)+0j,1),
+              ((Variable('x',1.)+0j,1.,0.,Variable('x',1.+2j),Variable('x',Variable('y',1.)+2j)),1),
+              ("('RI',1,0)",0), ("toto",0), (None,0),
+              (Variable('x',(1,2,2+5j)),1),
+              (Variable('x',(1,2,2+5j,5,6,7,8,9,10,11,12)),0),
+              (Variable('x',(1,2,2+5j,5,6,Variable('y',1+4j),8,9,10,11,12)),0),
+              (Variable('x',(1,"aaaa",2+5j,5,6,Variable('y',1+4j),8,9,10,11,12)),0),
+              (1+Variable('x',1.)*1j,1),
+             )
+       for valeur,valid in liste:
+           o=cata(valeur,'mcs',None)
+           self.assertEqual(o.isvalid(),valid,"erreur sur le test %s %s" % (valeur,valid)+'\n'+str(o.report()))
+           if valid: self.assertEqual(o.get_valeur(),valeur)
+
+   def test005(self):
+       t=Variable('t',None)
+       assert len(t) == 0
index 31b3b1bf8fe567cf787e9f338b1a306a8399f5bf..a8eb78f0118a2648b2b47f085d854bd79027ab71 100644 (file)
@@ -1,5 +1,6 @@
 # coding=utf-8
 from Accas import *
+from Extensions.param2 import Variable
 
 import unittest
 import compare
@@ -22,7 +23,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):
@@ -48,6 +49,14 @@ Fin Mot-cl
    ! Mot-clé :  mcs devrait avoir  longueur de la chaine entre 3 et 5 !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 Fin Mot-clé simple : mcs
+"""),
+              (Variable('x',"aaa"),OK),
+              (Variable('x',"aaaaaaaaaaaa"),
+"""Mot-clé simple : mcs
+   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   ! Mot-clé :  mcs devrait avoir  longueur de la chaine entre 3 et 5 !
+   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+Fin Mot-clé simple : mcs
 """),
              )
        self._test(cata,liste)
@@ -67,6 +76,22 @@ Fin Mot-cl
               (("aaaa","axyz","bbbb","zzz"),OK),
               ("aaaa",OK),("aaaaa",OK),
               ("axyzaa",OK),("bbbbaaa",OK),
+              (("aaa",Variable('x',"bbb")),OK),
+              (("aaa",Variable('x',"aaa")),
+"""Mot-clé simple : mcs
+   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   ! Mot-clé :  mcs devrait avoir  : pas de présence de doublon dans la liste !
+   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+Fin Mot-clé simple : mcs
+"""),
+              (Variable('x',("aaa","bbb")),OK),
+              (Variable('x',("aaa","bbb","bbb")),
+"""Mot-clé simple : mcs
+   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   ! Mot-clé :  mcs devrait avoir  : pas de présence de doublon dans la liste !
+   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+Fin Mot-clé simple : mcs
+"""),
              )
        self._test(cata,liste)
 
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..5f9cf5c
--- /dev/null
@@ -0,0 +1,906 @@
+# -*- 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]+')
+    pattern_ligne_non_blanche = re.compile(r'[^ \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]*')
+    optionprog=re.compile(r'#\s*parse:\s*([^\n\'"]*)$')
+
+    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
+        self.indent_list=[""]
+        self.objet_courant=None
+        self.affectation_flag=1
+        self.comment_flag=1
+        self.buffer=[]
+        self.buffer_indent=""
+
+    def getoptions(self):
+        m= self.optionprog.match(self.line)
+        if m:
+           option=m.group(1)
+           name=option[1:]
+           flag=(option[0] == '+')
+           if name == "affectation": self.affectation_flag=flag
+           if name == "comment": self.comment_flag=flag
+           if name == "all": 
+              self.comment_flag=flag
+              self.affectation_flag=flag
+
+    def readline(self):
+        self.line= self.texte.readline()
+        #print "line:",self.line
+        # option ?
+        self.getoptions()
+        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],self.lastrow, self.lastcol
+
+        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 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 :
+            #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 update_indent(self):
+        #print "update_indent",len(self.indent_list[-1]),len(self.buffer_indent)
+        if len(self.indent_list[-1]) > len(self.buffer_indent):
+           self.out=self.out+(len(self.indent_list[-1]) - len(self.buffer_indent))*" "
+           self.buffer_indent=self.indent_list[-1]
+
+    def do_indent(self):
+        #print "indentation dans do_indent",len(self.indent_list)
+
+        self.out=self.out+self.indent_list[-1]
+        self.buffer_indent=self.indent_list[-1]
+        if self.lastcol+len(self.indent_list[-1]) > self.thiscol:
+           self.lastcol=self.thiscol
+        else:
+           self.lastcol=self.lastcol+len(self.indent_list[-1])
+        self.please_indent = None
+
+    def flush_buffer(self):
+        #if self.buffer:
+        #   print len(self.indent_list),self.please_indent
+        for ob in self.buffer:
+           self.out= self.out+ str(ob)
+           self.do_indent()
+        self.buffer=[]
+        self.objet_courant=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.please_indent=1
+              self.affectation=0
+           else:
+              # affectation en cours, on ajoute
+              if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
+              self.affectation_courante.append_text(tstring)
+              return
+           
+        if self.objet_courant:
+           self.objet_courant=None
+           self.buffer.append(tstring)
+        #   self.please_indent = None
+           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
+              pass
+           elif self.paren_level > 0:
+              self.output(tstring)
+           elif self.comment_flag and not self.pattern_ligne_non_blanche.search(before):
+              # il s'agit d'une commande commentarisée
+              if self.objet_courant == None:
+                 if not self.buffer:self.buffer_indent=self.indent_list[-1]
+                 self.objet_courant=COMMANDE_COMMENTARISEE()
+                 self.buffer.append(self.objet_courant)
+                 self.objet_courant.append_text(tstring)
+                 self.please_indent = None
+              elif isinstance(self.objet_courant,COMMENTAIRE):
+                 self.objet_courant=COMMANDE_COMMENTARISEE()
+                 self.buffer.append(self.objet_courant)
+                 self.objet_courant.append_text(tstring)
+                 self.please_indent = None
+              else:
+                 self.objet_courant.append_text(tstring)
+                 self.please_indent = None
+           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
+              pass
+           elif self.paren_level > 0:
+              self.output(tstring)
+           elif self.comment_flag and not self.pattern_ligne_non_blanche.search(new_line):
+              # commentaire précédé de blancs
+              if self.objet_courant == None:
+                 if not self.buffer:self.buffer_indent=self.indent_list[-1]
+                 self.objet_courant=COMMENTAIRE()
+                 self.buffer.append(self.objet_courant)
+                 self.objet_courant.append_text(tstring)
+                 self.please_indent = None
+              elif isinstance(self.objet_courant,COMMANDE_COMMENTARISEE):
+                 self.objet_courant=COMMENTAIRE()
+                 self.buffer.append(self.objet_courant)
+                 self.objet_courant.append_text(tstring)
+                 self.please_indent = None
+              else:
+                 self.objet_courant.append_text(tstring)
+                 self.please_indent = None
+           else:
+              # commentaire inline
+              self.output(tstring)
+              self.please_indent = 1
+           return
+
+    def ERRORTOKEN(self, tstring):
+        print "ERRORTOKEN",tstring
+
+    def NAME(self, tstring):
+        if self.buffer:
+           self.update_indent()
+        self.flush_buffer()
+
+        if self.affectation ==1:
+           # on a une expression du type NAME=NAME
+           # 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
+           if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
+           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
+           if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
+           self.affectation_courante.append_text(tstring)
+           self.affectation=5
+           return
+        elif self.affectation == 2:
+           # affectation en cours, on ajoute
+           if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
+           self.affectation_courante.append_text(tstring)
+           self.affectation=2
+           return
+        self.affectation=0
+        self.name=None
+        if self.paren_level == 0 and self.affectation_flag: 
+           # si on est en dehors de parentheses et en mode transformation d'affectation
+           # on initialise l'attribut name qui indique une affectation en cours
+           self.name=tstring
+        self.output(tstring)
+
+    def ident(self, tstring):
+        self.flush_buffer()
+        self.affectation=0
+        self.output(tstring)
+
+    def NUMBER(self, tstring):
+        self.flush_buffer()
+        if self.affectation>=1:
+           # affectation en cours, on ajoute
+           if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
+           self.affectation_courante.append_text(tstring)
+           self.affectation=2
+           return
+        self.output(tstring)
+
+    def OP(self,tstring):
+        self.flush_buffer()
+        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 ==5:
+           # on a une expression qui commence par NAME=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.name=None
+           self.affectation=0
+        elif 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
+           if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
+           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.please_indent=1
+           self.affectation=0
+        elif self.affectation>=1:
+           # on complete l'affectation
+           if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
+           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):
+        #tstring=str(len(self.indent_list))*len(tstring)
+        self.indent_list.append(tstring) 
+        #print "indentation dans INDENT",len(self.indent_list),len(tstring)
+        self.affectation=0
+        if self.buffer:
+           self.update_indent()
+        self.flush_buffer()
+
+    def DEDENT(self, tstring):
+        #print "DEDENT",tstring,len(tstring)
+        if self.buffer:
+           self.out= self.out+ str(self.buffer[0])
+           if len(self.buffer) > 1:
+              for ob in self.buffer[1:]:
+                  self.do_indent()
+                  self.out= self.out+ str(ob)
+           self.buffer=[]
+           self.objet_courant=None
+           self.please_indent=1
+
+        self.affectation=0
+        self.indent_list = self.indent_list[:-1] 
+        #print "indentation dans DEDENT",len(self.indent_list)
+
+    def STRING(self, tstring):
+        self.flush_buffer()
+        if self.affectation>=1:
+           # affectation en cours, on ajoute
+           if self.thiscol > self.lastcol :self.affectation_courante.append_text((self.thiscol - self.lastcol)*" ")
+           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")
+
+
+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
+# parse: -affectation
+DS1=[None]*5
+DS2=[None]*5
+DS3=[None]*5
+DS4=[None]*5
+CHS1=[None]*5
+CHS2=[None]*5
+MO=AFFE_MODELE(  MAILLAGE=MA,
+          #test de validateur GEOM (typ=grma) avec grma derive de GEOM
+                 AFFE=(_F(GROUP_MA = ('LI1'),
+                          PHENOMENE = 'MECANIQUE',
+                          MODELISATION = 'DIS_TR'),
+                                ),
+                  INFO=2,);
+
+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 x==1:
+   print "coucou"
+elif x==2:
+   print "coucou"
+elif x==2:
+   print "coucou"
+elif x==2:
+   print "coucou"
+else:
+   print "coucou"
+# parse: +affectation
+ff=23 # parametre bidon
+
+# parse: -all
+a=45
+#commment1
+##toto = FORMULE(REEL='(REEL:A) = A',
+##               X=2
+##              );
+# parse: +all
+b=45
+#commment2
+##toto = FORMULE(REEL='(REEL:A) = A',
+##               X=2
+##              );
+# parse: -comment
+c=45
+#commment3
+##toto = FORMULE(REEL='(REEL:A) = A',
+##               X=2
+##              );
+# parse: +comment
+d=45
+#commment5
+##toto = FORMULE(REEL='(REEL:A) = A',
+##               X=2
+##              );
+p=sin(ff)
+
+e=toto(a=1)
+e=toto(a=1,b=3)
+e=toto(1,b=3)
+e=toto(a,b=3)
+e=toto()
+sensible=[2.1E11, 0.3,  1.E-6,   1.E-6,   ]
+
+n=len(sensible)
+# parse: -affectation
+
+PS=[None]*n
+
+for i in range(n):
+    PS[i]=DEFI_PARA_SENSI(VALE=sensible[i])
+# parse: +affectation
+
+TEST_RESU(RESU=(_F(RESULTAT   = U3L,
+                   INST       = 1.0,
+                   NOM_CHAM   = 'DEPL',
+                   GROUP_NO   = 'PPA',
+                   NOM_CMP    = 'DX',
+                   VALE       = 2.86E-5,
+                   PRECISION  = 5.E-2,
+                   REFERENCE  = 'AUTRE_ASTER',
+                   VERSION    = '7.1.11',
+                   ),
+                )
+       )#
+#
+FIN()
+#
+
+TEST_RESU(RESU=(_F(RESULTAT   = U3L,
+                   INST       = 1.0,
+                   NOM_CHAM   = 'DEPL',
+                   GROUP_NO   = 'PPA',
+                   NOM_CMP    = 'DX',
+                   VALE       = 2.86E-5,
+                   PRECISION  = 5.E-2,
+                   REFERENCE  = 'AUTRE_ASTER',
+                   VERSION    = '7.1.11',
+                   ),
+                )
+       ) #a
+
+titi = FORMULE(REEL='(REEL:A) = A',
+) # commentaire inline
+titi = FORMULE(REEL='(REEL:A) = A',
+ ) # commentaire inline
+
+def f(x):return x
+#comment
+def f(x):
+#comment
+  if a==1:print "coucou"
+  for i in range(10): s=0
+
+#com1
+#com2
+
+#com3
+a=1
+##commendcomm
+for k in range(1,10):
+
+   # Appel a GMSH pour le maillage
+
+   f=open("coque.geo","w")
+#comm
+   if a==1:
+
+                         #comm
+
+      for i in x:
+#comm
+##commendcomm
+#comm
+##commendcomm
+#comm
+        if x==3:
+#comm
+          r=1
+        if w==4:
+#comm
+
+           if k:
+
+#comm
+             if g:
+
+#comm
+
+               if t:
+                 a=5  
+#comm
+if 1:
+  a=2
+  b=3
+               # commenta
+else:
+  # commen
+  # commen
+  a=3
+           # qqqqqqqqqqqqqqqq
+  c=5
+
+b=5
+
+if 1:
+  a=2
+               # commenta
+else:
+  a=3
+if 1:
+  if 2:
+     if 3:
+       a=1
+     elif 4:
+       b=1
+     else:
+       c=5
+  elif 3:
+     x=1
+  else:
+     y=4
+elif 4:
+  s=1
+else:
+  t=9
+#com1
+#com2
+
+#com3
+a=1
+##commendcomm
+for k in range(1,10):
+
+   # Appel a GMSH pour le maillage
+
+   f=open("coque.geo","w")
+#comm
+   if 1: 
+      if 2:
+         if 3:
+            a=1
+      else:
+         a=6
+a=1
+##commendcomm
+for k in range(1,10):
+
+   # Appel a GMSH pour le maillage
+
+   f=open("coque.geo","w")
+#comm
+
+   if a==1:
+
+                         #comm
+
+      for i in x:
+#comm
+##commendcomm
+#comm
+##commendcomm
+#comm
+        if x==3:
+#comm
+          r=1
+
+   if 1:
+      if 2:
+         if 3:
+            a=1
+      else:
+         a=6
+
+if 1:
+   if 2:
+      if 3:
+         r=1
+         # comm
+   else:
+      x=7
+      toto(a=1,
+b=3)
+SUP_=dict([(grand,0.) for grand in grand_obs])
+
+for k in range(1,ns+1):
+   x=toto(a=1,b=2)
+#   comm
+   if 1:
+     #com
+
+     #com
+      x=1
+     #com
+
+     #com
+   ##com
+   elif 3:
+   ##com
+      x=1
+   else:
+      y=3
+
+def f():
+    return
+########################################################################
+
+########################################################################
+# macro commande de post-traitement (ex POST_GOUJ2E)
+# calcul des reactions cumulees suivant les filets
+
+def POST_GOUJ_ops(self,TABLE):
+  ier=0
+
+"""
+    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 2d607f3efcbc6efb7f8607fe718371bd3dff83e9..995984f72a2074026f6b7a22dff784232eb2aef1 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():
@@ -109,15 +109,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 3f5e420b8b5bded8ea57bbc243ef3bf0326e7b5a..c5bd30e4a9f54a75b21f29c0a9cd8bbd0edd1fbd 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,70 +496,13 @@ 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 + '),'
         if obj.nbrColonnes() :
            s=self.formatColonnes(obj.nbrColonnes(),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