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