Salome HOME
CCAR: mise a niveau du noyau avec Aster 6.3.20 (Noyau, Validation, Macro, Cata)
[tools/eficas.git] / Noyau / N_MACRO.py
1 #@ MODIF N_MACRO Noyau  DATE 09/10/2002   AUTEUR DURAND C.DURAND 
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR   
8 # (AT YOUR OPTION) ANY LATER VERSION.                                 
9 #
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT 
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF          
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU    
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.                            
14 #
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE   
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,       
17 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.      
18 #                                                                       
19 #                                                                       
20 # ======================================================================
21 """ 
22     Ce module contient la classe de definition MACRO
23     qui permet de spécifier les caractéristiques d'une macro-commande
24 """
25
26 import types,string,traceback
27
28 import N_ENTITE
29 import N_MACRO_ETAPE
30 import nommage
31
32 class MACRO(N_ENTITE.ENTITE):
33    """
34     Classe pour definir une macro-commande
35
36     Cette classe a trois attributs de classe 
37
38     - class_instance qui indique la classe qui devra etre utilisée 
39             pour créer l'objet qui servira à controler la conformité d'un 
40             macro-commande avec sa définition
41
42     - label qui indique la nature de l'objet de définition (ici, MACRO)
43
44     - nommage qui est un module Python qui fournit la fonctionnalité de nommage
45
46     et les attributs d'instance suivants :
47
48     - nom   : son nom
49
50     - op   : le numéro d'opérateur
51
52     - sd_prod : le type de concept produit. C'est une classe ou une fonction qui retourne
53                       une classe
54
55     - reentrant : vaut 'n' ou 'o'. Indique si l'opérateur est réentrant ou pas. Un opérateur
56                         réentrant peut modifier un concept d'entrée et le produire comme concept de sortie
57
58     - repetable : vaut 'n' ou 'o'. Indique si l'opérateur est répetable ou pas. Un opérateur
59                         non répétable ne doit apparaitre qu'une fois dans une exécution. C'est du ressort
60                         de l'objet gérant le contexte d'exécution de vérifier cette contrainte.
61
62     - fr   : commentaire associé en francais
63
64     - ang : commentaire associé en anglais
65
66     - docu : clé de documentation associée
67
68     - regles : liste des règles associées
69
70     - op_init : cet attribut vaut None ou une fonction. Si cet attribut ne vaut pas None, cette
71                       fonction est exécutée lors des phases d'initialisation de l'étape associée.
72
73     - niveau : indique le niveau dans lequel est rangé l'opérateur. Les opérateurs peuvent etre
74                      rangés par niveau. Ils apparaissent alors exclusivement dans leur niveau de rangement.
75                      Si niveau vaut None, l'opérateur est rangé au niveau global.
76
77     - entites : dictionnaire dans lequel sont stockés les sous entités de l'opérateur. Il s'agit
78                       des entités de définition pour les mots-clés : FACT, BLOC, SIMP. Cet attribut
79                       est initialisé avec args, c'est à dire les arguments d'appel restants.
80
81
82    """
83    class_instance = N_MACRO_ETAPE.MACRO_ETAPE
84    label = 'MACRO'
85    nommage = nommage
86
87    def __init__(self,nom,op,sd_prod=None,reentrant='n',repetable='o',fr="",ang="",
88                 docu="",regles=(),op_init=None,niveau = None,fichier_ini=0,UIinfo=None,**args):
89       """
90          Méthode d'initialisation de l'objet MACRO. Les arguments sont utilisés pour initialiser
91          les attributs de meme nom
92       """
93       # XXX fichier_ini n'est pas utilisé pour l'instant
94       self.nom=nom
95       # op est obligatoire et permet de spécifier la procédure de construction de la macro
96       # - Si op est un entier la construction de la macro est réalisée par une subroutine fortran opsxxx ou
97       # xxx est donné par la valeur absolue de op. L'execution est egalement effectuée via cette subroutine.
98       # - Si op est une fonction Python, la construction de la macro est effectuée par l'appel à cette fonction
99       # Suivant le cas on garde l info dans self.op ou dans self.proc
100       if type(op) == types.IntType:
101         self.proc=None
102         self.op=op
103       else:
104         self.op=None
105         self.proc=op
106
107       self.sd_prod=sd_prod
108       self.reentrant=reentrant
109       self.fr=fr
110       self.ang=ang
111       self.repetable = repetable
112       self.docu=docu
113       if type(regles)== types.TupleType:
114           self.regles=regles
115       else:
116           self.regles=(regles,)
117       self.fichier_ini = fichier_ini
118       # Attribut op_init : Fonction a appeler a la construction de l operateur sauf si == None
119       self.op_init=op_init
120       self.entites=args
121       current_cata=CONTEXT.get_current_cata()
122       if niveau == None:
123          self.niveau=None
124          current_cata.enregistre(self)
125       else:
126          self.niveau=current_cata.get_niveau(niveau)
127          self.niveau.enregistre(self)
128       self.UIinfo=UIinfo
129       self.affecter_parente()
130
131    def __call__(self,reuse=None,**args):
132       """
133           Construit l'objet MACRO_ETAPE a partir de sa definition (self),
134           puis demande la construction de ses sous-objets et du concept produit.
135       """
136       nomsd=self.nommage.GetNomConceptResultat(self.nom)
137       etape= self.class_instance(oper=self,reuse=reuse,args=args)
138       etape.McBuild()
139       return etape.Build_sd(nomsd)
140
141    def make_objet(self,mc_list='oui'):
142       """
143            Cette méthode crée l'objet MACRO_ETAPE dont la définition est self sans
144            créer sa sdprod.
145            Normalement l'étape est enregistrée auprès de son parent.
146            Si l'argument mc_list vaut 'oui', elle déclenche en plus la construction
147            des objets MCxxx.
148       """
149       etape= self.class_instance(oper=self,reuse=None,args={})
150       if mc_list == 'oui':etape.McBuild()
151       return etape
152
153    def verif_cata(self):
154       """
155           Méthode de vérification des attributs de définition
156       """
157       if self.op is not None and (type(self.op) != types.IntType or self.op > 0) :
158         self.cr.fatal("L'attribut 'op' doit etre un entier signé : %s" %`self.op`)
159       if self.proc is not None and type(self.proc) != types.FunctionType:
160         self.cr.fatal("L'attribut op doit etre une fonction Python : %s" % `self.proc`)
161       if type(self.regles) != types.TupleType :
162         self.cr.fatal("L'attribut 'regles' doit etre un tuple : %s" %`self.regles`)
163       if type(self.fr) != types.StringType :
164         self.cr.fatal("L'attribut 'fr' doit etre une chaine de caractères : %s" %`self.fr`)
165       if type(self.docu) != types.StringType :
166         self.cr.fatal("L'attribut 'docu' doit etre une chaine de caractères : %s" %`self.docu` )
167       if type(self.nom) != types.StringType :
168         self.cr.fatal("L'attribut 'nom' doit etre une chaine de caractères : %s" %`self.nom`)
169       if self.reentrant not in ('o','n','f'):
170         self.cr.fatal("L'attribut 'reentrant' doit valoir 'o','n' ou 'f' : %s" %`self.reentrant`)
171       self.verif_cata_regles()
172
173    def supprime(self):
174       """
175           Méthode pour supprimer les références arrières susceptibles de provoquer
176           des cycles de références
177       """
178       self.niveau=None
179
180