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