Salome HOME
8a2f645ca2bed6dd89fe1285f8b036dfb6647c57
[tools/eficas.git] / InterfaceQT4 / 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 from Noyau.N_CR import CR
35 from Editeur.utils  import init_rep_cata_dev
36
37 import analyse_catalogue
38 import autre_analyse_cata
39 import uiinfo
40 from monChoixCata import MonChoixCata
41
42 from PyQt4 import *
43 from PyQt4.QtGui import *
44 from PyQt4.QtCore import *
45
46 VERSION_EFICAS="Eficas V1.15"
47
48 class READERCATA:
49
50    def __init__(self,QWParent, appliEficas):
51       self.QWParent=QWParent
52       self.appliEficas=self.QWParent.appliEficas
53       self.code=self.QWParent.code
54       self.appliEficas.format_fichier='python'
55       self.version_code=self.QWParent.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
68       liste_cata_possibles=[]
69       for catalogue in self.appliEficas.CONFIGURATION.catalogues:
70           if catalogue[0] == self.code :
71              liste_cata_possibles.append(catalogue)
72
73       if len(liste_cata_possibles)==0:          
74           QMessageBox.critical( self.QWParent, "Import du catalogue","Pas de catalogue defini pour le code %s" % self.code)
75           self.appliEficas.close()
76           sys.exit(1)
77
78       if self.version_code is not None:
79           # La version a ete fixee
80           for cata in liste_cata_possibles:
81              if self.version_code == cata[1]:
82                 self.fic_cata = cata[2]
83                 self.appliEficas.format_fichier=cata[3]
84       elif len(liste_cata_possibles)==1:
85           self.fic_cata = liste_cata_possibles[0][2]
86           self.version_code = liste_cata_possibles[0][1]
87           self.appliEficas.format_fichier=liste_cata_possibles[0][3] 
88           lab=QString("Eficas V1.") 
89           lab+=QString(VERSION_EFICAS) 
90           lab+=QString(" pour ")
91           lab+=QString(self.code) 
92           lab+=QString(" avec le catalogue ")
93           lab+=self.version_code
94           try :
95           # souci pour les includes
96               self.appliEficas.setWindowTitle(lab)
97           except :
98               pass
99       else:
100           # plusieurs catalogues sont disponibles : il faut demander a l'utilisateur
101           # lequel il veut utiliser ...
102           self.ask_choix_catalogue()
103
104       if self.fic_cata == None :
105           print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
106           sys.exit(0)
107
108       self.determineMater()
109
110
111       # détermination de fic_cata_c et fic_cata_p
112       self.fic_cata_c = self.fic_cata + 'c'
113       self.fic_cata_p = os.path.splitext(self.fic_cata)[0]+'_pickled.py'
114
115       # import du catalogue
116       self.cata = self.import_cata(self.fic_cata)
117       if not self.cata :          
118           QMessageBox.critical( self.QWParent, "Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
119           self.appliEficas.close()
120           sys.exit(1)
121       #
122       # analyse du catalogue (ordre des mots-clés)
123       #
124       # Retrouve_Ordre_Cata_Standard fait une analyse textuelle du catalogue
125       # remplacé par Retrouve_Ordre_Cata_Standard_autre qui utilise une numerotation
126       # des mots clés a la création
127       self.Retrouve_Ordre_Cata_Standard_autre()
128
129       #
130       # analyse des données liées a  l'IHM : UIinfo
131       #
132       uiinfo.traite_UIinfo(self.cata)
133
134       #
135       # traitement des clefs documentaires
136       #
137       self.traite_clefs_documentaires()
138       self.cata=(self.cata,)
139       titre=VERSION_EFICAS + " avec le catalogue " + os.path.basename(self.fic_cata)
140       if self.appliEficas.top:
141         self.appliEficas.setWindowTitle(titre)
142       self.appliEficas.titre=titre
143
144    def determineMater(self) :
145       # Determinination du repertoire materiau
146       v_codeSansPoint=self.version_code
147       v_codeSansPoint=re.sub("\.","",v_codeSansPoint)
148       chaine="rep_mat_"+v_codeSansPoint
149       if hasattr(self.appliEficas.CONFIGURATION,chaine):
150           a=getattr(self.appliEficas.CONFIGURATION,chaine)
151       else :
152           try :
153              a=self.appliEficas.CONFIGURATION.dRepMat[self.version_code]
154           except :
155              if self.code == "ASTER" :
156                 print "Probleme avec le repertoire materiau"
157              a='.'
158       self.appliEficas.CONFIGURATION.rep_mat=a
159
160    def import_cata(self,cata):
161       """ 
162           Réalise l'import du catalogue dont le chemin d'acces est donné par cata
163       """
164       nom_cata = os.path.splitext(os.path.basename(cata))[0]
165       rep_cata = os.path.dirname(cata)
166       sys.path[:0] = [rep_cata]
167       try :
168           o=__import__(nom_cata)
169           return o
170       except Exception,e:
171           traceback.print_exc()
172           return 0
173
174    def Retrouve_Ordre_Cata_Standard_autre(self):
175       """ 
176           Construit une structure de données dans le catalogue qui permet
177           a  EFICAS de retrouver l'ordre des mots-clés dans le texte du catalogue.
178           Pour chaque entité du catlogue on crée une liste de nom ordre_mc qui
179           contient le nom des mots clés dans le bon ordre
180       """ 
181       self.cata_ordonne_dico,self.appliEficas.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
182
183    def Retrouve_Ordre_Cata_Standard(self):
184       """ 
185           Retrouve l'ordre des mots-clés dans le catalogue, cad :
186            - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
187                l'ordre des mots-clés dans le catalogue
188            - s'il n'a pas été modifié, relie le fichier pickle 
189       """
190       time1 = os.path.getmtime(self.fic_cata)
191       try :
192           time2 = os.path.getmtime(self.fic_cata_p)
193       except:
194           time2 = 0
195       if time2 > time1 :
196           # l'objet catalogue n'a pas été modifié depuis le dernier "pickle"
197           self.Get_Ordre_Cata()
198       else :
199           # le catalogue a été modifié depuis le dernier "pickle" :
200           # il faut retrouver l'ordre du catalogue et refaire pickle
201           self.Get_Ordre_Cata(mode='cata')
202       self.appliEficas.affiche_infos("Catalogue standard chargé")
203
204
205    def Get_Ordre_Cata(self,mode='pickle'):
206       """ 
207           Retrouve l'ordre du catalogue :
208             - mode='pickle ': tente de relire le fichier pickle et sinon lance l'analyse du catalogue
209             - mode='cata'   : force l'analyse du catalogue directement sans relire le pickle
210       """
211       if mode == 'pickle' :
212           try:
213               f = open(self.fic_cata_p)
214               u = cPickle.Unpickler(f)
215               self.cata_ordonne_dico = u.load()
216               f.close()
217           except :
218               # on peut ne pas arriver a  relire le fichier pickle s'il a été altéré
219               # ou (le plus probable) s'il a été créé sous un autre OS
220               self.Get_Ordre_Cata(mode='cata')
221       elif mode == 'cata':
222           cata_ordonne = analyse_catalogue.analyse_catalogue(self,self.fic_cata)
223           self.cata_ordonne_cr = cata_ordonne.cr
224           self.cata_ordonne_dico = cata_ordonne.entites
225           f = open(self.fic_cata_p,'w+')
226           p = cPickle.Pickler(f)
227           p.dump(self.cata_ordonne_dico)
228           f.close()
229       else :
230           raise Exception("Appel a  un mode inconnu de Get_Ordre_Cata : %s" % mode)
231           return
232
233    def ask_choix_catalogue(self):
234       """
235       Ouvre une fenetre de sélection du catalogue dans le cas oa¹ plusieurs
236       ont été définis dans Accas/editeur.ini
237       """      
238       # construction du dictionnaire et de la liste des catalogues
239       self.dico_catalogues = {}
240       defaut = None
241       for catalogue in self.appliEficas.CONFIGURATION.catalogues:
242           if catalogue[0] == self.code :
243               self.dico_catalogues[catalogue[1]] = catalogue
244               if len(catalogue) == 5 :
245                   if catalogue[4]=='defaut' : defaut = catalogue[1]
246       liste_choix = self.dico_catalogues.keys()
247       liste_choix.sort()
248
249       lab=QString("Eficas V1.") 
250       lab+=QString(version) 
251       lab+=QString(" pour ")
252       lab+=QString(self.code) 
253       lab+=QString(" avec le catalogue ")
254
255       # teste si plusieurs catalogues ou non
256       if len(liste_choix) == 0:          
257           QMessageBox.critical( self.QWParent, "", "Aucun catalogue déclaré pour %s" %self.code)
258           self.appliEficas.close()
259           sys.exit(1)
260           
261       # création d'une boite de dialogue modale
262       widgetChoix=MonChoixCata(liste_choix,self, self.appliEficas, "", True )
263       ret=widgetChoix.exec_()
264       
265       lab=QString("Eficas V1.") 
266       lab+=QString(version) 
267       lab+=QString(" pour ")
268       lab+=QString(self.code) 
269       lab+=QString(" avec le catalogue ")
270       if ret == QDialog.Accepted:
271           self.version_cata=str(self.version_cata)
272           self.fic_cata = self.dico_catalogues[self.version_cata][2]
273           self.version_code = self.version_cata
274           self.appliEficas.format_fichier = self.dico_catalogues[self.version_cata][3]
275           lab+=self.version_cata
276           self.appliEficas.setWindowTitle(lab)
277           #qApp.mainWidget().setCaption(lab)
278       else :
279           sys.exit(0)
280
281
282    def compile_cata(self,cata,catac):
283       """ 
284            Teste si le catalogue a bien besoin d'etre recompilé et si oui, le compile et
285            affiche un message dans le splash . Retourne 1 si la compilation s'est bien déroulée,
286            0 sinon.
287       """
288       time1 = os.path.getmtime(cata)
289       try:
290           time2 = os.path.getmtime(catac)
291       except:
292           time2 = 0
293       if time1 > time2:
294           try:
295               # le catalogue doit etre recompilé avant d'etre importé
296               if self.QWParent.test == 0 :
297                  splash._splash.configure(text="Compilation du catalogue\nCela peut prendre plusieurs secondes ...")
298               py_compile.compile(cata)
299           except:
300               return 0
301       return 1
302
303
304
305    def visuCRCATA(self):
306       """
307       Méthode permettant l'affichage du rapport de validation
308       """
309       cr = CR( debut = "Début rapport de validation du catalogue",
310                fin = "Fin rapport de validation du catalogue")
311       titre="rapport de validation du catalogue"
312       if hasattr(self,'cata_ordonne_cr') :
313           cr.add(self.cata_ordonne_cr)
314       if hasattr(self,'cata_dev_ordonne_cr') :
315           cr.add(self.cata_dev_ordonne_cr)
316       for cata in self.cata:
317           if hasattr(cata,'JdC'):
318               cr.add(cata.JdC.report())
319       texte_cr = str(cr)
320       self.visu_texte_cr = Fenetre(self.appliEficas,titre=titre,texte=texte_cr)
321
322
323    def traite_clefs_documentaires(self):
324       try:
325         self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
326         f=open(self.fic_cata_clef)
327       except:
328         #print "Pas de fichier associé contenant des clefs documentaires"
329         return
330
331       dict_clef_docu={}
332       for l in f.readlines():
333           clef=l.split(':')[0]
334           docu=l.split(':')[1]
335           docu=docu[0:-1]
336           dict_clef_docu[clef]=docu
337       for oper in self.cata.JdC.commandes:
338            if dict_clef_docu.has_key(oper.nom):
339               oper.docu=dict_clef_docu[oper.nom]