Salome HOME
pour tenir compte de LASSD
[tools/eficas.git] / Editeur / readercata.py
index 81423762e902d1c70f4dea74234b870d044d7140..5b72e6b305374d5cd078c9853eecc92d74313f74 100644 (file)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 #            CONFIGURATION MANAGEMENT OF EDF VERSION
 # ======================================================================
 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
@@ -28,7 +29,6 @@ import os,sys,py_compile
 import traceback
 import cPickle
 import Pmw
-from tkMessageBox import showinfo,showerror
 
 # Modules Eficas
 import prefs
@@ -36,10 +36,13 @@ import splash
 import fontes
 import analyse_catalogue
 from Noyau.N_CR import CR
+from widgets import showinfo,showerror
 from widgets import Fenetre
 from utils import init_rep_cata_dev
 
 #import catabrowser
+import autre_analyse_cata
+import uiinfo
 
 class READERCATA:
 
@@ -57,13 +60,10 @@ class READERCATA:
       self.parent=parent
       self.code=self.appli.code
       self.appli.format_fichier.set('python')
+      self.version_code=self.appli.version_code
+      self.fic_cata=None
       self.OpenCata()
-
       self.cataitem=None
-      #XXX CCAR : Pour le moment je ne construis pas le CATAItem
-      #self.cataitem = catabrowser.CATAItem(self,"Catalogue "+self.code,
-                                           #self.cata,
-                                           #objet_cata_ordonne = self.cata_ordonne_dico)
 
    def OpenCata(self):
       """ 
@@ -71,51 +71,88 @@ class READERCATA:
           dans le répertoire Cata 
       """
       message1 = "Compilation des fichiers Eficas \n\n Veuillez patienter ..."
-      splash._splash.configure(text = message1)
-      if len(self.appli.CONFIGURATION.catalogues) == 1:
-          self.fic_cata = self.appli.CONFIGURATION.catalogues[0][2]
+      if self.appli.test == 0 :
+         splash._splash.configure(text = message1)
+      self.configure_barre(4)
+
+      liste_cata_possibles=[]
+      for catalogue in self.appli.CONFIGURATION.catalogues:
+          if catalogue[0] == self.code :
+             liste_cata_possibles.append(catalogue)
+
+      if len(liste_cata_possibles)==0:
+          showerror("Import du catalogue","Pas de catalogue defini pour le code %s" % self.code)
+          self.appli.quit()
+          sys.exit(1)
+
+      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.appli.format_fichier.set(cata[3])
+      elif len(liste_cata_possibles)==1:
+          self.fic_cata = liste_cata_possibles[0][2]
           self.code = self.appli.CONFIGURATION.catalogues[0][0]
-          self.version_code = self.appli.CONFIGURATION.catalogues[0][1]
-          self.appli.format_fichier.set(self.appli.CONFIGURATION.catalogues[0][3])
-      elif len(self.appli.CONFIGURATION.catalogues) == 0:
-          # aucun catalogue défini dans le fichier Accas/editeur.ini
-          if self.code == 'ASTER' :
-              self.fic_cata = os.path.join(prefs.CODE_PATH,'Cata','cata.py')
-          elif self.code == 'SATURNE' :
-              self.fic_cata = os.path.join(prefs.CODE_PATH,'Cata','cata_saturne.py')
-          elif self.code == 'DESCARTES':
-              self.fic_cata = os.path.join(prefs.CODE_PATH,'Cata','cata_descartes.py')
-          else :
-              print 'Code inconnu'
-              sys.exit(0)
+          self.version_code = liste_cata_possibles[0][1]
+          self.appli.format_fichier.set(liste_cata_possibles[0][3])
       else:
           # plusieurs catalogues sont disponibles : il faut demander à l'utilisateur
           # lequel il veut utiliser ...
           self.ask_choix_catalogue()
+
       if self.fic_cata == None :
-          self.parent.destroy()
+          print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
           sys.exit(0)
+
       # 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'
-      print "Debut compil cata: ",time.clock()
+
+      #if self.appli.test == 0 :
+      #   splash._splash.configure(text = "Debut compil cata: %d s" % time.clock())
       # compilation éventuelle du catalogue
