Salome HOME
ec5afe0a03c9d77463f18cbb15da0daa8a778cae
[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
80         if self.salome:
81           import Accas
82           import eficasSalome
83           Accas.SalomeEntry = eficasSalome.SalomeEntry
84
85         self.multi=multi
86         self.demande=multi # specifique PSEN
87
88
89         if self.multi == False :
90              self.definitCode(code,ssCode)
91              if code==None: return
92
93
94       
95         if not self.salome and hasattr (self, 'CONFIGURATION') and hasattr(self.CONFIGURATION,'lang') : langue=self.CONFIGURATION.lang
96
97         if langue=='fr': self.langue=langue
98         else           : self.langue="ang"
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         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         #PN --> pb d exception qui font planter salome
194         # plus supporte en python 3
195         #if hasattr(prefsCode,'encoding'):
196         #   import sys
197         #   reload(sys)
198         #   sys.setdefaultencoding(prefsCode.encoding)
199
200     def construitMenu(self):
201         self.initPatrons()
202         self.initRecents()
203         self.initAides()
204         for intituleMenu in ("menuTraduction","menuOptions","menuMesh","menuExecution","menuN1"):
205               if hasattr(self,intituleMenu):
206                  menu=getattr(self,intituleMenu)
207                  menu.setAttribute(Qt.WA_DeleteOnClose)
208                  menu.close()
209                  delattr(self,intituleMenu)
210         for intituleAction in ("actionExecution","actionSaveRun",):
211             if hasattr(self,intituleAction):
212               action=getattr(self,intituleAction)
213               self.toolBar.removeAction(action)
214         if self.code.upper() in Appli.__dict__:
215           Appli.__dict__[self.code.upper()](self,)
216         if self.suiteTelemac : self.lookSuiteTelemac()
217
218     def initAides(self):
219         #print "je passe la"
220         repAide=os.path.dirname(os.path.abspath(__file__))
221         fileName='index.html'
222         self.docPath=repAide+"/../Aide"
223         if hasattr(self,'CONFIGURATION') and hasattr(self.CONFIGURATION,'docPath') : self.docPath=self.CONFIGURATION.docPath
224         if hasattr(self,'CONFIGURATION') and hasattr(self.CONFIGURATION,'fileName'):fileName=self.CONFIGURATION.fileName
225         self.fileDoc=os.path.join(self.docPath,fileName)
226         self.actionCode.setText(tr("Aide specifique ")+str(self.code))
227         if not os.path.isfile(self.fileDoc) :
228                self.fileDoc=""
229                self.docPath=""
230                self.actionCode.setEnabled(False)
231                return
232
233         self.actionCode.setEnabled(True)
234         self.menuAide.addAction(self.actionCode)
235
236     def newN1(self):
237         ssCode=None
238         code="PSEN_N1"
239         self.cleanPath()
240         dirCode=os.path.abspath(os.path.join(os.path.abspath(__file__),'../..',"ProcessOutputs_Eficas"))
241         sys.path.insert(0,dirCode)
242         self.code=code
243         self.definitCode(code,ssCode)
244         self.initRecents()
245         self.multi=True
246         self.demande=False
247         self.fileNew()
248
249     def newPSEN(self):
250         ssCode=None
251         code="PSEN"
252         self.cleanPath()
253         dirCode=os.path.abspath(os.path.join(os.path.abspath(__file__),'../..',code))
254         sys.path.insert(0,dirCode)
255         self.code=code
256         self.definitCode(code,ssCode)
257         self.multi=True
258         self.demande=False
259         self.fileNew()
260
261     def ajoutN1(self):
262         self.menuN1 = self.menubar.addMenu(tr("Process Output"))
263         self.actionN1 = QAction(self)
264         self.actionN1.setText(tr("Process Output"))
265         self.menuN1.addAction(self.actionN1)
266         self.actionN1.triggered.connect(self.newN1)
267
268
269         if hasattr(self,'actionOpenProcess'):return
270         
271         self.actionOpenProcess = QAction(self)
272         self.actionOpenProcess.setText(tr("Open Process_Output File"))
273         self.menuN1.addAction(self.actionOpenProcess)
274         self.actionOpenProcess.triggered.connect(self.openProcess)
275
276     def ajoutExecution(self):
277         self.menuExecution = self.menubar.addMenu(tr("&Run"))
278         self.actionExecution = QAction(self)
279         if sys.platform[0:5]=="linux":
280           icon6 = QIcon(self.repIcon+"/roue.png")
281           self.actionExecution.setIcon(icon6)
282         else :
283           self.actionExecution.setText(tr("Run"))
284         self.actionExecution.setObjectName("actionExecution")
285         self.menuExecution.addAction(self.actionExecution)
286         if not(self.actionExecution in self.toolBar.actions()):
287            self.toolBar.addAction(self.actionExecution)
288         self.actionExecution.setText(tr("Run"))
289         self.actionExecution.triggered.connect(self.run)
290
291     def ajoutSauveExecution(self):
292         self.actionSaveRun = QAction(self)
293         icon7 = QIcon(self.repIcon+"/export_MAP.png")
294         self.actionSaveRun.setIcon(icon7)
295         self.actionSaveRun.setObjectName("actionSaveRun")
296         self.menuExecution.addAction(self.actionSaveRun)
297         if not(self.actionSaveRun in self.toolBar.actions()):
298            self.toolBar.addAction(self.actionSaveRun)
299         self.actionSaveRun.setText(tr("Save Run"))
300         self.actionSaveRun.triggered.connect(self.saveRun)
301
302     def griserActionsStructures(self):
303         self.actionCouper.setEnabled(False)
304         self.actionColler.setEnabled(False)
305         self.actionCopier.setEnabled(False)
306         self.actionSupprimer.setEnabled(False)
307
308     def enleverActionsStructures(self):
309         self.toolBar.removeAction(self.actionCopier)
310         self.toolBar.removeAction(self.actionColler)
311         self.toolBar.removeAction(self.actionCouper)
312         self.menuEdition.removeAction(self.actionCouper)
313         self.menuEdition.removeAction(self.actionCopier)
314         self.menuEdition.removeAction(self.actionColler)
315
316
317     def enleverParametres(self):
318         self.toolBar.removeAction(self.actionParametres)
319         self.menuJdC.removeAction(self.actionParametres)
320
321     def enleverSupprimer(self):
322         self.toolBar.removeAction(self.actionSupprimer)
323
324     def enleverNewInclude(self):
325         self.actionNouvel_Include.setVisible(False)
326
327     def enleverRechercherDsCatalogue(self):
328         self.actionRechercherDsCatalogue.setVisible(False)
329
330     def connectRechercherDsCatalogue(self):
331         self.actionRechercherDsCatalogue.triggered.connect(self.handleRechercherDsCatalogue)
332
333     def ajoutSortieLegere(self):
334         if hasattr(self,'actionSortieLegere') : return
335         self.actionSortieLegere = QAction(self)
336         self.actionSortieLegere.setText(tr("Sortie Legere"))
337         self.menuFichier.insertAction(self.actionEnregistrer_sous,self.actionSortieLegere)
338         self.actionSortieLegere.triggered.connect(self.handleSortieLegere)
339
340
341     def ZCRACKS(self):
342         self.enleverNewInclude()
343         self.toolBar.addSeparator()
344         self.ajoutExecution()
345
346         self.menuOptions = self.menubar.addMenu("menuOptions")
347         self.menuOptions.addAction(self.actionParametres_Eficas)
348         self.menuOptions.setTitle(tr("Options"))
349
350     def ADAO(self):
351         self.enleverActionsStructures()
352         self.enleverNewInclude()
353
354     def ASTER(self) :
355         self.menuTraduction = self.menubar.addMenu("menuTraduction")
356         self.menuTraduction.addAction(self.actionTraduitV11V12)
357         self.menuTraduction.addAction(self.actionTraduitV10V11)
358         self.menuTraduction.addAction(self.actionTraduitV9V10)
359         self.menuTraduction.setTitle(tr("Traduction"))
360
361         self.menuFichier.addAction(self.actionSauveLigne)
362
363         self.menuOptions = self.menubar.addMenu("menuOptions")
364         self.menuOptions.addAction(self.actionParametres_Eficas)
365         self.menuOptions.addAction(self.actionLecteur_Pdf)
366         self.menuOptions.setTitle(tr("Options"))
367
368     def CARMEL3D(self):
369         #if self.salome == 0 : return
370         self.enleverNewInclude()
371         self.menuMesh = self.menubar.addMenu(tr("Gestion Maillage"))
372         self.menuMesh.setObjectName("Mesh")
373         self.menuMesh.addAction(self.actionChercheGrpMaille)
374         #self.griserActionsStructures()
375
376     def CARMELCND(self):
377         self.enleverNewInclude()
378         self.enleverRechercherDsCatalogue()
379         self.ajoutExecution()
380         self.ajoutSauveExecution()
381         self.griserActionsStructures()
382         
383     def MAP(self):
384         self.enleverNewInclude()
385         self.toolBar.addSeparator()
386         self.ajoutExecution()
387         self.ajoutSauveExecution()
388         self.menuOptions = self.menubar.addMenu("menuOptions")
389         self.menuOptions.addAction(self.actionParametres_Eficas)
390         self.menuOptions.setTitle(tr("Options"))
391
392     def PSEN(self):
393         if self.first: self.first=0
394         self.action_Nouveau.triggered.disconnect(self.fileNew)
395         self.action_Nouveau.triggered.connect(self.newPSEN)
396         self.enleverActionsStructures()
397         self.enleverParametres()
398         self.enleverRechercherDsCatalogue()
399         self.enleverNewInclude()
400         self.ajoutExecution()
401         self.ajoutN1()
402         self.ajoutHelpPSEN()
403         self.ajoutIcones()
404
405     def PSEN_N1(self):
406         self.enleverActionsStructures()
407         self.enleverParametres()
408         self.enleverRechercherDsCatalogue()
409         self.enleverNewInclude()
410         self.ajoutExecution()
411         self.ajoutIcones()
412
413     def TELEMAC(self):
414         self.enleverActionsStructures()
415         self.enleverNewInclude()
416         self.connectRechercherDsCatalogue()
417         self.ajoutSortieLegere()
418
419     def lookSuiteTelemac(self):
420         self.enleverActionsStructures()
421         self.enleverNewInclude()
422         self.enleverParametres()
423         self.enleverSupprimer()
424         self.enleverRechercherDsCatalogue()
425
426     def ajoutHelpPSEN(self):
427         self.actionParametres_Eficas.setText('Help PSEN')
428         self.actionParametres_Eficas.triggered.connect(self.aidePSEN)
429         
430
431
432     def ChercheGrpMesh(self):
433         Msg,listeGroup=self.ChercheGrpMeshInSalome()
434         if Msg == None :
435            self.viewmanager.handleAjoutGroup(listeGroup)
436         else :
437            print ("il faut gerer les erreurs")
438
439     def ChercheGrpMaille(self):
440         # Normalement la variable self.salome permet de savoir si on est ou non dans Salome
441         try:
442             Msg,listeGroup=self.ChercheGrpMailleInSalome() # recherche dans Salome
443             #Msg = None; listeGroup = None # recherche manuelle, i.e., sans Salome si ligne precedente commentee
444         except:
445             raise ValueError('Salome non ouvert')
446         if Msg == None :
447            self.viewmanager.handleAjoutGroup(listeGroup)
448         else :
449            print ("il faut gerer les erreurs")
450
451
452     def ChercheGrp(self):
453         #Msg,listeGroup=self.ChercheGrpMailleInSalome()
454         #if Msg == None :
455         #   self.viewmanager.handleAjoutGroup(listeGroup)
456         #else :
457         #print "il faut gerer "
458         pass
459
460
461     def ajoutIcones(self) :
462         # Pour pallier les soucis de repertoire d icone
463         #print self.repIcon
464         icon = QIcon(self.repIcon+"/new_file.png")
465         self.action_Nouveau.setIcon(icon)
466         icon1 = QIcon(self.repIcon+"/ouvrir.png")
467         self.actionOuvrir.setIcon(icon1)
468         icon2 = QIcon(self.repIcon+"/save.png")
469         self.actionEnregistrer.setIcon(icon2)
470         icon6 = QIcon(self.repIcon+"/delete.png")
471         self.actionSupprimer.setIcon(icon6)
472         icon7 = QIcon(self.repIcon+"/roue.png")
473         self.actionExecution.setIcon(icon7)
474
475
476
477    
478     def connecterSignauxQT4(self) :
479         self.connect(self.recentMenu,SIGNAL('aboutToShow()'),self.handleShowRecentMenu)
480
481         self.connect(self.action_Nouveau,SIGNAL("triggered()"),self.fileNew)
482         self.connect(self.actionNouvel_Include,SIGNAL("triggered()"),self.NewInclude)
483         self.connect(self.actionOuvrir,SIGNAL("triggered()"),self.fileOpen)
484         self.connect(self.actionEnregistrer,SIGNAL("triggered()"),self.fileSave)
485         self.connect(self.actionEnregistrer_sous,SIGNAL("triggered()"),self.fileSaveAs)
486         self.connect(self.actionFermer,SIGNAL("triggered()"),self.fileClose)
487         self.connect(self.actionFermer_tout,SIGNAL("triggered()"),self.fileCloseAll)
488         self.connect(self.actionQuitter,SIGNAL("triggered()"),self.fileExit)
489
490         self.connect(self.actionEficas,SIGNAL("triggered()"),self.aidePPal)
491         self.connect(self.actionVersion,SIGNAL("triggered()"),self.version)
492         self.connect(self.actionParametres,SIGNAL("triggered()"),self.gestionParam)
493
494         self.connect(self.actionCouper,SIGNAL("triggered()"),self.editCut)
495         self.connect(self.actionCopier,SIGNAL("triggered()"),self.editCopy)
496         self.connect(self.actionColler,SIGNAL("triggered()"),self.editPaste)
497         self.connect(self.actionSupprimer,SIGNAL("triggered()"),self.supprimer)
498         self.connect(self.actionRechercher,SIGNAL("triggered()"),self.rechercher)
499         self.connect(self.actionDeplier_replier,SIGNAL("triggered()"),self.Deplier)
500
501         self.connect(self.actionRapport_de_Validation,SIGNAL("triggered()"),self.jdcRapport)
502         self.connect(self.actionRegles_du_JdC,SIGNAL("triggered()"),self.jdcRegles)
503         self.connect(self.actionFichier_Source,SIGNAL("triggered()"),self.jdcFichierSource)
504         self.connect(self.actionFichier_Resultat,SIGNAL("triggered()"),self.visuJdcPy)
505
506
507
508
509         # Pour Aster
510         self.actionTraduitV9V10 = QAction(self)
511         self.actionTraduitV9V10.setObjectName("actionTraduitV9V10")
512         self.actionTraduitV9V10.setText(tr("TraduitV9V10"))
513         self.actionTraduitV10V11 = QAction(self)
514         self.actionTraduitV10V11.setObjectName("actionTraduitV10V11")
515         self.actionTraduitV10V11.setText(tr("TraduitV10V11"))
516         self.actionTraduitV11V12 = QAction(self)
517         self.actionTraduitV11V12.setObjectName("actionTraduitV11V12")
518         self.actionTraduitV11V12.setText(tr("TraduitV11V12"))
519         self.actionSauveLigne = QAction(self)
520         self.actionSauveLigne.setText(tr("Sauve Format Ligne"))
521
522         #self.connect(self.actionParametres_Eficas,SIGNAL("triggered()"),self.optionEditeur)
523         self.connect(self.actionLecteur_Pdf,SIGNAL("triggered()"),self.optionPdf)
524         self.connect(self.actionTraduitV9V10,SIGNAL("triggered()"),self.traductionV9V10)
525         self.connect(self.actionTraduitV10V11,SIGNAL("triggered()"),self.traductionV10V11)
526         self.connect(self.actionTraduitV11V12,SIGNAL("triggered()"),self.traductionV11V12)
527         self.connect(self.actionSauveLigne,SIGNAL("triggered()"),self.sauveLigne)
528
529
530         # Pour Carmel
531         self.actionChercheGrpMaille = QAction(self)
532         self.actionChercheGrpMaille.setText(tr("Acquiert groupe mailles"))
533         self.connect(self.actionChercheGrpMaille,SIGNAL("triggered()"),self.ChercheGrpMaille)
534
535         # Pour CarmelCND
536         self.actionChercheGrp = QAction(self)
537         self.actionChercheGrp.setText(tr("Acquisition Groupe Maille"))
538         self.connect(self.actionChercheGrp,SIGNAL("triggered()"),self.ChercheGrp)
539
540         # Pour Aide
541         self.actionCode = QAction(self)
542         self.actionCode.setText(tr("Specificites Maille"))
543         self.connect(self.actionCode,SIGNAL("triggered()"),self.aideCode)
544
545     def connecterSignaux(self) :
546
547         self.recentMenu.aboutToShow.connect(self.handleShowRecentMenu)
548         self.action_Nouveau.triggered.connect(self.fileNew)
549         self.actionNouvel_Include.triggered.connect(self.NewInclude)
550         self.actionOuvrir.triggered.connect(self.fileOpen)
551         self.actionEnregistrer.triggered.connect(self.fileSave)
552         self.actionEnregistrer_sous.triggered.connect(self.fileSaveAs)
553         self.actionFermer.triggered.connect(self.fileClose)
554         self.actionFermer_tout.triggered.connect(self.fileCloseAll)
555         self.actionQuitter.triggered.connect(self.fileExit)
556
557         self.actionEficas.triggered.connect(self.aidePPal)
558         self.actionVersion.triggered.connect(self.version)
559         self.actionParametres.triggered.connect(self.gestionParam)
560         self.actionCommentaire.triggered.connect(self.ajoutCommentaire)
561
562         self.actionCouper.triggered.connect(self.editCut)
563         self.actionCopier.triggered.connect(self.editCopy)
564         self.actionColler.triggered.connect(self.editPaste)
565         self.actionSupprimer.triggered.connect(self.supprimer)
566         self.actionRechercher.triggered.connect(self.rechercher)
567         self.actionDeplier_replier.triggered.connect(self.Deplier)
568
569         self.actionRapport_de_Validation.triggered.connect(self.jdcRapport)
570         self.actionRegles_du_JdC.triggered.connect(self.jdcRegles)
571         self.actionFichier_Source.triggered.connect(self.jdcFichierSource)
572         self.actionFichier_Resultat.triggered.connect(self.visuJdcPy)
573         self.actionAfficher_l_Arbre.triggered.connect(self.ouvreArbre)
574         self.actionCacher_l_Arbre.triggered.connect(self.fermeArbre)
575
576
577         # Pour Aster
578         self.actionTraduitV9V10 = QAction(self)
579         self.actionTraduitV9V10.setObjectName("actionTraduitV9V10")
580         self.actionTraduitV9V10.setText(tr("TraduitV9V10"))
581         self.actionTraduitV10V11 = QAction(self)
582         self.actionTraduitV10V11.setObjectName("actionTraduitV10V11")
583         self.actionTraduitV10V11.setText(tr("TraduitV10V11"))
584         self.actionTraduitV11V12 = QAction(self)
585         self.actionTraduitV11V12.setObjectName("actionTraduitV11V12")
586         self.actionTraduitV11V12.setText(tr("TraduitV11V12"))
587         self.actionSauveLigne = QAction(self)
588         self.actionSauveLigne.setText(tr("Sauve Format Ligne"))
589
590         #self.actionParametres_Eficas.triggered.connect(self.optionEditeur)
591         self.actionTraduitV9V10.triggered.connect(self.traductionV9V10)
592         self.actionTraduitV10V11.triggered.connect(self.traductionV10V11)
593         self.actionTraduitV11V12.triggered.connect(self.traductionV11V12)
594         self.actionSauveLigne.triggered.connect(self.sauveLigne)
595
596         # Pour Carmel
597         self.actionChercheGrpMaille = QAction(self)
598         self.actionChercheGrpMaille.setText(tr("Acquiert Groupe Maille"))
599
600         # Pour CarmelCND
601         self.actionChercheGrp = QAction(self)
602         self.actionChercheGrp.setText(tr("Accquisition Groupe Maille"))
603         self.actionChercheGrp.triggered.connect(self.ChercheGrp)
604
605         # Pour Aide
606         self.actionCode = QAction(self)
607         self.actionCode.setText(tr("Specificites Maille"))
608         self.actionCode.triggered.connect(self.aideCode)
609
610
611     def Deplier(self):
612         self.viewmanager.handleDeplier()
613
614     def ajoutCommentaire(self):
615         self.viewmanager.ajoutCommentaire()
616
617     def ouvreFichiers(self) :
618     # Ouverture des fichiers de commandes donnes sur la ligne de commande
619         cwd=os.getcwd()
620         self.dir=cwd
621         for study in session.d_env.studies:
622             os.chdir(cwd)
623             d=session.get_unit(study,self)
624             self.viewmanager.handleOpen(fichier=study["comm"],units=d)
625
626
627     def  get_source(self,file):
628     # appele par Editeur/session.py
629         import convert
630         p=convert.plugins['python']()
631         p.readfile(file)
632         texte=p.convert('execnoparseur')
633         return texte
634
635     def initPatrons(self) :
636     # Mise a jour du menu des fichiers recemment ouverts
637         from Editeur import listePatrons
638         if not(self.code in listePatrons.sous_menus) :
639            if hasattr(self,"menuPatrons"):
640               self.menuPatrons.setAttribute(Qt.WA_DeleteOnClose)
641               self.menuPatrons.close()
642               delattr(self,"menuPatrons")
643            return
644         if (not hasattr(self,"menuPatrons")):
645            self.menuPatrons = QMenu(self.menubar)
646            self.menuPatrons.setObjectName("menuPatrons")
647            self.menubar.addAction(self.menuPatrons.menuAction())
648            self.menuPatrons.setTitle(tr("Patrons"))
649         else :
650            self.menuPatrons.clear()
651         self.listePatrons = listePatrons.listePatrons(self.code)
652         idx = 0
653         for nomSsMenu in self.listePatrons.liste:
654             ssmenu=self.menuPatrons.addMenu(nomSsMenu)
655             for fichier in self.listePatrons.liste[nomSsMenu]:
656                id = ssmenu.addAction(fichier)
657                self.ficPatrons[id]=fichier
658                self.id.triggered.connect(self.handleOpenPatrons)
659             #   self.Patrons.setItemParameter(id,idx)
660                idx=idx+1
661
662     def initRecents(self):
663        self.recent =  []
664        try :
665            if sys.platform[0:5]=="linux" :
666               rep=os.path.join(os.environ['HOME'],'.config/Eficas',self.code)
667            else :
668               rep=os.path.join('C:/','.config/Eficas',self.code)
669            monFichier=rep+"/listefichiers_"+self.code
670            index=0
671            f=open(monFichier)
672            while ( index < 9) :
673               ligne=f.readline()
674               if ligne != "" : 
675                  l=(ligne.split("\n"))[0]
676                  self.recent.append(l)
677               index=index+1
678        except :
679            pass
680
681        try    : f.close()
682        except : pass
683
684     def addToRecentList(self, fn):
685       while fn in self.recent: self.recent.remove(fn)
686       self.recent.insert(0,fn)
687       if len(self.recent) > 9:
688          self.recent = self.recent[:9]
689
690
691     def addToRecentListQT4(self, fn):
692         """
693         Public slot to add a filename to the list of recently opened files.
694
695         @param fn name of the file to be added
696         """
697         self.recent.removeAll(fn)
698         self.recent.prepend(fn)
699         if len(self.recent) > 9:
700             self.recent = self.recent[:9]
701         index=0
702         self.sauveRecents()
703
704     def sauveRecents(self) :
705        try :
706          rep=self.CONFIGURATION.rep_user
707          monFichier=rep+"/listefichiers_"+self.code
708        except :
709          return
710        try :
711             f=open(monFichier,'w')
712             if len(self.recent) == 0 : return
713             index=0
714             while ( index <  len(self.recent)):
715               ligne=str(self.recent[index])+"\n"
716               f.write(ligne)
717               index=index+1
718        except :
719             pass
720        try :
721             f.close()
722        except :
723             pass
724
725
726
727     def traductionV11V12(self):
728         from .gereTraduction import traduction
729         traduction(self.CONFIGURATION.repIni,self.viewmanager,"V11V12")
730
731     def traductionV10V11(self):
732         from .gereTraduction import traduction
733         traduction(self.CONFIGURATION.repIni,self.viewmanager,"V10V11")
734
735     def traductionV9V10(self):
736         from .gereTraduction import traduction
737         traduction(self.CONFIGURATION.repIni,self.viewmanager,"V9V10")
738
739     def version(self) :
740         from .monVisu import DVisu
741         titre = tr("version ")
742         monVisuDialg=DVisu(parent=self,fl=0)
743         monVisuDialg.setWindowTitle(titre)
744         monVisuDialg.TB.setText(self.VERSION_EFICAS +tr(" pour ") + self.code)
745         monVisuDialg.adjustSize()
746         monVisuDialg.show()
747
748     def aidePPal(self) :
749         repAide=os.path.dirname(os.path.abspath(__file__))
750         maD=os.path.join( repAide,'..','Doc','html')
751         try :
752           indexAide=os.path.join(maD,'index.html')
753           if sys.platform[0:5]=="linux" : cmd="xdg-open "+indexAide
754           else                          : cmd="start "+indexAide
755           os.system(cmd)
756         except:
757           QMessageBox.warning( self,tr( "Aide Indisponible"),tr( "l'aide n est pas installee "))
758
759     def aidePSEN(self) :
760         repAide=os.path.dirname(os.path.abspath(__file__))
761         maD=os.path.join( repAide,'..','Doc','html')
762         try :
763           indexAide=os.path.join(maD,'index.html')
764           if sys.platform[0:5]=="linux" : cmd="xdg-open "+indexAide
765           else                          : cmd="start "+indexAide
766           os.system(cmd)
767         except:
768           QMessageBox.warning( self,tr( "Aide Indisponible"),tr( "l'aide n est pas installee "))
769
770     def aideCode(self) :
771         if self.code==None : return
772         try :
773         #if 1 :
774           if sys.platform[0:5]=="linux" : cmd="xdg-open "+self.fileDoc
775           else                          : cmd="start "+self.fileDoc
776           os.system(cmd)
777         except:
778         #else:
779           QMessageBox.warning( self,tr( "Aide Indisponible"),tr( "l'aide n est pas installee "))
780
781
782     def optionEditeur(self) :
783         try :
784            name='monOptions_'+self.code
785         except :
786            QMessageBox.critical( self,tr( "Parametrage"),tr( "Veuillez d abord choisir un code"))
787            return
788         try :
789         #if 1:
790            optionCode=__import__(name)
791         except :
792         #else :
793            QMessageBox.critical( self, tr("Parametrage"), tr("Pas de possibilite de personnalisation de la configuration "))
794            return
795         monOption=optionCode.Options(parent=self,modal = 0 ,configuration=self.CONFIGURATION)
796         monOption.show()
797
798     def optionPdf(self) :
799         from monOptionsPdf import OptionPdf
800         monOption=OptionPdf(parent=self,modal = 0 ,configuration=self.CONFIGURATION)
801         monOption.show()
802
803     def handleSortieLegere(self):
804         return self.viewmanager.saveLegerCurrentEditor()
805
806     def handleShowRecentMenu(self):
807         """
808         Private method to set up recent files menu.
809         """
810         self.recentMenu.clear()
811
812         for rp in self.recent:
813             id = self.recentMenu.addAction(rp)
814             self.ficRecents[id]=rp
815             id.triggered.connect(self.handleOpenRecent)
816         self.recentMenu.addSeparator()
817         self.recentMenu.addAction(tr('&Effacer'), self.handleClearRecent)
818
819     def handleOpenPatrons(self):
820         idx=self.sender()
821         fichier=self.repIni+"/../Editeur/Patrons/"+self.code+"/"+self.ficPatrons[idx]
822         self.viewmanager.handleOpen(fichier=fichier, patron = 1)
823
824     def handleOpenRecent(self):
825         idx=self.sender()
826         fichier=self.ficRecents[idx]
827         self.viewmanager.handleOpen(fichier=fichier, patron =0 )
828
829     def handleClearRecent(self):
830         self.recent = QStringList()
831         self.sauveRecents()
832
833     def handleRechercherDsCatalogue(self):
834         if not self.viewmanager : return
835         self.viewmanager.handleRechercherDsCatalogue()
836
837     def fileNew(self):
838         try:
839             self.viewmanager.newEditor()
840         except EficasException as exc:
841             msg = six.text_type(exc)
842             if msg != "": QMessageBox.warning(self, tr(u"Erreur"), msg)
843
844     def openProcess(self):
845         ssCode=None
846         code="PSEN_N1"
847         self.cleanPath()
848         dirCode=os.path.abspath(os.path.join(os.path.abspath(__file__),'../..',"ProcessOutputs_Eficas"))
849         sys.path.insert(0,dirCode)
850         self.code=code
851         self.definitCode(code,ssCode)
852         self.multi=True
853         self.demande=False
854         self.initRecents()
855         self.fileOpen()
856         
857
858     def fileOpen(self):
859         try:
860             self.viewmanager.handleOpen()
861         except EficasException as exc:
862             msg = six.text_type(exc)
863             if msg != "":
864                 QMessageBox.warning(self, tr(u"Erreur"), msg)
865
866     def sauveLigne(self):
867         return self.viewmanager.sauveLigneCurrentEditor()
868
869     def fileSave(self):
870         return self.viewmanager.saveCurrentEditor()
871
872     def fileSaveAs(self):
873         return self.viewmanager.saveAsCurrentEditor()
874
875     def fileClose(self):
876         self.viewmanager.handleClose(texte='&Fermer')
877
878     def fileCloseAll(self):
879         self.viewmanager.handleCloseAll(texte='&Fermer')
880
881     def fileExit(self):
882         # On peut sortir sur Abort
883         res=self.viewmanager.handleCloseAll()
884         if (res != 2) :
885             self.close()
886         return res
887
888     def editCopy(self):
889         self.viewmanager.handleEditCopy()
890
891     def editCut(self):
892         self.viewmanager.handleEditCut()
893
894     def editPaste(self):
895         self.viewmanager.handleEditPaste()
896
897     def rechercher(self):
898         self.viewmanager.handleRechercher()
899
900     def run(self):
901         self.viewmanager.run()
902
903     def saveRun(self):
904         self.viewmanager.saveRun()
905
906
907     def supprimer(self):
908         self.viewmanager.handleSupprimer()
909
910     def jdcFichierSource(self):
911         self.viewmanager.handleViewJdcFichierSource()
912
913     def jdcRapport(self):
914         self.viewmanager.handleViewJdcRapport()
915
916     def jdcRegles(self):
917         self.viewmanager.handleViewJdcRegles()
918
919     def gestionParam(self):
920         self.viewmanager.handlegestionParam()
921
922     def visuJdcPy(self):
923         self.viewmanager.handleViewJdcPy()
924
925     def ouvreArbre(self):
926         self.viewmanager.ouvreArbre()
927
928     def fermeArbre(self):
929         self.viewmanager.fermeArbre()
930
931     def NewInclude(self):
932         self.viewmanager.newIncludeEditor()
933
934     def cleanPath(self):
935         for pathCode in self.ListePathCode:
936             try:
937               aEnlever=os.path.abspath(os.path.join(os.path.dirname(__file__),'..',pathCode))
938               sys.path.remove(aEnlever)
939             except :
940               pass
941         for pathCode in self.listeAEnlever:
942             try:
943               sys.path.remove(aEnlever)
944             except :
945               pass
946
947
948     def closeEvent(self,event):
949       res=self.fileExit()
950       if res==2 : event.ignore()
951
952
953 if __name__=='__main__':
954
955     # Modules Eficas
956     rep=os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__),'..','ASTER')))
957     sys.path.append(rep)
958     from Aster import prefsCode
959     if hasattr(prefsCode,'encoding'):
960        # Hack pour changer le codage par defaut des strings
961        import sys
962        reload(sys)
963        sys.setdefaultencoding(prefsCode.encoding)
964        del sys.setdefaultencoding
965        # Fin hack
966
967     from Editeur import import_code
968     from Editeur import session
969
970     # Analyse des arguments de la ligne de commande
971     options=session.parse(sys.argv)
972     code=options.code
973
974
975     app = QApplication(sys.argv)
976     #app.setMainWidget(mw) (qt3)
977     Eficas=Appli()
978     Eficas.show()
979
980     #mw.ouvreFichiers()
981     #mw.show()
982
983     res=app.exec_()
984     sys.exit(res)