Salome HOME
19-07-16
[tools/eficas.git] / InterfaceQT4 / readercata.py
index 052d2f1d26d135918e93a15256630393e42b7813..9137cd3e31990d0043ff055ff26c6d5dbf71f790 100644 (file)
@@ -1,23 +1,22 @@
 # -*- coding: utf-8 -*-
-#            CONFIGURATION MANAGEMENT OF EDF VERSION
-# ======================================================================
-# COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
-# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
-# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
-# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
-# (AT YOUR OPTION) ANY LATER VERSION.
+# Copyright (C) 2007-2013   EDF R&D
 #
-# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
-# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
-# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
-# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
 #
-# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
-# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
-#    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
 #
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
-# ======================================================================
 """
     Ce module sert a lire un catalogue et a construire
     un objet CataItem pour Eficas.
@@ -29,143 +28,166 @@ import os,sys,py_compile
 import traceback
 import cPickle
 import re
+import types
 
 # Modules Eficas
-import prefs
 from Noyau.N_CR import CR
-from Editeur.utils  import init_rep_cata_dev
+from Editeur.catadesc import CatalogDescription
 
-from Editeur    import analyse_catalogue
-from Editeur    import autre_analyse_cata
-from Editeur    import uiinfo
+import analyse_catalogue
+import analyse_catalogue_initial
+import autre_analyse_cata
+import uiinfo
 from monChoixCata import MonChoixCata
+from Extensions.i18n import tr
+from Extensions.eficas_exception import EficasException
+
+from determine import monEnvQT5
+if monEnvQT5 :
+   from PyQt5.QtWidgets import QMessageBox, QApplication, QDialog
+else :
+   from PyQt4.QtGui  import *
 
-from PyQt4 import *
-from PyQt4.QtGui import *
-from PyQt4.QtCore import *
 
-version="14"
 
 class READERCATA:
 
    def __init__(self,QWParent, appliEficas):
       self.QWParent=QWParent
       self.appliEficas=self.QWParent.appliEficas
+      self.VERSION_EFICAS=self.appliEficas.VERSION_EFICAS
       self.code=self.QWParent.code
-      self.QWParent.format_fichier='python'
+      self.ssCode=self.appliEficas.ssCode
+      self.appliEficas.format_fichier='python'
+      self.mode_nouv_commande=self.appliEficas.CONFIGURATION.mode_nouv_commande
       self.version_code=self.QWParent.version_code
       self.version_cata=None
       self.fic_cata=None
       self.OpenCata()
       self.cataitem=None
+      if self.code=="TELEMAC": self.cree_dico_inverse()
 
    def OpenCata(self):
       """ 
