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