Salome HOME
CCAR:amelioration de la fonctionnalité mots clés inconnus
[tools/eficas.git] / Noyau / N_MACRO.py
1 """ 
2     Ce module contient la classe de definition MACRO
3     qui permet de spécifier les caractéristiques d'une macro-commande
4 """
5
6 import types,string,traceback
7
8 import N_ENTITE
9 import N_MACRO_ETAPE
10 import nommage
11
12 class MACRO(N_ENTITE.ENTITE):
13    """
14     Classe pour definir une macro-commande
15
16     Cette classe a trois attributs de classe 
17
18     - class_instance qui indique la classe qui devra etre utilisée 
19             pour créer l'objet qui servira à controler la conformité d'un 
20             macro-commande avec sa définition
21
22     - label qui indique la nature de l'objet de définition (ici, MACRO)
23
24     - nommage qui est un module Python qui fournit la fonctionnalité de nommage
25
26     et les attributs d'instance suivants :
27
28     - nom   : son nom
29
30     - op   : le numéro d'opérateur
31
32     - sd_prod : le type de concept produit. C'est une classe ou une fonction qui retourne
33                       une classe
34
35     - reentrant : vaut 'n' ou 'o'. Indique si l'opérateur est réentrant ou pas. Un opérateur
36                         réentrant peut modifier un concept d'entrée et le produire comme concept de sortie
37
38     - repetable : vaut 'n' ou 'o'. Indique si l'opérateur est répetable ou pas. Un opérateur
39                         non répétable ne doit apparaitre qu'une fois dans une exécution. C'est du ressort
40                         de l'objet gérant le contexte d'exécution de vérifier cette contrainte.
41
42     - fr   : commentaire associé en français
43
44     - ang : commentaire associé en anglais
45
46     - docu : clé de documentation associée
47
48     - regles : liste des règles associées
49
50     - op_init : cet attribut vaut None ou une fonction. Si cet attribut ne vaut pas None, cette
51                       fonction est exécutée lors des phases d'initialisation de l'étape associée.
52
53     - niveau : indique le niveau dans lequel est rangé l'opérateur. Les opérateurs peuvent être
54                      rangés par niveau. Ils apparaissent alors exclusivement dans leur niveau de rangement.
55                      Si niveau vaut None, l'opérateur est rangé au niveau global.
56
57     - entites : dictionnaire dans lequel sont stockés les sous entités de l'opérateur. Il s'agit
58                       des entités de définition pour les mots-clés : FACT, BLOC, SIMP. Cet attribut
59                       est initialisé avec args, c'est à dire les arguments d'appel restants.
60
61
62    """
63    class_instance = N_MACRO_ETAPE.MACRO_ETAPE
64    label = 'MACRO'
65    nommage = nommage
66
67    def __init__(self,nom,op,sd_prod=None,reentrant='n',repetable='o',fr="",ang="",
68                 docu="",regles=(),op_init=None,niveau = None,fichier_ini=0,**args):
69       """
70          Méthode d'initialisation de l'objet MACRO. Les arguments sont utilisés pour initialiser
71          les attributs de meme nom
72       """
73       # XXX fichier_ini n'est pas utilisé pour l'instant
74       self.nom=nom
75       # op est obligatoire et permet de spécifier la procédure de construction de la macro
76       # - Si op est un entier la construction de la macro est réalisée par une subroutine fortran opsxxx ou
77       # xxx est donné par la valeur absolue de op. L'execution est egalement effectuée via cette subroutine.
78       # - Si op est une fonction Python, la construction de la macro est effectuée par l'appel à cette fonction
79       # Suivant le cas on garde l info dans self.op ou dans self.proc
80       if type(op) == types.IntType:
81         self.proc=None
82         self.op=op
83       else:
84         self.op=None
85         self.proc=op
86
87       self.sd_prod=sd_prod
88       self.reentrant=reentrant
89       self.fr=fr
90       self.ang=ang
91       self.repetable = repetable
92       self.docu=docu
93       if type(regles)== types.TupleType:
94           self.regles=regles
95       else:
96           self.regles=(regles,)
97       self.fichier_ini = fichier_ini
98       # Attribut op_init : Fonction a appeler a la construction de l operateur sauf si == None
99       self.op_init=op_init
100       self.entites=args
101       current_cata=CONTEXT.get_current_cata()
102       if niveau == None:
103          self.niveau=None
104          current_cata.enregistre(self)
105       else:
106          self.niveau=current_cata.get_niveau(niveau)
107          self.niveau.enregistre(self)
108       self.affecter_parente()
109
110    def __call__(self,reuse=None,**args):
111       """
112           Construit l'objet MACRO_ETAPE a partir de sa definition (self),
113           puis demande la construction de ses sous-objets et du concept produit.
114       """
115       nomsd=self.nommage.GetNomConceptResultat(self.nom)
116       etape= self.class_instance(oper=self,reuse=reuse,args=args)
117       etape.McBuild()
118       return etape.Build_sd(nomsd)
119
120    def make_objet(self,mc_list='oui'):
121       """
122            Cette méthode crée l'objet MACRO_ETAPE dont la définition est self sans
123            créer sa sdprod.
124            Normalement l'étape est enregistrée auprès de son parent.
125            Si l'argument mc_list vaut 'oui', elle déclenche en plus la construction
126            des objets MCxxx.
127       """
128       etape= self.class_instance(oper=self,reuse=None,args={})
129       if mc_list == 'oui':etape.McBuild()
130       return etape
131
132    def verif_cata(self):
133       """
134           Méthode de vérification des attributs de définition
135       """
136       if self.op is not None and (type(self.op) != types.IntType or self.op > 0) :
137         self.cr.fatal("L'attribut 'op' doit être un entier signé : %s" %`self.op`)
138       if self.proc is not None and type(self.proc) != types.FunctionType:
139         self.cr.fatal("L'attribut op doit être une fonction Python : %s" % `self.proc`)
140       if type(self.regles) != types.TupleType :
141         self.cr.fatal("L'attribut 'regles' doit être un tuple : %s" %`self.regles`)
142       if type(self.fr) != types.StringType :
143         self.cr.fatal("L'attribut 'fr' doit être une chaîne de caractères : %s" %`self.fr`)
144       if type(self.docu) != types.StringType :
145         self.cr.fatal("L'attribut 'docu' doit être une chaîne de caractères : %s" %`self.docu` )
146       if type(self.nom) != types.StringType :
147         self.cr.fatal("L'attribut 'nom' doit être une chaîne de caractères : %s" %`self.nom`)
148       if self.reentrant not in ('o','n','f'):
149         self.cr.fatal("L'attribut 'reentrant' doit valoir 'o','n' ou 'f' : %s" %`self.reentrant`)
150       self.verif_cata_regles()
151
152    def supprime(self):
153       """
154           Méthode pour supprimer les références arrières susceptibles de provoquer
155           des cycles de références
156       """
157       self.niveau=None
158
159