Salome HOME
chgt Copyrigth
[tools/eficas.git] / Ihm / I_MCCOMPO.py
index c629886a94121949e3093c2218706026d777897c..7d764b8786e3dbfc6db0b2736e2edf0b0ac634aa 100644 (file)
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Copyright (C) 2007-2013   EDF R&D
+# Copyright (C) 2007-2021   EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
 #
 """
 """
+from __future__ import absolute_import
+from __future__ import print_function
 import string,types,sys
 from copy import copy
 import traceback
 
+import Validation
 from Extensions.i18n import tr
-from Noyau.N_MCLIST import MCList
 from Noyau.N_MCSIMP import MCSIMP
 from Noyau.N_MCFACT import MCFACT
 from Noyau.N_MCBLOC import MCBLOC
-import I_OBJECT
-import Validation
+from Noyau.N_MCLIST import MCList
+from . import I_OBJECT
 
-import CONNECTOR
+from . import CONNECTOR
 
 class MCCOMPO(I_OBJECT.OBJECT):
-  def getlabeltext(self):
+  def getLabelText(self):
     """ 
        Retourne le label de self 
        utilise pour l'affichage dans l'arbre
     """
-    return self.nom
+    return tr(self.nom)
 
-  def get_liste_mc_ordonnee(self,liste,dico):
+  def getListeMcOrdonnee(self,liste,dico):
     """
        Retourne la liste ordonnee (suivant le catalogue) des mots-cles
        d'une entite composee dont le chemin complet est donne sous forme
@@ -49,9 +51,9 @@ class MCCOMPO(I_OBJECT.OBJECT):
        il faut encore rearranger cette liste (certains mots-cles deja
        presents ne doivent plus etre proposes, regles ...)
     """
-    return self.filtre_liste_mc(self.get_liste_mc_ordonnee_brute(liste,dico))
+    return self.filtreListeMc(self.getListeMcOrdonneeBrute(liste,dico))
 
-  def get_liste_mc_ordonnee_brute(self,liste,dico):
+  def getListeMcOrdonneeBrute(self,liste,dico):
     """
        Retourne la liste ordonnee (suivant le catalogue) BRUTE des mots-cles
        d'une entite composee dont le chemin complet est donne sous forme
@@ -62,7 +64,7 @@ class MCCOMPO(I_OBJECT.OBJECT):
         dico=objet_cata.entites
         l=[]
         specifique=0
-        for obj in dico.keys() :
+        for obj in list(dico.keys()) :
             if not(hasattr(dico[obj],'cache')) or dico[obj].cache==0 :
                l.append(obj)
             else :
@@ -70,7 +72,7 @@ class MCCOMPO(I_OBJECT.OBJECT):
         if specifique == 1 : return l    
     return objet_cata.ordre_mc
 
-  def filtre_liste_mc(self,liste_brute):
+  def filtreListeMc(self,liste_brute):
     """ 
        Cette methode est appelee par EFICAS afin de presenter a 
        l'utilisateur la liste des enfants possibles de self actualisee 
@@ -80,17 +82,17 @@ class MCCOMPO(I_OBJECT.OBJECT):
        etre repetes
     """
     liste = copy(liste_brute)
-    liste_mc_presents = self.liste_mc_presents()
+    listeMcPresents = self.listeMcPresents()
     # on enleve les mots-cles non permis par les regles
     for regle in self.definition.regles:
-       # la methode purge_liste est a developper pour chaque regle qui
+       # la methode purgeListe est a developper pour chaque regle qui
        # influe sur la liste de choix a proposer a l'utilisateur
        # --> EXCLUS,UN_PARMI,PRESENT_ABSENT
-       liste = regle.purge_liste(liste,liste_mc_presents)
+       liste = regle.purgeListe(liste,listeMcPresents)
     # on enleve les mots-cles dont l'occurrence est deja atteinte
     liste_copy = copy(liste)
     for k in liste_copy:
-      objet = self.get_child(k,restreint = 'oui')
+      objet = self.getChild(k,restreint = 'oui')
       if objet != None :
         # l'objet est deja present : il faut distinguer plusieurs cas
         if isinstance(objet,MCSIMP):
@@ -112,19 +114,19 @@ class MCCOMPO(I_OBJECT.OBJECT):
             pass
         else :
           #XXX CCAR : les MCNUPLET ne sont pas traites
-          if CONTEXT.debug : print '   ',k,' est un objet de type inconnu :',type(objet)
+          if CONTEXT.debug : print('   ',k,' est un objet de type inconnu :',type(objet))
       else :
         # l'objet est absent : on enleve de la liste les blocs
         if self.definition.entites[k].statut=='c' :
           liste.remove(k)
         if self.definition.entites[k].label=='BLOC':
           liste.remove(k)
-    # Pour corriger les exces qui pourraient etre commis dans la methode purge_liste
+    # Pour corriger les exces qui pourraient etre commis dans la methode purgeListe
     # des regles, on essaie de compenser comme suit :
     # on ajoute les mots cles facteurs presents dont l'occurence n'est pas atteinte
-    for k in liste_mc_presents:
+    for k in listeMcPresents:
       if k in liste:continue
-      objet = self.get_child(k,restreint = 'oui')
+      objet = self.getChild(k,restreint = 'oui')
       if isinstance(objet,MCFACT):
           # un mot-cle facteur ne peut pas etre repete plus de self.max fois
           if objet.definition.max > 1:
@@ -135,25 +137,25 @@ class MCCOMPO(I_OBJECT.OBJECT):
               liste.append(k)
     return liste
 
-  def liste_mc_presents(self):
+  def listeMcPresents(self):
     """ 
        Retourne la liste des noms des mots-cles fils de self presents construite
