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