Salome HOME
PN
[tools/eficas.git] / Ihm / I_MCLIST.py
1 # -*- coding: utf-8 -*-
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 import types,traceback
22 from copy import copy
23 import CONNECTOR
24
25 class MCList:
26   def isMCList(self):
27     """ 
28        Retourne 1 si self est une MCList (liste de mots-clés), 0 sinon (défaut) 
29     """
30     return 1
31
32   def get_index(self,objet):
33     """
34         Retourne la position d'objet dans la liste self
35     """
36     return self.data.index(objet)
37
38   def ajout_possible(self):
39     """ 
40         Méthode booléenne qui retourne 1 si on peut encore ajouter une occurrence
41         de l'élément que contient self, 0 sinon 
42     """
43     max = self.data[0].definition.max
44     if max == '**':
45       return 1
46     else:
47       if len(self) < max :
48         return 1
49       else:
50         return 0
51
52   def isrepetable(self):
53     """
54        Indique si l'objet est répétable.
55        Retourne 1 si le mot-clé facteur self peut être répété
56        Retourne 0 dans le cas contraire
57     """
58     if self.data[0].definition.max > 1:
59        # marche avec '**'
60        return 1
61     else :
62        return 0
63
64   def isoblig(self):
65      """
66      Une MCList n'est jamais obligatoire (même si le MCFACT qu'elle représente l'est
67      """
68      return self.data[0].definition.statut=='o'
69   
70   def suppentite(self,obj):
71       """
72         Supprime le mot cle facteur obj de la MCLIST
73       """
74       if obj not in self:
75          return 0
76
77       self.init_modif()
78       self.remove(obj)
79       CONNECTOR.Emit(self,"supp",obj)
80       self.update_condition_bloc()
81       obj.supprime()
82       self.fin_modif()
83       return 1
84
85   def addentite(self,obj,pos=None):
86       """
87         Ajoute le mot cle facteur obj a la MCLIST a la position pos
88         Retourne None si l'ajout est impossible
89       """
90       if type(obj)==types.StringType :
91          # on est en mode création d'un motcle
92          raise "traitement non prevu"
93
94       if not self.ajout_possible():
95          self.jdc.send_message("L'objet %s ne peut pas être ajouté" % obj.nom)
96          return None
97
98       if self.nom != obj.nom:
99          return None
100
101       if obj.isMCList():
102          obj=obj.data[0]
103
104       # Traitement du copier coller seulement 
105       # Les autres cas d'ajout sont traites dans MCFACT
106       self.init_modif()
107       obj.verif_existence_sd()
108       obj.reparent(self.parent)
109       if pos is None:
110          self.append(obj)
111       else:
112          self.insert(pos,obj)
113       CONNECTOR.Emit(self,"add",obj)
114       self.fin_modif()
115       self.update_condition_bloc()
116       return obj
117
118   def liste_mc_presents(self):
119     return []
120
121   def update_concept(self,sd):
122     for child in self.data :
123         child.update_concept(sd)
124
125   def delete_concept(self,sd):
126     """ 
127         Inputs :
128            - sd=concept detruit
129         Fonction : Mettre a jour les fils de l objet suite à la disparition 
130         du concept sd
131         Seuls les mots cles simples MCSIMP font un traitement autre 
132         que de transmettre aux fils
133     """
134     for child in self.data :
135       child.delete_concept(sd)
136
137   def replace_concept(self,old_sd,sd):
138     """
139         Inputs :
140            - old_sd=concept remplacé
141            - sd=nouveau concept
142         Fonction : Mettre a jour les fils de l objet suite au remplacement 
143         du concept old_sd
144     """
145     for child in self.data :
146       child.replace_concept(old_sd,sd)
147
148   def get_docu(self):
149     return self.data[0].definition.get_docu()
150
151   def get_liste_mc_inconnus(self):
152      """
153      Retourne la liste des mots-clés inconnus dans self
154      """
155      l_mc = []
156      for mcfact in self.data :
157         if mcfact.isvalid() : continue
158         l_child = mcfact.get_liste_mc_inconnus()
159         for mc in l_child:
160            l = [self]
161            l.extend(mc)
162            l_mc.append(l)
163      return l_mc
164
165   def verif_condition_regles(self,liste_presents):
166     """
167         Retourne la liste des mots-clés à rajouter pour satisfaire les règles
168         en fonction de la liste des mots-clés présents
169     """
170     # Sans objet pour une liste de mots clés facteurs
171     return []
172
173   def deep_update_condition_bloc(self):
174      """
175         Parcourt l'arborescence des mcobject et realise l'update
176         des blocs conditionnels par appel de la methode update_condition_bloc
177      """
178      #print "deep_update_condition_bloc",self
179      for mcfact in self.data :
180          mcfact.deep_update_condition_bloc()
181
182   def update_condition_bloc(self):
183      """
184         Propage la mise a jour des conditions au parent.
185         Une liste ne fait pas de traitement sur les conditions
186      """
187      if self.parent: self.parent.update_condition_bloc()
188
189   def verif_condition_bloc(self):
190     """ 
191         Evalue les conditions de tous les blocs fils possibles 
192         (en fonction du catalogue donc de la définition) de self et 
193         retourne deux listes :
194            - la première contient les noms des blocs à rajouter
195            - la seconde contient les noms des blocs à supprimer
196     """
197     # Sans objet pour une liste de mots clés facteurs (a voir !!!)
198     return [],[]
199
200   def init_modif(self):
201     """
202        Met l'état de l'objet à modified et propage au parent
203        qui vaut None s'il n'existe pas
204     """
205     self.state = 'modified'
206     if self.parent:
207       self.parent.init_modif()
208
209   def fin_modif(self):
210     """
211       Méthode appelée après qu'une modification a été faite afin de déclencher
212       d'éventuels traitements post-modification
213     """
214     #print "fin_modif",self
215     CONNECTOR.Emit(self,"valid")
216     if self.parent:
217       self.parent.fin_modif()
218
219   def get_genealogie(self):
220      """
221          Retourne la liste des noms des ascendants.
222          Un objet MCList n'est pas enregistré dans la genealogie.
223          XXX Meme si le MCFACT fils ne l'est pas lui non plus ????
224      """
225      if self.parent: 
226         return self.parent.get_genealogie()
227      else:
228         return []
229
230   def get_liste_mc_ordonnee_brute(self,liste,dico):
231      """
232          Retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
233          d'une entité composée dont le chemin complet est donné sous forme
234          d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
235      """
236      for arg in liste:
237         objet_cata = dico[arg]
238         dico=objet_cata.entites
239      return objet_cata.ordre_mc
240
241   def verif_existence_sd(self):
242      """
243         Vérifie que les structures de données utilisées dans self existent bien dans le contexte
244         avant étape, sinon enlève la référence à ces concepts
245      """
246      for motcle in self.data :
247          motcle.verif_existence_sd()
248
249   def get_fr(self):
250      """
251          Retourne la chaine d'aide contenue dans le catalogue
252          en tenant compte de la langue
253      """
254      try :
255         return self.data[0].get_fr()
256      except:
257         return ''
258
259   def normalize(self):
260      """
261         Retourne l'objet normalisé. Une liste est déjà normalisée
262      """
263      return self
264
265   def update_mc_global(self):
266      """
267         Met a jour les mots cles globaux enregistrés dans l'étape parente
268         et dans le jdc parent.
269         Une liste ne peut pas etre globale. Elle se contente de passer
270         la requete a ses fils.
271      """
272      for motcle in self.data :
273          motcle.update_mc_global()
274
275   def delete_mc_global(self):
276      for motcle in self.data :
277          motcle.delete_mc_global()
278
279   #def __del__(self):
280   #   print "__del__",self