-       a partir de self.mc_liste 
+       a partir de self.mcListe 
     """
     l=[]
-    for v in self.mc_liste:
+    for v in self.mcListe:
       k=v.nom
       l.append(k)
     return l
 
-  def get_index_child(self,nom_fils):
+  def getIndexChild(self,nom_fils):
       """
         Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
         Permet de savoir a quelle position il faut ajouter un nouveau mot-cle
       """
       cata_ordonne = self.jdc.cata_ordonne_dico
-      liste_noms_mc_ordonnee = self.get_liste_mc_ordonnee_brute(self.get_genealogie(),cata_ordonne)
-      liste_noms_mc_presents = self.liste_mc_presents()
+      liste_noms_mc_ordonnee = self.getListeMcOrdonneeBrute(self.getGenealogie(),cata_ordonne)
+      liste_noms_mc_presents = self.listeMcPresents()
       index=0
       for nom in liste_noms_mc_ordonnee:
           if nom == nom_fils:break
@@ -161,53 +163,86 @@ class MCCOMPO(I_OBJECT.OBJECT):
           index=index+1
       return index
           
-  def ordonne_liste_mc(self,liste_mc_a_ordonner,liste_noms_mc_ordonnee):
+  def chercheIndiceDsLeContenu(self,objet) :
+  # uniquement pour Pyxb
+  # ajoute la taille des les Blocs
+  # faut -il chercher plus loin ds les petits-enfants ?
+      if objet.nature == 'MCList' : objet=objet[0]
+      leRang=0
+      positionDsLaListe=0
+      try :
+        positionDsLaListe=self.mcListe.index(objet)
+        positionDsLaListeDeFactSiFact =0
+      except :
+        for mc in self.mcListe:
+           if mc.nature == 'MCList':
+              try :
+                positionDsLaListeDeFactSiFact=mc.index(objet)
+                break
+              except :
+                positionDsLaListe=positionDsLaListe+1
+           else : positionDsLaListe=positionDsLaListe+1
+      i=0
+      while i < positionDsLaListe :
+        leRang= leRang + self.mcListe[i].longueurDsArbre()
+        i=i+1
+      leRang=leRang+positionDsLaListeDeFactSiFact
+      return leRang
+
+  def ordonneListeMc(self,listeMc_a_ordonner,liste_noms_mc_ordonnee):
     """
