From: eficas <> Date: Wed, 11 Jan 2006 17:35:31 +0000 (+0000) Subject: CCAR: ajout de tests elementaires et globaux dans Tests X-Git-Tag: merge_mars_06~14 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=1150d5b3bdeee2f7ecd7c55216c42b60e27866a7;p=tools%2Feficas.git CCAR: ajout de tests elementaires et globaux dans Tests Un test de construction de az.comm a ete cree ajout d'un objet application sans IHM pour les tests elementaires correction d'un bug dans comploader remplacement du parseur python par un autre parseur fonde sur tokenize.py correction d'un probleme dans la destruction des objets (methode supprime et include) amelioration de la prise en compte des parametres --- diff --git a/Accas/A_ASSD.py b/Accas/A_ASSD.py index 06e2566f..e8669988 100644 --- a/Accas/A_ASSD.py +++ b/Accas/A_ASSD.py @@ -44,7 +44,7 @@ class FONCTION(N_FONCTION.FONCTION,I_FONCTION.FONCTION,ASSD): N_FONCTION.FONCTION.__init__(self,etape=etape,sd=sd,reg=reg) I_FONCTION.FONCTION.__init__(self,etape=etape,sd=sd,reg=reg) -class formule(N_FONCTION.formule,I_FONCTION.formule,ASSD): +class formule(I_FONCTION.formule,N_FONCTION.formule,ASSD): def __init__(self,etape=None,sd=None,reg='oui'): N_FONCTION.formule.__init__(self,etape=etape,sd=sd,reg=reg) I_FONCTION.formule.__init__(self,etape=etape,sd=sd,reg=reg) diff --git a/Editeur/Objecttreeitem.py b/Editeur/Objecttreeitem.py index 6e7670f3..ae365327 100644 --- a/Editeur/Objecttreeitem.py +++ b/Editeur/Objecttreeitem.py @@ -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 diff --git a/Editeur/appli.py b/Editeur/appli.py index 83309694..0df69855 100644 --- a/Editeur/appli.py +++ b/Editeur/appli.py @@ -26,6 +26,7 @@ """ # Modules Python import os +import string import sys import types import Pmw @@ -40,6 +41,10 @@ from styles import style import fontes import tooltip import properties +import convert,generator +import comploader +from utils import extension_fichier,stripPath + from widgets import Fenetre from Misc import MakeNomComplet import session @@ -294,3 +299,114 @@ class APPLI: f.wait() +class valeur: + def __init__(self,v=None): + self.v=v + def set(self,v): + self.v=v + def get(self): + return self.v + +class STANDALONE(APPLI): + def __init__ (self,code=prefs.code,fichier=None,version='v8.2') : + self.code=code + self.top=None + self.format_fichier=valeur() + + self.dict_reels={} + self.liste_simp_reel=[] + # L'attribut test doit valoir 1 si on ne veut pas creer les fenetres + self.test=1 + + # Lecture des parametres de configuration (fichier global editeur.ini + # et utilisateur eficas.ini) + self.lecture_parametres() + + self.message='' + # Avant la creation du bureau qui lit le catalogue + self.version_code=version + import readercata + self.readercata=readercata.READERCATA(self,None) + + self.dir=None + + def affiche_infos(self,message): + return + + def get_text_JDC(self,JDC,format): + if generator.plugins.has_key(format): + # Le generateur existe on l'utilise + g=generator.plugins[format]() + jdc_formate=g.gener(JDC,format='beautifie') + return jdc_formate + else: + # Il n'existe pas c'est une erreur + return + + def newJDC(self): + CONTEXT.unset_current_step() + J=self.readercata.cata[0].JdC(procedure="", + appli=self, + cata=self.readercata.cata, + cata_ord_dico=self.readercata.cata_ordonne_dico, + rep_mat=self.CONFIGURATION.rep_mat, + ) + J.analyse() + return J + + def openJDC(self,file): + self.fileName = file + e=extension_fichier(file) + self.JDCName=stripPath(file) + self.initialdir = os.path.dirname(os.path.abspath(file)) + format=self.format_fichier.get() + # Il faut convertir le contenu du fichier en fonction du format + if convert.plugins.has_key(format): + # Le convertisseur existe on l'utilise + p=convert.plugins[format]() + p.readfile(file) + text=p.convert('exec',self) + # On se met dans le repertoire ou se trouve le fichier de commandes + # pour trouver les eventuels fichiers include ou autres + # localises a cote du fichier de commandes + os.chdir(self.initialdir) + CONTEXT.unset_current_step() + J=self.readercata.cata[0].JdC(procedure=text, + appli=self, + cata=self.readercata.cata, + cata_ord_dico=self.readercata.cata_ordonne_dico, + nom=self.JDCName, + rep_mat=self.CONFIGURATION.rep_mat, + ) + J.analyse() + return J + + def create_item(self,obj): + return comploader.make_objecttreeitem(self,getattr(obj,"nom","item"),obj) + + def get_file(self,unite=None,fic_origine = ''): + """ + Retourne le nom du fichier correspondant a l unite logique unite (entier) + ou d'un fichier poursuite + """ + f,ext=os.path.splitext(fic_origine) + if unite : + #include + finclude=f+".%d" % unite + else: + #poursuite + n=ext[-1] + if n == '0': + ext=".comm" + else: + ext=".com%d" % (string.atoi(n)-1) + if ext == '.com0' and not os.path.isfile(f+".com0"): + ext=".comm" + finclude=f+ext + ff=open(finclude) + text=ff.read() + ff.close() + return finclude,text + + def affiche_alerte(self,titre,message): + print titre+ "\n\n" + message diff --git a/Editeur/comploader.py b/Editeur/comploader.py index 1b9ddaa9..7a86c915 100644 --- a/Editeur/comploader.py +++ b/Editeur/comploader.py @@ -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 index 00000000..df539df0 --- /dev/null +++ b/Editeur/compobase.py @@ -0,0 +1,3 @@ +import Objecttreeitem +treeitem = Objecttreeitem.ObjectTreeItem +objet = None diff --git a/Editeur/compooper.py b/Editeur/compooper.py index 945bacee..f6c56171 100644 --- a/Editeur/compooper.py +++ b/Editeur/compooper.py @@ -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 diff --git a/Editeur/compoparam.py b/Editeur/compoparam.py index 64a1b15a..a96c2d32 100644 --- a/Editeur/compoparam.py +++ b/Editeur/compoparam.py @@ -216,7 +216,8 @@ class PARAMTreeItem(Objecttreeitem.ObjectTreeItem): """ Renomme le paramètre """ - self.object.set_attribut('nom',new_nom) + self.object.set_nom(new_nom) + #self.object.set_attribut('nom',new_nom) def get_fr(self): """ diff --git a/Extensions/jdc_include.py b/Extensions/jdc_include.py index deb6c558..e02f1dcc 100644 --- a/Extensions/jdc_include.py +++ b/Extensions/jdc_include.py @@ -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): """ diff --git a/Extensions/param2.py b/Extensions/param2.py index 74ac889c..61c6e3ae 100644 --- a/Extensions/param2.py +++ b/Extensions/param2.py @@ -1,5 +1,6 @@ from __future__ import division import math +import Numeric def mkf(value): if type(value) in (type(1), type(1L), type(1.5), type(1j),type("hh")): @@ -43,12 +44,12 @@ class Binop(Formula): self.values = mkf(value1), mkf(value2) def __str__(self): if self.op == '[]': - return "(%s[%s])" % (self.values[0], self.values[1]) + return "%s[%s]" % (self.values[0], self.values[1]) else: return "(%s %s %s)" % (self.values[0], self.op, self.values[1]) def __repr__(self): if self.op == '[]': - return "(%s[%s])" % (self.values[0], self.values[1]) + return "%s[%s]" % (self.values[0], self.values[1]) else: return "(%s %s %s)" % (self.values[0], self.op, self.values[1]) def eval(self): @@ -58,18 +59,53 @@ class Binop(Formula): result=result.eval() return result +original_cos=math.cos +original_sin=math.sin +original_ncos=Numeric.cos +original_nsin=Numeric.sin + class Unop(Formula): opmap = { '-': lambda x: -x, 'sin': lambda x: math.sin(x), - 'cos': lambda x: math.cos(x) } + 'cos': lambda x: original_cos(x) , + 'ncos': lambda x: original_ncos(x), + 'nsin': lambda x: original_nsin(x), + } def __init__(self, op, arg): self._op = op self._arg = mkf(arg) def __str__(self): return "%s(%s)" % (self._op, self._arg) + def __repr__(self): + return "%s(%s)" % (self._op, self._arg) def eval(self): return self.opmap[self._op](self._arg.eval()) +class Unop2(Unop): + def __init__(self, nom, op, arg): + self._nom = nom + self._op = op + self._arg=[] + for a in arg: + self._arg.append(mkf(a)) + def __str__(self): + s="%s(" % self._nom + for a in self._arg: + s=s+str(a)+',' + s=s+")" + return s + def __repr__(self): + s="%s(" % self._nom + for a in self._arg: + s=s+str(a)+',' + s=s+")" + return s + def eval(self): + l=[] + for a in self._arg: + l.append(a.eval()) + return self._op(*l) + class Constant(Formula): def __init__(self, value): self._value = value def eval(self): return self._value @@ -83,5 +119,11 @@ class Variable(Formula): def __repr__(self): return "Variable('%s',%s)" % (self._name, self._value) def __str__(self): return self._name +def cos(f): return Unop('ncos', f) +def sin(f): return Unop('nsin', f) +Numeric.cos=cos +Numeric.sin=sin def cos(f): return Unop('cos', f) def sin(f): return Unop('sin', f) +math.cos=cos +math.sin=sin diff --git a/Extensions/parametre.py b/Extensions/parametre.py index 28b6bd87..bb525091 100644 --- a/Extensions/parametre.py +++ b/Extensions/parametre.py @@ -29,6 +29,7 @@ # import de modules Python import string,types from math import * +import traceback # import de modules Eficas from Noyau.N_CR import CR @@ -48,23 +49,23 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) : idracine = 'param' def __init__(self,nom,valeur=None): - # parent ne peut être qu'un objet de type JDC - self.dict_valeur=[] - self.valeur = self.interprete_valeur(valeur) - self.val=valeur self.nom = nom # La classe PARAMETRE n'a pas de définition : on utilise self pour # complétude self.definition=self + # parent ne peut être qu'un objet de type JDC self.jdc = self.parent = CONTEXT.get_current_step() self.niveau=self.parent.niveau self.actif=1 self.state='undetermined' self.register() + self.dict_valeur=[] + self.valeur = self.interprete_valeur(valeur) + self.val=valeur - def __getitem__(self,key): - param_item=ITEM_PARAMETRE(self,key) - return param_item +# def __getitem__(self,key): +# param_item=ITEM_PARAMETRE(self,key) +# return param_item # def __neg__(self): # try: @@ -233,25 +234,37 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) : - une liste d'items d'un type qui précède Retourne la valeur interprétée """ - if not val : return None + #if not val : return None valeur = None # on vérifie si val est un entier - try : - valeur = string.atoi(val) # on a un entier - return valeur - except : - pass + #try : + # valeur = string.atoi(val) # on a un entier + # print "int",valeur + # return valeur + #except : + # traceback.print_exc() + # pass + #print val,valeur # on vérifie si val est un réel - try: - valeur = string.atof(val) # on a un réel - return valeur - except : - pass - # on vérifie si val est un tuple - try : - valeur = eval(val) - except: - pass + #try: + # valeur = string.atof(val) # on a un réel + # print "float",valeur + # return valeur + #except : + # traceback.print_exc() + # pass + #print val,valeur + + if type(val) == types.StringType: + # on tente l'evaluation (dans quel contexte ?) + if self.parent: + valeur=self.parent.eval_in_context(val,self) + else: + try : + valeur = eval(val) + except: + traceback.print_exc() + pass #PN je n ose pas modifier je rajoute if valeur != None : if type(valeur) == types.TupleType: @@ -274,12 +287,13 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) : # on a réussi à évaluer val en autre chose qu'un tuple ... #print "on a réussi à évaluer %s en autre chose qu'un tuple ..." %val #print 'on trouve : ',str(valeur),' de type : ',type(valeur) - # on retourne val comme une string car on n'a pas su l'interpréter if valeur != None : if type(valeur).__name__ == 'list': self.dict_valeur=[] for i in range(len(valeur)): - self.dict_valeur.append(valeur[i]) + self.dict_valeur.append(valeur[i]) + return valeur + # on retourne val comme une string car on n'a pas su l'interpréter return val def get_valeurs(self): @@ -298,6 +312,14 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) : self.valeur = self.interprete_valeur(new_valeur) self.init_modif() + def set_nom(self,new_nom): + """ + Change le nom du parametre + """ + self.init_modif() + self.nom=new_nom + self.fin_modif() + def init_modif(self): """ Méthode qui déclare l'objet courant comme modifié et propage @@ -361,6 +383,7 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) : self.parent = None self.jdc = None self.definition=None + self.niveau=None def active(self): """ @@ -413,7 +436,10 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) : """ Donne un echo de self sous la forme nom = valeur """ - return self.nom+' = '+str(self.valeur) + if type(self.valeur) == types.StringType: + return self.nom+' = '+ repr(self.valeur) + else: + return self.nom+' = '+ str(self.valeur) def __str__(self): """ @@ -477,7 +503,10 @@ class PARAMETRE(N_OBJECT.OBJECT,I_OBJECT.OBJECT,Formula) : pass def eval(self): - return self.valeur + if isinstance(self.valeur,Formula): + return self.valeur.eval() + else: + return self.valeur class COMBI_PARAMETRE : def __init__(self,chainevaleur,valeur): diff --git a/Ihm/I_ASSD.py b/Ihm/I_ASSD.py index 27742424..f7bd493e 100644 --- a/Ihm/I_ASSD.py +++ b/Ihm/I_ASSD.py @@ -22,3 +22,5 @@ class ASSD: def __repr__(self): return "concept %s de type %s" % (self.get_name(),self.__class__.__name__) + #def __del__(self): + # print "__del__",self diff --git a/Ihm/I_ETAPE.py b/Ihm/I_ETAPE.py index 6ad4ee81..eb3d20bf 100644 --- a/Ihm/I_ETAPE.py +++ b/Ihm/I_ETAPE.py @@ -38,6 +38,7 @@ from Noyau.N_Exception import AsException # Modules EFICAS import I_MCCOMPO import CONNECTOR +from Extensions import commande_comm class ETAPE(I_MCCOMPO.MCCOMPO): @@ -226,6 +227,7 @@ class ETAPE(I_MCCOMPO.MCCOMPO): """ if self.actif:return self.actif = 1 + self.init_modif() if self.sd : try: self.jdc.append_sdprod(self.sd) @@ -241,6 +243,7 @@ class ETAPE(I_MCCOMPO.MCCOMPO): et de la liste des sd """ self.actif = 0 + self.init_modif() if self.sd : self.jdc.del_sdprod(self.sd) self.jdc.delete_concept_after_etape(self,self.sd) @@ -395,6 +398,30 @@ class ETAPE(I_MCCOMPO.MCCOMPO): Realise l'update des blocs conditionnels fils de self """ self._update_condition_bloc() + + def get_objet_commentarise(self,format): + """ + Cette méthode retourne un objet commande commentarisée + representant la commande self + """ + import generator + g=generator.plugins[format]() + texte_commande = g.gener(self,format='beautifie') + # Il faut enlever la première ligne vide de texte_commande que + # rajoute le generator + rebut,texte_commande = string.split(texte_commande,'\n',1) + # on construit l'objet COMMANDE_COMM repésentatif de self mais non + # enregistré dans le jdc (pas ajouté dans jdc.etapes) + parent=self.parent + pos=self.parent.etapes.index(self) + commande_comment = commande_comm.COMMANDE_COMM(texte=texte_commande, + reg='non', + parent=parent) + self.parent.suppentite(self) + parent.addentite(commande_comment,pos) + + return commande_comment + #ATTENTION SURCHARGE: a garder en synchro ou a reintegrer dans le Noyau def Build_sd(self,nom): diff --git a/Ihm/I_FONCTION.py b/Ihm/I_FONCTION.py index 46bc19ab..04879d4f 100644 --- a/Ihm/I_FONCTION.py +++ b/Ihm/I_FONCTION.py @@ -18,6 +18,7 @@ # # # ====================================================================== +import string from I_ASSD import ASSD class FONCTION(ASSD): @@ -41,5 +42,27 @@ class FONCTION(ASSD): # modification de C Durand sur la gestion des formules dans le superviseur # On conserve l'ancienne classe fonction (ceinture et bretelles) class fonction(FONCTION) : pass -class formule(FONCTION) : pass + +from Extensions import param2 +class formule(FONCTION) : + def __call__(self,*val): + return param2.Unop2(self.nom,self.real_call,val) + + def real_call(self,*val): + if hasattr(self.parent,'contexte_fichier_init'): + context=self.parent.contexte_fichier_init + else : context={} + i=0 + for param in self.nompar : + context[param]=val[i] + i=i+1 + try : + res=eval(self.expression,self.jdc.const_context, context) + except : + print 75*'!' + print '! '+string.ljust('Erreur evaluation formule '+self.nom,72)+'!' + print 75*'!' + raise + return res + diff --git a/Ihm/I_FORM_ETAPE.py b/Ihm/I_FORM_ETAPE.py index 75cad81c..c7a035f2 100644 --- a/Ihm/I_FORM_ETAPE.py +++ b/Ihm/I_FORM_ETAPE.py @@ -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) diff --git a/Ihm/I_JDC.py b/Ihm/I_JDC.py index 7baa0353..17de72e2 100644 --- a/Ihm/I_JDC.py +++ b/Ihm/I_JDC.py @@ -696,6 +696,45 @@ class JDC(I_OBJECT.OBJECT): def changefichier(self,fichier): self.fin_modif() + def eval_in_context(self,valeur,etape): + """ Tente d'evaluer valeur dans le contexte courant de etape + Retourne le parametre valeur inchange si l'evaluation est impossible + """ + #contexte initial du jdc + context=self.condition_context.copy() + #contexte courant des concepts + context.update(self.get_contexte_avant(etape)) + #contexte des parametres + for e in self.etapes: + if e is etape:break + if not e.isactif():continue + e.update_context(context) + try : + objet = eval(valeur,context) + return objet + except: + pass + return valeur + +#ATTENTION SURCHARGE : cette methode doit etre gardée en synchronisation avec celle de Noyau + def supprime(self): + #print "supprime",self + Noyau.N_JDC.JDC.supprime(self) + # self.appli=None + # self.g_context={} + # self.const_context={} + # self.sds=[] + # self.sds_dict={} + # self.mc_globaux={} + # self.current_context={} + # self.condition_context={} + # self.etapes_niveaux=[] + # self.niveau=None + # self.params=[] + # self.fonctions=[] + # self._etape_context=None + # self.etapes=[] + #ATTENTION SURCHARGE : cette methode doit etre gardée en synchronisation avec celle de Noyau def register(self,etape): """ diff --git a/Ihm/I_MACRO_ETAPE.py b/Ihm/I_MACRO_ETAPE.py index 0ca98ea4..e351b006 100644 --- a/Ihm/I_MACRO_ETAPE.py +++ b/Ihm/I_MACRO_ETAPE.py @@ -90,6 +90,10 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): # de prendre cette precaution mais ce n'est pas vrai partout. old_recorded_units=self.recorded_units.copy() + # on supprime l'ancien jdc_aux s'il existe + if hasattr(self,'jdc_aux') and self.jdc_aux: + self.jdc_aux.supprime_aux() + if fichier is None:fichier="SansNom" j=self.JdC_aux( procedure=text, nom=fichier, appli=self.jdc.appli, @@ -132,6 +136,8 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): # On recupere le contexte de l'include verifie try: j_context=j.get_verif_contexte() + #print j_context.keys() + #print j.g_context.keys() except: # On retablit l'etape courante step CONTEXT.unset_current_step() @@ -491,7 +497,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): Cette méthode sert à créer un contexte en interprétant un texte source Python """ - #print "make_contexte_include" + #print "make_contexte_include",fichier # on récupère le contexte d'un nouveau jdc dans lequel on interprete text contexte = self.get_contexte_jdc(fichier,text) if contexte == None : @@ -676,6 +682,12 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): self.jdc_aux.supprime_aux() self.jdc_aux=None Noyau.N_MACRO_ETAPE.MACRO_ETAPE.supprime(self) + # self.contexte_fichier_init={} + # self.old_contexte_fichier_init={} + # self.g_context={} + # self.current_context={} + # self.etapes=[] + # self.mc_liste=[] #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro) def get_file(self,unite=None,fic_origine=''): @@ -758,6 +770,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): en interprétant un texte source Python Elle est appelee par la fonction sd_prd d'INCLUDE_MATERIAU """ + #print "make_contexte",fichier # On supprime l'attribut mat qui bloque l'evaluation du source de l'INCLUDE_MATERIAU # car on ne s'appuie pas sur lui dans EFICAS mais sur l'attribut fichier_ini if hasattr(self,'mat'):del self.mat diff --git a/Ihm/I_MCSIMP.py b/Ihm/I_MCSIMP.py index 7ed2b556..6dedfca2 100644 --- a/Ihm/I_MCSIMP.py +++ b/Ihm/I_MCSIMP.py @@ -313,6 +313,50 @@ class MCSIMP(I_OBJECT.OBJECT): if CONTEXT.debug : traceback.print_exc() return None,0 + def eval_val(self,new_valeur): + """ + Tente d'evaluer new_valeur comme un objet du jdc (par appel a eval_val_item) + ou comme une liste de ces memes objets + Si new_valeur contient au moins un separateur (,), tente l'evaluation sur + la chaine splittee + """ + if type(new_valeur) in (types.ListType,types.TupleType): + valeurretour=[] + for item in new_valeur : + valeurretour.append(self.eval_val_item(item)) + return valeurretour + else: + valeur=self.eval_val_item(new_valeur) + if valeur == new_valeur and new_valeur.find(',') > 0: + valeurretour=[] + for item in new_valeur.split(',') : + valeurretour.append(self.eval_val_item(item)) + return valeurretour + return valeur + + def eval_val_item(self,new_valeur): + """ + Tente d'evaluer new_valeur comme un concept, un parametre, un objet Python + Si c'est impossible retourne new_valeur inchange + argument new_valeur : string (nom de concept, de parametre, expression ou simple chaine) + """ + # concept ? + sd = self.jdc.get_sd_avant_etape(new_valeur,self.etape) + if sd : + return sd + # expression ou item parametre ? + d={} + # On veut EVAL avec tous ses comportements. On utilise Accas. Perfs ?? + d['EVAL']=Accas.EVAL + for p in self.jdc.params: + d[p.nom]=p + try : + objet = eval(new_valeur,d) + return objet + except: + pass + return new_valeur + def cherche_item_parametre (self,new_valeur): try: nomparam=new_valeur[0:new_valeur.find("[")] @@ -491,6 +535,12 @@ class MCSIMP(I_OBJECT.OBJECT): if self.jdc: self.jdc.mc_globaux[self.nom]=self + def nbrColonnes(self): + genea = self.get_genealogie() + if "VALE_C" in genea and "DEFI_FONCTION" in genea : return 3 + if "VALE" in genea and "DEFI_FONCTION" in genea : return 2 + return 0 + #-------------------------------------------------------------------------------- #ATTENTION SURCHARGE : toutes les methodes ci apres sont des surcharges du Noyau et de Validation @@ -534,7 +584,7 @@ class MCSIMP(I_OBJECT.OBJECT): verif_type=self.verif_type(val=v,cr=None) # cas des tuples avec un ITEM_PARAMETRE if verif_type == 0: - if type(v) == types.TupleType : + if type(v) in ( types.TupleType ,types.ListType): new_val=[] for i in v: if ((issubclass(i.__class__,param2.Formula)) or @@ -577,7 +627,8 @@ class MCSIMP(I_OBJECT.OBJECT): val.eval() return 1 except : - pass + traceback.print_exc() + pass return self.verif_type(val,cr) def verif_typeliste(self,val,cr='non') : @@ -585,4 +636,4 @@ class MCSIMP(I_OBJECT.OBJECT): for v in val : verif=verif+self.verif_typeihm(v,cr) return verif - + diff --git a/Tests/config.py b/Tests/config.py new file mode 100644 index 00000000..195b32e3 --- /dev/null +++ b/Tests/config.py @@ -0,0 +1,6 @@ + +import sys +sys.path.insert(0,"../Aster") +import prefs +ASTERDIR="/local/chris/ASTER/instals/STA8.2/astest" + diff --git a/Tests/run.py b/Tests/run.py index e1a5dce4..de323f1e 100644 --- a/Tests/run.py +++ b/Tests/run.py @@ -3,11 +3,12 @@ import sre import unittest from optparse import OptionParser -sys.path[:0]=[".."] +import config testMatch = sre.compile(r'^[Tt]est') class TestSuite(unittest.TestSuite): + ignore=[] loader = unittest.defaultTestLoader def __init__(self, names=[]): @@ -23,40 +24,54 @@ class TestSuite(unittest.TestSuite): mod = getattr(mod,comp) return mod + def importdir(self,rep,path): + init = os.path.abspath(os.path.join(path,'__init__.py')) + if os.path.isfile(init): + package=self._import(rep) + if package: + return TestPackageSuite(package) + else: + return TestDirectorySuite(path) + + def importfile(self,item,path): + root, ext = os.path.splitext(item) + if ext != '.py': + return + if root.find('/') >= 0: + dirname, file = os.path.split(path) + root, ext = os.path.splitext(file) + sys.path.insert(0,dirname) + mod=self._import(root) + sys.path.remove(dirname) + else: + mod=self._import(root) + return ModuleTestSuite(mod) + def collectTests(self): if self.names: entries=self.names else: entries = [ item for item in os.listdir(os.getcwd()) if item.lower().find('test') >= 0 ] + self.path=os.getcwd() + return self._collectTests(entries) + def _collectTests(self,entries): tests=[] for item in entries: - path=os.path.abspath(os.path.join(os.getcwd(),item)) - if os.path.isfile(item): - root, ext = os.path.splitext(item) - if ext == '.py': - if root.find('/') >= 0: - dirname, file = os.path.split(path) - root, ext = os.path.splitext(file) - sys.path.insert(0,dirname) - mod=self._import(root) - sys.path.remove(dirname) - else: - mod=self._import(root) - tests.append(ModuleTestSuite(mod)) - elif os.path.isdir(item): - init = os.path.abspath(os.path.join(item,'__init__.py')) - if os.path.isfile(init): - package=self._import(item) - if package: - tests.append(TestPackageSuite(package)) - else: - tests.append(TestDirectorySuite(path)) + if (item[0] == '.' + or item in self.ignore + or not testMatch.search(item)): + continue + path=os.path.abspath(os.path.join(self.path,item)) + if os.path.isfile(path): + t=self.importfile(item,path) + if t:tests.append(t) + elif os.path.isdir(path): + tests.append(self.importdir(item,path)) return tests class TestDirectorySuite(TestSuite): - ignore=[] def __init__(self,path): self.path=path super(TestDirectorySuite,self).__init__() @@ -67,33 +82,7 @@ class TestDirectorySuite(TestSuite): sys.path.insert(0,self.path) entries = os.listdir(self.path) entries.sort() - for item in entries: - if (item[0] == '.' - or item in self.ignore - or not testMatch.search(item)): - continue - item_path = os.path.abspath(os.path.join(self.path,item)) - if os.path.isfile(item_path): - root, ext = os.path.splitext(item) - if ext != '.py': - continue - if root.find('/') >= 0: - dirname, file = os.path.split(item_path) - root, ext = os.path.splitext(file) - sys.path.insert(0,dirname) - mod=self._import(root) - sys.path.remove(dirname) - else: - mod=self._import(root) - tests.append(ModuleTestSuite(mod)) - elif os.path.isdir(item_path): - init = os.path.abspath(os.path.join(item_path,'__init__.py')) - if os.path.isfile(init): - package=self._import(item) - if package: - tests.append(TestPackageSuite(package)) - else: - tests.append(TestDirectorySuite(item_path)) + tests=self._collectTests(entries) sys.path.remove(self.path) return tests @@ -103,37 +92,23 @@ class TestPackageSuite(TestDirectorySuite): path=os.path.abspath(os.path.dirname(self.package.__file__)) super(TestPackageSuite,self).__init__(path) - def collectTests(self): - tests=[] - if self.path: - sys.path.insert(0,self.path) - entries = os.listdir(self.path) - entries.sort() - for item in entries: - if (item[0] == '.' - or item in self.ignore - or not testMatch.search(item)): - continue - item_path = os.path.abspath(os.path.join(self.path,item)) - if os.path.isfile(item_path): - root, ext = os.path.splitext(item) - if ext != '.py': - continue - name="%s.%s" % (self.package.__name__,root) - mod=self._import(name) - tests.append(ModuleTestSuite(mod)) - elif os.path.isdir(item_path): - init = os.path.abspath(os.path.join(item_path,'__init__.py')) - if os.path.isfile(init): - name="%s.%s" % (self.package.__name__,item) - package=self._import(name) - if package: - tests.append(TestPackageSuite(package)) - else: - tests.append(TestDirectorySuite(item_path)) - sys.path.remove(self.path) - return tests - + def importdir(self,item,path): + init = os.path.abspath(os.path.join(path,'__init__.py')) + if os.path.isfile(init): + name="%s.%s" % (self.package.__name__,item) + package=self._import(name) + if package: + return TestPackageSuite(package) + else: + return TestDirectorySuite(path) + + def importfile(self,item,path): + root, ext = os.path.splitext(item) + if ext != '.py': + return + name="%s.%s" % (self.package.__name__,root) + mod=self._import(name) + return ModuleTestSuite(mod) class ModuleTestSuite(TestSuite): diff --git a/Tests/testcomm/a.11 b/Tests/testcomm/a.11 new file mode 100644 index 00000000..1723fcb9 --- /dev/null +++ b/Tests/testcomm/a.11 @@ -0,0 +1 @@ +MM=LIRE_MAILLAGE() diff --git a/Tests/testcomm/a.com0 b/Tests/testcomm/a.com0 new file mode 100644 index 00000000..04d1cc20 --- /dev/null +++ b/Tests/testcomm/a.com0 @@ -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 index 00000000..812f1bc0 --- /dev/null +++ b/Tests/testcomm/a.comm @@ -0,0 +1,3 @@ +DEBUT() +inf=1 +FIN() diff --git a/Tests/testcomm/aa.comm b/Tests/testcomm/aa.comm new file mode 100644 index 00000000..124141b4 --- /dev/null +++ b/Tests/testcomm/aa.comm @@ -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 index 00000000..478973df --- /dev/null +++ b/Tests/testcomm/b.comm @@ -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 index 00000000..e4dfab33 --- /dev/null +++ b/Tests/testcomm/c.comm @@ -0,0 +1,35 @@ +from Numeric import cos +DEBUT() +RAYCRA=1. +EPCRA=0.1 +S_CR=3.1415*(RAYCRA**2-(RAYCRA-EPCRA)**2) +T_CR=3.1415 +n=2 + +MA=LIRE_MAILLAGE( ) + +MO=AFFE_MODELE( MAILLAGE=MA, + AFFE=(_F(GROUP_MA = ('LI1'), + PHENOMENE = 'MECANIQUE', + MODELISATION = 'DIS_TR'), + ), + INFO=2,); + +carel=[0.]*78 + +CAREG=AFFE_CARA_ELEM(MODELE=MO, + DISCRET=_F(GROUP_MA=('LI1'), + CARA = 'K_TR_L', + VALE = carel, + REPERE='LOCAL' , ), + ORIENTATION=(_F(GROUP_MA=('LI1',), + CARA='VECT_Y', + VALE=(0.,0.,1.),),), + AFFE_FIBRE =( _F(GROUP_MA='CRAYON', COOR_AXE_POUTRE = (0.,0.,), CARA='SURFACE', VALE=( 0.,S_CR/4,)), + _F(GROUP_MA='CRAYON', COOR_AXE_POUTRE = (0.,0.,), CARA='SURFACE', VALE=( 0.,T_CR,)), + _F(GROUP_MA='CRAYON', COOR_AXE_POUTRE = (0.,sin(n*22.5*pi/180),), CARA='SURFACE', VALE=( 0.,T_CR/4,)), + _F(GROUP_MA='CRAYON', COOR_AXE_POUTRE = (0.,(cos(n*22.5*pi/180)),), CARA='SURFACE', VALE=( 0.,T_CR/4,)), + ), + ); + +FIN() diff --git a/Tests/testcomm/d.comm b/Tests/testcomm/d.comm new file mode 100644 index 00000000..06bd2405 --- /dev/null +++ b/Tests/testcomm/d.comm @@ -0,0 +1,4 @@ +DEBUT() +a=1 +MA=LIRE_MAILLAGE() +FIN() diff --git a/Tests/testcomm/efica01a.11 b/Tests/testcomm/efica01a.11 new file mode 100644 index 00000000..cda7b74f --- /dev/null +++ b/Tests/testcomm/efica01a.11 @@ -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 index 00000000..25134e98 --- /dev/null +++ b/Tests/testcomm/efica01a.com0 @@ -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 index 00000000..20eea866 --- /dev/null +++ b/Tests/testcomm/efica01a.comm @@ -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 index 00000000..cda7b74f --- /dev/null +++ b/Tests/testcomm/efica01b.11 @@ -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 index 00000000..20eea866 --- /dev/null +++ b/Tests/testcomm/efica01b.comm @@ -0,0 +1,275 @@ +# MODIF DATE 20/09/2004 AUTEUR DURAND C.DURAND +# TITRE TEST DE NON REGRESSION DE L IHM EFICAS - DERIVE DE SDND102A +# CONFIGURATION MANAGEMENT OF EDF VERSION +# ====================================================================== +# COPYRIGHT (C) 1991 - 2001 EDF R&D WWW.CODE-ASTER.ORG +# THIS PROGRAM IS FREE SOFTWARE YOU CAN REDISTRIBUTE IT AND/OR MODIFY +# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY +# THE FREE SOFTWARE FOUNDATION EITHER VERSION 2 OF THE LICENSE, OR +# (AT YOUR OPTION) ANY LATER VERSION. +# +# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT +# WITHOUT ANY WARRANTY WITHOUT EVEN THE IMPLIED WARRANTY OF +# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU +# GENERAL PUBLIC LICENSE FOR MORE DETAILS. +# +# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE +# ALONG WITH THIS PROGRAM IF NOT, WRITE TO EDF R&D CODE_ASTER, +# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE. +# ====================================================================== +# Ce cas test est gere en configuration dans la base ASTER, il sert de +# modele pour prononcer la recette de l IHM d EFICAS : l objectif est de +# pouvoir recreer ce test a l identique dans EFICAS a partir d une page +# blanche. +# On a donc essaye d y placer toutes les commandes un peu particulieres +# du langage de commandes d ASTER +# +# Il s agit en fait du test SDND102A auquel on a ajoute : +# la definition d un parametre (VAL) +# l inclusion d un fichier (INCLUDE) +# une poursuite (POURSUITE) +# Il contient ainsi : +# des parametres, des formules, des macros, des mots cles facteurs repetes +# (y compris conditionnes par des regles : calc_fonction / COMB), +# des blocs (mode_iter_simult,calc_char_seisme), un defi_valeur, un parametre. +# +# +# Il faudra y associer quelques recommandations pour la recette : +# - verifier qu en ouvrant le .com0, il demande bien a browser le .comm puis, en cascade, le .11 +# - verifier qu on peut bien supprimer une commande, un mot cle simple et facteur +# - verifier les acces a la doc +# +# + + +DEBUT(CODE=_F(NOM='EFICA01A',NIV_PUB_WEB='INTERNET',VISU_EFICAS='NON'),) + +MAILLAGE=LIRE_MAILLAGE() + +MAILLAGE=DEFI_GROUP(reuse=MAILLAGE, + MAILLAGE=MAILLAGE, + CREA_GROUP_NO=(_F(NOEUD='NO2', + NOM='MASSES',), + _F(NOEUD='NO1', + NOM='ENCASTRE',),),) + +MAILLA2=LIRE_MAILLAGE(UNITE=21,) + +MODELE=AFFE_MODELE(MAILLAGE=MAILLAGE, + AFFE=(_F(GROUP_MA='RESSORT', + PHENOMENE='MECANIQUE', + MODELISATION='DIS_T',), + _F(GROUP_NO='MASSES', + PHENOMENE='MECANIQUE', + MODELISATION='DIS_T',),),) + +BICHOC=AFFE_MODELE(MAILLAGE=MAILLA2, + AFFE=(_F(GROUP_MA='RESSORTS', + PHENOMENE='MECANIQUE', + MODELISATION='DIS_T',), + _F(GROUP_NO=('MASSES1','MASSES2',), + PHENOMENE='MECANIQUE', + MODELISATION='DIS_T',),),) +VAL = 98696.0 + + +CARA_ELE=AFFE_CARA_ELEM(MODELE=MODELE, + DISCRET=(_F(GROUP_MA='RESSORT', + REPERE='GLOBAL', + CARA='K_T_D_L', + VALE=(VAL,0.0,0.0,),), + _F(GROUP_NO='MASSES', + CARA='M_T_D_N', + VALE=25.0,),),) + +CARA_BIC=AFFE_CARA_ELEM(MODELE=BICHOC, + DISCRET=(_F(GROUP_MA='RESSORTS', + REPERE='GLOBAL', + CARA='K_T_D_L', + VALE=(VAL,0.0,0.0,),), + _F(GROUP_NO='MASSES1', + CARA='M_T_D_N', + VALE=25.0,), + _F(GROUP_NO='MASSES2', + CARA='M_T_D_N', + VALE=25.0,),),) + +CON_LIM=AFFE_CHAR_MECA(MODELE=MODELE, + DDL_IMPO=(_F(GROUP_NO='ENCASTRE', + DX=0.0, + DY=0.0, + DZ=0.0,), + _F(GROUP_NO='MASSES', + DY=0.0, + DZ=0.0,),),) + +CL_BICHO=AFFE_CHAR_MECA(MODELE=BICHOC, + DDL_IMPO=(_F(GROUP_NO='ENCBICHO', + DX=0.0, + DY=0.0, + DZ=0.0,), + _F(GROUP_NO=('MASSES1','MASSES2',), + DY=0.0, + DZ=0.0,),),) + +MACRO_MATR_ASSE(MODELE=MODELE, + CARA_ELEM=CARA_ELE, + CHARGE=CON_LIM, + NUME_DDL=CO('NUMEDDL'), + MATR_ASSE=(_F(MATRICE=CO('RIGIDITE'), + OPTION='RIGI_MECA',), + _F(MATRICE=CO('MASSE'), + OPTION='MASS_MECA',),),) + +MACRO_MATR_ASSE(MODELE=BICHOC, + CARA_ELEM=CARA_BIC, + CHARGE=CL_BICHO, + NUME_DDL=CO('NUMDDLC'), + MATR_ASSE=(_F(MATRICE=CO('RIGI_BIC'), + OPTION='RIGI_MECA',), + _F(MATRICE=CO('MASS_BIC'), + OPTION='MASS_MECA',),),) + +MODE_MEC=MODE_ITER_SIMULT(MATR_A=RIGIDITE, + MATR_B=MASSE,) + +MODE_MEC=NORM_MODE(reuse =MODE_MEC, + MODE=MODE_MEC, + NORME='MASS_GENE',) + +MODE_BIC=MODE_ITER_SIMULT(MATR_A=RIGI_BIC, + MATR_B=MASS_BIC, + METHODE='JACOBI', + OPTION='SANS', + CALC_FREQ=_F(OPTION='BANDE', + FREQ=(1.0,10.0,),),) + +MODE_BIC=NORM_MODE(reuse =MODE_BIC, + MODE=MODE_BIC, + NORME='MASS_GENE',) + +MODE_STA=MODE_STATIQUE(MATR_RIGI=RIGIDITE, + MATR_MASS=MASSE, + MODE_STAT=_F(TOUT='OUI', + AVEC_CMP='DX',),) + +MSTA_BIC=MODE_STATIQUE(MATR_RIGI=RIGI_BIC, + MATR_MASS=MASS_BIC, + MODE_STAT=_F(TOUT='OUI', + AVEC_CMP='DX',),) + +L_INST=DEFI_LIST_REEL(DEBUT=0.0, + INTERVALLE=_F(JUSQU_A=1.0, + PAS=1.E-4,),) + +OMEGAA=2.*pi*10. + +ACCE1 = FORMULE(VALE = 'sin(OMEGAA*INST)', + NOM_PARA='INST') + +ACCELER1=CALC_FONC_INTERP(FONCTION=ACCE1, + NOM_RESU='ACCE', + LIST_PARA=L_INST, + NOM_PARA = 'INST', + PROL_DROITE='LINEAIRE', + PROL_GAUCHE='LINEAIRE',) + +ACCE2 = FORMULE(VALE = '-sin(OMEGAA*INST)', + NOM_PARA='INST') + +ACCELER2=CALC_FONC_INTERP(FONCTION=ACCE2, + NOM_RESU='ACCE', + LIST_PARA=L_INST, + NOM_PARA = 'INST', + PROL_DROITE='LINEAIRE', + PROL_GAUCHE='LINEAIRE',) + +VITE1 = FORMULE(VALE = '-cos(OMEGAA*INST)/OMEGAA', + NOM_PARA='INST') + +VITESSE1=CALC_FONC_INTERP(FONCTION=VITE1, + NOM_RESU='VITE', + LIST_PARA=L_INST, + NOM_PARA = 'INST', + PROL_DROITE='LINEAIRE', + PROL_GAUCHE='LINEAIRE',) + +DEPL1 = FORMULE(VALE = '-sin(OMEGAA*INST)/(OMEGAA**2)', + NOM_PARA='INST') + +DEPLACE1=CALC_FONC_INTERP(FONCTION=DEPL1, + NOM_RESU='DEPL', + LIST_PARA=L_INST, + NOM_PARA = 'INST', + PROL_DROITE='LINEAIRE', + PROL_GAUCHE='LINEAIRE',) + +VITE2 = FORMULE(VALE = 'cos(OMEGAA*INST)/OMEGAA', + NOM_PARA='INST') + +VITESSE2=CALC_FONC_INTERP(FONCTION=VITE2, + NOM_RESU='VITE', + LIST_PARA=L_INST, + NOM_PARA = 'INST', + PROL_DROITE='LINEAIRE', + PROL_GAUCHE='LINEAIRE',) + +xx=2 + +INCLUDE(UNITE=11, + INFO=1,) + +MUR=DEFI_OBSTACLE(TYPE='PLAN_Z',) + +TRAN_GE1=DYNA_TRAN_MODAL(METHODE='EULER', + MASS_GENE=MASS_GEN, + RIGI_GENE=RIGI_GEN, + AMOR_REDUIT=0.07, + MODE_STAT=MODE_STA, + INCREMENT=_F(INST_INIT=0.0, + INST_FIN=1.0, + PAS=2.0E-4,), + ARCHIVAGE=_F(PAS_ARCH=8,), + EXCIT=_F(VECT_GENE=VECT_X, + ACCE=ACCELER1, + VITE=VITESSE1, + DEPL=DEPLACE1, + MULT_APPUI='OUI', + DIRECTION=(1.0,0.0,0.0,), + NOEUD='NO1',), + CHOC=_F(INTITULE='NO2/MUR', + GROUP_NO_1='MASSES', + OBSTACLE=MUR, + ORIG_OBST=(-1.0,0.0,0.0,), + NORM_OBST=(0.0,0.0,1.0,), + JEU=1.1005, + RIGI_NOR=5.76E7, + AMOR_NOR=0.0, + RIGI_TAN=0.0, + COULOMB=0.0,),) + +MULT_X1=CALC_CHAR_SEISME(MATR_MASS=MASS_BIC, + DIRECTION=(1.0,0.0,0.0,), + MODE_STAT=MSTA_BIC, + NOEUD='NO1',) + +MULT_X2=CALC_CHAR_SEISME(MATR_MASS=MASS_BIC, + DIRECTION=(1.0,0.0,0.0,), + MODE_STAT=MSTA_BIC, + NOEUD='NO11',) + +MACRO_PROJ_BASE(BASE=MODE_BIC, + MATR_ASSE_GENE=(_F(MATRICE=CO('MGEN_BIC'), + MATR_ASSE=MASS_BIC,), + _F(MATRICE=CO('RGEN_BIC'), + MATR_ASSE=RIGI_BIC,),), + VECT_ASSE_GENE=(_F(VECTEUR=CO('VECT_X1'), + VECT_ASSE=MULT_X1,), + _F(VECTEUR=CO('VECT_X2'), + VECT_ASSE=MULT_X2,),),) + +GRILLE=DEFI_OBSTACLE(TYPE='BI_PLAN_Z',) + +MAILLA3=LIRE_MAILLAGE(UNITE=22,) + +FIN() diff --git a/Tests/testcomm/incmat.comm b/Tests/testcomm/incmat.comm new file mode 100644 index 00000000..705a1cbd --- /dev/null +++ b/Tests/testcomm/incmat.comm @@ -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 index 00000000..8f61fd03 --- /dev/null +++ b/Tests/testcomm/parseur.comm @@ -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 index 00000000..b3c8f1d4 --- /dev/null +++ b/Tests/testcomm/testaster1.py @@ -0,0 +1,39 @@ +import os,glob,sys +import unittest + +from Editeur import appli + +from config import ASTERDIR + +class TestCase(unittest.TestCase): + app=None + def setUp(self): + if self.app == None: + self.app=appli.STANDALONE(version='v8.2') + pass + + def tearDown(self): + CONTEXT.unset_current_step() + + i=0 + for f in glob.glob(os.path.join(ASTERDIR,"[a-l]*.comm")): + ff=open(f) + text=ff.read() + ff.close() + if text.find("VISU_EFICAS") != -1:continue + for o in ('3','2','1','0','m'): + f=f[:-1]+o + if os.path.isfile(f):break + i=i+1 + exec """def test%s(self,file="%s"): + self.commtest(file) +""" % (i,f) + del i,f,ff,text,o + + def commtest(self,file): + """ Test generique""" + print file + j=self.app.openJDC(file=file) + assert j.isvalid(),j.report() + j.supprime() + assert sys.getrefcount(j) == 2,sys.getrefcount(j) diff --git a/Tests/testcomm/testaster10.py b/Tests/testcomm/testaster10.py new file mode 100644 index 00000000..850a651e --- /dev/null +++ b/Tests/testcomm/testaster10.py @@ -0,0 +1,42 @@ +import os,glob,sys +import unittest + +from Editeur import appli + +from config import ASTERDIR + +class TestCase(unittest.TestCase): + app=None + def setUp(self): + if self.app == None: + self.app=appli.STANDALONE(version='v8.2') + pass + + def tearDown(self): + CONTEXT.unset_current_step() + + i=0 + for f in glob.glob(os.path.join(ASTERDIR,"z*.comm")): + if f == os.path.join(ASTERDIR,"zzzz118c.comm"):continue + if f == os.path.join(ASTERDIR,"zzzz118d.comm"):continue + ff=open(f) + text=ff.read() + ff.close() + if text.find("VISU_EFICAS") != -1:continue + for o in ('3','2','1','0','m'): + f=f[:-1]+o + if os.path.isfile(f):break + i=i+1 + exec """def test%s(self,file="%s"): + self.commtest(file) +""" % (i,f) + del i,f,o,ff,text + + def commtest(self,file): + """ Test generique""" + print file + j=self.app.openJDC(file=file) + assert j.isvalid(),j.report() + j.supprime() + assert sys.getrefcount(j) == 2,sys.getrefcount(j) + diff --git a/Tests/testcomm/testaster2.py b/Tests/testcomm/testaster2.py new file mode 100644 index 00000000..97de2bee --- /dev/null +++ b/Tests/testcomm/testaster2.py @@ -0,0 +1,40 @@ +import os,glob,sys +import unittest + +from Editeur import appli + +from config import ASTERDIR + +class TestCase(unittest.TestCase): + app=None + def setUp(self): + if self.app == None: + self.app=appli.STANDALONE(version='v8.2') + pass + + def tearDown(self): + CONTEXT.unset_current_step() + + i=0 + for f in glob.glob(os.path.join(ASTERDIR,"[m-r]*.comm")): + ff=open(f) + text=ff.read() + ff.close() + if text.find("VISU_EFICAS") != -1:continue + for o in ('3','2','1','0','m'): + f=f[:-1]+o + if os.path.isfile(f):break + i=i+1 + exec """def test%s(self,file="%s"): + self.commtest(file) +""" % (i,f) + del i,f,o,ff,text + + def commtest(self,file): + """ Test generique""" + print file + j=self.app.openJDC(file=file) + assert j.isvalid(),j.report() + j.supprime() + assert sys.getrefcount(j) == 2,sys.getrefcount(j) + diff --git a/Tests/testcomm/testaster3.py b/Tests/testcomm/testaster3.py new file mode 100644 index 00000000..85d4d0d2 --- /dev/null +++ b/Tests/testcomm/testaster3.py @@ -0,0 +1,40 @@ +import os,glob,sys +import unittest + +from Editeur import appli + +from config import ASTERDIR + +class TestCase(unittest.TestCase): + app=None + def setUp(self): + if self.app == None: + self.app=appli.STANDALONE(version='v8.2') + pass + + def tearDown(self): + CONTEXT.unset_current_step() + + i=0 + for f in glob.glob(os.path.join(ASTERDIR,"s[a-d]*.comm")): + ff=open(f) + text=ff.read() + ff.close() + if text.find("VISU_EFICAS") != -1:continue + for o in ('3','2','1','0','m'): + f=f[:-1]+o + if os.path.isfile(f):break + i=i+1 + exec """def test%s(self,file="%s"): + self.commtest(file) +""" % (i,f) + del i,f,o,ff,text + + def commtest(self,file): + """ Test generique""" + print file + j=self.app.openJDC(file=file) + assert j.isvalid(),j.report() + j.supprime() + assert sys.getrefcount(j) == 2,sys.getrefcount(j) + diff --git a/Tests/testcomm/testaster4.py b/Tests/testcomm/testaster4.py new file mode 100644 index 00000000..66fcd829 --- /dev/null +++ b/Tests/testcomm/testaster4.py @@ -0,0 +1,40 @@ +import os,glob,sys +import unittest + +from Editeur import appli + +from config import ASTERDIR + +class TestCase(unittest.TestCase): + app=None + def setUp(self): + if self.app == None: + self.app=appli.STANDALONE(version='v8.2') + pass + + def tearDown(self): + CONTEXT.unset_current_step() + + i=0 + for f in glob.glob(os.path.join(ASTERDIR,"s[e-r]*.comm")): + ff=open(f) + text=ff.read() + ff.close() + if text.find("VISU_EFICAS") != -1:continue + for o in ('3','2','1','0','m'): + f=f[:-1]+o + if os.path.isfile(f):break + i=i+1 + exec """def test%s(self,file="%s"): + self.commtest(file) +""" % (i,f) + del i,f,o,ff,text + + def commtest(self,file): + """ Test generique""" + print file + j=self.app.openJDC(file=file) + assert j.isvalid(),j.report() + j.supprime() + assert sys.getrefcount(j) == 2,sys.getrefcount(j) + diff --git a/Tests/testcomm/testaster5.py b/Tests/testcomm/testaster5.py new file mode 100644 index 00000000..91d9917d --- /dev/null +++ b/Tests/testcomm/testaster5.py @@ -0,0 +1,40 @@ +import os,glob,sys +import unittest + +from Editeur import appli + +from config import ASTERDIR + +class TestCase(unittest.TestCase): + app=None + def setUp(self): + if self.app == None: + self.app=appli.STANDALONE(version='v8.2') + pass + + def tearDown(self): + CONTEXT.unset_current_step() + + i=0 + for f in glob.glob(os.path.join(ASTERDIR,"ssl[a-l]*.comm")): + ff=open(f) + text=ff.read() + ff.close() + if text.find("VISU_EFICAS") != -1:continue + for o in ('3','2','1','0','m'): + f=f[:-1]+o + if os.path.isfile(f):break + i=i+1 + exec """def test%s(self,file="%s"): + self.commtest(file) +""" % (i,f) + del i,f,o,ff,text + + def commtest(self,file): + """ Test generique""" + print file + j=self.app.openJDC(file=file) + assert j.isvalid(),j.report() + j.supprime() + assert sys.getrefcount(j) == 2,sys.getrefcount(j) + diff --git a/Tests/testcomm/testaster6.py b/Tests/testcomm/testaster6.py new file mode 100644 index 00000000..cb47f3a2 --- /dev/null +++ b/Tests/testcomm/testaster6.py @@ -0,0 +1,40 @@ +import os,glob,sys +import unittest + +from Editeur import appli + +from config import ASTERDIR + +class TestCase(unittest.TestCase): + app=None + def setUp(self): + if self.app == None: + self.app=appli.STANDALONE(version='v8.2') + pass + + def tearDown(self): + CONTEXT.unset_current_step() + + i=0 + for f in glob.glob(os.path.join(ASTERDIR,"ssl[m-z]*.comm")): + ff=open(f) + text=ff.read() + ff.close() + if text.find("VISU_EFICAS") != -1:continue + for o in ('3','2','1','0','m'): + f=f[:-1]+o + if os.path.isfile(f):break + i=i+1 + exec """def test%s(self,file="%s"): + self.commtest(file) +""" % (i,f) + del i,f,o,ff,text + + def commtest(self,file): + """ Test generique""" + print file + j=self.app.openJDC(file=file) + assert j.isvalid(),j.report() + j.supprime() + assert sys.getrefcount(j) == 2,sys.getrefcount(j) + diff --git a/Tests/testcomm/testaster7.py b/Tests/testcomm/testaster7.py new file mode 100644 index 00000000..5ade9873 --- /dev/null +++ b/Tests/testcomm/testaster7.py @@ -0,0 +1,40 @@ +import os,glob,sys +import unittest + +from Editeur import appli + +from config import ASTERDIR + +class TestCase(unittest.TestCase): + app=None + def setUp(self): + if self.app == None: + self.app=appli.STANDALONE(version='v8.2') + pass + + def tearDown(self): + CONTEXT.unset_current_step() + + i=0 + for f in glob.glob(os.path.join(ASTERDIR,"ss[m-z]*.comm")): + ff=open(f) + text=ff.read() + ff.close() + if text.find("VISU_EFICAS") != -1:continue + for o in ('3','2','1','0','m'): + f=f[:-1]+o + if os.path.isfile(f):break + i=i+1 + exec """def test%s(self,file="%s"): + self.commtest(file) +""" % (i,f) + del i,f,o,ff,text + + def commtest(self,file): + """ Test generique""" + print file + j=self.app.openJDC(file=file) + assert j.isvalid(),j.report() + j.supprime() + assert sys.getrefcount(j) == 2,sys.getrefcount(j) + diff --git a/Tests/testcomm/testaster8.py b/Tests/testcomm/testaster8.py new file mode 100644 index 00000000..91a04480 --- /dev/null +++ b/Tests/testcomm/testaster8.py @@ -0,0 +1,40 @@ +import os,glob,sys +import unittest + +from Editeur import appli + +from config import ASTERDIR + +class TestCase(unittest.TestCase): + app=None + def setUp(self): + if self.app == None: + self.app=appli.STANDALONE(version='v8.2') + pass + + def tearDown(self): + CONTEXT.unset_current_step() + + i=0 + for f in glob.glob(os.path.join(ASTERDIR,"s[t-z]*.comm")): + ff=open(f) + text=ff.read() + ff.close() + if text.find("VISU_EFICAS") != -1:continue + for o in ('3','2','1','0','m'): + f=f[:-1]+o + if os.path.isfile(f):break + i=i+1 + exec """def test%s(self,file="%s"): + self.commtest(file) +""" % (i,f) + del i,f,o,ff,text + + def commtest(self,file): + """ Test generique""" + print file + j=self.app.openJDC(file=file) + assert j.isvalid(),j.report() + j.supprime() + assert sys.getrefcount(j) == 2,sys.getrefcount(j) + diff --git a/Tests/testcomm/testaster9.py b/Tests/testcomm/testaster9.py new file mode 100644 index 00000000..60841bd2 --- /dev/null +++ b/Tests/testcomm/testaster9.py @@ -0,0 +1,40 @@ +import os,glob,sys +import unittest + +from Editeur import appli + +from config import ASTERDIR + +class TestCase(unittest.TestCase): + app=None + def setUp(self): + if self.app == None: + self.app=appli.STANDALONE(version='v8.2') + pass + + def tearDown(self): + CONTEXT.unset_current_step() + + i=0 + for f in glob.glob(os.path.join(ASTERDIR,"[t-y]*.comm")): + ff=open(f) + text=ff.read() + ff.close() + if text.find("VISU_EFICAS") != -1:continue + for o in ('3','2','1','0','m'): + f=f[:-1]+o + if os.path.isfile(f):break + i=i+1 + exec """def test%s(self,file="%s"): + self.commtest(file) +""" % (i,f) + del i,f,o,ff,text + + def commtest(self,file): + """ Test generique""" + print file + j=self.app.openJDC(file=file) + assert j.isvalid(),j.report() + j.supprime() + assert sys.getrefcount(j) == 2,sys.getrefcount(j) + diff --git a/Tests/testcomm/testcomm.py b/Tests/testcomm/testcomm.py new file mode 100644 index 00000000..9622ffb2 --- /dev/null +++ b/Tests/testcomm/testcomm.py @@ -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 index 00000000..62077618 --- /dev/null +++ b/Tests/testcomm/titi.comm @@ -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 index 00000000..188fe70b --- /dev/null +++ b/Tests/testelem/az.comm @@ -0,0 +1,106 @@ + + +DEBUT(); +P1 = 9.8; + +P2 = 8.8; + +P3 = 7; + +P5 = (P3 * P1); + +P6 = (P1 - 3); + +P4 = [2, 3, 4]; + +#Pas trouve shellpanel + +MAILLA2=LIRE_MAILLAGE(UNITE=P4[1],); + +aaa = FORMULE(VALE='a+z', + NOM_PARA=('a','z',),); + +MAIL=LIRE_MAILLAGE(UNITE=P3,); +# 'LIRE_MAILLAGE', 'UNITE' --> uniquebasepanel + +az = FORMULE(VALE='aaaaa', + NOM_PARA=('ae','inst',),); + +AFFE1=AFFE_MODELE(MAILLAGE=MAIL, + AFFE=(_F(GROUP_MA=('RESSORT','eee',), + PHENOMENE='MECANIQUE', + MODELISATION='DIS_T',), + _F(GROUP_MA='MASSES', + PHENOMENE='MECANIQUE', + MODELISATION='DIS_T',), + _F(GROUP_NO=('GNP3','GNP5','GNP6','GNP7','GNP8','GNP9','GNP10','GNP11','GNP12',), + PHENOMENE='ACOUSTIQUE', + MODELISATION='PLAN',),),); + +MOD=AFFE_MODELE(MAILLAGE=MAIL, + AFFE=(_F(GROUP_MA='RESSORT', + PHENOMENE='MECANIQUE', + MODELISATION='DIS_T',), + _F(GROUP_MA='MASSES', + PHENOMENE='MECANIQUE', + MODELISATION='DIS_T',), + _F(TOUT='OUI', + PHENOMENE='THERMIQUE', + MODELISATION='COQUE',),),); + +CARA=AFFE_CARA_ELEM(MODELE=MOD, + POUTRE=_F(GROUP_MA='MA', + SECTION='CERCLE', + CARA='R', + VALE=(3.0,P6,),),); +# 'AFFE_MODELE', 'MAILLAGE' --> uniqueassdpanel +# AFFE_MODELE', 'AFFE', 'GROUP_MA' --> plusieursbasepanel +# 'AFFE_MODELE', 'AFFE', 'PHENOMENE' --> uniqueintopanel +# 'AFFE_MODELE', 'AFFE', 'b_mecanique'--> plusieursintopanel + +F1=DEFI_FONCTION(NOM_PARA='DX', + VALE=(5.0,3.0,P4[1],P3,),); + +F3=DEFI_FONCTION(NOM_PARA='DRX', + VALE_C=(5.0,7.0,9.0,9.0,8.0,7.0,),); +# 'DEFI_FONCTION', 'VALE' --> fonctionpanel + +MATER2=DEFI_MATERIAU(ELAS=_F(E=100000000000.0, + NU=0.0,), + ECRO_ASYM_LINE=_F(DC_SIGM_EPSI=0.0, + SY_C=200000000.0, + DT_SIGM_EPSI=0.0, + SY_T=50000000.0,),); + +PS1=DEFI_PARA_SENSI(VALE=1.0,); + +PS2=DEFI_PARA_SENSI(VALE=1.0,); + +PS3=DEFI_PARA_SENSI(VALE=1.0,); + +CHMAT2=AFFE_MATERIAU(MAILLAGE=MAIL, + AFFE=_F(TOUT='OUI', + MATER=MATER2,),); + +AAAZ=AFFE_CHAR_THER(MODELE=AFFE1, + TEMP_IMPO=_F(TOUT='OUI', + TEMP=0.0,),); + +TH1=THER_LINEAIRE(MODELE=AFFE1, + CHAM_MATER=CHMAT2, + EXCIT=_F(CHARGE=AAAZ,), + SENSIBILITE=(PS1,PS2,),); +# 'THER_LINEAIRE', 'SENSIBILITE' --> plusieursassdpanel + +ACA1=AFFE_CHAR_ACOU(MODELE=AFFE1, + PRES_IMPO=_F(TOUT='OUI', + PRES=('RI',3.0,3.0,),),); +# 'AFFE_CHAR_ACOU', 'PRES_IMPO', 'PRES' --> uniquecomppanel + +MACRO_MATR_ASSE(MODELE=AFFE1, + NUME_DDL=CO('DDL1'), + MATR_ASSE=_F(MATRICE=CO('MAT1'), + OPTION='RIGI_THER',),); +# 'MACRO_MATR_ASSE', 'MATR_ASSE', 'MATRICE' --> uniquesdcopanel + +FIN(); diff --git a/Tests/testelem/testitem1.py b/Tests/testelem/testitem1.py new file mode 100644 index 00000000..bfe1a5e9 --- /dev/null +++ b/Tests/testelem/testitem1.py @@ -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 index 00000000..d904bb65 --- /dev/null +++ b/Tests/testelem/testjdc1.py @@ -0,0 +1,356 @@ +import os +import unittest +import difflib + +import prefs +from Editeur import appli + +def add_param(j,pos,nom,valeur): + co=j.addentite("PARAMETRE",pos) + co.set_nom(nom) + co.set_valeur(valeur) + return co + +def add_mcsimp(obj,nom,valeur): + mcs=obj.get_child(nom,restreint='oui') + if mcs is None: + pos=obj.get_index_child(nom) + mcs=obj.addentite(nom,pos) + mcs.set_valeur(mcs.eval_val(valeur)) + return mcs + +def cdiff(text1,text2): + return " ".join(difflib.context_diff(text1.splitlines(1),text2.splitlines(1))) + +class TestCase(unittest.TestCase): + def setUp(self): + pass + + def tearDown(self): + CONTEXT.unset_current_step() + + def test001(self): + """ Test d'insertion de commandes dans fichier toto.comm""" + app=appli.STANDALONE(version='v8.2') + file=os.path.join(prefs.INSTALLDIR,"Tests/testelem/toto.comm") + j=app.openJDC(file=file) + expected="""DEBUT CR validation : toto.comm +FIN CR validation :toto.comm +""" + cr=str(j.report()) + assert cr == expected, cr + "!=" + expected + co=j.etapes[1] + mcs=co.addentite("INFO") + + cr=app.get_text_JDC(j,'python') + expected=""" + +DEBUT(); + +MA=LIRE_MAILLAGE(INFO=1,); + +FIN(); +""" + assert cr == expected, cr + "!=" + expected + co=j.addentite("LIRE_MAILLAGE",2) + test,mess=co.nomme_sd("MA2") + assert test == 1 + + cr=app.get_text_JDC(j,'python') + expected=""" + +DEBUT(); + +MA=LIRE_MAILLAGE(INFO=1,); + +MA2=LIRE_MAILLAGE(); + +FIN(); +""" + assert cr == expected, cr + "!=" + expected + + def test002(self): + """ Test de construction du fichier de commandes az.comm de zero""" + + app=appli.STANDALONE(version='v8.2') + j=app.newJDC() +# commande DEBUT + co=j.addentite("DEBUT",0) +# commande FIN + co=j.addentite("FIN",1) +# parametres + pos=0 + pos=pos+1 + co=add_param(j,pos,"P1","9.8") + pos=pos+1 + co=add_param(j,pos,"P2","8.8") + pos=pos+1 + co=add_param(j,pos,"P3","7") + pos=pos+1 + co=add_param(j,pos,"P5","P3*P1") + pos=pos+1 + co=add_param(j,pos,"P6","P1-3") + pos=pos+1 + co=add_param(j,pos,"P4","[2,3,4]") +# commentaire + pos=pos+1 + co=j.addentite("COMMENTAIRE",pos) + co.set_valeur("Pas trouve shellpanel") +# commande LIRE_MAILLAGE + pos=pos+1 + co=j.addentite("LIRE_MAILLAGE",pos) + test,mess=co.nomme_sd("MAILLA2") + mcs=co.addentite("UNITE") + valeur=mcs.eval_val("P4[1]") + test=mcs.set_valeur(valeur) +# formule + pos=pos+1 + co=j.addentite("FORMULE",pos) + co.update_formule_python(("aaa","REEL","a+z","(a,z)")) +# commande LIRE_MAILLAGE + pos=pos+1 + ma=co=j.addentite("LIRE_MAILLAGE",pos) + test,mess=co.nomme_sd("MAIL") + mcs=co.addentite("UNITE") + valeur,validite=mcs.eval_valeur("P3") + test=mcs.set_valeur(valeur) +# + pos=pos+1 + co=j.addentite("COMMENTAIRE",pos) + co.set_valeur(" 'LIRE_MAILLAGE', 'UNITE' --> uniquebasepanel") +# formule + pos=pos+1 + co=j.addentite("FORMULE",pos) + co.update_formule_python(("az","REEL","aaaaa","(ae,inst)")) +# commande AFFE_MODELE + pos=pos+1 + co=j.addentite("AFFE_MODELE",pos) + mcs=co.get_child("MAILLAGE") + valeur,validite=mcs.eval_valeur("MAIL") + assert valeur == ma.sd + test=mcs.set_valeur(valeur) + assert valeur == co["MAILLAGE"] + mcf=co.addentite("AFFE") + mcs=mcf[0].get_child("PHENOMENE") + valeur=mcs.eval_val_item('MECANIQUE') + assert valeur=='MECANIQUE',str(valeur) + test=mcs.set_valeur(valeur) + assert mcf["PHENOMENE"] == 'MECANIQUE' + mcs=mcf[0].get_child("b_mecanique").get_child("MODELISATION") + mcs.set_valeur(mcs.eval_val_item('DIS_T')) + assert mcf["MODELISATION"] == 'DIS_T' + mcs=add_mcsimp(mcf[0],"GROUP_MA",('RESSORT','eee',)) + + mcf=co.addentite("AFFE") + mcs=mcf[1].get_child("PHENOMENE") + mcs.set_valeur(mcs.eval_val_item('MECANIQUE')) + mcs=mcf[1].get_child("b_mecanique").get_child("MODELISATION") + mcs.set_valeur(mcs.eval_val_item('DIS_T')) + mcs=add_mcsimp(mcf[1],"GROUP_MA",'MASSES') + + mcf=co.addentite("AFFE") + mcs=mcf[2].get_child("PHENOMENE") + mcs.set_valeur(mcs.eval_val_item('ACOUSTIQUE')) + mcs=mcf[2].get_child("b_acoustique").get_child("MODELISATION") + mcs.set_valeur(mcs.eval_val_item('PLAN')) + mcs=add_mcsimp(mcf[2],"GROUP_NO",'GNP3,GNP5,GNP6,GNP7,GNP8,GNP9,GNP10,GNP11,GNP12') + + co.nomme_sd("AFFE1") +# commande AFFE_MODELE + pos=pos+1 + co=j.addentite("AFFE_MODELE",pos) + mcs=co.get_child("MAILLAGE") + mcs.set_valeur(mcs.eval_val("MAIL")) + + mcf=co.addentite("AFFE") + mcs=mcf[0].get_child("PHENOMENE") + valeur=mcs.eval_val_item('MECANIQUE') + test=mcs.set_valeur(valeur) + mcs=mcf[0].get_child("b_mecanique").get_child("MODELISATION") + mcs.set_valeur(mcs.eval_val_item('DIS_T')) + mcs=add_mcsimp(mcf[0],"GROUP_MA",'RESSORT') + + mcf=co.addentite("AFFE") + mcs=mcf[1].get_child("PHENOMENE") + mcs.set_valeur(mcs.eval_val_item('MECANIQUE')) + mcs=mcf[1].get_child("b_mecanique").get_child("MODELISATION") + mcs.set_valeur(mcs.eval_val_item('DIS_T')) + mcs=add_mcsimp(mcf[1],"GROUP_MA",'MASSES') + + mcf=co.addentite("AFFE") + mcs=mcf[2].get_child("PHENOMENE") + mcs.set_valeur(mcs.eval_val_item('THERMIQUE')) + mcs=mcf[2].get_child("b_thermique").get_child("MODELISATION") + mcs.set_valeur(mcs.eval_val_item('COQUE')) + mcs=add_mcsimp(mcf[2],"TOUT",'OUI') + + co.nomme_sd("MOD") +#CARA=AFFE_CARA_ELEM(MODELE=MOD, +# POUTRE=_F(GROUP_MA='MA', +# SECTION='CERCLE', +# CARA='R', +# VALE=(3.0,P6,),),); + pos=pos+1 + co=j.addentite("AFFE_CARA_ELEM",pos) + mcs=co.get_child("MODELE") + mcs.set_valeur(mcs.eval_val("MOD")) + mcf=co.addentite("POUTRE") + mcs=mcf[0].get_child("SECTION") + mcs.set_valeur(mcs.eval_val('CERCLE')) + assert mcf[0]["SECTION"] == 'CERCLE' + mcs=add_mcsimp(mcf[0],"GROUP_MA",'MA') + mcs=mcf[0].get_child("b_cercle").get_child("b_constant").get_child("CARA") + mcs.set_valeur(mcs.eval_val('R')) + mcs=mcf[0].get_child("b_cercle").get_child("b_constant").get_child("VALE") + mcs.set_valeur(mcs.eval_val('3.0,P6')) + co.nomme_sd("CARA") +# commentaire + pos=pos+1 + co=j.addentite("COMMENTAIRE",pos) + text=""" 'AFFE_MODELE', 'MAILLAGE' --> uniqueassdpanel + AFFE_MODELE', 'AFFE', 'GROUP_MA' --> plusieursbasepanel + 'AFFE_MODELE', 'AFFE', 'PHENOMENE' --> uniqueintopanel + 'AFFE_MODELE', 'AFFE', 'b_mecanique'--> plusieursintopanel""" + co.set_valeur(text) +#F1=DEFI_FONCTION(NOM_PARA='DX', +# VALE=(5.0,3.0,P4[1],P3,),); + pos=pos+1 + co=j.addentite("DEFI_FONCTION",pos) + mcs=co.get_child("NOM_PARA") + mcs.set_valeur(mcs.eval_val("DX")) + mcs=co.addentite("VALE") + mcs.set_valeur(mcs.eval_val("5.0,3.0,P4[1],P3")) + co.nomme_sd("F1") +#F3=DEFI_FONCTION(NOM_PARA='DRX', +# VALE_C=(5.0,7.0,9.0,9.0,8.0,7.0,),); + pos=pos+1 + co=j.addentite("DEFI_FONCTION",pos) + mcs=co.get_child("NOM_PARA") + mcs.set_valeur(mcs.eval_val("DRX")) + mcs=co.addentite("VALE_C") + mcs.set_valeur(mcs.eval_val("5.0,7.0,9.0,9.0,8.0,7.0")) + co.nomme_sd("F3") +# commentaire + pos=pos+1 + co=j.addentite("COMMENTAIRE",pos) + co.set_valeur(" 'DEFI_FONCTION', 'VALE' --> fonctionpanel ") +#MATER2=DEFI_MATERIAU(ELAS=_F(E=100000000000.0, +# NU=0.0,), +# ECRO_ASYM_LINE=_F(DC_SIGM_EPSI=0.0, +# SY_C=200000000.0, +# DT_SIGM_EPSI=0.0, +# SY_T=50000000.0,),); + pos=pos+1 + co=j.addentite("DEFI_MATERIAU",pos) + mcf=co.addentite("ELAS") + mcs=mcf[0].get_child("E") + mcs.set_valeur(mcs.eval_val("100000000000.0")) + mcs=mcf[0].get_child("NU") + mcs.set_valeur(mcs.eval_val("0.0")) + mcf=co.addentite("ECRO_ASYM_LINE") + mcs=mcf[0].get_child("DC_SIGM_EPSI") + mcs.set_valeur(mcs.eval_val("0.0")) + mcs=mcf[0].get_child("DT_SIGM_EPSI") + mcs.set_valeur(mcs.eval_val("0.0")) + mcs=mcf[0].get_child("SY_C") + mcs.set_valeur(mcs.eval_val("200000000.0")) + mcs=mcf[0].get_child("SY_T") + mcs.set_valeur(mcs.eval_val("50000000.0")) + co.nomme_sd("MATER2") +#PS1=DEFI_PARA_SENSI(VALE=1.0,); +#PS2=DEFI_PARA_SENSI(VALE=1.0,); +#PS3=DEFI_PARA_SENSI(VALE=1.0,); + pos=pos+1 + co=j.addentite("DEFI_PARA_SENSI",pos) + mcs=co.get_child("VALE") + mcs.set_valeur(mcs.eval_val("1.0")) + co.nomme_sd("PS1") + pos=pos+1 + co=j.addentite("DEFI_PARA_SENSI",pos) + mcs=co.get_child("VALE") + mcs.set_valeur(mcs.eval_val("1.0")) + co.nomme_sd("PS2") + pos=pos+1 + co=j.addentite("DEFI_PARA_SENSI",pos) + mcs=co.get_child("VALE") + mcs.set_valeur(mcs.eval_val("1.0")) + co.nomme_sd("PS3") +#CHMAT2=AFFE_MATERIAU(MAILLAGE=MAIL, +# AFFE=_F(TOUT='OUI', +# MATER=MATER2,),); + pos=pos+1 + co=j.addentite("AFFE_MATERIAU",pos) + add_mcsimp(co,"MAILLAGE","MAIL") + mcf=co.get_child("AFFE") + add_mcsimp(mcf[0],"TOUT","OUI") + add_mcsimp(mcf[0],"MATER","MATER2") + co.nomme_sd("CHMAT2") +#AAAZ=AFFE_CHAR_THER(MODELE=AFFE1, +# TEMP_IMPO=_F(TOUT='OUI', +# TEMP=0.0,),); + pos=pos+1 + co=j.addentite("AFFE_CHAR_THER",pos) + add_mcsimp(co,"MODELE","AFFE1") + mcf=co.addentite("TEMP_IMPO") + add_mcsimp(mcf[0],"TOUT","OUI") + add_mcsimp(mcf[0],"TEMP","0.0") + co.nomme_sd("AAAZ") +#TH1=THER_LINEAIRE(MODELE=AFFE1, +# CHAM_MATER=CHMAT2, +# EXCIT=_F(CHARGE=AAAZ,), +# SENSIBILITE=(PS1,PS2,),); + pos=pos+1 + co=j.addentite("THER_LINEAIRE",pos) + add_mcsimp(co,"MODELE","AFFE1") + add_mcsimp(co,"CHAM_MATER","CHMAT2") + mcf=co.get_child("EXCIT") + add_mcsimp(mcf[0],"CHARGE","AAAZ") + add_mcsimp(co,"SENSIBILITE","PS1,PS2") + co.nomme_sd("TH1") +# commentaire + pos=pos+1 + co=j.addentite("COMMENTAIRE",pos) + co.set_valeur(" 'THER_LINEAIRE', 'SENSIBILITE' --> plusieursassdpanel") +#ACA1=AFFE_CHAR_ACOU(MODELE=AFFE1, +# PRES_IMPO=_F(TOUT='OUI', +# PRES=('RI',3.0,3.0,),),); + pos=pos+1 + co=j.addentite("AFFE_CHAR_ACOU",pos) + add_mcsimp(co,"MODELE","AFFE1") + mcf=co.addentite("PRES_IMPO") + add_mcsimp(mcf[0],"TOUT","OUI") + add_mcsimp(mcf[0],"PRES","'RI',3.0,3.0") + co.nomme_sd("ACA1") +# commentaire + pos=pos+1 + co=j.addentite("COMMENTAIRE",pos) + co.set_valeur(" 'AFFE_CHAR_ACOU', 'PRES_IMPO', 'PRES' --> uniquecomppanel") + +# 'AFFE_CHAR_ACOU', 'PRES_IMPO', 'PRES' --> uniquecomppanel + +#MACRO_MATR_ASSE(MODELE=AFFE1, +# NUME_DDL=CO('DDL1'), +# MATR_ASSE=_F(MATRICE=CO('MAT1'), +# OPTION='RIGI_THER',),); + pos=pos+1 + co=j.addentite("MACRO_MATR_ASSE",pos) + add_mcsimp(co,"MODELE","AFFE1") + mcs=co.get_child("NUME_DDL") + mcs.set_valeur_co('DDL1') + mcf=co.get_child("MATR_ASSE") + mcs=mcf[0].get_child("MATRICE") + mcs.set_valeur_co('MAT1') + add_mcsimp(mcf[0],"OPTION","RIGI_THER") +# commentaire + pos=pos+1 + co=j.addentite("COMMENTAIRE",pos) + co.set_valeur(" 'MACRO_MATR_ASSE', 'MATR_ASSE', 'MATRICE' --> uniquesdcopanel") + + assert j.isvalid() + + text1=app.get_text_JDC(j,'python') + file=os.path.join(prefs.INSTALLDIR,"Tests/testelem/az.comm") + f=open(file) + text2=f.read() + f.close() + assert text1 == text2 , cdiff(text1,text2) diff --git a/Tests/testelem/testjdc3.py b/Tests/testelem/testjdc3.py new file mode 100644 index 00000000..8c980e8e --- /dev/null +++ b/Tests/testelem/testjdc3.py @@ -0,0 +1,54 @@ +import os +import unittest +import difflib + +import prefs +from Editeur import appli + +def add_param(j,pos,nom,valeur): + co=j.addentite("PARAMETRE",pos) + co.set_nom(nom) + co.set_valeur(valeur) + return co + +def add_mcsimp(obj,nom,valeur): + mcs=obj.get_child(nom,restreint='oui') + if mcs is None: + pos=obj.get_index_child(nom) + mcs=obj.addentite(nom,pos) + mcs.set_valeur(mcs.eval_val(valeur)) + return mcs + +def cdiff(text1,text2): + return " ".join(difflib.context_diff(text1.splitlines(1),text2.splitlines(1))) + +class TestCase(unittest.TestCase): + def setUp(self): + pass + + def tearDown(self): + CONTEXT.unset_current_step() + + def test001(self): + """ Test de commentarisation/decommentarisation de commandes dans fichier az.comm""" + app=appli.STANDALONE(version='v8.2') + file=os.path.join(prefs.INSTALLDIR,"Tests/testelem/az.comm") + j=app.openJDC(file=file) + assert j.isvalid(),j.report() + # on commente la commande LIRE_MAILLAGE + for co in j.etapes: + if co.nom == "LIRE_MAILLAGE" and co.sd.nom == "MAIL":break + cco=co.get_objet_commentarise(format=app.format_fichier.get()) + # on decommente la commande LIRE_MAILLAGE + commande,nom = cco.uncomment() + # on reaffecte l'objet MAIL + for co in j.etapes: + if co.nom in ("AFFE_MODELE","AFFE_MATERIAU") : + add_mcsimp(co,"MAILLAGE",'MAIL') + + text1=app.get_text_JDC(j,'python') + f=open(file) + text2=f.read() + f.close() + assert text1 == text2 , cdiff(text1,text2) + diff --git a/Tests/testelem/testsimp3.py b/Tests/testelem/testsimp3.py index 20c66701..de100f32 100644 --- a/Tests/testelem/testsimp3.py +++ b/Tests/testelem/testsimp3.py @@ -27,10 +27,10 @@ class TestSimpCase(unittest.TestCase): self.assertEqual(b.eval(),2.56) c=Variable('q',[1,a,3]) d=c[1]/3 - self.assertEqual(str(d),'((q[1]) / 3)') + self.assertEqual(str(d),'(q[1] / 3)') self.assertEqual(d.eval(),25.6/3) f=cos(d) - self.assertEqual(str(f),'cos(((q[1]) / 3))') + self.assertEqual(str(f),'cos((q[1] / 3))') self.assertEqual(f.eval(),-0.628288791022798) g=a**2 self.assertEqual(str(g),'(n ** 2)') @@ -41,12 +41,14 @@ class TestSimpCase(unittest.TestCase): self.assertEqual(g.eval(),429496.72960000008) def test003(self): + """ Validation d'un parametre (instance de la classe Variable) + """ cata=SIMP(statut='o',typ='R',max=3) liste=((1,1),(Variable('x',(0.,1.)),1), (1.,1),(Variable('x',(0.,1.)),1), (('RI',1,0),0), (1+0j,0), ("('RI',1,0)",0), ("toto",0), (None,0), ) for valeur,valid in liste: o=cata(valeur,'mcs',None) - print o.val,o.valeur + #print o.val,o.valeur msg="erreur sur le test %s %s" % (valeur,valid)+'\n'+str(o.report()) self.assertEqual(o.isvalid(),valid,msg=msg) diff --git a/Tests/testelem/testvalidator2.py b/Tests/testelem/testvalidator2.py index 31b3b1bf..ce843908 100644 --- a/Tests/testelem/testvalidator2.py +++ b/Tests/testelem/testvalidator2.py @@ -22,7 +22,7 @@ class TestValidCase(unittest.TestCase): valid=compare.check(rep,report) if not valid: msg="le rapport d'erreur est incorrect.\n valeur = %s\n expected =\n%s\n got =\n%s " % (valeur,report,rep) - print msg + #print msg self.assert_(valid,msg=msg) def test001(self): diff --git a/Tests/testelem/toto.comm b/Tests/testelem/toto.comm new file mode 100644 index 00000000..99c02a4b --- /dev/null +++ b/Tests/testelem/toto.comm @@ -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 index 00000000..74bd9ef1 --- /dev/null +++ b/convert/autre_parseur.py @@ -0,0 +1,586 @@ +# -*- coding: utf-8 -*- +# CONFIGURATION MANAGEMENT OF EDF VERSION +# ====================================================================== +# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG +# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY +# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY +# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR +# (AT YOUR OPTION) ANY LATER VERSION. +# +# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT +# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF +# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU +# GENERAL PUBLIC LICENSE FOR MORE DETAILS. +# +# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE +# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER, +# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE. +# +# +# ====================================================================== +import sys,string,re,tokenize +import cStringIO + +class ENTITE_JDC : + def __init__(self): + self.texte = '' + + def set_text(self,texte): + self.texte = texte + + def append_text(self,texte): + """ + """ + self.texte = self.texte +texte + +class COMMENTAIRE(ENTITE_JDC): + + def __str__(self): + """ + Retourne une chaîne de caractères représentant self + sous une forme interprétable par EFICAS + """ + t=repr(self.texte) + return "COMMENTAIRE("+t+")\n" + + def append_text(self,texte): + """ + Ajoute texte à self.texte en enlevant le # initial + """ + if texte[0] == '#': + self.texte = self.texte+texte[1:] + else: + # le dièse n'est pas sur le premier caractère + amont,aval = string.split(texte,'#',1) # on découpe suivant la première occurrence de # + self.texte = self.texte +amont + aval + +class AFFECTATION(ENTITE_JDC): + + def append_text(self,texte): + """ + Ajoute texte à self.texte en enlevant tout retour chariot et tout point virgule + """ + self.texte = self.texte+texte + + def __str__(self): + """ + Retourne une expression de l'affectation compréhensible par ACCAS + et exploitable par EFICAS + """ + t=repr(self.texte) + t=self.texte + return "PARAMETRE(nom='"+self.name+"',valeur="+t+")" + +class COMMANDE_COMMENTARISEE(ENTITE_JDC): + + def append_text(self,texte): + """ + Ajoute texte à self.texte en enlevant les doubles commentaires + """ + texte = string.strip(texte) + texte = string.strip(texte[2:]) + self.texte = self.texte+(len(self.texte)>0)*'\n'+texte + + def __str__(self): + """ + Retourne une expression de la commande commentarisée compréhensible par ACCAS + et exploitable par EFICAS + """ + return "COMMANDE_COMM(texte="+repr(self.texte)+")\n" + + +next = {} +next['if'] = next['elif'] = 'elif', 'else', 'end' +next['while'] = next['for'] = 'else', 'end' +next['try'] = 'except', 'finally' +next['except'] = 'except', 'else', 'end' +next['else'] = next['finally'] = next['def'] = next['class'] = 'end' +next['end'] = () +start = 'if', 'while', 'for', 'try', 'def', 'class' + +class PARSEUR_PYTHON: + """ + Cette classe sert à créer un objet PARSEUR_PYTHON qui réalise l'analyse d'un texte + représentant un JDC Python en distinguant : + - les commentaires inter commandes + - les affectations + - les commandes + """ + # au moins 1 caractère non blanc ou non tabulation + pattern_ligne_non_blanche = re.compile(r'^[\w\t]+') + kwprog = re.compile( + r'^\s*(?P[a-z]+)' + r'(\s+(?P[a-zA-Z_]\w*))?' + r'[^\w]') + endprog = re.compile( + r'^\s*#?\s*end\s+(?P[a-z]+)' + r'(\s+(?P[a-zA-Z_]\w*))?' + r'[^\w]') + wsprog = re.compile(r'^[ \t]*') + + def __init__(self,texte): + # on verifie que le texte fourni se compile correctement + compile(texte,"",'exec') + self.texte = cStringIO.StringIO(texte) + self.line='' + self.out="" + self.lastcol = 0 + self.lastrow = 1 + self.please_indent = 1 + self.indent_list = [] + self.indentation=0 + self.paren_level=0 + self.affectation=0 + for i in range(5): + self.indent_list.append(' '*i) + self.objet_courant=None + self.stack=[] + + def readline(self): + self.line= self.texte.readline() + #print "line:",self.line + self.indentation=len(self.stack) + m = self.kwprog.match(self.line) + if m: + kw = m.group('kw') + if kw in start: + self.stack.append((kw, kw)) + elif next.has_key(kw) and self.stack: + kwa,kwb=self.stack[-1] + self.stack.append((kwa, kw)) + return self.line + + def get_texte(self,appli=None): + """ + Retourne le texte issu de l'analyse + """ + for tk in tokenize.generate_tokens(self.readline): + self.process_token(tk) + return self.out + + def process_token(self, tk): + """ + """ + ttype, tstring, spos, epos, line = tk + thisrow, thiscol = spos + #print spos, epos,tokenize.tok_name[ttype] + + if thisrow > self.lastrow: + # si plusieurs lignes (>1) + self.out=self.out+"\n" * (thisrow - self.lastrow - 1) + self.lastcol = 0 + + #if thiscol > self.lastcol : + # self.out=self.out+ " " * (thiscol - self.lastcol) + # self.please_indent = None + + self.thiscol=thiscol + #self.nextrow, self.nextcol = epos + + try: + fn = getattr(self, tokenize.tok_name[ttype]) + except AttributeError: + print >>sys.stderr, "No match!", tokenize.tok_name[ttype], tstring + return + + if ttype != tokenize.DEDENT and ttype != tokenize.INDENT and ttype != tokenize.COMMENT and self.please_indent: + self.do_indent() + + fn(tstring) + self.lastrow, self.lastcol = epos + + def output(self,tstring): + #print "output",tstring + #if self.thiscol > self.lastcol : + # self.out=self.out+ " " * (self.thiscol - self.lastcol) + # self.please_indent = None + #self.thiscol=0 + #self.lastrow, self.lastcol=self.nextrow, self.nextcol + if self.objet_courant: + #print str(self.objet_courant) + self.out=self.out+self.indent_list[self.indentation] + self.out= self.out+ str(self.objet_courant) + self.objet_courant=None + self.lastcol=self.thiscol + + if self.thiscol > self.lastcol : + # print self.thiscol,self.lastcol + self.out=self.out+ " " * (self.thiscol - self.lastcol) + self.lastcol=self.thiscol + + self.out=self.out+tstring + + def output_com(self,tstring): + self.out=self.out+tstring + + def do_indent(self): + #print "indentation=",self.indentation + if self.objet_courant: + self.out=self.out+self.indent_list[self.indentation] + #self.out=self.out+self.indent_list[-1] + self.out= self.out+ str(self.objet_courant) + self.objet_courant=None + + #self.lastcol=len(self.indent_list[-1]) + #self.lastcol=self.indentation + self.lastcol=self.thiscol + self.out=self.out+self.indent_list[self.indentation] + #self.out=self.out+self.indent_list[-1] + self.please_indent = None + + def NL(self, tstring): + if self.affectation: + if self.paren_level == 0: + # affectation en cours mais complète + self.out= self.out+ str(self.affectation_courante) + self.affectation_courante=None + self.affectation=0 + else: + # affectation en cours, on ajoute + self.affectation_courante.append_text(tstring) + return + + self.output(tstring) + self.please_indent = 1 + + def COMMENT(self, tstring): + liste= string.split(self.line,"##",1) + if len(liste) > 1: + # On a trouve un double commentaire + before,after=liste + if self.affectation: + # affectation en cours, on ignore + #self.affectation_courante.append_text(tstring) + pass + elif self.paren_level > 0: + self.output(tstring) + elif not self.pattern_ligne_non_blanche.match(before): + # il s'agit d'une commande commentarisée + if self.objet_courant == None: + self.objet_courant=COMMANDE_COMMENTARISEE() + self.objet_courant.append_text(tstring) + elif isinstance(self.objet_courant,COMMENTAIRE): + self.output_com(str(self.objet_courant)) + self.objet_courant=COMMANDE_COMMENTARISEE() + self.objet_courant.append_text(tstring) + else: + self.objet_courant.append_text(tstring) + else: + # commentaire inline + self.output(tstring) + self.please_indent = 1 + return + + else: + # On a un commentaire simple + new_line = string.split(self.line,'#')[0] + if self.affectation: + # affectation en cours, on ignore + #self.affectation_courante.append_text(tstring) + pass + elif self.paren_level > 0: + self.output(tstring) + elif not self.pattern_ligne_non_blanche.match(new_line): + # commentaire précédé de blancs + if self.objet_courant == None: + self.objet_courant=COMMENTAIRE() + self.objet_courant.append_text(tstring) + elif isinstance(self.objet_courant,COMMANDE_COMMENTARISEE): + self.output_com(str(self.objet_courant)) + self.objet_courant=COMMENTAIRE() + self.objet_courant.append_text(tstring) + else: + self.objet_courant.append_text(tstring) + else: + # commentaire inline + self.output(tstring) + self.please_indent = 1 + return + + def ERRORTOKEN(self, tstring): + print "ERRORTOKEN",tstring + + def NAME(self, tstring): + if self.affectation ==1: + # on ne veut pas des expressions qui commencent par NAME=NAME(NAME + # on en prend le chemin : on met affectation a 3 pour le signaler + # on attend d'en savoir plus + self.affectation_courante.append_text(tstring) + self.affectation=3 + return + elif self.affectation ==4: + # on a une expression qui commence par NAME=NAME(NAME + # il s'agit tres probablement d'une commande + # on annule l'affectation en cours + self.out= self.out+ self.affectation_courante.texte + self.affectation_courante=None + self.affectation=0 + elif self.affectation == 2: + # affectation en cours, on ajoute + self.affectation_courante.append_text(tstring) + self.affectation=2 + return + self.affectation=0 + self.name=None + if self.paren_level == 0: self.name=tstring + self.output(tstring) + + def ident(self, tstring): + self.affectation=0 + self.output(tstring) + + def NUMBER(self, tstring): + if self.affectation>=1: + # affectation en cours, on ajoute + self.affectation_courante.append_text(tstring) + self.affectation=2 + return + self.output(tstring) + + def OP(self,tstring): + if tstring in ('(','[','{'): self.paren_level=self.paren_level+1 + if tstring in (')',']','}'): self.paren_level=self.paren_level-1 + + if tstring == ')' and self.affectation ==4: + # on a une expression qui commence par NAME=NAME() + # il peut s'agir d'une commande + # on annule l'affectation en cours + self.out= self.out+ self.affectation_courante.texte + self.affectation_courante=None + self.affectation=0 + elif tstring == '(' and self.affectation == 3: + # on a deja trouve NAME=NAME + # on passe affectation a 4 + self.affectation_courante.append_text(tstring) + self.affectation=4 + return + elif tstring == ';' and self.affectation>=1: + # l'affectation est terminee + self.out= self.out+ str(self.affectation_courante) + self.affectation_courante=None + self.affectation=0 + elif self.affectation>=1: + # on complete l'affectation + self.affectation_courante.append_text(tstring) + self.affectation=2 + return + + self.affectation=0 + if self.name and tstring=='=': + self.affectation=1 + self.affectation_courante=AFFECTATION() + self.affectation_courante.name=self.name + self.output(tstring) + + ENDMARKER = ident + NEWLINE=NL + + def INDENT(self, tstring): +# self.indent_list.append(tstring) + self.affectation=0 + self.do_indent() + + def DEDENT(self, tstring): + self.affectation=0 + if self.objet_courant: + self.out=self.out+self.indent_list[self.indentation] + self.out= self.out+ str(self.objet_courant) + self.objet_courant=None + del self.stack[0] + self.indentation=self.indentation-1 +# self.indent_list = self.indent_list[:-1] + + def STRING(self, tstring): + if self.affectation>=1: + # affectation en cours, on ajoute + self.affectation_courante.append_text(tstring) + self.affectation=2 + return + self.output(tstring) + +if __name__ == "__main__" : + import sys + import cStringIO + text=''' +# +# comment +# comment +# comment +# + +import sys,os + +# commentaire +# commentaire +# commentaire + +DEBUT(); +##toto = FORMULE(REEL='(REEL:A) = A',); + +x=2*cos(90.)/34. + +a=1. +if a != 0: + a=+1 + +b=2. +c=a+b +#if 1: +# d=3 +# e=5 +#try: +# a=1/2 +#except KeyError: +# pass + +if 1: + a=2 + b=3 + # commenta +else: + # commen + # commen + a=3 + # qqqqqqqqqqqqqqqq + c=5 + +b=5 + # commentaire +toto = FORMULE(REEL='(REEL:A) = A',); +titi = FORMULE(REEL='(REEL:A) = A',) # commentaire inline +tutu = FORMULE(REEL='(REEL:A) = A',) ## commentaire inline + +TEST_TABLE( TABLE=RELV[k], + FILTRE=( + _F( NOM_PARA = 'QUANTITE', + VALE_K = 'MAXIMUM'),), + # commentaire + NOM_PARA='VMIS', # comm + VALE=1.9669824189084E9, + REFERENCE='NON_REGRESSION', + VERSION='8.1.0' ) + +if 1: + a=fff(a=1, + b=2) +if 1: + a=2 + b=3 + # commenta +else: + # commen + # commen + a=3 + +for k in range(1,10): + + # Appel a GMSH pour le maillage + + f=open("coque.geo","w") + +''' + text=""" + +a = 1. +b=3 +c= 3 * 5 +d= 4 + \ + 5 \ + -4 +e=toto(a=1) +x=(1,2) +y=[3, +#comme +4] +z="a" +zz='v' +u='''aaaa +bbbb''' +if 1: + a=45 +else: + a=5.6 +d={"a":0} +e={"a":0, +#comme +"d":4} +a==1 +x=a==1 +s="-"*80 +fmt_raison='-'*80+''' + + Exception erreur_Fatale interceptee + Raison : %s + +'''+'-'*80+'xxxxxxxxxxxxxxxx' +q=30*cos(12) +f=cos(12) +#commen''' +#commen''' +y=a[1] +y=["x"]*10 + +##toto = FORMULE(REEL='(REEL:A) = A', +## X=2 +## ); +# +# comment +# comment +# comment +# +zz=8.9; +zz=8.9;aa=10 +P1 = 9.8; + +P2 = 8.8; + +P3 = 7; + +P5 = P3*P1; + +P6 = P1-3; + +P4 = [2,3,4]; + +P7=P4[1] +MA=LIRE_MAILLAGE() +MA=LIRE_MAILLAGE(#comment +) +xyz=cos(10) +MA=LIRE_MAILLAGE(INFO=1) +MA=LIRE_MAILLAGE( +INFO=1) +MA=LIRE_MAILLAGE(#comme +INFO=1) +MA=\ +LIRE_MAILLAGE(INFO=1) +MA= LIRE_MAILLAGE() +TFIN = 1.790 # Temps fin pour le calcul + +PAS = 0.001 # pas de temps du calcul +DS1=[None]*5 +DS2=[None]*5 +DS3=[None]*5 +DS4=[None]*5 +CHS1=[None]*5 +CHS2=[None]*5 + + + +for k in range(1,5): + DS1[k] = CREA_CHAMP( OPERATION='EXTR', TYPE_CHAM='NOEU_DEPL_R', + RESULTAT= MODESTA1, NUME_ORDRE=k, NOM_CHAM = 'DEPL'); + + +""" + + if len(sys.argv)== 2: + progname, input = sys.argv + f=open(input) + t=f.read() + f.close() + else: + t=text + txt = PARSEUR_PYTHON(t).get_texte() + print txt + compile(txt,"",'exec') diff --git a/convert/convert_python.py b/convert/convert_python.py index 999dac50..2d90a9f1 100644 --- a/convert/convert_python.py +++ b/convert/convert_python.py @@ -50,7 +50,7 @@ """ import sys,string,traceback -import parseur_python +from autre_parseur import PARSEUR_PYTHON from Noyau import N_CR def entryPoint(): @@ -106,15 +106,15 @@ class PythonParser: def convert(self,outformat,appli=None): if outformat == 'exec': try: - return parseur_python.PARSEUR_PYTHON(self.text).get_texte(appli) + return PARSEUR_PYTHON(self.text).get_texte(appli) except: # Erreur lors de la conversion l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1], sys.exc_info()[2]) - self.cr.exception("Impossible de convertir le fichier python \ - qui doit contenir des erreurs.\n \ - On retourne le fichier non converti \n \ - Prévenir la maintenance. \n" + string.join(l)) + self.cr.exception("Impossible de convertir le fichier python " + "qui doit contenir des erreurs.\n" + "On retourne le fichier non converti.\n" + "Prévenir la maintenance. \n" + string.join(l)) # On retourne néanmoins le source initial non converti (au cas où) return self.text elif outformat == 'execnoparseur': diff --git a/convert/parseur_python.py b/convert/parseur_python.py index 7f4395a4..1d2146fd 100644 --- a/convert/parseur_python.py +++ b/convert/parseur_python.py @@ -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]) - 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, '', 'exec') diff --git a/generator/generator_python.py b/generator/generator_python.py index bebd399f..cce4eb6a 100644 --- a/generator/generator_python.py +++ b/generator/generator_python.py @@ -32,6 +32,7 @@ import Accas import Extensions from Extensions.parametre import ITEM_PARAMETRE from Formatage import Formatage +from Extensions.param2 import Formula def entryPoint(): """ @@ -149,6 +150,8 @@ class PythonGenerator: return self.generMCNUPLET(obj) elif isinstance(obj,ITEM_PARAMETRE): return self.generITEM_PARAMETRE(obj) + elif isinstance(obj,Formula): + return self.generFormula(obj) else: raise "Type d'objet non prévu",obj @@ -237,17 +240,15 @@ class PythonGenerator: def generITEM_PARAMETRE(self,obj): return repr(obj) + def generFormula(self,obj): + return repr(obj) + def generPARAMETRE(self,obj): """ Cette méthode convertit un PARAMETRE en une liste de chaines de caractères à la syntaxe python """ - if type(obj.valeur) == types.StringType: - # PN pour corriger le bug a='3+4' au lieu de a= 3+4 - #return obj.nom + " = '" + obj.valeur + "';\n" - return obj.nom + " = " + obj.valeur + ";\n" - else: - return obj.nom + ' = ' + str(obj.valeur) + ';\n' + return repr(obj) + ";\n" def generETAPE_NIVEAU(self,obj): """ @@ -451,6 +452,42 @@ class PythonGenerator: l.append(data) return l + def format_item(self,valeur,etape): + if type(valeur) == types.InstanceType : + if valeur.__class__.__name__ == 'CO' or hasattr(etape,'sdprods') and valeur in etape.sdprods : + s = "CO('"+ self.generator(valeur) +"')" + elif isinstance(valeur,Accas.PARAMETRE): + # il ne faut pas prendre la string que retourne gener + # mais seulement le nom dans le cas d'un paramètre + s = valeur.nom + else: + s = self.generator(valeur) + elif type(valeur) == types.FloatType : + # Pour un flottant on utilise str + # ou la notation scientifique + s = str(valeur) + try : + clefobj=obj.GetNomConcept() + if self.appli.dict_reels.has_key(clefobj): + if self.appli.dict_reels[clefobj].has_key(valeur): + s=self.appli.dict_reels[clefobj][valeur] + except: + pass + elif type(valeur) == types.StringType : + if valeur.find('\n') == -1: + # pas de retour chariot, on utilise repr + s = repr(valeur) + elif valeur.find('"""') == -1: + # retour chariot mais pas de triple ", on formatte + s='"""'+valeur+'"""' + else: + s = repr(valeur) + else : + # Pour les autres types on utilise repr + s = repr(valeur) + return s + + def generMCSIMP(self,obj) : """ Convertit un objet MCSIMP en une liste de chaines de caractères à la @@ -459,68 +496,11 @@ class PythonGenerator: if type(obj.valeur) in (types.TupleType,types.ListType) : s = '' for val in obj.valeur : - if type(val) == types.InstanceType : - if hasattr(obj.etape,'sdprods') and val in obj.etape.sdprods : - s = s + "CO('"+ self.generator(val) +"')" - elif val.__class__.__name__ == 'CO': - s = s + "CO('"+ self.generator(val) +"')" - elif isinstance(val,Accas.PARAMETRE): - # il ne faut pas prendre la string que retourne gener - # mais seulement le nom dans le cas d'un paramètre - s = s + val.nom - else: - s = s + self.generator(val) - elif type(val) == types.FloatType : - # Pour un flottant on utilise str qui a une precision de - # "seulement" 12 chiffres : evite les flottants du genre 0.599999999999998 - s2=str(val) - try : - clefobj=obj.GetNomConcept() - if self.appli.dict_reels.has_key(clefobj): - if self.appli.dict_reels[clefobj].has_key(val): - s2=self.appli.dict_reels[clefobj][val] - except: - pass - s = s + s2 - else : - # Pour les autres types on utilise repr - s = s + `val` - s = s + ',' + s =s +self.format_item(val,obj.etape) + ',' if len(obj.valeur) > 1: s = '(' + s + '),' else : - val=obj.valeur - if type(val) == types.InstanceType : - if hasattr(obj.etape,'sdprods') and val in obj.etape.sdprods : - s = "CO('"+ self.generator(val) +"')" - elif val.__class__.__name__ == 'CO': - s = "CO('"+ self.generator(val) +"')" - elif isinstance(val,Accas.PARAMETRE): - # il ne faut pas prendre la string que retourne gener - # mais seulement le nom dans le cas d'un paramètre - s = val.nom - elif isinstance(val,Extensions.parametre.PARAMETRE): - s = val.nom - else: - s = self.generator(val) - elif type(val) == types.FloatType : - # Pour un flottant on utilise str - # ou la notation scientifique - s = str(val) - try : - clefobj=obj.GetNomConcept() - if self.appli.dict_reels.has_key(clefobj): - if self.appli.dict_reels[clefobj].has_key(val): - s=self.appli.dict_reels[clefobj][val] - except: - pass - else : - # Pour les autres types on utilise repr - if isinstance(val,Extensions.parametre.PARAMETRE): - s = val.nom - else: - s = `val` - s= s + ',' + s=self.format_item(obj.valeur,obj.etape) + ',' return s