From ca2521cc11d74018b60dbed719ecd584fd9178ea Mon Sep 17 00:00:00 2001 From: Pascale Noyret Date: Tue, 14 Jan 2014 13:00:24 +0000 Subject: [PATCH] souci include = donnee ou unite --- Aster/Cata/cataSTA11/ops.py | 126 +++++++++++++++++++----------------- Ihm/I_MACRO_ETAPE.py | 16 +++-- 2 files changed, 79 insertions(+), 63 deletions(-) diff --git a/Aster/Cata/cataSTA11/ops.py b/Aster/Cata/cataSTA11/ops.py index 95adc6db..3402a70e 100644 --- a/Aster/Cata/cataSTA11/ops.py +++ b/Aster/Cata/cataSTA11/ops.py @@ -1,6 +1,4 @@ -#@ MODIF ops Cata DATE 15/04/2013 AUTEUR COURTOIS M.COURTOIS -# -*- coding: iso-8859-1 -*- -# CONFIGURATION MANAGEMENT OF EDF VERSION +# coding=utf-8 # ====================================================================== # COPYRIGHT (C) 1991 - 2013 EDF R&D WWW.CODE-ASTER.ORG # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY @@ -17,7 +15,7 @@ # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER, # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE. # ====================================================================== -# RESPONSABLE COURTOIS M.COURTOIS +# person_in_charge: mathieu.courtois at edf.fr # Modules Python import sys @@ -27,6 +25,7 @@ import traceback import cPickle as pickle import re from math import sqrt, pi, atan2, tan, log, exp +from glob import glob # Modules Eficas import Accas @@ -39,7 +38,7 @@ try: import aster import aster_core aster_exists = True - # Si le module aster est présent, on le connecte + # Si le module aster est présent, on le connecte # au JDC import Build.B_CODE Build.B_CODE.CODE.codex=aster @@ -51,7 +50,7 @@ except: def commun_DEBUT_POURSUITE(jdc, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, LANG, INFO): - """Fonction sdprod partie commune à DEBUT et POURSUITE. + """Fonction sdprod partie commune à DEBUT et POURSUITE. (on stocke un entier au lieu du logique) """ jdc.set_par_lot(PAR_LOT, user_value=True) @@ -63,7 +62,7 @@ def commun_DEBUT_POURSUITE(jdc, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, jdc.info_level = INFO jdc.hist_etape = (DEBUG != None and DEBUG['HIST_ETAPE'] == 'OUI') if CODE != None: - jdc.fico = CODE['NOM'] + jdc.fico = 'TEST' if aster_exists: if LANG: from Execution.i18n import localization @@ -74,13 +73,13 @@ def commun_DEBUT_POURSUITE(jdc, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, #message.register_print_function(asprint) # ne faire qu'une fois if not hasattr(jdc, 'msg_init'): - # messages d'alarmes désactivés + # messages d'alarmes désactivés if IGNORE_ALARM: if not type(IGNORE_ALARM) in (list, tuple): IGNORE_ALARM = [IGNORE_ALARM] for idmess in IGNORE_ALARM: MessageLog.disable_alarm(idmess) - # en POURSUITE, conserver le catalogue de comportement picklé + # en POURSUITE, conserver le catalogue de comportement picklé if not hasattr(jdc, 'catalc'): from Comportement import catalc jdc.catalc = catalc @@ -88,14 +87,23 @@ def commun_DEBUT_POURSUITE(jdc, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, def DEBUT(self, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, LANG, INFO, **args): - """ + """ Fonction sdprod de la macro DEBUT - """ - # La commande DEBUT ne peut exister qu'au niveau jdc - if self.jdc is not self.parent : - raise Accas.AsException("La commande DEBUT ne peut exister qu'au niveau jdc") - commun_DEBUT_POURSUITE(self.jdc, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, LANG, INFO) - + """ + # La commande DEBUT ne peut exister qu'au niveau jdc + if self.jdc is not self.parent : + raise Accas.AsException("La commande DEBUT ne peut exister qu'au niveau jdc") + commun_DEBUT_POURSUITE(self.jdc, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, LANG, INFO) + suppr = False + for fname in glob('pick.*') + glob('glob.*'): + try: + UTMESS('I', 'SUPERVIS_4', valk=fname) + os.remove(fname) + suppr = True + except OSError: + UTMESS('A', 'SUPERVIS_5', valk=fname) + if suppr: + UTMESS('I', 'SUPERVIS_6') def build_debut(self,**args): """ @@ -107,13 +115,13 @@ def build_debut(self,**args): self.jdc._Build() # On execute la fonction debut pour initialiser les bases # Cette execution est indispensable avant toute autre action sur ASTER - # op doit être un entier car la fonction debut appelle GCECDU qui demande - # le numéro de l'operateur associé (getoper) + # op doit être un entier car la fonction debut appelle GCECDU qui demande + # le numéro de l'operateur associé (getoper) self.definition.op=0 self.set_icmd(1) self.codex.debut(self) # On remet op a None juste apres pour eviter que la commande DEBUT - # ne soit executée dans la phase d'execution + # ne soit executée dans la phase d'execution self.definition.op=None return 0 @@ -126,6 +134,8 @@ def POURSUITE(self, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, LANG, INFO, raise Accas.AsException("La commande POURSUITE ne peut exister qu'au niveau jdc") commun_DEBUT_POURSUITE(self.jdc, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, LANG, INFO) + if aster_exists: + self.jdc.set_poursuite(True) if self.codex: base = 'glob.1' @@ -138,35 +148,35 @@ def POURSUITE(self, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, LANG, INFO, # Le module d'execution est accessible et glob.1 est present # Pour eviter de rappeler plusieurs fois la sequence d'initialisation # on memorise avec l'attribut fichier_init que l'initialisation - # est réalisée + # est réalisée if hasattr(self,'fichier_init'):return self.fichier_init='glob.1' self.jdc.initexec() - # le sous programme fortran appelé par self.codex.poursu demande le numéro + # le sous programme fortran appelé par self.codex.poursu demande le numéro # de l'operateur (GCECDU->getoper), on lui donne la valeur 0 self.definition.op=0 self.codex.poursu(self) # Par la suite pour ne pas executer la commande pendant la phase - # d'execution on le remet à None + # d'execution on le remet à None self.definition.op = None self.g_context = {} - # Il peut exister un contexte python sauvegardé sous forme pickled - # On récupère ces objets après la restauration des concepts pour que - # la récupération des objets pickled soit prioritaire. - # On vérifie que les concepts relus dans glob.1 sont bien tous - # presents sous le même nom et du même type dans pick.1 - # Le contexte est ensuite updaté (surcharge) et donc enrichi des + # Il peut exister un contexte python sauvegardé sous forme pickled + # On récupère ces objets après la restauration des concepts pour que + # la récupération des objets pickled soit prioritaire. + # On vérifie que les concepts relus dans glob.1 sont bien tous + # presents sous le même nom et du même type dans pick.1 + # Le contexte est ensuite updaté (surcharge) et donc enrichi des # variables qui ne sont pas des concepts. # On supprime du pickle_context les concepts valant None, ca peut - # être le cas des concepts non executés, placés après FIN. + # être le cas des concepts non executés, placés après FIN. UTMESS('I', 'SUPERVIS2_1', valk='pick.1') pickle_context = get_pickled_context() if pickle_context == None: UTMESS('F', 'SUPERVIS_86') return self.jdc.restore_pickled_attrs(pickle_context) - # vérification cohérence pick/base + # vérification cohérence pick/base savsign = self.jdc._sign newsign = self.jdc.signature(base) if args.get('FORMAT_HDF') == 'OUI': @@ -195,7 +205,7 @@ def POURSUITE(self, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, LANG, INFO, i_int = 'exception' co.executed = 1 UTMESS('I', 'SUPERVIS_66', valk=(co.nom, typnam.lower(), i_int)) - # pour que sds_dict soit cohérent avec g_context + # pour que sds_dict soit cohérent avec g_context self.jdc.sds_dict[elem] = co if elem != co.nom: name = re.sub('_([0-9]+)$', '[\\1]', co.nom) @@ -231,7 +241,7 @@ def POURSUITE(self, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, LANG, INFO, else: # Si le module d'execution n est pas accessible ou glob.1 absent on # demande un fichier (EFICAS) - # Il faut éviter de réinterpréter le fichier à chaque appel de + # Il faut éviter de réinterpréter le fichier à chaque appel de # POURSUITE if hasattr(self,'fichier_init'): return @@ -239,20 +249,20 @@ def POURSUITE(self, PAR_LOT, IMPR_MACRO, CODE, DEBUG, IGNORE_ALARM, LANG, INFO, def get_pickled_context(): """ - Cette fonction permet de réimporter dans le contexte courant du jdc (jdc.g_context) - les objets python qui auraient été sauvegardés, sous forme pickled, lors d'une - précédente étude. Un fichier pick.1 doit être présent dans le répertoire de travail + Cette fonction permet de réimporter dans le contexte courant du jdc (jdc.g_context) + les objets python qui auraient été sauvegardés, sous forme pickled, lors d'une + précédente étude. Un fichier pick.1 doit être présent dans le répertoire de travail """ fpick = 'pick.1' if not osp.isfile(fpick): return None - # Le fichier pick.1 est présent. On essaie de récupérer les objets python sauvegardés + # Le fichier pick.1 est présent. On essaie de récupérer les objets python sauvegardés context={} try: file=open(fpick, 'rb') - # Le contexte sauvegardé a été picklé en une seule fois. Il est seulement - # possible de le récupérer en bloc. Si cette opération echoue, on ne récupère + # Le contexte sauvegardé a été picklé en une seule fois. Il est seulement + # possible de le récupérer en bloc. Si cette opération echoue, on ne récupère # aucun objet. context = pickle.load(file) file.close() @@ -267,7 +277,7 @@ def POURSUITE_context(self,d): """ Fonction op_init de la macro POURSUITE """ - # self représente la macro POURSUITE ... + # self représente la macro POURSUITE ... d.update(self.g_context) # Une commande POURSUITE n'est possible qu'au niveau le plus haut # On ajoute directement les concepts dans le contexte du jdc @@ -312,10 +322,10 @@ def INCLUDE_context(self,d): d.update(ctxt) def build_include(self,**args): - """Fonction ops de la macro INCLUDE appelée lors de la phase de Build""" + """Fonction ops de la macro INCLUDE appelée lors de la phase de Build""" # Pour presque toutes les commandes (sauf FORMULE et POURSUITE) - # le numéro de la commande n est pas utile en phase de construction - # La macro INCLUDE ne sera pas numérotée (incrément=None) + # le numéro de la commande n est pas utile en phase de construction + # La macro INCLUDE ne sera pas numérotée (incrément=None) ier=0 self.set_icmd(None) # On n'execute pas l'ops d'include en phase BUILD car il ne sert a rien. @@ -328,11 +338,11 @@ def _detr_list_co(self, context): # par nom de concept (typ=assd) for mc in self['CONCEPT'] or []: list_co.update(force_list(mc["NOM"])) - # par chaine de caractères (typ='TXM') + # par chaine de caractères (typ='TXM') for mc in self['OBJET'] or []: # longueur <= 8, on cherche les concepts existants for nom in force_list(mc['CHAINE']): - assert type(nom) in (str, unicode), 'On attend une chaine de caractères : %s' % nom + assert type(nom) in (str, unicode), 'On attend une chaine de caractères : %s' % nom if len(nom.strip()) <= 8: if self.jdc.sds_dict.get(nom) != None: list_co.add(self.jdc.sds_dict[nom]) @@ -342,8 +352,8 @@ def _detr_list_co(self, context): return list_co def DETRUIRE(self, CONCEPT, OBJET, **args): - """Fonction OPS pour la macro DETRUIRE : exécution réelle.""" - # pour les formules, il ne faut pas vider l'attribut "parent_context" trop tôt + """Fonction OPS pour la macro DETRUIRE : exécution réelle.""" + # pour les formules, il ne faut pas vider l'attribut "parent_context" trop tôt for co in _detr_list_co(self, {}): co.supprime(force=True) self.set_icmd(1) @@ -358,9 +368,9 @@ def build_detruire(self, d): assert isinstance(co, ASSD), 'On attend un concept : %s (type=%s)' % (co, type(co)) nom = co.nom #message.debug(SUPERV, "refcount_1(%s) = %d", nom, sys.getrefcount(co)) - # traitement particulier pour les listes de concepts, on va mettre à None - # le terme de l'indice demandé dans la liste : - # nomconcept_i est supprimé, nomconcept[i]=None + # traitement particulier pour les listes de concepts, on va mettre à None + # le terme de l'indice demandé dans la liste : + # nomconcept_i est supprimé, nomconcept[i]=None i = nom.rfind('_') if i > 0 and not nom.endswith('_'): concept_racine = nom[:i] @@ -369,7 +379,7 @@ def build_detruire(self, d): num = int(nom[i+1:]) d[concept_racine][num] = None except (ValueError, IndexError): - # cas : RESU_aaa ou (RESU_8 avec RESU[8] non initialisé) + # cas : RESU_aaa ou (RESU_8 avec RESU[8] non initialisé) pass # pour tous les concepts : if d.has_key(nom): @@ -378,20 +388,20 @@ def build_detruire(self, d): del self.jdc.sds_dict[nom] # "suppression" du concept co.supprime() - # On signale au parent que le concept n'existe plus après l'étape self + # On signale au parent que le concept n'existe plus après l'étape self self.parent.delete_concept_after_etape(self, co) - # marque comme détruit == non executé + # marque comme détruit == non executé co.executed = 0 def build_procedure(self,**args): """ - Fonction ops de la macro PROCEDURE appelée lors de la phase de Build + Fonction ops de la macro PROCEDURE appelée lors de la phase de Build """ ier=0 # Pour presque toutes les commandes (sauf FORMULE et POURSUITE) - # le numéro de la commande n est pas utile en phase de construction - # On ne numérote pas une macro PROCEDURE (incrément=None) + # le numéro de la commande n est pas utile en phase de construction + # On ne numérote pas une macro PROCEDURE (incrément=None) self.set_icmd(None) #ier=self.codex.opsexe(self,3) return ier @@ -413,7 +423,7 @@ def build_formule(self, d): NOM_PARA = [NOM_PARA, ] for para in NOM_PARA: if para.strip() != para: - raise Accas.AsException("nom de paramètre invalide (contient des blancs)" \ + raise Accas.AsException("nom de paramètre invalide (contient des blancs)" \ " : %s" % repr(para)) if self.sd == None: return @@ -441,7 +451,7 @@ def build_gene_vari_alea(self, d): k = 1. / (moyen - a) if exp(-b * k) < 1.e-12: UTMESS('F', 'PROBA0_3') - # résolution par point fixe + # résolution par point fixe eps = 1.E-4 nitmax = 100000 test = 0. @@ -449,7 +459,7 @@ def build_gene_vari_alea(self, d): test = k k = 1. / (moyen - (a * exp(-a * k) - b * exp(-b * k)) / \ (exp(-a * k) - exp(-b * k))) - # génération de la variable aléatoire + # génération de la variable aléatoire alpha = exp(-a * k) - exp(-b * k) self.sd.valeur = -(log(exp(-a * k) - alpha * self.getran()[0])) / k elif TYPE == 'EXPONENTIELLE': diff --git a/Ihm/I_MACRO_ETAPE.py b/Ihm/I_MACRO_ETAPE.py index acf2d052..d81a0de3 100644 --- a/Ihm/I_MACRO_ETAPE.py +++ b/Ihm/I_MACRO_ETAPE.py @@ -700,7 +700,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): if hasattr(self,'fichier_unite') : self.parent.record_unit(self.fichier_unite,self) - def get_file_memo(self,unite=None,fic_origine=''): + def get_file_memo(self,unite=None,fname=None,fic_origine=''): """Retourne le nom du fichier et le source correspondant a l'unite unite Initialise en plus recorded_units """ @@ -716,7 +716,13 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): if self.parent.recorded_units.has_key(unite): f,text,units=self.parent.recorded_units[unite] elif self.jdc : - f,text=self.jdc.get_file(unite=unite,fic_origine=fic_origine) + if fname: + if not os.path.exists(fname): + raise AsException(fname + tr(" n'est pas un fichier existant")) + f = fname + text = open(fname, 'rb').read() + else: + f,text=self.jdc.get_file(unite=unite,fic_origine=fic_origine) else: f,text=None,None @@ -974,7 +980,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): #ATTENTION SURCHARGE : cette methode surcharge celle de Noyau (a garder en synchro) - def make_include(self,unite=None): + def make_include(self,unite=None,fname=None): """ Inclut un fichier dont l'unite logique est unite Cette methode est appelee par la fonction sd_prod de la macro INCLUDE @@ -986,11 +992,11 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): # On supprime l'attribut unite qui bloque l'evaluation du source de l'INCLUDE # car on ne s'appuie pas sur lui dans EFICAS mais sur l'attribut fichier_ini # Si unite n'a pas de valeur, l'etape est forcement invalide. On peut retourner None - if not unite : return + if not unite and not fname: return if not hasattr(self,'fichier_ini') : # Si le fichier n'est pas defini on le demande - f,text=self.get_file_memo(unite=unite,fic_origine=self.parent.nom) + f,text=self.get_file_memo(unite=unite,fname=fname,fic_origine=self.parent.nom) # On memorise le fichier retourne self.fichier_ini = f self.fichier_text = text -- 2.39.2