-        Retourne liste_mc_a_ordonner ordonnee suivant l'ordre 
+        Retourne listeMc_a_ordonner ordonnee suivant l'ordre 
         donne par liste_noms_mc_ordonnee
     """
     liste = []
     # on transforme liste_a_ordonner en un dictionnaire (plus facile a consulter)
     d_mc = {}
-    for mc in liste_mc_a_ordonner:
+    for mc in listeMc_a_ordonner:
       d_mc[mc.nom]=mc
     # on construit la liste des objets ordonnes
     for nom_mc in liste_noms_mc_ordonnee:
-      if d_mc.has_key(nom_mc):
+      if nom_mc in d_mc:
         liste.append(d_mc.get(nom_mc))
     # on la retourne
     return liste
 
-  def suppentite(self,objet) :
+  def suppEntite(self,objet) :
     """ 
         Supprime le fils 'objet' de self : 
         Retourne 1 si la suppression a pu etre effectuee,
         Retourne 0 dans le cas contraire
     """
-    if not objet in self.mc_liste:
-       # Impossible de supprimer objet. Il n'est pas dans mc_liste
+    if not objet in self.mcListe:
+       # Impossible de supprimer objet. Il n'est pas dans mcListe
        return 0
 
-    self.init_modif()
-    self.mc_liste.remove(objet)
+    self.initModif()
+    objet.delObjPyxb()
+# PNPNPN a corriger
+    try :
+      objet.deleteRef()
+    except : pass
+    self.mcListe.remove(objet)
     CONNECTOR.Emit(self,"supp",objet)
-    objet.delete_mc_global()
-    objet.update_condition_bloc()
+    objet.deleteMcGlobal()
+    objet.updateConditionBloc()
     objet.supprime()
     self.etape.modified()
-    self.fin_modif()
+    self.finModif()
     return 1
 
-  def isoblig(self):
+  def isOblig(self):
       return 0
 
-  def addentite(self,name,pos=None):
+  def addEntite(self,name,pos=None):
       """ 
           Ajoute le mot-cle name a la liste des mots-cles de
           l'objet MCCOMPOSE
       """
-      self.init_modif()
-      if type(name)==types.StringType :
+      #print ('addEntite', name, pos)
+      self.initModif()
+      if type(name)==bytes or type(name) == str :
         # on est en mode creation d'un motcle 
         if self.ispermis(name) == 0 : return 0
         objet=self.definition.entites[name](val=None,nom=name,parent=self)
@@ -217,46 +252,52 @@ class MCCOMPO(I_OBJECT.OBJECT):
         # Appel de la methode qui fait le menage dans les references
         # sur les concepts produits (verification que les concepts existent
         # dans le contexte de la commande courante).
-        objet.verif_existence_sd()
+        objet.verifExistenceSd()
 
       # On verifie que l'ajout d'objet est autorise
       if self.ispermis(objet) == 0:
-        self.jdc.appli.affiche_alerte(tr("Erreur"),
+        self.jdc.editor.afficheAlerte(tr("Erreur"),
                                       tr("L'objet %(v_1)s ne peut  etre un fils de %(v_2)s",\
                                       {'v_1': objet.nom, 'v_2': self.nom}))
-        self.fin_modif()
+        self.finModif()
         return 0
 
       # On cherche s'il existe deja un mot cle de meme nom
-      old_obj = self.get_child(objet.nom,restreint = 'oui')
+      old_obj = self.getChild(objet.nom,restreint = 'oui')
       if not old_obj :
          # on normalize l'objet
          objet=objet.normalize()
          # Le mot cle n'existe pas encore. On l'ajoute a la position
          # demandee (pos)
          if pos == None :
-           self.mc_liste.append(objet)
+           self.mcListe.append(objet)
          else :
-           self.mc_liste.insert(pos,objet)
+           self.mcListe.insert(pos,objet)
          # Il ne faut pas oublier de reaffecter le parent d'obj (si copie)
          objet.reparent(self)
+         if  self.cata.modeleMetier :
+             if isinstance(objet,MCList): objet[0].addObjPyxb(self.chercheIndiceDsLeContenu(objet))
+             else : objet.addObjPyxb(self.chercheIndiceDsLeContenu(objet))
          CONNECTOR.Emit(self,"add",objet)
-         objet.update_mc_global()
-         objet.update_condition_bloc()
-         self.fin_modif()
+         objet.updateMcGlobal()
+         objet.updateConditionBloc()
+         self.finModif()
          return objet
       else:
          # Le mot cle existe deja. Si le mot cle est repetable,
          # on cree une liste d'objets. Dans le cas contraire,
          # on emet un message d'erreur.
-         if not old_obj.isrepetable():
-            self.jdc.appli.affiche_alerte(tr("Erreur"),tr("L'objet %s ne peut pas etre repete", objet.nom))
-            self.fin_modif()
+         if not old_obj.isRepetable():
+            self.jdc.editor.afficheAlerte(tr("Erreur"),tr("L'objet %s ne peut pas etre repete", objet.nom))
+            self.finModif()
             return 0
          else:
             # une liste d'objets de meme type existe deja
-            old_obj.addentite(objet)
-            self.fin_modif()
+            old_obj.addEntite(objet)
+            if  self.cata.modeleMetier :
+             if isinstance(objet,MCList): objet[0].addObjPyxb(self.chercheIndiceDsLeContenu(objet))
+             else : objet.addObjPyxb(self.chercheIndiceDsLeContenu(objet))
+            self.finModif()
             return old_obj
 
   def ispermis(self,fils):
@@ -265,30 +306,31 @@ class MCCOMPO(I_OBJECT.OBJECT):
         est bien permis, cad peut bien etre un fils de self, 
         Retourne 0 sinon 
     """