-      test = self.compile_cata(self.fic_cata,self.fic_cata_c)
-      print "Fin compil cata: ",time.clock()
-      if not test : showerror("Compilation catalogue","Impossible de compiler le catalogue %s" %self.fic_cata)
+      #test = self.compile_cata(self.fic_cata,self.fic_cata_c)
+      #self.update_barre()
+      #if self.appli.test == 0 :
+      #   splash._splash.configure(text = "Fin compil cata: %d s" % time.clock())
+      #if not test : showerror("Compilation catalogue","Impossible de compiler le catalogue %s" %self.fic_cata)
+
       # import du catalogue
-      print "Debut import_cata: ",time.clock()
+      if self.appli.test == 0 :
+         splash._splash.configure(text = "Debut import_cata: %d s" % time.clock())
       self.cata = self.import_cata(self.fic_cata)
-      print "Fin import_cata: ",time.clock()
+      self.update_barre()
+      if self.appli.test == 0 :
+         splash._splash.configure(text = "Fin import_cata: %d s" % time.clock())
       if not self.cata : showerror("Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
+
+      #
       # analyse du catalogue (ordre des mots-clés)
-      #XXX A priori ceci fait double emploi. Il faut d'abord calculer l'ordre
-      # puis fabriquer le CATAItem
-      #CCAR :self.catalo = catabrowser.CATAItem(self,"Catalogue",self.cata)
-      print "Debut Retrouve_Ordre: ",time.clock()
-      self.Retrouve_Ordre_Cata_Standard()
-      print "Fin Retrouve_Ordre: ",time.clock()
+      #
+      if self.appli.test == 0 :
+         splash._splash.configure(text = "Debut Retrouve_Ordre: %d s" % time.clock())
+      # 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 à la création
+      #self.Retrouve_Ordre_Cata_Standard()
+      self.Retrouve_Ordre_Cata_Standard_autre()
+      self.update_barre()
+      if self.appli.test == 0 :
+         splash._splash.configure(text = "Fin Retrouve_Ordre: %d s" % time.clock())
+      #
+      # analyse des données liées à l'IHM : UIinfo
+      #
+      uiinfo.traite_UIinfo(self.cata)
+      self.update_barre()
+
+      #
+      # traitement des clefs documentaires
+      #
+      self.traite_clefs_documentaires()
+
       # chargement et analyse des catalogues développeur (le cas échéant)
+      #
       if self.appli.CONFIGURATION.isdeveloppeur == 'OUI' :
           init_rep_cata_dev(self.fic_cata,self.appli.CONFIGURATION.path_cata_dev)
           fic_cata_dev = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
@@ -128,7 +165,8 @@ class READERCATA:
                   self.cata = (self.cata,)
               else:
                   self.cata_dev =self.import_cata(fic_cata_dev)
-                  self.Retrouve_Ordre_Cata_Developpeur()
+                  #self.Retrouve_Ordre_Cata_Developpeur()
+                  self.Retrouve_Ordre_Cata_Developpeur_autre()
                   self.cata = (self.cata,self.cata_dev)
           else:
               self.cata = (self.cata,)
@@ -139,19 +177,27 @@ class READERCATA:
       """ 
           Réalise l'import du catalogue dont le chemin d'accès est donné par cata
       """
-      import imp
-      splash._splash.configure(text = "Chargement du catalogue")
+      if self.appli.test == 0 :
+         splash._splash.configure(text = "Chargement du catalogue")
       nom_cata = os.path.splitext(os.path.basename(cata))[0]
       rep_cata = os.path.dirname(cata)
       sys.path[:0] = [rep_cata]
       try :
-          f,p,d = imp.find_module(nom_cata)
-          o = imp.load_module(nom_cata,f,p,d)
+          o=__import__(nom_cata)
           return o
       except Exception,e:
           traceback.print_exc()
           return 0
 
+   def Retrouve_Ordre_Cata_Standard_autre(self):
+      """ 
+          Construit une structure de données dans le catalogue qui permet
+          à 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
+      """ 
+      self.cata_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
+
    def Retrouve_Ordre_Cata_Standard(self):
       """ 
           Retrouve l'ordre des mots-clés dans le catalogue, cad :
@@ -173,6 +219,39 @@ class READERCATA:
           self.Get_Ordre_Cata(mode='cata')
       self.appli.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.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
+      message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
+      if self.appli.test == 0 :
+         splash._splash.configure(text = message,barre='oui')
+      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.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
+
+   def Retrouve_Ordre_Cata_Developpeur_autre(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
+      message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
+      if self.appli.test == 0 :
+         splash._splash.configure(text = message,barre='oui')
+      cata_dev_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
+      self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
+      self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
+
    def Get_Ordre_Cata(self,mode='pickle'):
       """ 
           Retrouve l'ordre du catalogue :
@@ -183,7 +262,8 @@ class READERCATA:
           try:
               f = open(self.fic_cata_p)
               u = cPickle.Unpickler(f)
-              splash._splash.configure(text = "Analyse du catalogue")
+              if self.appli.test == 0 :
+                 splash._splash.configure(text = "Analyse du catalogue")
               self.cata_ordonne_dico = u.load()
               f.close()
           except :
@@ -191,10 +271,11 @@ class READERCATA:
               # ou (le plus probable) s'il a été créé sous un autre OS
               self.Get_Ordre_Cata(mode='cata')
       elif mode == 'cata':
-          splash._splash.configure(text = "Analyse du catalogue",barre='oui')
+          if self.appli.test == 0 :
+              splash._splash.configure(text = "Analyse du catalogue",barre='oui')
           cata_ordonne = analyse_catalogue.analyse_catalogue(self,self.fic_cata)
           self.cata_ordonne_cr = cata_ordonne.cr
-          self.cata_ordonne_dico = cata_ordonne.dico
+          self.cata_ordonne_dico = cata_ordonne.entites
           splash._splash.configure(text = "Sauvegarde des informations sur le catalogue")
           f = open(self.fic_cata_p,'w+')
           p = cPickle.Pickler(f)
@@ -222,13 +303,14 @@ class READERCATA:
       # test si plusieurs catalogues ou non
       if len(liste_choix) == 0:
           showerror("Aucun catalogue déclaré pour %s" %self.code)
-          self.quit()
+          self.appli.quit()
+          sys.exit(1)
       elif len(liste_choix) == 1:
           self.fic_cata = self.dico_catalogues[liste_choix[0]][2]
           self.version_code = liste_choix[0]
           return
       # création d'une boîte de dialogue modale
-      self.fenetre_choix_cata = Pmw.Dialog(self.parent,
+      self.fenetre_choix_cata = Pmw.Dialog(splash._splash, #avec self.parent, ne marche pas sous Windows
                                            buttons=('OK','ANNULER'),
                                            defaultbutton = 'OK',
                                            title = "Choix d'une version du code %s" %self.code,
@@ -279,7 +361,8 @@ class READERCATA:
       if time1 > time2:
           try:
               # le catalogue doit être recompilé avant d'être importé
-              splash._splash.configure(text="Compilation du catalogue\nCela peut prendre une trentaine de secondes ...")
+              if self.appli.test == 0 :
+                 splash._splash.configure(text="Compilation du catalogue\nCela peut prendre plusieurs secondes ...")
               py_compile.compile(cata)
           except:
               return 0
@@ -294,14 +377,16 @@ class READERCATA:
       """ Configure la barre de progression en lui passant comme paramètre le
           nombre de commandes du catalogue qui lui sert à déterminer la longueur de son incrément """
       try:
-          splash._splash.configure(barre='oui',ratio = nbcommandes)
+          if self.appli.test == 0 :
+             splash._splash.configure(barre='oui',ratio = nbcommandes)
       except:
           pass
 
    def update_barre(self):
       """ Update la position de la barre de progression : la fait progresser de son incrément """
       try:
-          splash._splash.update_barre()
+          if self.appli.test == 0 :
+             splash._splash.update_barre()
       except:
           pass
 
@@ -322,3 +407,21 @@ class READERCATA:
       texte_cr = str(cr)
       self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)
 
+
+   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)
+      except:
+        #print "Pas de fichier associé 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]
+          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]