-          Ouvre le catalogue standard du code courant, cad le catalogue présent
-          dans le répertoire Cata 
+          Ouvre le catalogue standard du code courant, cad le catalogue present
+          dans le repertoire Cata 
       """
-      message1 = "Compilation des fichiers Eficas \n\n Veuillez patienter ..."
 
       liste_cata_possibles=[]
+      self.Commandes_Ordre_Catalogue=[]
+
+      all_cata_list = []
       for catalogue in self.appliEficas.CONFIGURATION.catalogues:
-          if catalogue[0] == self.code :
-             liste_cata_possibles.append(catalogue)
+          if isinstance(catalogue, CatalogDescription):
+              all_cata_list.append(catalogue)
+          elif isinstance(catalogue, types.TupleType):
+              all_cata_list.append(CatalogDescription.create_from_tuple(catalogue))
+          else:
+              print "Catalog description cannot be interpreted: ", catalogue
+
+      # This filter is only useful for codes that have subcodes (like MAP).
+      # Otherwise, the "code" attribute of the catalog description can (should) be None.
+      if self.ssCode is None:
+          liste_cata_possibles = all_cata_list
+      else:
+          for catalogue in all_cata_list:
+              if catalogue.code == self.code and catalogue.file_format == self.ssCode:
+                  liste_cata_possibles.append(catalogue)
 
       if len(liste_cata_possibles)==0:          
-          QMessageBox.critical( self.QWParent, "Import du catalogue","Pas de catalogue defini pour le code %s" % self.code)
+          QMessageBox.critical(self.QWParent, tr("Import du catalogue"),
+                               tr("Pas de catalogue defini pour le code ") + self.code)
           self.appliEficas.close()
-          sys.exit(1)
+          if self.appliEficas.salome == 0 :
+             sys.exit(1)
+          return
+
 
       if self.version_code is not None:
           # La version a ete fixee
           for cata in liste_cata_possibles:
-             if self.version_code == cata[1]:
-                self.fic_cata = cata[2]
-                self.appliEficas.format_fichier=cata[3]
-      elif len(liste_cata_possibles)==1:
-          self.fic_cata = liste_cata_possibles[0][2]
-          self.version_code = liste_cata_possibles[0][1]
-          self.QWParent.format_fichier=liste_cata_possibles[0][3] 
-          lab=QString("Eficas V1.") 
-          lab+=QString(version) 
-          lab+=QString(" pour ")
-          lab+=QString(self.code) 
-          lab+=QString(" avec le catalogue ")
-          lab+=self.version_code
-          try :
-          # souci pour les includes
-              self.appliEficas.setWindowTitle(lab)
-          except :
-              pass
+             if self.version_code == cata.identifier:
+                self.fic_cata = cata.cata_file_path
+                self.appliEficas.format_fichier = cata.file_format
+                self.appliEficas.format_fichier_in = cata.file_format_in
       else:
-          # plusieurs catalogues sont disponibles : il faut demander a l'utilisateur
-          # lequel il veut utiliser ...
-          self.ask_choix_catalogue()
+          cata_choice_list = []
+          for cata in liste_cata_possibles:
+              if cata.selectable:
+                  if cata.default:
+                      cata_choice_list.insert(0, cata)
+                  else :
+                      cata_choice_list.append(cata)
+          if len(cata_choice_list) == 0:
+              QMessageBox.critical(self.QWParent, tr("Import du catalogue"),
+                                   tr("Aucun catalogue trouve"))
+              self.appliEficas.close()
+              if self.appliEficas.salome == 0 :
+                 sys.exit(1)
+          elif len(cata_choice_list) == 1:
+              self.fic_cata = cata_choice_list[0].cata_file_path
+              self.version_code = cata_choice_list[0].identifier
+              self.appliEficas.format_fichier = cata_choice_list[0].file_format
+              self.appliEficas.format_fichier_in = cata_choice_list[0].file_format_in
+          else:
+              # plusieurs catalogues sont disponibles : il faut demander a l'utilisateur
+              # lequel il veut utiliser ...
+              self.ask_choix_catalogue(cata_choice_list)
 
       if self.fic_cata == None :
-          print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
-          sys.exit(0)
+          if self.appliEficas.salome == 0 :
+             print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
+             sys.exit(1)
+          else :
+             self.appliEficas.close()
+             return
 
-      self.determineMater()
-
-
-      # détermination de fic_cata_c et fic_cata_p
-      self.fic_cata_c = self.fic_cata + 'c'
-      self.fic_cata_p = os.path.splitext(self.fic_cata)[0]+'_pickled.py'
+      if self.code == "ASTER" : self.determineMater()
 
       # import du catalogue
       self.cata = self.import_cata(self.fic_cata)
       if not self.cata :          
-          QMessageBox.critical( self.QWParent, "Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
+          QMessageBox.critical( self.QWParent, tr("Import du catalogue"),tr("Impossible d'importer le catalogue ")+ self.fic_cata)
          self.appliEficas.close()
-          sys.exit(1)
+          if self.appliEficas.salome == 0 :
+             sys.exit(1)
       #
-      # analyse du catalogue (ordre des mots-clés)
+      # analyse du catalogue (ordre des mots-cles)
       #
       # Retrouve_Ordre_Cata_Standard fait une analyse textuelle du catalogue
-      # remplacé par Retrouve_Ordre_Cata_Standard_autre qui utilise une numerotation
-      # des mots clés a la création
+      # remplace par Retrouve_Ordre_Cata_Standard_autre qui utilise une numerotation
+      # des mots cles a la creation
       self.Retrouve_Ordre_Cata_Standard_autre()
+      if self.mode_nouv_commande== "initial" : self.Retrouve_Ordre_Cata_Standard()
+      if hasattr(self.cata, 'Ordre_Des_Commandes') : self.Ordre_Des_Commandes=self.cata.Ordre_Des_Commandes
+      else : self.Ordre_Des_Commandes=None
+      
+      if hasattr(self.cata, 'Classement_Commandes_Ds_Arbre') : 
+             self.Classement_Commandes_Ds_Arbre=self.cata.Classement_Commandes_Ds_Arbre
+      else : self.Classement_Commandes_Ds_Arbre=()
+      #print self.cata.Ordre_Des_Commandes
 
       #
-      # analyse des données liées a  l'IHM : UIinfo
+      # analyse des donnees liees l'IHM : UIinfo
       #
       uiinfo.traite_UIinfo(self.cata)
 
       #
       # traitement des clefs documentaires
       #
-      self.traite_clefs_documentaires()
+      if self.code == "ASTER" : self.traite_clefs_documentaires()
+      self.cata=(self.cata,)
 
-      # chargement et analyse des catalogues développeur (le cas échéant)
-      #
-      if self.appliEficas.CONFIGURATION.isdeveloppeur == 'OUI' :
-          init_rep_cata_dev(self.fic_cata,self.appliEficas.CONFIGURATION.path_cata_dev)
-          fic_cata_dev = os.path.join(self.appliEficas.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
-          if os.path.isfile(fic_cata_dev):
-              # il y a bien un catalogue développeur : il faut récupérer le module_object associé ...
-              test = self.compile_cata(fic_cata_dev,fic_cata_dev+'c')
-              if not test :
-                  showinfo("Compilation catalogue développeur",
-                           "Erreur dans la compilation du catalogue développeur")
-                  self.cata = (self.cata,)
-              else:
-                  self.cata_dev =self.import_cata(fic_cata_dev)
-                  #self.Retrouve_Ordre_Cata_Developpeur()
-                  self.Retrouve_Ordre_Cata_Developpeur_autre()
-                  self.cata = (self.cata,self.cata_dev)
-          else:
-              self.cata = (self.cata,)
-      else:
-          self.cata = (self.cata,)
-      titre="Eficas V1.14 avec le catalogue " + os.path.basename(self.fic_cata)
+      self.titre=self.VERSION_EFICAS+" "+tr( " avec le catalogue ") + os.path.basename(self.fic_cata)
       if self.appliEficas.top:
-        self.appliEficas.setWindowTitle(titre)
-      self.appliEficas.titre=titre
+        self.appliEficas.setWindowTitle(self.titre)
+      self.appliEficas.titre=self.titre
+      self.QWParent.titre=self.titre
 
    def determineMater(self) :
       # Determinination du repertoire materiau
       v_codeSansPoint=self.version_code
+      if v_codeSansPoint == None : return 
       v_codeSansPoint=re.sub("\.","",v_codeSansPoint)
       chaine="rep_mat_"+v_codeSansPoint
       if hasattr(self.appliEficas.CONFIGURATION,chaine):
@@ -181,11 +203,35 @@ class READERCATA:
 
    def import_cata(self,cata):
       """ 
