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
35 from Noyau.N_CR import CR
36 from Editeur.catadesc import CatalogDescription
37 from Editeur.utils import init_rep_cata_dev
39 import analyse_catalogue
40 import analyse_catalogue_initial
41 import autre_analyse_cata
43 from monChoixCata import MonChoixCata
46 from PyQt4.QtGui import *
47 from PyQt4.QtCore import *
52 def __init__(self,QWParent, appliEficas):
53 self.QWParent=QWParent
54 self.appliEficas=self.QWParent.appliEficas
55 self.VERSION_EFICAS=self.appliEficas.VERSION_EFICAS
56 self.code=self.QWParent.code
57 self.ssCode=self.appliEficas.ssCode
58 self.appliEficas.format_fichier='python'
59 if hasattr(self.appliEficas,'mode_nouv_commande'):
60 self.mode_nouv_commande=self.appliEficas.mode_nouv_commande
62 self.mode_nouv_commande='alpha'
63 self.version_code=self.QWParent.version_code
64 self.version_cata=None
71 Ouvre le catalogue standard du code courant, cad le catalogue présent
72 dans le répertoire Cata
75 liste_cata_possibles=[]
76 self.Commandes_Ordre_Catalogue=[]
79 for catalogue in self.appliEficas.CONFIGURATION.catalogues:
80 if isinstance(catalogue, CatalogDescription):
81 all_cata_list.append(catalogue)
82 elif isinstance(catalogue, types.TupleType):
83 all_cata_list.append(CatalogDescription.create_from_tuple(catalogue))
85 print "Catalog description cannot be interpreted: ", catalogue
87 # This filter is only useful for codes that have subcodes (like MAP).
88 # Otherwise, the "code" attribute of the catalog description can (should) be None.
89 if self.ssCode is None:
90 liste_cata_possibles = all_cata_list
92 for catalogue in all_cata_list:
94 #print catalogue.file_format
95 if catalogue.code == self.code and catalogue.file_format == self.ssCode:
96 liste_cata_possibles.append(catalogue)
101 if len(liste_cata_possibles)==0:
102 QMessageBox.critical(self.QWParent, "Import du catalogue",
103 u"Pas de catalogue défini pour le code %s" % self.code)
104 self.appliEficas.close()
105 if self.appliEficas.salome == 0 :
110 if self.version_code is not None:
111 # La version a ete fixee
112 for cata in liste_cata_possibles:
113 if self.version_code == cata.identifier:
114 self.fic_cata = cata.cata_file_path
115 self.appliEficas.format_fichier = cata.file_format
116 self.appliEficas.format_fichier_in = cata.file_format_in
118 cata_choice_list = []
119 for cata in liste_cata_possibles:
122 cata_choice_list.insert(0, cata)
124 cata_choice_list.append(cata)
125 if len(cata_choice_list) == 0:
126 QMessageBox.critical(self.QWParent, "Import du catalogue",
127 QString.fromUtf8("Aucun catalogue trouvé"))
128 self.appliEficas.close()
129 if self.appliEficas.salome == 0 :
131 elif len(cata_choice_list) == 1:
132 self.fic_cata = cata_choice_list[0].cata_file_path
133 self.version_code = cata_choice_list[0].identifier
134 self.appliEficas.format_fichier = cata_choice_list[0].file_format
135 self.appliEficas.format_fichier_in = cata_choice_list[0].file_format_in
136 lab=QString("Eficas ")
137 lab+=QString(self.VERSION_EFICAS)
138 lab+=QString(" pour ")
139 lab+=QString(self.code)
140 lab+=QString(" avec le catalogue ")
141 lab+=self.version_code
143 # souci pour les includes et sans Ihm
144 self.appliEficas.setWindowTitle(lab)
148 # plusieurs catalogues sont disponibles : il faut demander a l'utilisateur
149 # lequel il veut utiliser ...
150 self.ask_choix_catalogue(cata_choice_list)
151 # On est dans Salome et il faut sortir proprement
153 if self.fic_cata == None :
154 if self.appliEficas.salome == 0 :
155 print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
158 self.appliEficas.close()
161 self.determineMater()
162 # détermination de fic_cata_c et fic_cata_p
163 self.fic_cata_c = self.fic_cata + 'c'
164 self.fic_cata_p = os.path.splitext(self.fic_cata)[0]+'_pickled.py'
166 # import du catalogue
167 self.cata = self.import_cata(self.fic_cata)
169 QMessageBox.critical( self.QWParent, "Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
170 self.appliEficas.close()
171 if self.appliEficas.salome == 0 :
174 # analyse du catalogue (ordre des mots-clés)
176 # Retrouve_Ordre_Cata_Standard fait une analyse textuelle du catalogue
177 # remplacé par Retrouve_Ordre_Cata_Standard_autre qui utilise une numerotation
178 # des mots clés a la création
179 self.Retrouve_Ordre_Cata_Standard_autre()
180 if self.mode_nouv_commande== "initial" :
181 self.Retrouve_Ordre_Cata_Standard()
184 # analyse des données liées a l'IHM : UIinfo
186 uiinfo.traite_UIinfo(self.cata)
189 # traitement des clefs documentaires
191 self.traite_clefs_documentaires()
192 self.cata=(self.cata,)
193 titre=self.VERSION_EFICAS + " avec le catalogue " + os.path.basename(self.fic_cata)
194 if self.appliEficas.top:
195 self.appliEficas.setWindowTitle(titre)
196 self.appliEficas.titre=titre
197 self.QWParent.titre=titre
199 def determineMater(self) :
200 # Determinination du repertoire materiau
201 v_codeSansPoint=self.version_code
202 if v_codeSansPoint == None : return
203 v_codeSansPoint=re.sub("\.","",v_codeSansPoint)
204 chaine="rep_mat_"+v_codeSansPoint
205 if hasattr(self.appliEficas.CONFIGURATION,chaine):
206 a=getattr(self.appliEficas.CONFIGURATION,chaine)
209 a=self.appliEficas.CONFIGURATION.dRepMat[self.version_code]
211 if self.code == "ASTER" :
212 print "Probleme avec le repertoire materiau"
214 self.appliEficas.CONFIGURATION.rep_mat=a
216 def import_cata(self,cata):
218 Réalise l'import du catalogue dont le chemin d'acces est donné par cata
220 nom_cata = os.path.splitext(os.path.basename(cata))[0]
221 rep_cata = os.path.dirname(cata)
222 sys.path[:0] = [rep_cata]
224 if sys.modules.has_key(nom_cata):
225 del sys.modules[nom_cata]
226 for k in sys.modules.keys():
227 if k[0:len(nom_cata)+1] == nom_cata+'.':
231 o=__import__(nom_cata)
234 traceback.print_exc()
237 def Retrouve_Ordre_Cata_Standard_autre(self):
239 Construit une structure de données dans le catalogue qui permet
240 a EFICAS de retrouver l'ordre des mots-clés dans le texte du catalogue.
241 Pour chaque entité du catlogue on crée une liste de nom ordre_mc qui
242 contient le nom des mots clés dans le bon ordre
244 self.cata_ordonne_dico,self.appliEficas.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
246 def Retrouve_Ordre_Cata_Standard(self):
248 Retrouve l'ordre des mots-clés dans le catalogue, cad :
249 Attention s appuie sur les commentaires
251 nom_cata = os.path.splitext(os.path.basename(self.fic_cata))[0]
252 rep_cata = os.path.dirname(self.fic_cata)
253 self.Commandes_Ordre_Catalogue = analyse_catalogue_initial.analyse_catalogue(self.fic_cata)
255 def ask_choix_catalogue(self, cata_choice_list):
257 Ouvre une fenetre de sélection du catalogue dans le cas où plusieurs
258 ont été définis dans Accas/editeur.ini
260 code = getattr(self.appliEficas.CONFIGURATION, "code", None)
262 title="Choix d une version du code "+str(code)
264 title="Choix d une version "
266 widgetChoix = MonChoixCata(self.appliEficas, [cata.user_name for cata in cata_choice_list], title)
267 ret=widgetChoix.exec_()
269 lab=QString(self.VERSION_EFICAS)
270 lab+=QString(" pour ")
271 lab+=QString(self.code)
272 lab+=QString(" avec le catalogue ")
273 if ret == QDialog.Accepted:
274 cata = cata_choice_list[widgetChoix.CBChoixCata.currentIndex()]
275 self.version_cata = cata.identifier
276 self.fic_cata = cata.cata_file_path
277 self.version_code = self.version_cata
278 self.appliEficas.format_fichier = cata.file_format
279 self.appliEficas.format_fichier_in = cata.file_format_in
280 lab+=self.version_cata
281 self.appliEficas.setWindowTitle(lab)
282 #qApp.mainWidget().setCaption(lab)
284 self.appliEficas.close()
285 if self.appliEficas.salome == 0 :
288 def traite_clefs_documentaires(self):
290 self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
291 #print self.fic_cata_clef
292 f=open(self.fic_cata_clef)
294 #print "Pas de fichier associe contenant des clefs documentaires"
298 for l in f.readlines():
302 dict_clef_docu[clef]=docu
303 for oper in self.cata.JdC.commandes:
304 if dict_clef_docu.has_key(oper.nom):
305 oper.docu=dict_clef_docu[oper.nom]