]> SALOME platform Git repositories - tools/eficas.git/blob - InterfaceQT4/readercata.py
Salome HOME
d6119edb8b1aad698c10d85250fb823bfb996751
[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 import types
33
34 # Modules Eficas
35 from Noyau.N_CR import CR
36 from Editeur.catadesc import CatalogDescription
37 from Editeur.utils  import init_rep_cata_dev
38
39 import analyse_catalogue
40 import analyse_catalogue_initial
41 import autre_analyse_cata
42 import uiinfo
43 from monChoixCata import MonChoixCata
44
45 from PyQt4 import *
46 from PyQt4.QtGui import *
47 from PyQt4.QtCore import *
48
49
50 class READERCATA:
51
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
61       else :
62          self.mode_nouv_commande='alpha'
63       self.version_code=self.QWParent.version_code
64       self.version_cata=None
65       self.fic_cata=None
66       self.OpenCata()
67       self.cataitem=None
68
69    def OpenCata(self):
70       """ 
71           Ouvre le catalogue standard du code courant, cad le catalogue présent
72           dans le répertoire Cata 
73       """
74
75       liste_cata_possibles=[]
76       self.Commandes_Ordre_Catalogue=[]
77
78       all_cata_list = []
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))
84           else:
85               print "Catalog description cannot be interpreted: ", catalogue
86
87       # TODO: Remove this filter. Normally, CONFIGURATION should only define the catalogs for this code anyway.
88       # Non pas pour Map qui a une notion de sscode
89       for catalogue in all_cata_list:
90           if catalogue.code == self.code :
91              if (self.ssCode == None) or (self.ssCode == catalogue.file_format):
92                  liste_cata_possibles.append(catalogue)
93
94       if len(liste_cata_possibles)==0:          
95           QMessageBox.critical( self.QWParent, "Import du catalogue","Pas de catalogue defini pour le code %s" % self.code)
96           self.appliEficas.close()
97           if self.appliEficas.salome == 0 :
98              sys.exit(1)
99           return
100
101
102       if self.version_code is not None:
103           # La version a ete fixee
104           for cata in liste_cata_possibles:
105              if self.version_code == cata.identifier:
106                 self.fic_cata = cata.cata_file_path
107                 self.appliEficas.format_fichier = cata.file_format
108                 self.appliEficas.format_fichier_in = cata.file_format_in
109       else:
110           cata_choice_list = []
111           for cata in liste_cata_possibles:
112               if cata.selectable:
113                   if cata.default:
114                       cata_choice_list.insert(0, cata)
115                   else :
116                       cata_choice_list.append(cata)
117           if len(cata_choice_list) == 0:
118               QMessageBox.critical(self.QWParent, "Import du catalogue",
119                                    QString.fromUtf8("Aucun catalogue trouvé"))
120               self.appliEficas.close()
121               if self.appliEficas.salome == 0 :
122                  sys.exit(1)
123           elif len(cata_choice_list) == 1:
124               self.fic_cata = cata_choice_list[0].cata_file_path
125               self.version_code = cata_choice_list[0].identifier
126               self.appliEficas.format_fichier = cata_choice_list[0].file_format
127               self.appliEficas.format_fichier_in = cata_choice_list[0].file_format_in
128               lab=QString("Eficas ") 
129               lab+=QString(self.VERSION_EFICAS) 
130               lab+=QString(" pour ")
131               lab+=QString(self.code) 
132               lab+=QString(" avec le catalogue ")
133               lab+=self.version_code
134               try :
135               # souci pour les includes et sans Ihm
136                   self.appliEficas.setWindowTitle(lab)
137               except :
138                   pass
139           else:
140               # plusieurs catalogues sont disponibles : il faut demander a l'utilisateur
141               # lequel il veut utiliser ...
142               self.ask_choix_catalogue(cata_choice_list)
143               # On est dans Salome et il faut sortir proprement
144
145       if self.fic_cata == None :
146           if self.appliEficas.salome == 0 :
147              print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
148              sys.exit(1)
149           else :
150              self.appliEficas.close()
151              return
152
153       self.determineMater()
154       # détermination de fic_cata_c et fic_cata_p
155       self.fic_cata_c = self.fic_cata + 'c'
156       self.fic_cata_p = os.path.splitext(self.fic_cata)[0]+'_pickled.py'
157
158       # import du catalogue
159       self.cata = self.import_cata(self.fic_cata)
160       if not self.cata :          
161           QMessageBox.critical( self.QWParent, "Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
162           self.appliEficas.close()
163           if self.appliEficas.salome == 0 :
164              sys.exit(1)
165       #
166       # analyse du catalogue (ordre des mots-clés)
167       #
168       # Retrouve_Ordre_Cata_Standard fait une analyse textuelle du catalogue
169       # remplacé par Retrouve_Ordre_Cata_Standard_autre qui utilise une numerotation
170       # des mots clés a la création
171       self.Retrouve_Ordre_Cata_Standard_autre()
172       if self.mode_nouv_commande== "initial" :
173          self.Retrouve_Ordre_Cata_Standard()
174
175       #
176       # analyse des données liées a  l'IHM : UIinfo
177       #
178       uiinfo.traite_UIinfo(self.cata)
179
180       #
181       # traitement des clefs documentaires
182       #
183       self.traite_clefs_documentaires()
184       self.cata=(self.cata,)
185       titre=self.VERSION_EFICAS + " avec le catalogue " + os.path.basename(self.fic_cata)
186       if self.appliEficas.top:
187         self.appliEficas.setWindowTitle(titre)
188       self.appliEficas.titre=titre
189
190    def determineMater(self) :
191       # Determinination du repertoire materiau
192       v_codeSansPoint=self.version_code
193       if v_codeSansPoint == None : return 
194       v_codeSansPoint=re.sub("\.","",v_codeSansPoint)
195       chaine="rep_mat_"+v_codeSansPoint
196       if hasattr(self.appliEficas.CONFIGURATION,chaine):
197           a=getattr(self.appliEficas.CONFIGURATION,chaine)
198       else :
199           try :
200              a=self.appliEficas.CONFIGURATION.dRepMat[self.version_code]
201           except :
202              if self.code == "ASTER" :
203                 print "Probleme avec le repertoire materiau"
204              a='.'
205       self.appliEficas.CONFIGURATION.rep_mat=a
206
207    def import_cata(self,cata):
208       """ 
209           Réalise l'import du catalogue dont le chemin d'acces est donné par cata
210       """
211       nom_cata = os.path.splitext(os.path.basename(cata))[0]
212       rep_cata = os.path.dirname(cata)
213       sys.path[:0] = [rep_cata]
214       
215       if sys.modules.has_key(nom_cata):
216         del sys.modules[nom_cata]
217       for k in sys.modules.keys():
218         if k[0:len(nom_cata)+1] == nom_cata+'.':
219           del sys.modules[k]
220
221       try :
222           o=__import__(nom_cata)
223           return o
224       except Exception,e:
225           traceback.print_exc()
226           return 0
227
228    def Retrouve_Ordre_Cata_Standard_autre(self):
229       """ 
230           Construit une structure de données dans le catalogue qui permet
231           a  EFICAS de retrouver l'ordre des mots-clés dans le texte du catalogue.
232           Pour chaque entité du catlogue on crée une liste de nom ordre_mc qui
233           contient le nom des mots clés dans le bon ordre
234       """ 
235       self.cata_ordonne_dico,self.appliEficas.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
236
237    def Retrouve_Ordre_Cata_Standard(self):
238       """ 
239           Retrouve l'ordre des mots-clés dans le catalogue, cad :
240           Attention s appuie sur les commentaires
241       """
242       nom_cata = os.path.splitext(os.path.basename(self.fic_cata))[0]
243       rep_cata = os.path.dirname(self.fic_cata)
244       self.Commandes_Ordre_Catalogue = analyse_catalogue_initial.analyse_catalogue(self.fic_cata)
245
246    def ask_choix_catalogue(self, cata_choice_list):
247       """
248       Ouvre une fenetre de sélection du catalogue dans le cas où plusieurs
249       ont été définis dans Accas/editeur.ini
250       """      
251       title = getattr(self.appliEficas.CONFIGURATION, "cata_choice_window_title", None)
252       widgetChoix = MonChoixCata(self.appliEficas, [cata.user_name for cata in cata_choice_list], title)
253       ret=widgetChoix.exec_()
254       
255       lab=QString(self.VERSION_EFICAS)
256       lab+=QString(" pour ")
257       lab+=QString(self.code) 
258       lab+=QString(" avec le catalogue ")
259       if ret == QDialog.Accepted:
260           cata = cata_choice_list[widgetChoix.CBChoixCata.currentIndex()]
261           self.version_cata = cata.identifier
262           self.fic_cata = cata.cata_file_path
263           self.version_code = self.version_cata
264           self.appliEficas.format_fichier = cata.file_format
265           self.appliEficas.format_fichier_in = cata.file_format_in
266           lab+=self.version_cata
267           self.appliEficas.setWindowTitle(lab)
268           #qApp.mainWidget().setCaption(lab)
269       else:
270           self.appliEficas.close()
271           if self.appliEficas.salome == 0 :
272              sys.exit(0)
273
274    def traite_clefs_documentaires(self):
275       try:
276         self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
277         #print self.fic_cata_clef
278         f=open(self.fic_cata_clef)
279       except:
280         #print "Pas de fichier associe contenant des clefs documentaires"
281         return
282
283       dict_clef_docu={}
284       for l in f.readlines():
285           clef=l.split(':')[0]
286           docu=l.split(':')[1]
287           docu=docu[0:-1]
288           dict_clef_docu[clef]=docu
289       for oper in self.cata.JdC.commandes:
290            if dict_clef_docu.has_key(oper.nom):
291               oper.docu=dict_clef_docu[oper.nom]