Salome HOME
bug double affichage rechercher
[tools/eficas.git] / InterfaceQT4 / qtEficas.py
1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2013   EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 from __future__ import absolute_import
22 from __future__ import print_function
23 try :
24    from builtins import str
25 except : pass
26
27 import os, sys
28 import six
29
30
31 from PyQt5.QtWidgets import QApplication, QMainWindow, QBoxLayout, QMenu, QAction, QMessageBox
32 from PyQt5.QtGui import QIcon
33 from PyQt5.QtCore import Qt
34
35 from Extensions.i18n import tr
36 from Extensions.eficas_exception import EficasException
37 from Extensions import param2
38
39
40 from myMain import Ui_Eficas
41 from .viewManager import MyTabview
42 from .getVersion import getEficasVersion
43 from Editeur import session
44
45
46
47 class Appli(Ui_Eficas,QMainWindow):
48     """
49     Class implementing the main user interface.
50     """
51     def __init__(self,code=None,salome=0,parent=None,ssCode=None,multi=False,langue='fr',ssIhm=False):
52         """
53         Constructor
54         """
55         QMainWindow.__init__(self,parent)
56         Ui_Eficas.__init__(self)
57
58
59         version=getEficasVersion()
60         self.VERSION_EFICAS="Eficas QT5 Salome " + version
61         self.salome=salome
62         self.parentMainWindow=parent
63         self.ihm="QT"
64         self.ssIhm=ssIhm
65         self.top = self    #(pour CONFIGURATION)
66         self.QWParent=None #(Pour lancement sans IHM)
67         self.code=code
68         self.indice=0
69         self.first=1
70         self.dict_reels={}
71         self.recent =  []
72         self.ficRecents={}
73         self.mesScripts={}
74         self.listeAEnlever=[]
75         self.ListePathCode=['Adao','ADAO','Carmel3D','Telemac','CF','MAP','ZCracks', 'SEP','SPECA','PSEN_Eficas','PSEN_N1']
76         self.listeCode=['Adao','ADAO','Carmel3D','Telemac','CF','MAP','ZCracks', 'SEP','SPECA','PSEN_Eficas','PSEN_N1']
77         self.repIcon=os.path.join( os.path.dirname(os.path.abspath(__file__)),'..','Editeur','icons')
78
79         if langue=='fr': self.langue=langue
80         else           : self.langue="ang"
81
82         if self.salome:
83           import Accas
84           import eficasSalome
85           Accas.SalomeEntry = eficasSalome.SalomeEntry
86
87         self.multi=multi
88         self.demande=multi # specifique PSEN
89
90
91         if self.multi == False :
92              self.definitCode(code,ssCode)
93              if code==None: return
94
95
96       
97         if not self.salome and hasattr (self, 'CONFIGURATION') and hasattr(self.CONFIGURATION,'lang') : langue=self.CONFIGURATION.lang
98
99
100         self.suiteTelemac=False 
101         if hasattr (self, 'CONFIGURATION') :
102            if self.CONFIGURATION.force_langue :
103               from .monChoixLangue import MonChoixLangue
104               widgetLangue = MonChoixLangue(self)
105               ret=widgetLangue.exec_()
106            self.suiteTelemac=self.CONFIGURATION.suiteTelemac 
107            
108
109         from Extensions import localisation
110         app=QApplication
111         if hasattr (self, 'CONFIGURATION') : localisation.localise(None,self.langue,translatorFichier=self.CONFIGURATION.translatorFichier)
112
113
114
115         self.setupUi(self)
116         #if parent != None : self.parentCentralWidget = parent.centralWidget()
117         #else              : self.parentCentralWidget = None 
118
119         if not self.salome :
120            if  hasattr (self, 'CONFIGURATION') and hasattr(self.CONFIGURATION,'taille') : self.taille=self.CONFIGURATION.taille
121            else : self.taille=1700
122
123            if self.code in ['MAP',] : self.resize(1440,self.height())
124            else : self.resize(self.taille,self.height())
125
126    
127         icon = QIcon(self.repIcon+"/parametres.png")
128         self.actionParametres.setIcon(icon)
129
130
131         self.myQtab.removeTab(0)
132         self.blEntete= QBoxLayout(0,self.frameEntete)
133         self.blEntete.insertWidget(0,self.toolBar)
134         self.blEntete.insertWidget(0,self.menubar)
135
136         if hasattr (self, 'CONFIGURATION') and self.CONFIGURATION.closeEntete==True and self.salome: self.closeEntete()
137
138         eficas_root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
139
140         #self.resize(20,20)
141         self.viewmanager = MyTabview(self)
142         self.recentMenu=QMenu(tr('&Recents'))
143         #self.menuFichier.insertMenu(self.actionOuvrir,self.recentMenu)
144         # actionARemplacer ne sert que pour l insert Menu
145         self.menuFichier.insertMenu(self.actionARemplacer ,self.recentMenu)
146         self.menuFichier.removeAction(self.actionARemplacer)
147         self.connecterSignaux()
148         self.toolBar.addSeparator()
149         if self.code != None : self.construitMenu()
150
151         self.setWindowTitle(self.VERSION_EFICAS)
152         #try :
153         if 1 :
154           self.ouvreFichiers()
155         #except EficasException, exc:
156         #except:
157         #  print "je suis dans le except"
158           #if self.salome == 0 : exit()
159
160         #self.adjustSize()
161
162     def closeEntete(self):
163         self.menuBar().close()
164         self.toolBar.close()
165         self.frameEntete.close()
166
167     def definitCode(self,code,ssCode) :
168         self.code=code
169         self.ssCode=ssCode
170         if self.code==None :
171            self.cleanPath()
172            from .monChoixCode import MonChoixCode
173            widgetChoix = MonChoixCode(self)
174            ret=widgetChoix.exec_()
175         import sys
176         if self.code == None:return # pour le cancel de la fenetre choix code
177         name='prefs_'+self.code
178         prefsCode=__import__(name)
179
180         self.repIni=prefsCode.repIni
181         if ssCode != None :
182            self.format_fichier= ssCode  #par defaut
183            prefsCode.NAME_SCHEME=ssCode
184         else :
185            self.format_fichier="python" #par defaut
186
187         nameConf='configuration_'+self.code
188         configuration=__import__(nameConf)
189         self.CONFIGURATION = configuration.make_config(self,prefsCode.repIni)
190         self.CONFIGStyle = None
191         if hasattr(configuration,'make_config_style'):
192            self.CONFIGStyle = configuration.make_config_style(self,prefsCode.repIni)
193         from Extensions import localisation
194         app=QApplication
195         if hasattr (self, 'CONFIGURATION') : localisation.localise(None,self.langue,translatorFichier=self.CONFIGURATION.translatorFichier)
196         #PN --> pb d exception qui font planter salome
197         # plus supporte en python 3
198         #if hasattr(prefsCode,'encoding'):
199         #   import sys
200         #   reload(sys)
201         #   sys.setdefaultencoding(prefsCode.encoding)
202
203     def construitMenu(self):
204         self.initPatrons()
205         self.initRecents()
206         self.initAides()
207         for intituleMenu in ("menuTraduction","menuOptions","menuMesh","menuExecution","menuN1"):
208               if hasattr(self,intituleMenu):
209                  menu=getattr(self,intituleMenu)
210                  menu.setAttribute(Qt.WA_DeleteOnClose)
211                  menu.close()
212                  delattr(self,intituleMenu)
213         for intituleAction in ("actionExecution","actionSaveRun"):
214             if hasattr(self,intituleAction):
215               action=getattr(self,intituleAction)
216               self.toolBar.removeAction(action)
217         if self.code.upper() in Appli.__dict__:
218           Appli.__dict__[self.code.upper()](self,)
219         if self.suiteTelemac : self.lookSuiteTelemac()
220
221     def initAides(self):
222         #print "je passe la"
223         repAide=os.path.dirname(os.path.abspath(__file__))
224         fileName='index.html'
225         self.docPath=repAide+"/../Aide"
226         if hasattr(self,'CONFIGURATION') and hasattr(self.CONFIGURATION,'docPath') : self.docPath=self.CONFIGURATION.docPath
227         if hasattr(self,'CONFIGURATION') and hasattr(self.CONFIGURATION,'fileName'):fileName=self.CONFIGURATION.fileName
228         self.fileDoc=os.path.join(self.docPath,fileName)
229         self.actionCode.setText(tr("Aide specifique ")+str(self.code))
230         if not os.path.isfile(self.fileDoc) :
231                self.fileDoc=""
232                self.docPath=""
233                self.actionCode.setEnabled(False)
234                return
235
236         self.actionCode.setEnabled(True)
237         self.menuAide.addAction(self.actionCode)
238
239     def newN1(self):
240         ssCode=None
241         code="PSEN_N1"
242         self.cleanPath()
243         dirCode=os.path.abspath(os.path.join(os.path.abspath(__file__),'../..',"ProcessOutputs_Eficas"))
244         sys.path.insert(0,dirCode)
245         self.code=code
246         self.definitCode(code,ssCode)
247         self.initRecents()
248         self.multi=True
249         self.demande=False
250         self.fileNew()
251
252     def newPSEN(self):
253         ssCode=None
254         code="PSEN"
255         self.cleanPath()
256         dirCode=os.path.abspath(os.path.join(os.path.abspath(__file__),'../..',code))
257         sys.path.insert(0,dirCode)
258         self.code=code
259         self.definitCode(code,ssCode)
260         self.multi=True
261         self.demande=False
262         self.fileNew()
263
264     def ajoutN1(self):
265         self.menuN1 = self.menubar.addMenu(tr("Process Output"))
266         self.actionN1 = QAction(self)
267         self.actionN1.setText(tr("Process Output"))
268         self.menuN1.addAction(self.actionN1)
269         self.actionN1.triggered.connect(self.newN1)
270
271
272         if hasattr(self,'actionOpenProcess'):return
273         
274         self.actionOpenProcess = QAction(self)
275         self.actionOpenProcess.setText(tr("Open Process_Output File"))
276         self.menuN1.addAction(self.actionOpenProcess)
277         self.actionOpenProcess.triggered.connect(self.openProcess)
278
279     def ajoutExecution(self):
280         self.menuExecution = self.menubar.addMenu(tr("&Run"))
281         self.actionExecution = QAction(self)
282         if sys.platform[0:5]=="linux":
283           icon6 = QIcon(self.repIcon+"/roue.png")
284           self.actionExecution.setIcon(icon6)
285         else :
286           self.actionExecution.setText(tr("Run"))
287         self.actionExecution.setObjectName("actionExecution")
288         self.menuExecution.addAction(self.actionExecution)
289         if not(self.actionExecution in self.toolBar.actions()):
290            self.toolBar.addAction(self.actionExecution)
291         self.actionExecution.setText(tr("Run"))
292         self.actionExecution.triggered.connect(self.run)
293
294     def ajoutSauveExecution(self):
295         self.actionSaveRun = QAction(self)
296         icon7 = QIcon(self.repIcon+"/export_MAP.png")
297         self.actionSaveRun.setIcon(icon7)
298         self.actionSaveRun.setObjectName("actionSaveRun")
299         self.menuExecution.addAction(self.actionSaveRun)
300         if not(self.actionSaveRun in self.toolBar.actions()):
301            self.toolBar.addAction(self.actionSaveRun)
302         self.actionSaveRun.setText(tr("Save Run"))
303         self.actionSaveRun.triggered.connect(self.saveRun)
304
305     def griserActionsStructures(self):
306         self.actionCouper.setEnabled(False)
307         self.actionColler.setEnabled(False)
308         self.actionCopier.setEnabled(False)
309         self.actionSupprimer.setEnabled(False)
310
311     def enleverActionsStructures(self):
312         self.toolBar.removeAction(self.actionCopier)
313         self.toolBar.removeAction(self.actionColler)
314         self.toolBar.removeAction(self.actionCouper)
315         self.menuEdition.removeAction(self.actionCouper)
316         self.menuEdition.removeAction(self.actionCopier)
317         self.menuEdition.removeAction(self.actionColler)
318
319
320     def enleverParametres(self):
321         self.toolBar.removeAction(self.actionParametres)
322         self.menuJdC.removeAction(self.actionParametres)
323
324     def enleverSupprimer(self):
325         self.toolBar.removeAction(self.actionSupprimer)
326
327     def enleverNewInclude(self):
328         self.actionNouvel_Include.setVisible(False)
329
330     def enleverRechercherDsCatalogue(self):
331         self.actionRechercherDsCatalogue.setVisible(False)
332
333     def connectRechercherDsCatalogue(self):
334         if hasattr(self,'rechercherDejaLa') : return
335         self.rechercherDejaLa=True
336         self.actionRechercherDsCatalogue.triggered.connect(self.handleRechercherDsCatalogue)
337
338     def ajoutSortieLegere(self):
339         if hasattr(self,'actionSortieLegere') : return
340         self.actionSortieLegere = QAction(self)
341         self.actionSortieLegere.setText(tr("Sortie Legere"))
342         self.menuFichier.insertAction(self.actionEnregistrer_sous,self.actionSortieLegere)
343         self.actionSortieLegere.triggered.connect(self.handleSortieLegere)
344
345
346     def ZCRACKS(self):
347         self.enleverNewInclude()
348         self.toolBar.addSeparator()
349         self.ajoutExecution()
350
351         self.menuOptions = self.menubar.addMenu("menuOptions")
352         self.menuOptions.addAction(self.actionParametres_Eficas)
353         self.menuOptions.setTitle(tr("Options"))
354
355     def ADAO(self):
356         self.enleverActionsStructures()
357         self.enleverNewInclude()
358
359     def ASTER(self) :
360         self.menuTraduction = self.menubar.addMenu("menuTraduction")
361         self.menuTraduction.addAction(self.actionTraduitV11V12)
362         self.menuTraduction.addAction(self.actionTraduitV10V11)
363         self.menuTraduction.addAction(self.actionTraduitV9V10)
364         self.menuTraduction.setTitle(tr("Traduction"))
365
366         self.menuFichier.addAction(self.actionSauveLigne)
367
368         self.menuOptions = self.menubar.addMenu("menuOptions")
369         self.menuOptions.addAction(self.actionParametres_Eficas)
370         self.menuOptions.addAction(self.actionLecteur_Pdf)
371         self.menuOptions.setTitle(tr("Options"))
372
373     def CARMEL3D(self):
374         #if self.salome == 0 : return
375         self.enleverNewInclude()
376         self.menuMesh = self.menubar.addMenu(tr("Gestion Maillage"))
377         self.menuMesh.setObjectName("Mesh")
378         self.menuMesh.addAction(self.actionChercheGrpMaille)
379         #self.griserActionsStructures()
380
381     def CARMELCND(self):
382         self.enleverNewInclude()
383         self.enleverRechercherDsCatalogue()
384         self.ajoutExecution()
385         self.ajoutSauveExecution()
386         self.griserActionsStructures()
387         
388     def MAP(self):
389         self.enleverNewInclude()
390         self.toolBar.addSeparator()
391         self.ajoutExecution()
392         self.ajoutSauveExecution()
393         self.menuOptions = self.menubar.addMenu("menuOptions")
394         self.menuOptions.addAction(self.actionParametres_Eficas)
395         self.menuOptions.setTitle(tr("Options"))
396
397     def PSEN(self):
398         if self.first: self.first=0
399         self.action_Nouveau.triggered.disconnect(self.fileNew)
400         self.action_Nouveau.triggered.connect(self.newPSEN)
401         self.enleverActionsStructures()
402         self.enleverParametres()
403         self.enleverRechercherDsCatalogue()
404         self.enleverNewInclude()
405         self.ajoutExecution()
406         self.ajoutN1()
407         self.ajoutHelpPSEN()
408         self.ajoutIcones()
409
410     def PSEN_N1(self):
411         self.enleverActionsStructures()
412         self.enleverParametres()
413         self.enleverRechercherDsCatalogue()
414         self.enleverNewInclude()
415         self.ajoutExecution()
416         self.ajoutIcones()
417
418     def TELEMAC(self):
419         self.enleverActionsStructures()
420         self.enleverNewInclude()
421         self.connectRechercherDsCatalogue()
422         self.ajoutSortieLegere()
423
424     def lookSuiteTelemac(self):
425         self.enleverActionsStructures()
426         self.enleverNewInclude()
427         self.enleverParametres()
428         self.enleverSupprimer()
429         self.enleverRechercherDsCatalogue()
430
431     def ajoutHelpPSEN(self):
432         self.actionParametres_Eficas.setText('Help PSEN')
433         self.actionParametres_Eficas.triggered.connect(self.aidePSEN)
434         
435
436
437     def ChercheGrpMesh(self):
438         Msg,listeGroup=self.ChercheGrpMeshInSalome()
439         if Msg == None :
440            self.viewmanager.handleAjoutGroup(listeGroup)
441         else :
442            print ("il faut gerer les erreurs")
443
444     def ChercheGrpMaille(self):
445         # Normalement la variable self.salome permet de savoir si on est ou non dans Salome
446         try:
447             Msg,listeGroup=self.ChercheGrpMailleInSalome() # recherche dans Salome
448             #Msg = None; listeGroup = None # recherche manuelle, i.e., sans Salome si ligne precedente commentee
449         except:
450             raise ValueError('Salome non ouvert')
451         if Msg == None :
452            self.viewmanager.handleAjoutGroup(listeGroup)
453         else :
454            print ("il faut gerer les erreurs")
455
456
457     def ChercheGrp(self):
458         #Msg,listeGroup=self.ChercheGrpMailleInSalome()
459         #if Msg == None :
460         #   self.viewmanager.handleAjoutGroup(listeGroup)
461         #else :
462         #print "il faut gerer "
463         pass
464
465
466     def ajoutIcones(self) :
467         # Pour pallier les soucis de repertoire d icone
468         #print self.repIcon
469         icon = QIcon(self.repIcon+"/new_file.png")
470         self.action_Nouveau.setIcon(icon)
471         icon1 = QIcon(self.repIcon+"/ouvrir.png")
472         self.actionOuvrir.setIcon(icon1)
473         icon2 = QIcon(self.repIcon+"/save.png")
474         self.actionEnregistrer.setIcon(icon2)
475         icon6 = QIcon(self.repIcon+"/delete.png")
476         self.actionSupprimer.setIcon(icon6)
477         icon7 = QIcon(self.repIcon+"/roue.png")
478         self.actionExecution.setIcon(icon7)
479
480
481
482    
483     def connecterSignauxQT4(self) :
484         self.connect(self.recentMenu,SIGNAL('aboutToShow()'),self.handleShowRecentMenu)
485
486         self.connect(self.action_Nouveau,SIGNAL("triggered()"),self.fileNew)
487         self.connect(self.actionNouvel_Include,SIGNAL("triggered()"),self.NewInclude)
488         self.connect(self.actionOuvrir,SIGNAL("triggered()"),self.fileOpen)
489         self.connect(self.actionEnregistrer,SIGNAL("triggered()"),self.fileSave)
490         self.connect(self.actionEnregistrer_sous,SIGNAL("triggered()"),self.fileSaveAs)
491         self.connect(self.actionFermer,SIGNAL("triggered()"),self.fileClose)
492         self.connect(self.actionFermer_tout,SIGNAL("triggered()"),self.fileCloseAll)
493         self.connect(self.actionQuitter,SIGNAL("triggered()"),self.fileExit)
494
495         self.connect(self.actionEficas,SIGNAL("triggered()"),self.aidePPal)
496         self.connect(self.actionVersion,SIGNAL("triggered()"),self.version)
497         self.connect(self.actionParametres,SIGNAL("triggered()"),self.gestionParam)
498
499         self.connect(self.actionCouper,SIGNAL("triggered()"),self.editCut)
500         self.connect(self.actionCopier,SIGNAL("triggered()"),self.editCopy)
501         self.connect(self.actionColler,SIGNAL("triggered()"),self.editPaste)
502         self.connect(self.actionSupprimer,SIGNAL("triggered()"),self.supprimer)
503         self.connect(self.actionRechercher,SIGNAL("triggered()"),self.rechercher)
504         self.connect(self.actionDeplier_replier,SIGNAL("triggered()"),self.Deplier)
505
506         self.connect(self.actionRapport_de_Validation,SIGNAL("triggered()"),self.jdcRapport)
507         self.connect(self.actionRegles_du_JdC,SIGNAL("triggered()"),self.jdcRegles)
508         self.connect(self.actionFichier_Source,SIGNAL("triggered()"),self.jdcFichierSource)
509         self.connect(self.actionFichier_Resultat,SIGNAL("triggered()"),self.visuJdcPy)
510
511
512
513
514         # Pour Aster
515         self.actionTraduitV9V10 = QAction(self)
516         self.actionTraduitV9V10.setObjectName("actionTraduitV9V10")
517         self.actionTraduitV9V10.setText(tr("TraduitV9V10"))
518         self.actionTraduitV10V11 = QAction(self)
519         self.actionTraduitV10V11.setObjectName("actionTraduitV10V11")
520         self.actionTraduitV10V11.setText(tr("TraduitV10V11"))
521         self.actionTraduitV11V12 = QAction(self)
522         self.actionTraduitV11V12.setObjectName("actionTraduitV11V12")
523         self.actionTraduitV11V12.setText(tr("TraduitV11V12"))
524         self.actionSauveLigne = QAction(self)
525         self.actionSauveLigne.setText(tr("Sauve Format Ligne"))
526
527         #self.connect(self.actionParametres_Eficas,SIGNAL("triggered()"),self.optionEditeur)
528         self.connect(self.actionLecteur_Pdf,SIGNAL("triggered()"),self.optionPdf)
529         self.connect(self.actionTraduitV9V10,SIGNAL("triggered()"),self.traductionV9V10)
530         self.connect(self.actionTraduitV10V11,SIGNAL("triggered()"),self.traductionV10V11)
531         self.connect(self.actionTraduitV11V12,SIGNAL("triggered()"),self.traductionV11V12)
532         self.connect(self.actionSauveLigne,SIGNAL("triggered()"),self.sauveLigne)
533
534
535         # Pour Carmel
536         self.actionChercheGrpMaille = QAction(self)
537         self.actionChercheGrpMaille.setText(tr("Acquiert groupe mailles"))
538         self.connect(self.actionChercheGrpMaille,SIGNAL("triggered()"),self.ChercheGrpMaille)
539
540         # Pour CarmelCND
541         self.actionChercheGrp = QAction(self)
542         self.actionChercheGrp.setText(tr("Acquisition Groupe Maille"))
543         self.connect(self.actionChercheGrp,SIGNAL("triggered()"),self.ChercheGrp)
544
545         # Pour Aide
546         self.actionCode = QAction(self)
547         self.actionCode.setText(tr("Specificites Maille"))
548         self.connect(self.actionCode,SIGNAL("triggered()"),self.aideCode)
549
550     def connecterSignaux(self) :
551
552         self.recentMenu.aboutToShow.connect(self.handleShowRecentMenu)
553         self.action_Nouveau.triggered.connect(self.fileNew)
554         self.actionNouvel_Include.triggered.connect(self.NewInclude)
555         self.actionOuvrir.triggered.connect(self.fileOpen)
556         self.actionEnregistrer.triggered.connect(self.fileSave)
557         self.actionEnregistrer_sous.triggered.connect(self.fileSaveAs)
558         self.actionFermer.triggered.connect(self.fileClose)
559         self.actionFermer_tout.triggered.connect(self.fileCloseAll)
560         self.actionQuitter.triggered.connect(self.fileExit)
561
562         self.actionEficas.triggered.connect(self.aidePPal)
563         self.actionVersion.triggered.connect(self.version)
564         self.actionParametres.triggered.connect(self.gestionParam)
565         self.actionCommentaire.triggered.connect(self.ajoutCommentaire)
566
567         self.actionCouper.triggered.connect(self.editCut)
568         self.actionCopier.triggered.connect(self.editCopy)
569         self.actionColler.triggered.connect(self.editPaste)
570         self.actionSupprimer.triggered.connect(self.supprimer)
571         self.actionRechercher.triggered.connect(self.rechercher)
572         self.actionDeplier_replier.triggered.connect(self.Deplier)
573
574         self.actionRapport_de_Validation.triggered.connect(self.jdcRapport)
575         self.actionRegles_du_JdC.triggered.connect(self.jdcRegles)
576         self.actionFichier_Source.triggered.connect(self.jdcFichierSource)
577         self.actionFichier_Resultat.triggered.connect(self.visuJdcPy)
578         self.actionAfficher_l_Arbre.triggered.connect(self.ouvreArbre)
579         self.actionCacher_l_Arbre.triggered.connect(self.fermeArbre)
580
581
582         # Pour Aster
583         self.actionTraduitV9V10 = QAction(self)
584         self.actionTraduitV9V10.setObjectName("actionTraduitV9V10")
585         self.actionTraduitV9V10.setText(tr("TraduitV9V10"))
586         self.actionTraduitV10V11 = QAction(self)
587         self.actionTraduitV10V11.setObjectName("actionTraduitV10V11")
588         self.actionTraduitV10V11.setText(tr("TraduitV10V11"))
589         self.actionTraduitV11V12 = QAction(self)
590         self.actionTraduitV11V12.setObjectName("actionTraduitV11V12")
591         self.actionTraduitV11V12.setText(tr("TraduitV11V12"))
592         self.actionSauveLigne = QAction(self)
593         self.actionSauveLigne.setText(tr("Sauve Format Ligne"))
594
595         #self.actionParametres_Eficas.triggered.connect(self.optionEditeur)
596         self.actionTraduitV9V10.triggered.connect(self.traductionV9V10)
597         self.actionTraduitV10V11.triggered.connect(self.traductionV10V11)
598         self.actionTraduitV11V12.triggered.connect(self.traductionV11V12)
599         self.actionSauveLigne.triggered.connect(self.sauveLigne)
600
601         # Pour Carmel
602         self.actionChercheGrpMaille = QAction(self)
603         self.actionChercheGrpMaille.setText(tr("Acquiert Groupe Maille"))
604
605         # Pour CarmelCND
606         self.actionChercheGrp = QAction(self)
607         self.actionChercheGrp.setText(tr("Accquisition Groupe Maille"))
608         self.actionChercheGrp.triggered.connect(self.ChercheGrp)
609
610         # Pour Aide
611         self.actionCode = QAction(self)
612         self.actionCode.setText(tr("Specificites Maille"))
613         self.actionCode.triggered.connect(self.aideCode)
614
615
616     def Deplier(self):
617         self.viewmanager.handleDeplier()
618
619     def ajoutCommentaire(self):
620         self.viewmanager.ajoutCommentaire()
621
622     def ouvreFichiers(self) :
623     # Ouverture des fichiers de commandes donnes sur la ligne de commande
624         cwd=os.getcwd()
625         self.dir=cwd
626         for study in session.d_env.studies:
627             os.chdir(cwd)
628             d=session.get_unit(study,self)
629             self.viewmanager.handleOpen(fichier=study["comm"],units=d)
630
631
632     def  get_source(self,file):
633     # appele par Editeur/session.py
634         import convert
635         p=convert.plugins['python']()
636         p.readfile(file)
637         texte=p.convert('execnoparseur')
638         return texte
639
640     def initPatrons(self) :
641     # Mise a jour du menu des fichiers recemment ouverts
642         from Editeur import listePatrons
643         if not(self.code in listePatrons.sous_menus) :
644            if hasattr(self,"menuPatrons"):
645               self.menuPatrons.setAttribute(Qt.WA_DeleteOnClose)
646               self.menuPatrons.close()
647               delattr(self,"menuPatrons")
648            return
649         if (not hasattr(self,"menuPatrons")):
650            self.menuPatrons = QMenu(self.menubar)
651            self.menuPatrons.setObjectName("menuPatrons")
652            self.menubar.addAction(self.menuPatrons.menuAction())
653            self.menuPatrons.setTitle(tr("Patrons"))
654         else :
655            self.menuPatrons.clear()
656         self.listePatrons = listePatrons.listePatrons(self.code)
657         idx = 0
658         for nomSsMenu in self.listePatrons.liste:
659             ssmenu=self.menuPatrons.addMenu(nomSsMenu)
660             for fichier in self.listePatrons.liste[nomSsMenu]:
661                id = ssmenu.addAction(fichier)
662                self.ficPatrons[id]=fichier
663                self.id.triggered.connect(self.handleOpenPatrons)
664             #   self.Patrons.setItemParameter(id,idx)
665                idx=idx+1
666
667     def initRecents(self):
668        self.recent =  []
669        try :
670            if sys.platform[0:5]=="linux" :
671               rep=os.path.join(os.environ['HOME'],'.config/Eficas',self.code)
672            else :
673               rep=os.path.join('C:/','.config/Eficas',self.code)
674            monFichier=rep+"/listefichiers_"+self.code
675            index=0
676            f=open(monFichier)
677            while ( index < 9) :
678               ligne=f.readline()
679               if ligne != "" : 
680                  l=(ligne.split("\n"))[0]
681                  self.recent.append(l)
682               index=index+1
683        except :
684            pass
685
686        try    : f.close()
687        except : pass
688
689     def addToRecentList(self, fn):
690       while fn in self.recent: self.recent.remove(fn)
691       self.recent.insert(0,fn)
692       if len(self.recent) > 9:
693          self.recent = self.recent[:9]
694
695
696     def addToRecentListQT4(self, fn):
697         """
698         Public slot to add a filename to the list of recently opened files.
699
700         @param fn name of the file to be added
701         """
702         self.recent.removeAll(fn)
703         self.recent.prepend(fn)
704         if len(self.recent) > 9:
705             self.recent = self.recent[:9]
706         index=0
707         self.sauveRecents()
708
709     def sauveRecents(self) :
710        try :
711          rep=self.CONFIGURATION.rep_user
712          monFichier=rep+"/listefichiers_"+self.code
713        except :
714          return
715        try :
716             f=open(monFichier,'w')
717             if len(self.recent) == 0 : return
718             index=0
719             while ( index <  len(self.recent)):
720               ligne=str(self.recent[index])+"\n"
721               f.write(ligne)
722               index=index+1
723        except :
724             pass
725        try :
726             f.close()
727        except :
728             pass
729
730
731
732     def traductionV11V12(self):
733         from .gereTraduction import traduction
734         traduction(self.CONFIGURATION.repIni,self.viewmanager,"V11V12")
735
736     def traductionV10V11(self):
737         from .gereTraduction import traduction
738         traduction(self.CONFIGURATION.repIni,self.viewmanager,"V10V11")
739
740     def traductionV9V10(self):
741         from .gereTraduction import traduction
742         traduction(self.CONFIGURATION.repIni,self.viewmanager,"V9V10")
743
744     def version(self) :
745         from .monVisu import DVisu
746         titre = tr("version ")
747         monVisuDialg=DVisu(parent=self,fl=0)
748         monVisuDialg.setWindowTitle(titre)
749         monVisuDialg.TB.setText(self.VERSION_EFICAS +tr(" pour ") + self.code)
750         monVisuDialg.adjustSize()
751         monVisuDialg.show()
752
753     def aidePPal(self) :
754         repAide=os.path.dirname(os.path.abspath(__file__))
755         maD=os.path.join( repAide,'..','Doc','html')
756         try :
757           indexAide=os.path.join(maD,'index.html')
758           if sys.platform[0:5]=="linux" : cmd="xdg-open "+indexAide
759           else                          : cmd="start "+indexAide
760           os.system(cmd)
761         except:
762           QMessageBox.warning( self,tr( "Aide Indisponible"),tr( "l'aide n est pas installee "))
763
764     def aidePSEN(self) :
765         repAide=os.path.dirname(os.path.abspath(__file__))
766         maD=os.path.join( repAide,'..','Doc','html')
767         try :
768           indexAide=os.path.join(maD,'index.html')
769           if sys.platform[0:5]=="linux" : cmd="xdg-open "+indexAide
770           else                          : cmd="start "+indexAide
771           os.system(cmd)
772         except:
773           QMessageBox.warning( self,tr( "Aide Indisponible"),tr( "l'aide n est pas installee "))
774
775     def aideCode(self) :
776         if self.code==None : return
777         try :
778         #if 1 :
779           if sys.platform[0:5]=="linux" : cmd="xdg-open "+self.fileDoc
780           else                          : cmd="start "+self.fileDoc
781           os.system(cmd)
782         except:
783         #else:
784           QMessageBox.warning( self,tr( "Aide Indisponible"),tr( "l'aide n est pas installee "))
785
786
787     def optionEditeur(self) :
788         try :
789            name='monOptions_'+self.code
790         except :
791            QMessageBox.critical( self,tr( "Parametrage"),tr( "Veuillez d abord choisir un code"))
792            return
793         try :
794         #if 1:
795            optionCode=__import__(name)
796         except :
797         #else :
798            QMessageBox.critical( self, tr("Parametrage"), tr("Pas de possibilite de personnalisation de la configuration "))
799            return
800         monOption=optionCode.Options(parent=self,modal = 0 ,configuration=self.CONFIGURATION)
801         monOption.show()
802
803     def optionPdf(self) :
804         from monOptionsPdf import OptionPdf
805         monOption=OptionPdf(parent=self,modal = 0 ,configuration=self.CONFIGURATION)
806         monOption.show()
807
808     def handleSortieLegere(self):
809         return self.viewmanager.saveLegerCurrentEditor()
810
811     def handleShowRecentMenu(self):
812         """
813         Private method to set up recent files menu.
814         """
815         self.recentMenu.clear()
816
817         for rp in self.recent:
818             id = self.recentMenu.addAction(rp)
819             self.ficRecents[id]=rp
820             id.triggered.connect(self.handleOpenRecent)
821         self.recentMenu.addSeparator()
822         self.recentMenu.addAction(tr('&Effacer'), self.handleClearRecent)
823
824     def handleOpenPatrons(self):
825         idx=self.sender()
826         fichier=self.repIni+"/../Editeur/Patrons/"+self.code+"/"+self.ficPatrons[idx]
827         self.viewmanager.handleOpen(fichier=fichier, patron = 1)
828
829     def handleOpenRecent(self):
830         idx=self.sender()
831         fichier=self.ficRecents[idx]
832         self.viewmanager.handleOpen(fichier=fichier, patron =0 )
833
834     def handleClearRecent(self):
835         self.recent = QStringList()
836         self.sauveRecents()
837
838     def handleRechercherDsCatalogue(self):
839         if not self.viewmanager : return
840         self.viewmanager.handleRechercherDsCatalogue()
841
842     def fileNew(self):
843         try:
844             self.viewmanager.newEditor()
845         except EficasException as exc:
846             msg = six.text_type(exc)
847             if msg != "": QMessageBox.warning(self, tr(u"Erreur"), msg)
848
849     def openProcess(self):
850         ssCode=None
851         code="PSEN_N1"
852         self.cleanPath()
853         dirCode=os.path.abspath(os.path.join(os.path.abspath(__file__),'../..',"ProcessOutputs_Eficas"))
854         sys.path.insert(0,dirCode)
855         self.code=code
856         self.definitCode(code,ssCode)
857         self.multi=True
858         self.demande=False
859         self.initRecents()
860         self.fileOpen()
861         
862
863     def fileOpen(self):
864         try:
865             self.viewmanager.handleOpen()
866         except EficasException as exc:
867             msg = six.text_type(exc)
868             if msg != "":
869                 QMessageBox.warning(self, tr(u"Erreur"), msg)
870
871     def sauveLigne(self):
872         return self.viewmanager.sauveLigneCurrentEditor()
873
874     def fileSave(self):
875         return self.viewmanager.saveCurrentEditor()
876
877     def fileSaveAs(self):
878         return self.viewmanager.saveAsCurrentEditor()
879
880     def fileClose(self):
881         self.viewmanager.handleClose(texte='&Fermer')
882
883     def fileCloseAll(self):
884         self.viewmanager.handleCloseAll(texte='&Fermer')
885
886     def fileExit(self):
887         # On peut sortir sur Abort
888         res=self.viewmanager.handleCloseAll()
889         if (res != 2) :
890             self.close()
891         return res
892
893     def editCopy(self):
894         self.viewmanager.handleEditCopy()
895
896     def editCut(self):
897         self.viewmanager.handleEditCut()
898
899     def editPaste(self):
900         self.viewmanager.handleEditPaste()
901
902     def rechercher(self):
903         self.viewmanager.handleRechercher()
904
905     def run(self):
906         self.viewmanager.run()
907
908     def saveRun(self):
909         self.viewmanager.saveRun()
910
911
912     def supprimer(self):
913         self.viewmanager.handleSupprimer()
914
915     def jdcFichierSource(self):
916         self.viewmanager.handleViewJdcFichierSource()
917
918     def jdcRapport(self):
919         self.viewmanager.handleViewJdcRapport()
920
921     def jdcRegles(self):
922         self.viewmanager.handleViewJdcRegles()
923
924     def gestionParam(self):
925         self.viewmanager.handlegestionParam()
926
927     def visuJdcPy(self):
928         self.viewmanager.handleViewJdcPy()
929
930     def ouvreArbre(self):
931         self.viewmanager.ouvreArbre()
932
933     def fermeArbre(self):
934         self.viewmanager.fermeArbre()
935
936     def NewInclude(self):
937         self.viewmanager.newIncludeEditor()
938
939     def cleanPath(self):
940         for pathCode in self.ListePathCode:
941             try:
942               aEnlever=os.path.abspath(os.path.join(os.path.dirname(__file__),'..',pathCode))
943               sys.path.remove(aEnlever)
944             except :
945               pass
946         for pathCode in self.listeAEnlever:
947             try:
948               sys.path.remove(aEnlever)
949             except :
950               pass
951
952
953     def closeEvent(self,event):
954       res=self.fileExit()
955       if res==2 : event.ignore()
956
957
958 if __name__=='__main__':
959
960     # Modules Eficas
961     rep=os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__),'..','ASTER')))
962     sys.path.append(rep)
963     from Aster import prefsCode
964     if hasattr(prefsCode,'encoding'):
965        # Hack pour changer le codage par defaut des strings
966        import sys
967        reload(sys)
968        sys.setdefaultencoding(prefsCode.encoding)
969        del sys.setdefaultencoding
970        # Fin hack
971
972     from Editeur import import_code
973     from Editeur import session
974
975     # Analyse des arguments de la ligne de commande
976     options=session.parse(sys.argv)
977     code=options.code
978
979
980     app = QApplication(sys.argv)
981     #app.setMainWidget(mw) (qt3)
982     Eficas=Appli()
983     Eficas.show()
984
985     #mw.ouvreFichiers()
986     #mw.show()
987
988     res=app.exec_()
989     sys.exit(res)