-    if type(fils) == types.StringType :
+    if type(fils) == bytes or type(fils) == str  :
       # on veut juste savoir si self peut avoir un fils de nom 'fils'
-      if self.definition.entites.has_key(fils):
+      if fils in self.definition.entites:
         return 1
       else :
         return 0
-    elif type(fils) == types.InstanceType:
+    #elif type(fils) == types.InstanceType:
+    elif isinstance(fils,object):
       # fils est un objet (commande,mcf,mclist)
       # on est dans le cas d'une tentative de copie de l'objet
       # on veut savoir si l'objet peut bien etre un fils de self :
       # la verification du nom de suffit pas (plusieurs commandes
       # ont le meme mot-cle facteur AFFE ... et c'est l'utilisateur
       # qui choisit le pere d'ou un risque d'erreur)
-      if not self.definition.entites.has_key(fils.nom):
+      if not fils.nom in self.definition.entites:
         return 0
       else:
         if fils.parent.nom != self.nom : return 0
       return 1
 
-  def update_concept(self,sd):
-    for child in self.mc_liste :
-        child.update_concept(sd)
+  def updateConcept(self,sd):
+    for child in self.mcListe :
+        child.updateConcept(sd)
 
-  def delete_concept(self,sd):
+  def deleteConcept(self,sd):
     """ 
         Inputs :
            - sd=concept detruit
@@ -298,10 +340,10 @@ class MCCOMPO(I_OBJECT.OBJECT):
         Seuls les mots cles simples MCSIMP font un traitement autre que 
         de transmettre aux fils
     """
-    for child in self.mc_liste :
-      child.delete_concept(sd)
+    for child in self.mcListe :
+      child.deleteConcept(sd)
 
-  def replace_concept(self,old_sd,sd):
+  def replaceConcept(self,old_sd,sd):
     """
         Inputs :
            - old_sd=concept remplace
@@ -310,10 +352,10 @@ class MCCOMPO(I_OBJECT.OBJECT):
         Mettre a jour les fils de l objet suite au remplacement  du
         concept old_sd
     """
-    for child in self.mc_liste :
-      child.replace_concept(old_sd,sd)
+    for child in self.mcListe :
+      child.replaceConcept(old_sd,sd)
 
-  def get_liste_mc_inconnus(self):
+  def getListeMcInconnus(self):
      """
      Retourne la liste des mots-cles inconnus dans self
      """
@@ -321,56 +363,69 @@ class MCCOMPO(I_OBJECT.OBJECT):
      if self.reste_val != {}:
         for k,v in self.reste_val.items() :
             l_mc.append([self,k,v])
-     for child in self.mc_liste :
-        if child.isvalid() : continue
-        l_child = child.get_liste_mc_inconnus()
+     for child in self.mcListe :
+        if child.isValid() : continue
+        l_child = child.getListeMcInconnus()
         for mc in l_child:
            l = [self]
            l.extend(mc)
            l_mc.append(l)
      return l_mc
 
-  def deep_update_condition_bloc(self):
+  def deepUpdateConditionBlocApresCreation(self):
+     # idem deepUpdateConditionBloc sauf qu on cherche les MC qui
+     # avait ete laisse de cote par la construction
+     #print ('Ihm deepUpdateConditionBloc', self.nom, self.reste_val)
+     if self.reste_val != {} : self.buildMcApresGlobal()
+     for mcobj in self.mcListe:
+        if mcobj.nature=="MCList" :
+           for obj in mcobj : obj.deepUpdateConditionBlocApresCreation() 
+        elif hasattr(mcobj,"deepUpdateConditionBlocApresCreation"):
+           mcobj.deepUpdateConditionBlocApresCreation()
+     
+
+  def deepUpdateConditionBloc(self):
      """
         Parcourt l'arborescence des mcobject et realise l'update 
-        des blocs conditionnels par appel de la methode update_condition_bloc
+        des blocs conditionnels par appel de la methode updateConditionBloc
      """
-     self._update_condition_bloc()
-     for mcobj in self.mc_liste:
-        if hasattr(mcobj,"deep_update_condition_bloc"):
-           mcobj.deep_update_condition_bloc()
+     self._updateConditionBloc()
+     for mcobj in self.mcListe:
+        if hasattr(mcobj,"deepUpdateConditionBloc"):
+           mcobj.deepUpdateConditionBloc()
 
