Salome HOME
modif pour MT
[tools/eficas.git] / Noyau / N_MCBLOC.py
1 # coding=utf-8
2 # Copyright (C) 2007-2017   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         if parent:
68             self.jdc = self.parent.jdc
69             self.niveau = self.parent.niveau
70             self.etape = self.parent.etape
71         else:
72             # Le mot cle a été créé sans parent
73             self.jdc = None
74             self.niveau = None
75             self.etape = None
76         self.mcListe = self.buildMc()
77
78     def getValeur(self):
79         """
80            Retourne la "valeur" de l'objet bloc. Il s'agit d'un dictionnaire dont
81            les clés seront les noms des objets de self.mcListe et les valeurs
82            les valeurs des objets de self.mcListe obtenues par application de
83            la méthode getValeur.
84
85            Dans le cas particulier d'un objet bloc les éléments du dictionnaire
86            obtenu par appel de la méthode getValeur sont intégrés au niveau
87            supérieur.
88
89         """
90         dico = {}
91         for mocle in self.mcListe:
92             if mocle.isBLOC():
93                 # Si mocle est un BLOC, on inclut ses items dans le dictionnaire
94                 # représentatif de la valeur de self. Les mots-clés fils de blocs sont
95                 # donc remontés au niveau supérieur.
96                 dico.update(mocle.getValeur())
97             else:
98                 dico[mocle.nom] = mocle.getValeur()
99
100         # On rajoute tous les autres mots-clés locaux possibles avec la valeur
101         # par défaut ou None
102         # Pour les mots-clés facteurs, on ne traite que ceux avec statut défaut ('d')
103         # et caché ('c')
104         # On n'ajoute aucune information sur les blocs. Ils n'ont pas de défaut seulement
105         # une condition.
106         for k, v in list(self.definition.entites.items()):
107             if not k in dico:
108                 if v.label == 'SIMP':
109                     # Mot clé simple
110                     dico[k] = v.defaut
111                 elif v.label == 'FACT':
112                     if v.statut in ('c', 'd'):
113                         # Mot clé facteur avec défaut ou caché provisoire
114                         dico[k] = v(val=None, nom=k, parent=self)
115                         # On demande la suppression des pointeurs arrieres
116                         # pour briser les eventuels cycles
117                         dico[k].supprime()
118                     else:
119                         dico[k] = None
120
121         return dico
122
123     def isBLOC(self):
124         """
125             Indique si l'objet est un BLOC
126         """
127         return 1
128
129     def accept(self, visitor):
130         """
131            Cette methode permet de parcourir l'arborescence des objets
132            en utilisant le pattern VISITEUR
133         """
134         visitor.visitMCBLOC(self)
135
136     def makeobjet(self):
137         return self.definition(val=None,  nom=self.nom, parent=self.parent)