Salome HOME
212d7e2611236f37ffda79b7e6acb5cdb18b84b1
[tools/eficas.git] / Noyau / N_MCBLOC.py
1 # coding=utf-8
2 # Copyright (C) 2007-2021   EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19
20
21 """
22     Ce module contient la classe MCBLOC qui sert à controler la valeur
23     d'un bloc de mots-clés par rapport à sa définition portée par un objet
24     de type ENTITE
25 """
26
27 from __future__ import absolute_import
28 import types
29
30 from . import N_MCCOMPO
31
32
33 class MCBLOC(N_MCCOMPO.MCCOMPO):
34
35     """
36        Classe support d'un bloc de mots-clés.
37
38     """
39
40     nature = "MCBLOC"
41
42     def __init__(self, val, definition, nom, parent,dicoPyxbDeConstruction=None):
43         """
44            Attributs :
45
46             - val : valeur du bloc (dictionnaire dont les clés sont des noms de mots-clés et les valeurs
47                     les valeurs des mots-clés)
48
49             - definition : objet de définition de type BLOC associé au bloc (porte les attributs de définition)
50
51             - nom : nom du bloc. Ce nom lui est donné par celui qui crée le bloc de mot-clé
52
53             - parent : le créateur du bloc. Ce peut etre un mot-clé facteur ou un autre objet composite de type
54                        OBJECT. Si parent vaut None, le bloc ne possède pas de contexte englobant.
55
56             - mcListe : liste des sous-objets du bloc construite par appel à la méthode buildMc
57
58         """
59         #print ('MCBLOC' ,  val, definition, nom, parent)
60         self.definition = definition
61         self.nom = nom
62         self.val = val
63         self.parent = parent
64         self.valeur = val
65         self.objPyxbDeConstruction=None
66         self.dicoPyxbDeConstruction=dicoPyxbDeConstruction
67         self.estIdentifiePar=None
68         if parent:
69             self.jdc = self.parent.jdc
70             self.niveau = self.parent.niveau
71             self.etape = self.parent.etape
72         else:
73             # Le mot cle a été créé sans parent
74             self.jdc = None
75             self.niveau = None
76             self.etape = None
77         self.mcListe = self.buildMc()
78
79     def getValeur(self):
80         """
81            Retourne la "valeur" de l'objet bloc. Il s'agit d'un dictionnaire dont
82            les clés seront les noms des objets de self.mcListe et les valeurs
83            les valeurs des objets de self.mcListe obtenues par application de
84            la méthode getValeur.
85
86            Dans le cas particulier d'un objet bloc les éléments du dictionnaire
87            obtenu par appel de la méthode getValeur sont intégrés au niveau
88            supérieur.
89
90         """
91         dico = {}
92         for mocle in self.mcListe:
93             if mocle.isBLOC():
94                 # Si mocle est un BLOC, on inclut ses items dans le dictionnaire
95                 # représentatif de la valeur de self. Les mots-clés fils de blocs sont
96                 # donc remontés au niveau supérieur.
97                 dico.update(mocle.getValeur())
98             else:
99                 dico[mocle.nom] = mocle.getValeur()
100
101         # On rajoute tous les autres mots-clés locaux possibles avec la valeur
102         # par défaut ou None
103         # Pour les mots-clés facteurs, on ne traite que ceux avec statut défaut ('d')
104         # et caché ('c')
105         # On n'ajoute aucune information sur les blocs. Ils n'ont pas de défaut seulement
106         # une condition.
107         for k, v in list(self.definition.entites.items()):
108             if not k in dico:
109                 if v.label == 'SIMP':
110                     # Mot clé simple
111                     dico[k] = v.defaut
112                 elif v.label == 'FACT':
113                     if v.statut in ('c', 'd'):
114                         # Mot clé facteur avec défaut ou caché provisoire
115                         dico[k] = v(val=None, nom=k, parent=self)
116                         # On demande la suppression des pointeurs arrieres
117                         # pour briser les eventuels cycles
118                         dico[k].supprime()
119                     else:
120                         dico[k] = None
121
122         return dico
123
124     def isBLOC(self):
125         """
126             Indique si l'objet est un BLOC
127         """
128         return 1
129
130     def accept(self, visitor):
131         """
132            Cette methode permet de parcourir l'arborescence des objets
133            en utilisant le pattern VISITEUR
134         """
135         visitor.visitMCBLOC(self)
136
137     def makeobjet(self):
138         return self.definition(val=None,  nom=self.nom, parent=self.parent)