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.
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.
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.
20 # ======================================================================
26 from Noyau.N_MCLIST import MCList
27 from Noyau.N_MCSIMP import MCSIMP
28 from Noyau.N_MCFACT import MCFACT
29 from Noyau.N_MCBLOC import MCBLOC
32 class MCCOMPO(I_OBJECT.OBJECT):
33 def getlabeltext(self):
35 Retourne le label de self suivant qu'il s'agit d'un MCFACT,
36 d'un MCBLOC ou d'un MCFACT appartenant à une MCList :
37 utilisée pour l'affichage dans l'arbre
39 objet = self.parent.get_child(self.nom)
40 # objet peut-être self ou une MCList qui contient self ...
41 if isinstance(objet,MCList) :
42 index = objet.get_index(self)+1 # + 1 à cause de la numérotation qui commence à 0
43 label = self.nom +'_'+`index`+':'
48 def get_liste_mc_ordonnee(self,liste,dico):
50 Retourne la liste ordonnée (suivant le catalogue) des mots-clés
51 d'une entité composée dont le chemin complet est donné sous forme
52 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
53 il faut encore réarranger cette liste (certains mots-clés déjà
54 présents ne doivent plus être proposés, règles ...)
56 return self.filtre_liste_mc(self.get_liste_mc_ordonnee_brute(liste,dico))
58 def get_liste_mc_ordonnee_brute(self,liste,dico):
60 Retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
61 d'une entité composée dont le chemin complet est donné sous forme
62 d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
65 objet_cata = dico[arg]
66 dico=objet_cata.entites
67 return objet_cata.ordre_mc
69 def filtre_liste_mc(self,liste_brute):
71 Cette méthode est appelée par EFICAS afin de présenter à
72 l'utilisateur la liste des enfants possibles de self actualisée
73 en fonction du contexte de self. En clair, sont supprimés de la
74 liste des possibles (fournie par la définition), les mots-clés
75 exclus par les règles de self et les mots-clés ne pouvant plus
78 liste = copy(liste_brute)
79 liste_mc_presents = self.liste_mc_presents()
80 # on enlève les mots-clés non permis par les règles
81 for regle in self.definition.regles:
82 # la méthode purge_liste est à développer pour chaque règle qui
83 # influe sur la liste de choix à proposer à l'utilisateur
84 # --> EXCLUS,UN_PARMI,PRESENT_ABSENT
85 liste = regle.purge_liste(liste,liste_mc_presents)
86 # on enlève les mots-clés dont l'occurrence est déjà atteinte
87 liste_copy = copy(liste)
89 objet = self.get_child(k,restreint = 'oui')
91 # l'objet est déjà présent : il faut distinguer plusieurs cas
92 if isinstance(objet,MCSIMP):
93 # un mot-clé simple ne peut pas être répété
95 elif isinstance(objet,MCBLOC):
96 # un bloc conditionnel ne doit pas apparaître dans la liste de choix
98 elif isinstance(objet,MCFACT):
99 # un mot-clé facteur ne peut pas être répété plus de self.max fois
100 if objet.definition.max == 1:
102 elif isinstance(objet,MCList):
104 nb_occur_maxi = objet[0].definition.max
105 if len(objet) >= nb_occur_maxi:
110 #XXX CCAR : les MCNUPLET ne sont pas traités
111 if CONTEXT.debug : print ' ',k,' est un objet de type inconnu :',type(objet)
113 # l'objet est absent : on enlève de la liste les blocs
114 if self.definition.entites[k].statut=='c' :
116 if self.definition.entites[k].label=='BLOC':
118 # Pour corriger les exces qui pourraient etre commis dans la methode purge_liste
119 # des regles, on essaie de compenser comme suit :
120 # on ajoute les mots cles facteurs presents dont l'occurence n'est pas atteinte
121 for k in liste_mc_presents:
122 if k in liste:continue
123 objet = self.get_child(k,restreint = 'oui')
124 if isinstance(objet,MCFACT):
125 # un mot-clé facteur ne peut pas être répété plus de self.max fois
126 if objet.definition.max > 1:
128 elif isinstance(objet,MCList):
129 nb_occur_maxi = objet[0].definition.max
130 if len(objet) < nb_occur_maxi:
134 def liste_mc_presents(self):
136 Retourne la liste des noms des mots-clés fils de self présents construite
137 à partir de self.mc_liste
140 for v in self.mc_liste:
145 def ordonne_liste_mc(self,liste_mc_a_ordonner,liste_noms_mc_ordonnee):
147 Retourne liste_mc_a_ordonner ordonnée suivant l'ordre
148 donné par liste_noms_mc_ordonnee
151 # on transforme liste_a_ordonner en un dictionnaire (plus facile à consulter)
153 for mc in liste_mc_a_ordonner:
155 # on construit la liste des objets ordonnés
156 for nom_mc in liste_noms_mc_ordonnee:
157 if d_mc.has_key(nom_mc):
158 liste.append(d_mc.get(nom_mc))
162 def suppentite(self,objet) :
164 Supprime le fils 'objet' de self :
165 Retourne 1 si la suppression a pu être effectuée,
166 Retourne 0 dans le cas contraire
169 if not objet in self.mc_liste:
170 # Impossible de supprimer objet. Il n'est pas dans mc_liste
175 if hasattr(objet.definition,'position'):
176 if objet.definition.position == 'global' :
177 self.delete_mc_global(objet)
178 elif objet.definition.position == 'global_jdc' :
179 self.delete_mc_global_jdc(objet)
180 self.mc_liste.remove(objet)
190 def addentite(self,name,pos=None):
192 Ajoute le mot-cle name à la liste des mots-cles de
196 if type(name)==types.StringType :
197 # on est en mode création d'un motcle
198 if self.ispermis(name) == 0 : return 0
199 objet=self.definition.entites[name](val=None,nom=name,parent=self)
200 if hasattr(objet.definition,'position'):
201 if objet.definition.position == 'global' :
202 self.append_mc_global(objet)
203 elif objet.definition.position == 'global_jdc' :
204 self.append_mc_global_jdc(objet)
206 # dans ce cas on est en mode copie d'un motcle
208 objet.verif_existence_sd()
209 # si un objet de même nom est déjà présent dans la liste
210 # et si l'objet est répétable
211 # il faut créer une MCList et remplacer l'objet de la liste
213 test1 = objet.isrepetable()
214 old_obj = self.get_child(objet.nom,restreint = 'oui')
215 test2 = self.ispermis(objet)
216 #print "test1,test2=",test1,test2
217 if test1 == 0 and old_obj :
218 self.jdc.send_message("L'objet %s ne peut pas être répété" %objet.nom)
222 self.jdc.send_message("L'objet %s ne peut être un fils de %s" %(objet.nom,self.nom))
227 #if not isinstance(old_obj,MCList):
228 if not old_obj.isMCList():
229 # un objet de même nom existe déjà mais ce n'est pas une MCList
230 # Il faut en créer une
231 # L'objet existant (old_obj) est certainement un MCFACT
232 # qui pointe vers un constructeur
233 # de MCList : definition.liste_instance
234 #print "un objet de même type existe déjà"
235 index = self.mc_liste.index(old_obj)
236 #XXX remplacé par definition.list_instance : new_obj = MCList()
237 new_obj = old_obj.definition.list_instance()
238 new_obj.init(objet.nom,self)
239 new_obj.append(old_obj)
240 new_obj.append(objet)
241 # Il ne faut pas oublier de reaffecter le parent d'obj
243 self.mc_liste.remove(old_obj)
244 self.mc_liste.insert(index,new_obj)
248 # une liste d'objets de même type existe déjà
249 #print "une liste d'objets de même type existe déjà"
250 old_obj.append(objet)
251 # Il ne faut pas oublier de reaffecter le parent d'obj
256 self.mc_liste.append(objet)
258 self.mc_liste.insert(pos,objet)
259 # Il ne faut pas oublier de reaffecter le parent d'obj (si copie)
264 def ispermis(self,fils):
266 Retourne 1 si l'objet de nom nom_fils
267 est bien permis, cad peut bien être un fils de self,
270 if type(fils) == types.StringType :
271 # on veut juste savoir si self peut avoir un fils de nom 'fils'
272 if self.definition.entites.has_key(fils):
276 elif type(fils) == types.InstanceType:
277 # fils est un objet (commande,mcf,mclist)
278 # on est dans le cas d'une tentative de copie de l'objet
279 # on veut savoir si l'objet peut bien être un fils de self :
280 # la vérification du nom de suffit pas (plusieurs commandes
281 # ont le même mot-clé facteur AFFE ... et c'est l'utilisateur
282 # qui choisit le père d'où un risque d'erreur)
283 if not self.definition.entites.has_key(fils.nom):
286 if fils.parent.nom != self.nom : return 0
289 def liste_mc_presents(self):
291 Retourne la liste des noms des mots-clés fils de self présents
292 construite à partir de self.mc_liste
295 for v in self.mc_liste:
300 def delete_concept(self,sd):
305 Mettre a jour les fils de l objet suite à la disparition du
307 Seuls les mots cles simples MCSIMP font un traitement autre que
308 de transmettre aux fils
310 for child in self.mc_liste :
311 child.delete_concept(sd)
313 def replace_concept(self,old_sd,sd):
316 - old_sd=concept remplace
317 - sd = nouveau concept
319 Mettre a jour les fils de l objet suite au remplacement du
322 for child in self.mc_liste :
323 child.replace_concept(old_sd,sd)
325 def delete_mc_global(self,mc):
327 Supprime le mot-clé mc de la liste des mots-clés globaux de l'étape
329 etape = self.get_etape()
332 del etape.mc_globaux[nom]
334 def delete_mc_global_jdc(self,mc):
336 Supprime le mot-clé mc de la liste des mots-clés globaux du jdc
339 del self.jdc.mc_globaux[nom]
341 def get_liste_mc_inconnus(self):
343 Retourne la liste des mots-clés inconnus dans self
346 if self.reste_val != {}:
347 for k,v in self.reste_val.items() :
348 l_mc.append([self,k,v])
349 for child in self.mc_liste :
350 if child.isvalid() : continue
351 l_child = child.get_liste_mc_inconnus()
358 def verif_condition_bloc(self):
360 Evalue les conditions de tous les blocs fils possibles
361 (en fonction du catalogue donc de la définition) de self
362 et retourne deux listes :
363 - la première contient les noms des blocs à rajouter
364 - la seconde contient les noms des blocs à supprimer
368 dict = self.cree_dict_condition(self.mc_liste)
369 for k,v in self.definition.entites.items():
371 globs= self.jdc and self.jdc.condition_context or {}
372 if v.verif_presence(dict,globs):
373 # le bloc doit être présent
374 if not self.get_child(k,restreint = 'oui'):
375 # le bloc n'est pas présent et il doit être créé
376 liste_ajouts.append(k)
378 # le bloc doit être absent
379 if self.get_child(k,restreint = 'oui'):
380 # le bloc est présent : il faut l'enlever
381 liste_retraits.append(k)
382 return liste_ajouts,liste_retraits
384 def verif_existence_sd(self):
386 Vérifie que les structures de données utilisées dans self existent bien dans le contexte
387 avant étape, sinon enlève la référence à ces concepts
389 for motcle in self.mc_liste :
390 motcle.verif_existence_sd()