-          Réalise l'import du catalogue dont le chemin d'acca¨s est donné par cata
+          Realise l'import du catalogue dont le chemin d'acces est donne par cata
       """
       nom_cata = os.path.splitext(os.path.basename(cata))[0]
       rep_cata = os.path.dirname(cata)
       sys.path[:0] = [rep_cata]
+      self.appliEficas.listeAEnlever.append(rep_cata)
+
+      
+      if sys.modules.has_key(nom_cata):
+        del sys.modules[nom_cata]
+      for k in sys.modules.keys():
+        if k[0:len(nom_cata)+1] == nom_cata+'.':
+          del sys.modules[k]
+
+      mesScriptsNomFichier='mesScripts_'+self.code.upper()
+      if self.code == "ASTER" :
+         self.appliEficas.rep_scripts=os.path.join(rep_cata,nom_cata)
+         sys.path[:0] = [self.appliEficas.rep_scripts]
+         try :
+             self.appliEficas.mesScripts[self.code]=__import__(mesScriptsNomFichier)
+         except:
+             pass
+         sys.path=sys.path[1:]
+      else :
+         try :
+            self.appliEficas.mesScripts[self.code]=__import__(mesScriptsNomFichier)
+         except:
+            pass
+
       try :
           o=__import__(nom_cata)
           return o
@@ -193,197 +239,137 @@ class READERCATA:
           traceback.print_exc()
           return 0
 
+
+
    def Retrouve_Ordre_Cata_Standard_autre(self):
       """ 
