]> SALOME platform Git repositories - tools/eficas.git/blob - InterfaceQT/readercata.py
Salome HOME
Modif V6_4_°
[tools/eficas.git] / InterfaceQT / readercata.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 """
22     Ce module sert a lire un catalogue et a construire
23     un objet CataItem pour Eficas.
24     Il s'appuie sur la classe READERCATA
25 """
26 # Modules Python
27 import time
28 import os,sys,py_compile
29 import traceback
30 import cPickle
31 import re
32
33 # Modules Eficas
34 import prefs
35 from Noyau.N_CR import CR
36 from Editeur.utils  import init_rep_cata_dev
37
38 from Editeur    import analyse_catalogue
39 from Editeur    import autre_analyse_cata
40 from Editeur    import uiinfo
41 from monChoixCata import MonChoixCata
42
43 from qt import *
44
45 version="16"
46
47 class READERCATA:
48
49    def __init__(self,appli,parent):
50       self.appli=appli      
51       self.parent=parent
52       self.code=self.appli.code
53       self.appli.format_fichier='python'
54       self.appli.appliEficas.format_fichier='python'
55       self.version_code=self.appli.version_code
56       self.version_cata=None
57       self.fic_cata=None
58       self.OpenCata()
59       self.cataitem=None
60
61    def OpenCata(self):
62       """ 
63           Ouvre le catalogue standard du code courant, cad le catalogue présent
64           dans le répertoire Cata 
65       """
66       message1 = "Compilation des fichiers Eficas \n\n Veuillez patienter ..."
67       self.configure_barre(4)
68
69       liste_cata_possibles=[]
70       for catalogue in self.appli.CONFIGURATION.catalogues:
71           if catalogue[0] == self.code :
72              liste_cata_possibles.append(catalogue)
73
74       if len(liste_cata_possibles)==0:          
75           QMessageBox.critical( self.parent, "Import du catalogue","Pas de catalogue defini pour le code %s" % self.code)
76           self.appli.parent.ui.close()
77           sys.exit(1)
78
79       if self.version_code is not None:
80           # La version a ete fixee
81           for cata in liste_cata_possibles:
82              if self.version_code == cata[1]:
83                 self.fic_cata = cata[2]
84                 self.appli.format_fichier=cata[3]
85                 self.appli.appliEficas.format_fichier=cata[3]
86       elif len(liste_cata_possibles)==1:
87           self.fic_cata = liste_cata_possibles[0][2]
88           self.version_code = liste_cata_possibles[0][1]
89           self.appli.format_fichier=liste_cata_possibles[0][3] 
90           self.appli.appliEficas.format_fichier=liste_cata_possibles[0][3] 
91           lab=QString("Eficas V1.") 
92           lab+=QString(version) 
93           lab+=QString(" pour ")
94           lab+=QString(self.code) 
95           lab+=QString(" avec le catalogue ")
96           lab+=self.version_code
97           try :
98           # souci pour les includes
99               self.appli.parent.ui.setCaption(lab)
100           except :
101               pass
102           #qApp.mainWidget().setCaption(lab)
103       else:
104           # plusieurs catalogues sont disponibles : il faut demander a l'utilisateur
105           # lequel il veut utiliser ...
106           self.ask_choix_catalogue()
107
108       if self.fic_cata == None :
109           print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
110           sys.exit(0)
111
112       self.determineMater()
113
114
115       # détermination de fic_cata_c et fic_cata_p
116       self.fic_cata_c = self.fic_cata + 'c'
117       self.fic_cata_p = os.path.splitext(self.fic_cata)[0]+'_pickled.py'
118
119       # import du catalogue
120       self.cata = self.import_cata(self.fic_cata)
121       self.update_barre()
122       if not self.cata :          
123           QMessageBox.critical( self.parent, "Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
124           self.appli.parent.ui.close()
125           sys.exit(1)
126       #
127       # analyse du catalogue (ordre des mots-clés)
128       #
129       # Retrouve_Ordre_Cata_Standard fait une analyse textuelle du catalogue
130       # remplacé par Retrouve_Ordre_Cata_Standard_autre qui utilise une numerotation
131       # des mots clés a la création
132       self.Retrouve_Ordre_Cata_Standard_autre()
133       self.update_barre()
134
135       #
136       # analyse des données liées a  l'IHM : UIinfo
137       #
138       uiinfo.traite_UIinfo(self.cata)
139       self.update_barre()
140
141       #
142       # traitement des clefs documentaires
143       #
144       self.traite_clefs_documentaires()
145
146       # chargement et analyse des catalogues développeur (le cas échéant)
147       #
148       if self.appli.CONFIGURATION.isdeveloppeur == 'OUI' :
149           init_rep_cata_dev(self.fic_cata,self.appli.CONFIGURATION.path_cata_dev)
150           fic_cata_dev = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
151           if os.path.isfile(fic_cata_dev):
152               # il y a bien un catalogue développeur : il faut récupérer le module_object associé ...
153               test = self.compile_cata(fic_cata_dev,fic_cata_dev+'c')
154               if not test :
155                   showinfo("Compilation catalogue développeur",
156                            "Erreur dans la compilation du catalogue développeur")
157                   self.cata = (self.cata,)
158               else:
159                   self.cata_dev =self.import_cata(fic_cata_dev)
160                   #self.Retrouve_Ordre_Cata_Developpeur()
161                   self.Retrouve_Ordre_Cata_Developpeur_autre()
162                   self.cata = (self.cata,self.cata_dev)
163           else:
164               self.cata = (self.cata,)
165       else:
166           self.cata = (self.cata,)
167       titreSuite=" avec le catalogue " + os.path.basename(self.fic_cata)
168       titre=self.appli.titre+titreSuite
169       if self.appli.top:
170         self.appli.top.title(titre)
171       self.appli.titre=titre
172
173    def determineMater(self) :
174       # Determinination du repertoire materiau
175       v_codeSansPoint=self.version_code
176       v_codeSansPoint=re.sub("\.","",v_codeSansPoint)
177       chaine="rep_mat_"+v_codeSansPoint
178       if hasattr(self.appli.CONFIGURATION,chaine):
179           a=getattr(self.appli.CONFIGURATION,chaine)
180       else :
181           try :
182              a=self.appli.CONFIGURATION.dRepMat[self.version_code]
183           except :
184              if self.code == "ASTER" :
185                 print "Probleme avec le repertoire materiau"
186              a='.'
187       self.appli.CONFIGURATION.rep_mat=a
188
189    def import_cata(self,cata):
190       """ 
191           Réalise l'import du catalogue dont le chemin d'acca¨s est donné par cata
192       """
193       nom_cata = os.path.splitext(os.path.basename(cata))[0]
194       rep_cata = os.path.dirname(cata)
195       sys.path[:0] = [rep_cata]
196       try :
197           o=__import__(nom_cata)
198           return o
199       except Exception,e:
200           traceback.print_exc()
201           return 0
202
203    def Retrouve_Ordre_Cata_Standard_autre(self):
204       """ 
205           Construit une structure de données dans le catalogue qui permet
206           a  EFICAS de retrouver l'ordre des mots-clés dans le texte du catalogue.
207           Pour chaque entité du catlogue on crée une liste de nom ordre_mc qui
208           contient le nom des mots clés dans le bon ordre
209       """ 
210       self.cata_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
211
212    def Retrouve_Ordre_Cata_Standard(self):
213       """ 
214           Retrouve l'ordre des mots-clés dans le catalogue, cad :
215            - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
216                l'ordre des mots-clés dans le catalogue
217            - s'il n'a pas été modifié, relie le fichier pickle 
218       """
219       time1 = os.path.getmtime(self.fic_cata)
220       try :
221           time2 = os.path.getmtime(self.fic_cata_p)
222       except:
223           time2 = 0
224       if time2 > time1 :
225           # l'objet catalogue n'a pas été modifié depuis le dernier "pickle"
226           self.Get_Ordre_Cata()
227       else :
228           # le catalogue a été modifié depuis le dernier "pickle" :
229           # il faut retrouver l'ordre du catalogue et refaire pickle
230           self.Get_Ordre_Cata(mode='cata')
231       self.appli.affiche_infos("Catalogue standard chargé")
232
233    def Retrouve_Ordre_Cata_Developpeur(self):
234       """ 
235           Retrouve l'ordre des mots-clés dans le catalogue, cad :
236           - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
237             l'ordre des mots-clés dans le catalogue
238           - s'il n'a pas été modifié, relie le fichier pickle 
239       """
240       if self.code != 'ASTER' : return
241       fic_cata = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
242       message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
243       cata_dev_ordonne = analyse_cata.analyse_catalogue(self,self.fic_cata)
244       self.cata_dev_ordonne_cr = cata_dev_ordonne.cr
245       cata_dev_ordonne_dico = cata_dev_ordonne.entites
246       self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
247       self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
248
249    def Retrouve_Ordre_Cata_Developpeur_autre(self):
250       """
251           Retrouve l'ordre des mots-clés dans le catalogue, cad :
252           - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
253             l'ordre des mots-clés dans le catalogue
254           - s'il n'a pas été modifié, relie le fichier pickle
255       """
256       if self.code != 'ASTER' : return
257       message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
258       cata_dev_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
259       self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
260       self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
261
262    def Get_Ordre_Cata(self,mode='pickle'):
263       """ 
264           Retrouve l'ordre du catalogue :
265             - mode='pickle ': tente de relire le fichier pickle et sinon lance l'analyse du catalogue
266             - mode='cata'   : force l'analyse du catalogue directement sans relire le pickle
267       """
268       if mode == 'pickle' :
269           try:
270               f = open(self.fic_cata_p)
271               u = cPickle.Unpickler(f)
272               self.cata_ordonne_dico = u.load()
273               f.close()
274           except :
275               # on peut ne pas arriver a  relire le fichier pickle s'il a été altéré
276               # ou (le plus probable) s'il a été créé sous un autre OS
277               self.Get_Ordre_Cata(mode='cata')
278       elif mode == 'cata':
279           cata_ordonne = analyse_catalogue.analyse_catalogue(self,self.fic_cata)
280           self.cata_ordonne_cr = cata_ordonne.cr
281           self.cata_ordonne_dico = cata_ordonne.entites
282           f = open(self.fic_cata_p,'w+')
283           p = cPickle.Pickler(f)
284           p.dump(self.cata_ordonne_dico)
285           f.close()
286       else :
287           raise Exception("Appel a  un mode inconnu de Get_Ordre_Cata : %s" % mode)
288           return
289
290    def ask_choix_catalogue(self):
291       """
292       Ouvre une fenetre de sélection du catalogue dans le cas oa¹ plusieurs
293       ont été définis dans Accas/editeur.ini
294       """      
295       # construction du dictionnaire et de la liste des catalogues
296       self.dico_catalogues = {}
297       defaut = None
298       for catalogue in self.appli.CONFIGURATION.catalogues:
299           if catalogue[0] == self.code :
300               self.dico_catalogues[catalogue[1]] = catalogue
301               if len(catalogue) == 5 :
302                   if catalogue[4]=='defaut' : defaut = catalogue[1]
303       liste_choix = self.dico_catalogues.keys()
304       liste_choix.sort()
305
306       lab=QString("Eficas V1.") 
307       lab+=QString(version) 
308       lab+=QString(" pour ")
309       lab+=QString(self.code) 
310       lab+=QString(" avec le catalogue ")
311
312       # teste si plusieurs catalogues ou non
313       if len(liste_choix) == 0:          
314           QMessageBox.critical( self.parent, "", "Aucun catalogue déclaré pour %s" %self.code)
315           self.appli.parent.ui.close()
316           sys.exit(1)
317           
318       # création d'une boite de dialogue modale
319       widgetChoix=MonChoixCata(liste_choix,self, self.parent, "", True )
320       ret=widgetChoix.exec_loop()
321       
322       lab=QString("Eficas V1.") 
323       lab+=QString(version) 
324       lab+=QString(" pour ")
325       lab+=QString(self.code) 
326       lab+=QString(" avec le catalogue ")
327       if ret == QDialog.Accepted:
328           self.version_cata=str(self.version_cata)
329           self.fic_cata = self.dico_catalogues[self.version_cata][2]
330           self.version_code = self.version_cata
331           self.appli.format_fichier = self.dico_catalogues[self.version_cata][3]
332           self.appli.appliEficas.format_fichier = self.dico_catalogues[self.version_cata][3]
333           lab+=self.version_cata
334           self.appli.parent.ui.setCaption(lab)
335           #qApp.mainWidget().setCaption(lab)
336       else :
337           sys.exit(0)
338
339
340    def compile_cata(self,cata,catac):
341       """ 
342            Teste si le catalogue a bien besoin d'etre recompilé et si oui, le compile et
343            affiche un message dans le splash . Retourne 1 si la compilation s'est bien déroulée,
344            0 sinon.
345       """
346       time1 = os.path.getmtime(cata)
347       try:
348           time2 = os.path.getmtime(catac)
349       except:
350           time2 = 0
351       if time1 > time2:
352           try:
353               # le catalogue doit etre recompilé avant d'etre importé
354               if self.appli.test == 0 :
355                  splash._splash.configure(text="Compilation du catalogue\nCela peut prendre plusieurs secondes ...")
356               py_compile.compile(cata)
357           except:
358               return 0
359       return 1
360
361
362 #--------------------------------------------------------------------------------
363 # Méthodes concernant la barre de progression lors de l'analyse du catalogue
364 #--------------------------------------------------------------------------------
365
366    def configure_barre(self,nbcommandes):
367       """ Configure la barre de progression en lui passant comme parama¨tre le
368           nombre de commandes du catalogue qui lui sert a  déterminer la longueur de son incrément """
369       try:
370           if self.appli.test == 0 :
371              splash._splash.configure(barre='oui',ratio = nbcommandes)
372       except:
373           pass
374
375    def update_barre(self):
376       """ Update la position de la barre de progression : la fait progresser de son incrément """
377       try:
378           if self.appli.test == 0 :
379              splash._splash.update_barre()
380       except:
381           pass
382
383    def visuCRCATA(self):
384       """
385       Méthode permettant l'affichage du rapport de validation
386       """
387       cr = CR( debut = "Début rapport de validation du catalogue",
388                fin = "Fin rapport de validation du catalogue")
389       titre="rapport de validation du catalogue"
390       if hasattr(self,'cata_ordonne_cr') :
391           cr.add(self.cata_ordonne_cr)
392       if hasattr(self,'cata_dev_ordonne_cr') :
393           cr.add(self.cata_dev_ordonne_cr)
394       for cata in self.cata:
395           if hasattr(cata,'JdC'):
396               cr.add(cata.JdC.report())
397       texte_cr = str(cr)
398       self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)
399
400
401    def traite_clefs_documentaires(self):
402       try:
403         self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
404         f=open(self.fic_cata_clef)
405       except:
406         #print "Pas de fichier associé contenant des clefs documentaires"
407         return
408
409       dict_clef_docu={}
410       for l in f.readlines():
411           clef=l.split(':')[0]
412           docu=l.split(':')[1]
413           docu=docu[0:-1]
414           dict_clef_docu[clef]=docu
415       for oper in self.cata.JdC.commandes:
416            if dict_clef_docu.has_key(oper.nom):
417               oper.docu=dict_clef_docu[oper.nom]