Salome HOME
faa27690b999415537c763f55d8a66b22f4e66b9
[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       # 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
91       else:
92           for catalogue in all_cata_list:
93               #print catalogue.code
94               #print catalogue.file_format
95               if catalogue.code == self.code and catalogue.file_format == self.ssCode:
96                   liste_cata_possibles.append(catalogue)
97
98       #print "___________"
99       #print self.ssCode
100       #print self.code
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 :
106              sys.exit(1)
107           return
108
109
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
117       else:
118           cata_choice_list = []
119           for cata in liste_cata_possibles:
120               if cata.selectable:
121                   if cata.default:
122                       cata_choice_list.insert(0, cata)
123                   else :
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 :
130                  sys.exit(1)
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
142               try :
143               # souci pour les includes et sans Ihm
144                   self.appliEficas.setWindowTitle(lab)
145               except :
146                   pass
147           else:
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
152
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)
156              sys.exit(1)
157           else :
158              self.appliEficas.close()
159              return
160
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'
165
166       # import du catalogue
167       self.cata = self.import_cata(self.fic_cata)
168       if not self.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 :
172              sys.exit(1)
173       #
174       # analyse du catalogue (ordre des mots-clés)
175       #
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()
182
183       #
184       # analyse des données liées a  l'IHM : UIinfo
185       #
186       uiinfo.traite_UIinfo(self.cata)
187
188       #
189       # traitement des clefs documentaires
190       #
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
198
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)
207       else :
208           try :
209              a=self.appliEficas.CONFIGURATION.dRepMat[self.version_code]
210           except :
211              if self.code == "ASTER" :
212                 print "Probleme avec le repertoire materiau"
213              a='.'
214       self.appliEficas.CONFIGURATION.rep_mat=a
215
216    def import_cata(self,cata):
217       """ 
218           Réalise l'import du catalogue dont le chemin d'acces est donné par cata
219       """
220       nom_cata = os.path.splitext(os.path.basename(cata))[0]
221       rep_cata = os.path.dirname(cata)
222       sys.path[:0] = [rep_cata]
223       
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+'.':
228           del sys.modules[k]
229
230       try :
231           o=__import__(nom_cata)
232           return o
233       except Exception,e:
234           traceback.print_exc()
235           return 0
236
237    def Retrouve_Ordre_Cata_Standard_autre(self):
238       """ 
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
243       """ 
244       self.cata_ordonne_dico,self.appliEficas.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
245
246    def Retrouve_Ordre_Cata_Standard(self):
247       """ 
248           Retrouve l'ordre des mots-clés dans le catalogue, cad :
249           Attention s appuie sur les commentaires
250       """
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)
254
255    def ask_choix_catalogue(self, cata_choice_list):
256       """
257       Ouvre une fenetre de sélection du catalogue dans le cas où plusieurs
258       ont été définis dans Accas/editeur.ini
259       """      
260       code = getattr(self.appliEficas.CONFIGURATION, "code", None)
261       if code != None : 
262           title="Choix d une version du code "+str(code)
263       else :
264           title="Choix d une version "
265     
266       widgetChoix = MonChoixCata(self.appliEficas, [cata.user_name for cata in cata_choice_list], title)
267       ret=widgetChoix.exec_()
268       
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)
283       else:
284           self.appliEficas.close()
285           if self.appliEficas.salome == 0 :
286              sys.exit(0)
287
288    def traite_clefs_documentaires(self):
289       try:
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)
293       except:
294         #print "Pas de fichier associe contenant des clefs documentaires"
295         return
296
297       dict_clef_docu={}
298       for l in f.readlines():
299           clef=l.split(':')[0]
300           docu=l.split(':')[1]
301           docu=docu[0:-1]
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]