-          Construit une structure de données dans le catalogue qui permet
-          a  EFICAS de retrouver l'ordre des mots-clés dans le texte du catalogue.
-          Pour chaque entité du catlogue on crée une liste de nom ordre_mc qui
-          contient le nom des mots clés dans le bon ordre
+          Construit une structure de donnees dans le catalogue qui permet
+          a EFICAS de retrouver l'ordre des mots-cles dans le texte du catalogue.
+          Pour chaque entite du catlogue on cree une liste de nom ordre_mc qui
+          contient le nom des mots cles dans le bon ordre
       """ 
       self.cata_ordonne_dico,self.appliEficas.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
+      #print self.cata_ordonne_dico,self.appliEficas.liste_simp_reel
 
    def Retrouve_Ordre_Cata_Standard(self):
       """ 
-          Retrouve l'ordre des mots-clés dans le catalogue, cad :
-           - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
-               l'ordre des mots-clés dans le catalogue
-           - s'il n'a pas été modifié, relie le fichier pickle 
-      """
-      time1 = os.path.getmtime(self.fic_cata)
-      try :
-          time2 = os.path.getmtime(self.fic_cata_p)
-      except:
-          time2 = 0
-      if time2 > time1 :
-          # l'objet catalogue n'a pas été modifié depuis le dernier "pickle"
-          self.Get_Ordre_Cata()
-      else :
-          # le catalogue a été modifié depuis le dernier "pickle" :
-          # il faut retrouver l'ordre du catalogue et refaire pickle
-          self.Get_Ordre_Cata(mode='cata')
-      self.appliEficas.affiche_infos("Catalogue standard chargé")
-
-   def Retrouve_Ordre_Cata_Developpeur(self):
-      """ 
-          Retrouve l'ordre des mots-clés dans le catalogue, cad :
-          - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
-            l'ordre des mots-clés dans le catalogue
-          - s'il n'a pas été modifié, relie le fichier pickle 
-      """
-      if self.code != 'ASTER' : return
-      fic_cata = os.path.join(self.appliEficas.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
-      message="Chargement catalogue développeur présent dans :\n %s..." % self.appliEficas.CONFIGURATION.path_cata_dev
-      cata_dev_ordonne = analyse_cata.analyse_catalogue(self,self.fic_cata)
-      self.cata_dev_ordonne_cr = cata_dev_ordonne.cr
-      cata_dev_ordonne_dico = cata_dev_ordonne.entites
-      self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
-      self.appliEficas.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
-
-   def Retrouve_Ordre_Cata_Developpeur_autre(self):
+          Retrouve l'ordre des mots-cles dans le catalogue, cad :
+          Attention s appuie sur les commentaires
       """
