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