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