-          Retrouve l'ordre des mots-clés dans le catalogue, cad :
-          - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
-            l'ordre des mots-clés dans le catalogue
-          - s'il n'a pas été modifié, relie le fichier pickle
-      """
-      if self.code != 'ASTER' : return
-      message="Chargement catalogue développeur présent dans :\n %s..." % self.appliEficas.CONFIGURATION.path_cata_dev
-      cata_dev_ordonne_dico,self.appliEficas.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
-      self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
-      self.appliEficas.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
+      nom_cata = os.path.splitext(os.path.basename(self.fic_cata))[0]
+      rep_cata = os.path.dirname(self.fic_cata)
+      self.Commandes_Ordre_Catalogue = analyse_catalogue_initial.analyse_catalogue(self.fic_cata)
+      #print self.Commandes_Ordre_Catalogue
 
-   def Get_Ordre_Cata(self,mode='pickle'):
-      """ 
-          Retrouve l'ordre du catalogue :
-            - mode='pickle ': tente de relire le fichier pickle et sinon lance l'analyse du catalogue
-            - mode='cata'   : force l'analyse du catalogue directement sans relire le pickle
+   def ask_choix_catalogue(self, cata_choice_list):
       """
-      if mode == 'pickle' :
-          try:
-              f = open(self.fic_cata_p)
-              u = cPickle.Unpickler(f)
-              self.cata_ordonne_dico = u.load()
-              f.close()
-          except :
-              # on peut ne pas arriver a  relire le fichier pickle s'il a été altéré
-              # ou (le plus probable) s'il a été créé sous un autre OS
-              self.Get_Ordre_Cata(mode='cata')
-      elif mode == 'cata':
-          cata_ordonne = analyse_catalogue.analyse_catalogue(self,self.fic_cata)
-          self.cata_ordonne_cr = cata_ordonne.cr
-          self.cata_ordonne_dico = cata_ordonne.entites
-          f = open(self.fic_cata_p,'w+')
-          p = cPickle.Pickler(f)
-          p.dump(self.cata_ordonne_dico)
-          f.close()
-      else :
-          raise Exception("Appel a  un mode inconnu de Get_Ordre_Cata : %s" % mode)
-          return
-
-   def ask_choix_catalogue(self):
-      """
-      Ouvre une fenetre de sélection du catalogue dans le cas oa¹ plusieurs
-      ont été définis dans Accas/editeur.ini
+      Ouvre une fenetre de selection du catalogue dans le cas où plusieurs
+      ont ete definis dans Accas/editeur.ini
       """      
-      # construction du dictionnaire et de la liste des catalogues
-      self.dico_catalogues = {}
-      defaut = None
-      for catalogue in self.appliEficas.CONFIGURATION.catalogues:
-          if catalogue[0] == self.code :
-              self.dico_catalogues[catalogue[1]] = catalogue
-              if len(catalogue) == 5 :
-                  if catalogue[4]=='defaut' : defaut = catalogue[1]
-      liste_choix = self.dico_catalogues.keys()
-      liste_choix.sort()
-
-      lab=QString("Eficas V1.") 
-      lab+=QString(version) 
-      lab+=QString(" pour ")
-      lab+=QString(self.code) 
-      lab+=QString(" avec le catalogue ")
-
-      # teste si plusieurs catalogues ou non
-      if len(liste_choix) == 0:          
-          QMessageBox.critical( self.QWParent, "", "Aucun catalogue déclaré pour %s" %self.code)
-         self.appliEficas.close()
-          sys.exit(1)
-          
-      # création d'une boite de dialogue modale
-      widgetChoix=MonChoixCata(liste_choix,self, self.appliEficas, "", True )
+      code = getattr(self.appliEficas.CONFIGURATION, "code", None)
+      if code != None : 
+          title=tr("Choix d une version du code ")+str(code)
+      else :
+          title=tr("Choix d une version ")
+    
+      widgetChoix = MonChoixCata(self.appliEficas, [cata.user_name for cata in cata_choice_list], title)
       ret=widgetChoix.exec_()
       
-      lab=QString("Eficas V1.") 
-      lab+=QString(version) 
-      lab+=QString(" pour ")
-      lab+=QString(self.code) 
-      lab+=QString(" avec le catalogue ")
+      lab=str(self.VERSION_EFICAS)+" "
+      lab+=tr(" pour ")
+      lab+=str(self.code) 
+      lab+=tr(" avec le catalogue ")
       if ret == QDialog.Accepted:
-          self.version_cata=str(self.version_cata)
-          self.fic_cata = self.dico_catalogues[self.version_cata][2]
+          cata = cata_choice_list[widgetChoix.CBChoixCata.currentIndex()]
+          self.version_cata = cata.identifier
+          self.fic_cata = cata.cata_file_path
           self.version_code = self.version_cata
-          self.appliEficas.format_fichier = self.dico_catalogues[self.version_cata][3]
+          self.appliEficas.format_fichier = cata.file_format
+          self.appliEficas.format_fichier_in = cata.file_format_in
           lab+=self.version_cata
           self.appliEficas.setWindowTitle(lab)
           #qApp.mainWidget().setCaption(lab)
-      else :
-          sys.exit(0)
-
-
-   def compile_cata(self,cata,catac):
-      """ 
-           Teste si le catalogue a bien besoin d'etre recompilé et si oui, le compile et
-           affiche un message dans le splash . Retourne 1 si la compilation s'est bien déroulée,
-           0 sinon.
-      """
-      time1 = os.path.getmtime(cata)
-      try:
-          time2 = os.path.getmtime(catac)
-      except:
-          time2 = 0
-      if time1 > time2:
-          try:
-              # le catalogue doit etre recompilé avant d'etre importé
-              if self.QWParent.test == 0 :
-                 splash._splash.configure(text="Compilation du catalogue\nCela peut prendre plusieurs secondes ...")
-              py_compile.compile(cata)
-          except:
-              return 0
-      return 1
-
-
-
-   def visuCRCATA(self):
-      """
-      Méthode permettant l'affichage du rapport de validation
-      """
-      cr = CR( debut = "Début rapport de validation du catalogue",
-               fin = "Fin rapport de validation du catalogue")
-      titre="rapport de validation du catalogue"
-      if hasattr(self,'cata_ordonne_cr') :
-          cr.add(self.cata_ordonne_cr)
-      if hasattr(self,'cata_dev_ordonne_cr') :
-          cr.add(self.cata_dev_ordonne_cr)
-      for cata in self.cata:
-          if hasattr(cata,'JdC'):
-              cr.add(cata.JdC.report())
-      texte_cr = str(cr)
-      self.visu_texte_cr = Fenetre(self.appliEficas,titre=titre,texte=texte_cr)
-
+      else:
+          raise EficasException()
+        
 
    def traite_clefs_documentaires(self):
       try:
-        self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
-        f=open(self.fic_cata_clef)
+        fic_doc='rep_doc_'+str(self.version_code)
+        self.fic_doc=getattr(self.appliEficas.CONFIGURATION,fic_doc )
+        f=open(self.fic_doc)
       except:
-        #print "Pas de fichier associé contenant des clefs documentaires"
+        print "Pas de fichier associe contenant des clefs documentaires"
         return
 
       dict_clef_docu={}
       for l in f.readlines():
           clef=l.split(':')[0]
-          docu=l.split(':')[1]
-          docu=docu[0:-1]
+          deb=l.find(':')+1
+          docu=l[deb:-1]
           dict_clef_docu[clef]=docu
       for oper in self.cata.JdC.commandes:
            if dict_clef_docu.has_key(oper.nom):
               oper.docu=dict_clef_docu[oper.nom]
+
+   def cree_dico_inverse(self):
+        self.dicoInverse={}
+        self.dicoMC={} 
+        listeEtapes=self.cata[0].JdC.commandes
+        for e in self.cata[0].JdC.commandes:
+        #for e in (self.cata[0].JdC.commandes[0],):
+            #print e.nom
+            self.traite_entite(e)
+        #for e in self.cata[0].JdC.commandes:
+        #    self.cree_rubrique(e,self.dico,0)
+        #print self.dicoInverse
+
+        #from Extensions import localisation
+        #app=QApplication
+        # tres dommage  A Revoir
+        #localisation.localise(app,"fr")
+        self.dicoInverseFrancais={}
+        self.dicoFrancaisAnglais={}
+        self.dicoAnglaisFrancais={}
+        for k in self.dicoInverse.keys():
+            listefr=[]
+            for nom, obj in self.dicoInverse[k] :
+                listefr.append((tr(nom),obj))
+                self.dicoFrancaisAnglais[tr(nom)]=nom
+                self.dicoAnglaisFrancais[nom]=tr(nom)
+            self.dicoInverseFrancais[tr(k)]=listefr
+            #print tr(k),listefr
+        if self.appliEficas.langue=="ang" : localisation.localise(app,"en")
+        
+         
+        
+   def traite_entite(self,e):
+       #print "_______________"
+       #print e
+       #print e.nom
+       boolIn=0
+       for (nomFils, fils) in e.entites.items() :
+          self.dicoMC[nomFils]=fils
+          self.traite_entite(fils)
+          boolIn=1
+       if boolIn==0 :
+          liste=[]
+          moi=e
+          while hasattr(moi,'pere') :
+                liste.append((moi.nom,moi))
+                moi=moi.pere
+          liste.append((moi.nom,moi))
+          self.dicoInverse[e.nom]=liste
+
+   def cree_rubrique(self,e,dico, niveau):
+       from Accas import A_BLOC
+       decale=niveau*"   "
+       #if niveau != 0 :
+       #    if isinstance(e,A_BLOC.BLOC): print decale, e.condition 
+       #    else :                           print decale, e. nom  
+       for (nom, fils) in e.entites.items() :
+           if  fils.entites.items() != [] : self.cree_rubrique(fils,dico,niveau+1)
+           #else : print (niveau+1)*"   ", nom
+
+        
+