]> SALOME platform Git repositories - tools/eficas.git/blob - Aster/Cata/cataSTA8/Macro/exec_logiciel_ops.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / Aster / Cata / cataSTA8 / Macro / exec_logiciel_ops.py
1 #@ MODIF exec_logiciel_ops Macro  DATE 29/08/2006   AUTEUR MCOURTOI M.COURTOIS 
2 # -*- coding: iso-8859-1 -*-
3 #            CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2006  EDF R&D                  WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY  
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY  
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR     
9 # (AT YOUR OPTION) ANY LATER VERSION.                                                  
10 #                                                                       
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT   
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF            
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU      
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                              
15 #                                                                       
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE     
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,         
18 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.        
19 # ======================================================================
20
21 import os.path
22 import traceback
23 import shutil
24 from types import ListType, TupleType
25 EnumTypes = (ListType, TupleType)
26
27 # ------------------------------------------------------------------------------
28 def exec_logiciel_ops(self, LOGICIEL, ARGUMENT, MAILLAGE, CODE_RETOUR_MAXI, INFO, **args):
29    """
30    Macro IMPR_FONCTION permettant d'imprimer dans un fichier des fonctions,
31    colonnes de table...
32    Erreurs<S> dans IMPR_FONCTION pour ne pas perdre la base.
33    """
34    macro='EXEC_LOGICIEL'
35    import aster
36    from Utilitai.Utmess     import UTMESS
37    from Utilitai.System     import ExecCommand
38    from Utilitai.UniteAster import UniteAster
39    
40    PRE_GMSH      = self.get_cmd("PRE_GMSH")
41    PRE_GIBI      = self.get_cmd("PRE_GIBI")
42    LIRE_MAILLAGE = self.get_cmd("LIRE_MAILLAGE")
43    
44    ier=0
45    # La macro compte pour 1 dans la numerotation des commandes
46    self.set_icmd(1)
47
48    #----------------------------------------------
49    # constantes des modes d'exécution
50    CMD_EXTERNE = 1
51    EXECFILE    = 2
52    mode_lancement = None
53
54    # paramètres nécessaires pour écrire la ligne de commande
55    # !! d_para['options'] est une liste !!
56    d_para = {'prog' : '', 'options' : ''}
57    
58    l_args = []
59    if ARGUMENT != None:
60       l_args = ARGUMENT[:]
61       if type(l_args) not in EnumTypes:
62          l_args = [l_args,]
63    
64    #----------------------------------------------
65    # 1. Préparation des données
66    # 1.1. EXEC_LOGICIEL standard
67    if MAILLAGE == None:
68       mode_lancement = CMD_EXTERNE
69       cmd = '%(prog)s %(options)s'
70    
71    # 1.2. Cas "lancement d'un mailleur"
72    else:
73       mcf = MAILLAGE[0]
74       dMCF = mcf.cree_dict_valeurs(mcf.mc_liste)
75       d_para['fichIN']  = 'fort.%d' % dMCF['UNITE_GEOM']
76       d_para['fichOUT'] = 'fort.%d' % dMCF['UNITE']
77       
78       if dMCF['FORMAT'] == 'GMSH':
79          mode_lancement = CMD_EXTERNE
80          cmd = '%(prog)s %(options)s -o %(fichOUT)s %(fichIN)s'
81          d_para['prog'] = os.path.join(aster.repout(), 'gmsh')
82          d_para['options'] = ('-3',)
83       
84       elif dMCF['FORMAT'] == 'GIBI':
85          mode_lancement = CMD_EXTERNE
86          cmd = '%(prog)s %(options)s %(fichIN)s %(fichOUT)s'
87          d_para['prog'] = os.path.join(aster.repout(), 'gibi')
88       
89       elif dMCF['FORMAT'] == 'SALOME':
90          mode_lancement = EXECFILE
91          if len(l_args) < 1:
92             UTMESS('F', macro, "FORMAT SALOME, L'ARGUMENT 1 DOIT ETRE " \
93                                "LE NOM DU FICHIER MED PRODUIT PAR LE SCRIPT PYTHON.")
94          else:
95             d_para['fichMED'] = l_args[0]
96       
97       else:
98          UTMESS('F', macro, "ON NE SAIT PAS TRAITER LE FORMAT '%s'" % dMCF['FORMAT'])
99    
100    #----------------------------------------------
101    # 2. lecture des mots-clés
102    if LOGICIEL != None:
103       d_para['prog'] = LOGICIEL
104
105    if len(l_args) > 0:
106       d_para['options'] = l_args
107    d_para['options'] = ' '.join(d_para['options'])
108    
109    #----------------------------------------------
110    # 3. Exécution
111    # 3a. Lancement d'une commande externe
112    if mode_lancement == CMD_EXTERNE:
113       scmd = cmd % d_para
114       comment = "Lancement de la commande :\n%s" % scmd
115       iret, output = ExecCommand(scmd,
116                                  alt_comment=comment)
117       # écrire l'output dans le .mess si demandé
118       if INFO == 2:
119          aster.affiche('MESSAGE', output)
120       
121       if CODE_RETOUR_MAXI >= 0 and iret > CODE_RETOUR_MAXI:
122          UTMESS('F', macro, 'CODE RETOUR INCORRECT (MAXI %d) : %d' \
123                 % (CODE_RETOUR_MAXI, iret))
124    
125    #----------------------------------------------
126    # 3b. Exécution d'un fichier Python
127    elif mode_lancement == EXECFILE:
128       if d_para['prog'] != '':
129          UTMESS('A', macro, "LE MOT-CLE LOGICIEL N'EST PAS UTILISE AVEC CE FORMAT")
130       context={}
131       try:
132          execfile(d_para['fichIN'], context)
133       except:
134          traceback.print_exc()
135          txt = open(d_para['fichIN'], 'r').read()
136          UTMESS('F', macro, """ERREURS LORS DE L'EXECUTION DU FICHIER CI-DESSOUS :
137 <<<<<<<<<<<<<<< DEBUT DU FICHIER >>>>>>>>>>>>>>>
138 %s
139 <<<<<<<<<<<<<<<  FIN  DU FICHIER >>>>>>>>>>>>>>>
140 """ % txt)
141       
142       if not os.path.exists(d_para['fichMED']):
143          UTMESS('F', macro, "LE FICHIER %s N'EXISTE PAS" % d_para['fichMED'])
144       else:
145          # copie fichMED vers fichOUT pour pouvoir le récupérer
146          shutil.copyfile(d_para['fichMED'], d_para['fichOUT'])
147    
148    else:
149       UTMESS('F', macro, "Mode de lancement inconnu : %s" % mode_lancement)
150    
151    #----------------------------------------------
152    # 4. Conversion du maillage
153    if MAILLAGE != None:
154       UL = UniteAster()
155       umail = UL.Libre(action='ASSOCIER',
156                        nom='exec_logiciel.%s2mail' % dMCF['FORMAT'].lower())
157       
158       # déclaration du concept maillage en sortie
159       self.DeclareOut('mail', dMCF['MAILLAGE'])
160       
161       lire_mail_opts = {}
162       if dMCF['FORMAT'] == 'GMSH':
163          PRE_GMSH(UNITE_GMSH     = dMCF['UNITE'],
164                   UNITE_MAILLAGE = umail)
165
166       elif dMCF['FORMAT'] == 'GIBI':
167          PRE_GIBI(UNITE_GIBI     = dMCF['UNITE'],
168                   UNITE_MAILLAGE = umail)
169
170       elif dMCF['FORMAT'] == 'SALOME':
171          # ici l'unité en entrée de LIRE_MAILLAGE ne correspond pas au .mail
172          # mais au fichier MED en sortie du execfile.
173          umail = dMCF['UNITE']
174          etat = UL.Etat(umail, etat='O', TYPE='LIBRE', nom=d_para['fichMED'])
175          lire_mail_opts['FORMAT']   = 'MED'
176          lire_mail_opts['INFO_MED'] = INFO
177       
178       mail = LIRE_MAILLAGE(UNITE = umail,
179                            INFO  = INFO,
180                            **lire_mail_opts)
181
182       UL.EtatInit()
183    return ier
184