-  def update_condition_bloc(self):
+  def updateConditionBloc(self):
      """
         Realise l'update des blocs conditionnels fils de self
         et propage au parent
      """
-     self._update_condition_bloc()
-     if self.parent:self.parent.update_condition_bloc()
+     self._updateConditionBloc()
+     if self.parent:self.parent.updateConditionBloc()
 
-  def _update_condition_bloc(self):
+  def _updateConditionBloc(self):
      """
         Realise l'update des blocs conditionnels fils de self
      """
-     dict = self.cree_dict_condition(self.mc_liste,condition=1)
+     dict = self.creeDictCondition(self.mcListe,condition=1)
+     #print ('_updateConditionBloc', dict)
      for k,v in self.definition.entites.items():
         if v.label != 'BLOC' :continue
         globs= self.jdc and self.jdc.condition_context or {}
-        bloc=self.get_child(k,restreint = 'oui')
-        presence=v.verif_presence(dict,globs)
+        bloc=self.getChild(k,restreint = 'oui')
+        presence=v.verifPresence(dict,globs)
         if presence and not bloc:
            # le bloc doit etre present
            # mais le bloc n'est pas present et il doit etre cree
            #print "AJOUT BLOC",k
-           pos=self.get_index_child(k)
-           self.addentite(k,pos)
+           pos=self.getIndexChild(k)
+           self.addEntite(k,pos)
         if not presence and bloc:
            # le bloc devrait etre absent
            # le bloc est present : il faut l'enlever
            #print "SUPPRESSION BLOC",k,bloc
-           self.suppentite(bloc)
+           self.suppEntite(bloc)
 
-  def verif_condition_bloc(self):
+  def verifConditionBloc(self):
     """ 
         Evalue les conditions de tous les blocs fils possibles 
         (en fonction du catalogue donc de la definition) de self
@@ -380,49 +435,50 @@ class MCCOMPO(I_OBJECT.OBJECT):
     """
     liste_ajouts = []
     liste_retraits = []
-    dict = self.cree_dict_condition(self.mc_liste,condition=1)
+    dict = self.creeDictCondition(self.mcListe,condition=1)
     for k,v in self.definition.entites.items():
       if v.label=='BLOC' :
         globs= self.jdc and self.jdc.condition_context or {}
-        if v.verif_presence(dict,globs):
+        if v.verifPresence(dict,globs):
           # le bloc doit etre present
-          if not self.get_child(k,restreint = 'oui'):
+          if not self.getChild(k,restreint = 'oui'):
             # le bloc n'est pas present et il doit etre cree
             liste_ajouts.append(k)
         else :
           # le bloc doit etre absent
-          if self.get_child(k,restreint = 'oui'):
+          if self.getChild(k,restreint = 'oui'):
             # le bloc est present : il faut l'enlever
             liste_retraits.append(k)
     return liste_ajouts,liste_retraits
 
-  def verif_existence_sd(self):
+  def verifExistenceSd(self):
      """
         Verifie que les structures de donnees utilisees dans self existent bien dans le contexte
         avant etape, sinon enleve la reference a ces concepts
      """
-     for motcle in self.mc_liste :
-         motcle.verif_existence_sd()
+     for motcle in self.mcListe :
+         motcle.verifExistenceSd()
 
-  def update_mc_global(self):
+  def updateMcGlobal(self):
      """
         Met a jour les mots cles globaux enregistres dans l'etape parente 
         et dans le jdc parent.
         Un mot cle compose ne peut pas etre global. Il se contente de passer
         la requete a ses fils.
      """
-     for motcle in self.mc_liste :
-         motcle.update_mc_global()
+     for motcle in self.mcListe :
+         motcle.updateMcGlobal()
 
-  def delete_mc_global(self):
-     for motcle in self.mc_liste :
-         motcle.delete_mc_global()
+  def deleteMcGlobal(self):
+     for motcle in self.mcListe :
+         motcle.deleteMcGlobal()
      try :
-         motcle.update_mc_global()
+         motcle.updateMcGlobal()
      except :
-       pass
+         pass
 
-  def init_modif_up(self):
-    Validation.V_MCCOMPO.MCCOMPO.init_modif_up(self)
+  def initModifUp(self):
+    Validation.V_MCCOMPO.MCCOMPO.initModifUp(self)
     CONNECTOR.Emit(self,"valid")
 
+