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.
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.
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.
20 # ======================================================================
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
28 import os,sys,py_compile
34 from Noyau.N_CR import CR
35 from Editeur.utils import init_rep_cata_dev
37 import analyse_catalogue
38 import autre_analyse_cata
40 from monChoixCata import MonChoixCata
43 from PyQt4.QtGui import *
44 from PyQt4.QtCore import *
46 VERSION_EFICAS="Eficas V1.15"
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
63 Ouvre le catalogue standard du code courant, cad le catalogue présent
64 dans le répertoire Cata
66 message1 = "Compilation des fichiers Eficas \n\n Veuillez patienter ..."
68 liste_cata_possibles=[]
69 for catalogue in self.appliEficas.CONFIGURATION.catalogues:
70 if catalogue[0] == self.code :
71 liste_cata_possibles.append(catalogue)
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()
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
95 # souci pour les includes
96 self.appliEficas.setWindowTitle(lab)
100 # plusieurs catalogues sont disponibles : il faut demander a l'utilisateur
101 # lequel il veut utiliser ...
102 self.ask_choix_catalogue()
104 if self.fic_cata == None :
105 print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
108 self.determineMater()
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'
115 # import du catalogue
116 self.cata = self.import_cata(self.fic_cata)
118 QMessageBox.critical( self.QWParent, "Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
119 self.appliEficas.close()
122 # analyse du catalogue (ordre des mots-clés)
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()
130 # analyse des données liées a l'IHM : UIinfo
132 uiinfo.traite_UIinfo(self.cata)
135 # traitement des clefs documentaires
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
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)
153 a=self.appliEficas.CONFIGURATION.dRepMat[self.version_code]
155 if self.code == "ASTER" :
156 print "Probleme avec le repertoire materiau"
158 self.appliEficas.CONFIGURATION.rep_mat=a
160 def import_cata(self,cata):
162 Réalise l'import du catalogue dont le chemin d'acces est donné par cata
164 nom_cata = os.path.splitext(os.path.basename(cata))[0]
165 rep_cata = os.path.dirname(cata)
166 sys.path[:0] = [rep_cata]
168 o=__import__(nom_cata)
171 traceback.print_exc()
174 def Retrouve_Ordre_Cata_Standard_autre(self):
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
181 self.cata_ordonne_dico,self.appliEficas.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
183 def Retrouve_Ordre_Cata_Standard(self):
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
190 time1 = os.path.getmtime(self.fic_cata)
192 time2 = os.path.getmtime(self.fic_cata_p)
196 # l'objet catalogue n'a pas été modifié depuis le dernier "pickle"
197 self.Get_Ordre_Cata()
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é")
205 def Get_Ordre_Cata(self,mode='pickle'):
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
211 if mode == 'pickle' :
213 f = open(self.fic_cata_p)
214 u = cPickle.Unpickler(f)
215 self.cata_ordonne_dico = u.load()
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')
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)
230 raise Exception("Appel a un mode inconnu de Get_Ordre_Cata : %s" % mode)
233 def ask_choix_catalogue(self):
235 Ouvre une fenetre de sélection du catalogue dans le cas oa¹ plusieurs
236 ont été définis dans Accas/editeur.ini
238 # construction du dictionnaire et de la liste des catalogues
239 self.dico_catalogues = {}
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()
249 lab=QString("Eficas V1.")
250 lab+=QString(version)
251 lab+=QString(" pour ")
252 lab+=QString(self.code)
253 lab+=QString(" avec le catalogue ")
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()
261 # création d'une boite de dialogue modale
262 widgetChoix=MonChoixCata(liste_choix,self, self.appliEficas, "", True )
263 ret=widgetChoix.exec_()
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)
282 def compile_cata(self,cata,catac):
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,
288 time1 = os.path.getmtime(cata)
290 time2 = os.path.getmtime(catac)
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)
305 def visuCRCATA(self):
307 Méthode permettant l'affichage du rapport de validation
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())
320 self.visu_texte_cr = Fenetre(self.appliEficas,titre=titre,texte=texte_cr)
323 def traite_clefs_documentaires(self):
325 self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
326 f=open(self.fic_cata_clef)
328 #print "Pas de fichier associé contenant des clefs documentaires"
332 for l in f.readlines():
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]