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