]> SALOME platform Git repositories - tools/eficas.git/blob - InterfaceQT4/editor.py
Salome HOME
Pour Traduction Carmel et Parametres
[tools/eficas.git] / InterfaceQT4 / editor.py
1 # -*- coding: utf-8 -*-
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 import types,sys,os, re
21 import  subprocess
22 import traceback
23 from PyQt4 import *
24 from PyQt4.QtGui  import *
25 from PyQt4.QtCore import *
26 import time
27 from datetime import date
28 from Extensions.i18n import tr
29
30
31 # Modules Eficas
32
33 import convert, generator
34 from Editeur        import session
35 from Editeur        import comploader
36 from Editeur        import Objecttreeitem
37 from desBaseWidget  import Ui_baseWidget
38 from monViewTexte   import ViewText 
39 from monWidgetParam import MonWidgetParam 
40 import browser
41 import readercata
42
43 DictExtensions= {"MAP" : ".map"}
44
45
46
47 class JDCEditor(Ui_baseWidget,QtGui.QWidget):
48 # ----------------------------------------- #
49     """
50        Editeur de jdc
51     """
52
53     def __init__ (self,appli,fichier = None, jdc = None, QWParent=None, units = None, include=0 , vm=None):
54     #----------------------------------------------------------------------------------------------------------#
55
56         QtGui.QWidget.__init__(self,None)
57         self.setupUi(self)
58         self.monOptionnel=None
59         self.fenetreCentraleAffichee=None
60         self.appliEficas = appli
61         self.appli       = appli  #---- attendu par IHM
62         self.vm          = vm
63         self.fichier     = fichier
64         self.jdc         = jdc
65         self.first       = True
66         self.QWParent    = QWParent
67          
68         if appli != None :
69            self.salome =  self.appliEficas.salome
70         else :
71            self.salome=0
72            print "dans JDC pas d appli ????????"
73
74         # ces attributs sont mis a jour par definitCode appelee par newEditor
75         self.code = self.appliEficas.CONFIGURATION.code
76         self.affiche_alpha=1
77         if self.code in ['MAP','Adao'] : 
78            self.widgetTree.close()
79            self.widgetTree=None
80            self.appliEficas.resize(1440,self.appliEficas.height())
81         else :
82            self.appliEficas.resize(2000,self.appliEficas.height())
83
84         self.version_code = session.d_env.cata
85
86         if not hasattr ( self.appliEficas, 'readercata') or  self.appliEficas.multi==True:
87            self.readercata  = readercata.READERCATA( self, self.appliEficas )
88            self.appliEficas.readercata=self.readercata
89         else :
90            self.readercata=self.appliEficas.readercata
91         if self.readercata.fic_cata == None : return    #Sortie Salome
92         self.titre=self.readercata.titre
93
94         self.format =  self.appliEficas.format_fichier
95
96         self.dict_reels={}
97         self.liste_simp_reel=[]
98         self.ihm="QT"
99
100         nameConf='configuration_'+self.code
101         configuration=__import__(nameConf)
102         self.CONFIGURATION = self.appliEficas.CONFIGURATION
103         self.CONFIGStyle =   self.appliEficas.CONFIGStyle
104
105         try:
106           self.CONFIGURATION.generator_module
107           _module = __import__(self.CONFIGURATION.generator_module)
108           info = _module.entryPoint()
109           generator.plugins.addEntryPoint(info)
110         except:
111           pass
112
113         try:
114           self.CONFIGURATION.convert_module
115           _module = __import__(self.CONFIGURATION.convert_module)
116           info = _module.entryPoint()
117           convert.plugins.addEntryPoint(info)
118         except :
119           pass
120
121         self.sb = None
122         if hasattr(self.appliEficas,"statusBar"):
123            self.sb = self.appliEficas.statusBar()
124
125         self.fileInfo       = None
126         self.lastModified   = 0
127
128         self.modified   = False
129         self.isReadOnly = False
130         self.node_selected = []
131         self.deplier = True
132         self.message=''
133
134         self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
135
136         #------- construction du jdc --------------
137
138         jdc_item = None
139         self.mode_nouv_commande=self.readercata.mode_nouv_commande
140
141         self.nouveau=0
142         if self.fichier is not None:        #  fichier jdc fourni
143             self.fileInfo = QFileInfo(self.fichier)
144             self.fileInfo.setCaching(0)
145             if jdc==None :
146                try :
147                    self.jdc = self.readFile(self.fichier)
148                except :
149                    print "mauvaise lecture"
150             else :
151                self.jdc=jdc
152             if self.jdc is not None and units is not None:
153                self.jdc.recorded_units=units
154                self.jdc.old_recorded_units=units
155         else:
156             if not self.jdc:                   #  nouveau jdc
157                 if not include :
158                    self.jdc = self._newJDC(units=units)
159                 else :
160                    self.jdc = self._newJDCInclude(units=units)
161                 self.nouveau=1
162
163         if self.jdc:
164             self.jdc.appli = self
165             self.jdc.lang    = self.appli.langue
166             txt_exception  = None
167             if not jdc:
168                 self.jdc.analyse()
169                 txt_exception = self.jdc.cr.get_mess_exception()
170             if txt_exception:
171                 self.jdc = None
172                 qApp.restoreOverrideCursor()
173                 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
174                 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
175             else:
176                 comploader.charger_composants("QT")
177                 jdc_item=Objecttreeitem.make_objecttreeitem( self, "nom", self.jdc )
178                 if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False):
179                     self.viewJdcRapport()
180
181         if jdc_item:
182             self.tree = browser.JDCTree( jdc_item,  self )
183         self.appliEficas.construitMenu()
184
185     #--------------------------------#
186     def _newJDC( self ,units = None):
187     #--------------------------------#
188         """
189         Initialise un nouveau JDC vierge
190         """
191         self.modified=1
192         CONTEXT.unset_current_step()
193
194         texte=""
195         if self.code == "CARMELCND" : texte=self._newJDCCND()
196         if self.code == "ZCRACKS" : texte=self._newZCRACKS()
197         #   texte=self.newTexteCND
198        
199         jdc=self.readercata.cata[0].JdC( procedure =texte,
200                                          appli=self,
201                                          cata=self.readercata.cata,
202                                          cata_ord_dico=self.readercata.cata_ordonne_dico,
203                                          rep_mat=self.CONFIGURATION.rep_mat
204                                         )
205         jdc.lang    = self.appli.langue
206         if units is not None:
207            jdc.recorded_units=units
208            jdc.old_recorded_units=units
209         ## PNPN est ce que la ligne suivante est bien utile ?
210         if texte == "" :jdc.analyse()
211         return jdc
212
213     #--------------------------------#
214     def _newJDCInclude( self ,units = None):
215     #--------------------------------#
216         """
217         Initialise un nouveau JDC vierge
218         """
219         import Extensions.jdc_include
220         JdC_aux=Extensions.jdc_include.JdC_include
221         CONTEXT.unset_current_step()
222
223         jaux=self.readercata.cata[0].JdC( procedure="",
224                                appli=self,
225                                cata=self.readercata.cata,
226                                cata_ord_dico=self.readercata.cata_ordonne_dico,
227                                rep_mat=self.CONFIGURATION.rep_mat,
228                               )
229         jaux.analyse()
230
231         J=JdC_aux( procedure="",
232                    appli=self,
233                    cata=self.readercata.cata,
234                    cata_ord_dico=self.readercata.cata_ordonne_dico,
235                    jdc_pere=jaux,
236                    rep_mat=self.CONFIGURATION.rep_mat,
237                    )
238         J.analyse()
239         if units is not None:
240            J.recorded_units=units
241            J.old_recorded_units=units
242         return J
243
244
245     #-------------------------------#
246     def readFile(self, fn):
247     #--------------------------------#
248         """
249         Public slot to read the text from a file.
250         @param fn filename to read from (string or QString)
251         """
252         fn = unicode(fn)
253
254         # ------------------------------------------------------------------------------------
255         #                         charge le JDC
256         # ------------------------------------------------------------------------------------
257
258         jdcName=os.path.basename(fn)
259         # Il faut convertir le contenu du fichier en fonction du format
260         if convert.plugins.has_key( self.appliEficas.format_fichier_in ):
261              # Le convertisseur existe on l'utilise
262              #appli = self
263              p=convert.plugins[self.appliEficas.format_fichier_in]()
264              p.readfile(fn)
265              if p.text=="" : self.nouveau=1
266              pareil,texteNew=self.verifieCHECKSUM(p.text)
267              #if texteNew == ""
268              if pareil == False and (self.appliEficas.ssIhm == False) :
269                 QMessageBox.warning( self, tr("fichier modifie"),tr("Attention! fichier change hors EFICAS"))
270              p.text=texteNew
271              memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
272              if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
273              p.text=texteNew
274              text=p.convert('exec',self.appliEficas)
275              if not p.cr.estvide():
276                 self.affiche_infos("Erreur a la conversion",Qt.red)
277         else :
278             self.affiche_infos("Type de fichier non reconnu",Qt.red)
279             if self.appliEficas.ssIhm == False:
280                     QMessageBox.critical( self, tr("Type de fichier non reconnu"),
281                     tr("EFICAS ne sait pas ouvrir le type de fichier %s" ,self.appliEficas.format_fichier_in))
282             return None
283
284         CONTEXT.unset_current_step()
285         jdc=self.readercata.cata[0].JdC(procedure=text,
286                                     appli=self,
287                                     cata=self.readercata.cata,
288                                     cata_ord_dico=self.readercata.cata_ordonne_dico,
289                                     nom=jdcName,
290                                     rep_mat=self.CONFIGURATION.rep_mat
291                                    )
292         # ----------------------------------------------------
293         #      charge le JDC fin
294         # ----------------------------------------------------
295         self.modified = False
296
297 #        qApp.restoreOverrideCursor()
298         if self.fileInfo!= None :
299            self.lastModified = self.fileInfo.lastModified()
300         else :
301            self.lastModified = 1
302         nouveauTitre=self.titre+"              "+str(os.path.basename(self.fichier))
303         self.appliEficas.setWindowTitle(nouveauTitre)
304         return jdc
305
306
307     #-----------------------#
308     def get_source(self,file):
309     #-----------------------#
310
311         # Il faut convertir le contenu du fichier en fonction du format
312         if convert.plugins.has_key(self.format):
313             # Le convertisseur existe on l'utilise
314             p=convert.plugins[self.format]()
315             p.readfile(file)
316             text=p.convert('execnoparseur')
317             if not p.cr.estvide():
318                 self.affiche_infos("Erreur a la conversion",Qt.red)
319             return text
320         else:
321             # Il n'existe pas c'est une erreur
322             self.affiche_infos("Type de fichier non reconnu",Qt.red)
323             QMessageBox.critical( self, tr("Type de fichier non reconnu"),tr("EFICAS ne sait pas ouvrir ce type de fichier"))
324             return None
325
326     #-----------------------------------------------------------------------#
327     def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
328     #--------------------------------------------------------------------#
329         w = ViewText( self.QWParent,self ,caption,txt,largeur,hauteur)
330         w.show()
331     #
332
333     #----------------------------------------------#
334     def __generateTempFilename(self, prefix, suffix):
335     #----------------------------------------------#
336         import tempfile
337         (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
338         os.close(fd)
339         return filename
340     #
341
342
343     #----------------------------------------------#
344     def _viewTextExecute(self, txt, prefix, suffix):
345     #----------------------------------------------#
346         self.w = ViewText( self.QWParent )
347         self.w.setWindowTitle( "execution" )
348         self.monExe=QProcess(self.w)
349         pid=self.monExe.pid()
350         nomFichier = self.__generateTempFilename(prefix, suffix = ".sh")
351         f=open(nomFichier,'w')
352         f.write(txt)
353         f.close()
354         self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
355         self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
356         exe='sh /tmp/test.sh'
357         self.monExe.start(exe)
358         self.monExe.closeWriteChannel()
359         self.w.exec_()
360         try:
361           commande="rm  "+ nomFichier
362           os.system(commande)
363         except :
364           pass
365
366
367     def readFromStdErr(self):
368         a=self.monExe.readAllStandardError()
369         self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
370
371     def readFromStdOut(self) :
372         a=self.monExe.readAllStandardOutput()
373         self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
374         
375
376
377     #-----------------------#
378     def gestionParam(self):
379     #-----------------------#
380         w = MonWidgetParam( self)
381         w.show()
382
383     #-----------------------#
384     def viewJdcSource(self):
385     #-----------------------#
386         f=open(self.fichier,'r')
387         texteSource=f.read()
388         f.close()
389         self._viewText(texteSource, "JDC_SOURCE")
390
391     #-----------------------#
392     def viewJdcPy(self):
393     #-----------------------#
394         strSource = str( self.get_text_JDC(self.format) )
395         self._viewText(strSource, "JDC_RESULTAT")
396
397     #-----------------------#
398     def viewJdcRapport(self):
399     #-----------------------#
400         strRapport = unicode( self.jdc.report() )
401         self._viewText(strRapport, "JDC_RAPPORT")
402
403     #----------------#
404     def closeIt(self):
405     #----------------#
406         """
407         Public method called by the viewmanager to finally get rid of us.
408         """
409         if self.jdc:
410             self.jdc.supprime()
411         self.close()
412
413     #----------------------------------------------#
414     def affiche_infos(self,message,couleur=Qt.black):
415     #----------------------------------------------#
416         if self.sb:
417            mapalette=self.sb.palette()
418            from PyQt4.QtGui import QPalette
419            mapalette.setColor( QPalette.WindowText, couleur )
420            self.sb.setPalette( mapalette );
421            self.sb.showMessage(QString.fromUtf8(message))#,2000)
422
423     #------------------------------#
424     def affiche_alerte(self,titre,message):
425     #------------------------------#
426     # appele par I_MACRO_ETAPE
427         QMessageBox.information( self, titre, message)
428
429     #-------------------#
430     def init_modif(self):
431     #-------------------#
432       """
433           Met l'attribut modified a 'o' : utilise par Eficas pour savoir
434           si un JDC doit etre sauvegarde avant destruction ou non
435       """
436       self.modified = True
437
438     #---------------------------------------#
439     def chercheNoeudSelectionne(self,copie=1):
440     #---------------------------------------#
441       """
442         appele par Cut et Copy pour positionner self.node_selected
443       """
444       self.node_selected=[]
445       if len(self.tree.selectedItems()) == 0 : return
446       self.node_selected=self.tree.selectedItems()
447
448
449     #---------------------#
450     def handleSupprimer(self):
451     #---------------------#
452       self.chercheNoeudSelectionne()
453       if len(self.node_selected) == 0 : return
454       self.QWParent.noeud_a_editer = []
455       if self.node_selected[0]==self.tree.racine: return
456       if len(self.node_selected) == 1 : self.node_selected[0].delete()
457       else : self.node_selected[0].deleteMultiple(self.node_selected)
458
459     #---------------------#
460     def handleRechercher(self):
461     #---------------------#
462       from monRecherche import DRecherche
463       monRechercheDialg=DRecherche(parent=self,fl=0)
464       monRechercheDialg.show()
465
466     #---------------------#
467     def handleDeplier(self):
468     #---------------------#
469        if self.tree == None : return
470        self.tree.collapseAll()
471        if self.deplier :
472           self.tree.collapseItem(self.tree.topLevelItem(0))
473           self.deplier = False
474        else:
475           self.tree.expandItem(self.tree.topLevelItem(0))
476           self.deplier = True
477
478     #---------------------#
479     def handleEditCut(self):
480     #---------------------#
481       """
482       Stocke dans Eficas.noeud_a_editer le noeud a couper
483       """
484       #print "handleEditCut"
485       self.chercheNoeudSelectionne()
486       self.QWParent.edit="couper"
487       self.QWParent.noeud_a_editer = self.node_selected
488
489     #-----------------------#
490     def handleEditCopy(self):
491     #-----------------------#
492       """
493       Stocke dans Eficas.noeud_a_editer le noeud a copier
494       """
495       self.chercheNoeudSelectionne()
496       if len(self.node_selected) == 0 : return
497       if len(self.node_selected) == 1 : self.node_selected[0].update_node_label_in_blue()
498       else :  self.node_selected[0].update_plusieurs_node_label_in_blue(self.node_selected)
499       self.QWParent.edit="copier"
500       self.QWParent.noeud_a_editer = self.node_selected
501
502     #------------------------#
503     def handleEditPaste(self):
504     #------------------------#
505       """
506       Lance la copie de l'objet place dans self.QWParent.noeud_a_editer
507       Ne permet que la copie d'objets de type Commande ou MCF
508       """
509       self.chercheNoeudSelectionne()
510       if (not(hasattr(self.QWParent,'noeud_a_editer'))) or len(self.QWParent.noeud_a_editer)==0:
511           QMessageBox.information( self,
512                       tr("Copie impossible"),
513                       tr("Veuillez selectionner un objet a copier"))
514           return
515       if len(self.node_selected) != 1 :
516           QMessageBox.information( self,
517                       tr("Copie impossible"),
518                       tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
519           return
520
521       if len(self.QWParent.noeud_a_editer)!=1:
522          self.handleEditPasteMultiple()
523          return
524
525       noeudOuColler=self.node_selected[0]
526       pos='after'
527       if noeudOuColler == self.tree.racine:
528          indexNoeudOuColler=0
529          pos='before'
530       else :
531          indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
532
533       try :
534        noeudACopier=self.QWParent.noeud_a_editer[0]
535        indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
536       except :
537        QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
538        return
539
540       if (self.QWParent.edit != "couper"):
541         try:
542            if noeudOuColler == self.tree.racine :
543               child=noeudOuColler.doPastePremier(noeudACopier)
544            else :
545               child=noeudACopier.doPaste(noeudOuColler,pos)
546            if child==None or child==0:
547                QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
548                self.message = ''
549                self.affiche_infos("Copie refusee",Qt.red)
550            if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
551                try :
552                  nom=noeudACopier.item.sd.nom
553                  child.item.nomme_sd(nom)
554                except :
555                  pass
556            return
557            self.init_modif()
558            child.select()
559         except  :
560            traceback.print_exc()
561            QMessageBox.critical( self,tr( "Copie refusee"),tr('Copie refusee pour ce type d objet'))
562            self.message = ''
563            self.affiche_infos("Copie refusee",Qt.red)
564            return
565
566       # il faut declarer le JDCDisplay_courant modifie
567       # suppression eventuelle du noeud selectionne
568       # si possible on renomme l objet comme le noeud couper
569
570       if (self.QWParent.edit == "couper"):
571          #try :
572          if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
573            QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
574
575          #if 1:
576          try :
577             indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
578             noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
579             noeudACopier.treeParent.build_children()
580
581          #else:
582          except:
583             pass
584          self.QWParent.noeud_a_editer=[]
585
586       # on rend la copie a nouveau possible en liberant le flag edit
587       self.QWParent.edit="copier"
588       noeudACopier.select()
589
590     #----------------------------------#
591     def handleDeplaceMultiple(self):
592     #----------------------------------#
593        pass
594
595     #----------------------------------#
596     def handleEditPasteMultiple(self):
597     #----------------------------------#
598
599     # On ne garde que les niveaux "Etape"
600     # On insere dans l'ordre du JDC
601      listeNoeudsACouper=[]
602      listeIndex=[]
603      listeChild=[]
604      listeItem=[]
605      from InterfaceQT4 import compojdc
606      noeudOuColler=self.node_selected[0]
607      if not (isinstance(noeudOuColler.treeParent, compojdc.Node)):
608         QMessageBox.information( self,
609                   tr("Copie impossible a cet endroit",),
610                   tr("Veuillez selectionner une commande, un parametre, un commentaire ou une macro"))
611         return
612      indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
613
614      for noeud in self.QWParent.noeud_a_editer :
615         if not (isinstance(noeud.treeParent, compojdc.Node)): continue
616         indexInTree=noeud.treeParent.children.index(noeud)
617         indice = 0
618         for index in listeIndex:
619             if index < indexInTree : indice = indice +1
620         listeIndex.insert(indice, indexInTree)
621         listeNoeudsACouper.insert(indice, noeud)
622
623      noeudJdc=noeudOuColler.treeParent
624      dejaCrees=0
625      # on les cree a l'envers parcequ'on ajoute a NoeudOuColler
626      listeIndex.reverse()
627      for index in listeIndex:
628          indexTravail=index
629          if indexNoeudOuColler < index:
630             indexTravail=indexTravail+dejaCrees
631          noeudOuColler=noeudJdc.children[indexNoeudOuColler]
632          noeud=noeudJdc.children[indexTravail]
633          child=noeud.doPaste(noeudOuColler)
634          listeChild.append(child)
635          dejaCrees=dejaCrees+1
636
637      self.QWParent.noeud_a_editer = []
638      for i in range(len(listeIndex)):
639         noeud=noeudJdc.children[indexNoeudOuColler+1+i]
640         self.QWParent.noeud_a_editer.append(noeud)
641
642      listeASupprimer=[]
643      if self.QWParent.edit !="couper" : return
644
645      for index in listeIndex:
646          indexTravail=index
647          if indexNoeudOuColler < index:
648             indexTravail=indexTravail+(len(listeIndex))
649          noeud=noeudJdc.children[indexTravail]
650
651          listeItem.append(noeud.item)
652          listeASupprimer.append(noeud)
653
654      for i in range(len(listeChild)):
655          self.tree.item.suppitem(listeItem[i])
656          listeChild[i].item.update(listeItem[i])
657
658      self.QWParent.noeud_a_editer = []
659
660
661     #---------------------#
662     def getFileName(self):
663     #---------------------#
664       return self.fichier
665
666     #---------------------------#
667     def get_file_variable(self) :
668     #---------------------------#
669      titre = tr("Choix d'un fichier XML")
670      texte = tr("Le fichier contient une commande MODEL\n")
671      texte = texte+tr('Donnez le nom du fichier XML qui contient la description des variables')
672      QMessageBox.information( self, titre,tr(texte))
673
674      fichier = QFileDialog.getOpenFileName(self.appliEficas,
675                    tr('Ouvrir Fichier'),
676                    self.appliEficas.CONFIGURATION.savedir,
677                    self.appliEficas.trUtf8('Wrapper Files (*.xml);;''All Files (*)'))
678      return  fichier
679
680     #----------------------------------#
681     def writeFile(self, fn, txt = None):
682     #----------------------------------#
683         """
684         Public slot to write the text to a file.
685
686         @param fn filename to write to (string or QString)
687         @return flag indicating success
688         """
689
690         fn = unicode(fn)
691
692         if txt == None :
693             txt = self.get_text_JDC(self.format)
694             eol = '\n'
695             if len(txt) >= len(eol):
696                if txt[-len(eol):] != eol:
697                   txt += eol
698             else:
699                 txt += eol
700             txt=self.ajoutVersionCataDsJDC(txt)
701             checksum=self.get_checksum(txt)
702             txt=txt+checksum
703         try:
704             f = open(fn, 'wb')
705             f.write(txt)
706             f.close()
707             return 1
708         except IOError, why:
709             QMessageBox.critical(self, self.trUtf8('Save File'),
710                 self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
711                     .arg(unicode(fn)).arg(str(why)))
712             return 0
713
714     #-------------------------------------#
715     def get_text_JDC(self,format,pourRun=0):
716     #-------------------------------------#
717       if self.code == "MAP" and not(generator.plugins.has_key(format)): format = "MAP"
718       if generator.plugins.has_key(format):
719          # Le generateur existe on l'utilise
720          self.generator=generator.plugins[format]()
721          try :
722             jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
723             if pourRun : jdc_formate=self.generator.textePourRun
724          except ValueError,e:
725             QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
726          if not self.generator.cr.estvide():
727             self.affiche_infos(tr("Erreur a la generation"),Qt.red)
728             QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
729             return ""
730          else:
731             return jdc_formate
732       else:
733          # Il n'existe pas c'est une erreur
734          self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
735          QMessageBox.critical( self, "Format  non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
736          return ""
737
738     #------------#
739     def run(self):
740     #------------#
741       fonction="run"+self.code
742       if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
743
744     #------------#
745     def saveRun(self):
746     #------------#
747       fonction="saveRun"+self.code
748       if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
749
750     #---------------#
751     def runMAP(self):
752     #---------------#
753
754       if not(self.jdc.isvalid()):
755          QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution MAP"))
756          return
757       if len(self.jdc.etapes) != 1 :
758          QMessageBox.critical( self, tr("Execution impossible "),tr("le JDC doit contenir un et un seul composant"))
759          return
760       if self.modified or self.fichier==None  :
761          self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
762          texte=self.get_text_JDC("MAP")
763          self.writeFile( self.fichierMapInput, txt = texte)
764       else :
765          self.fichierMapInput=self.fichier
766       composant=self.jdc.etapes[0].nom.lower()[0:-5]
767
768
769       # :TRICKY: to determine if a component requires SALOME, loads the component from Eficas catalog
770       # then instantiate corresponding class and call getUseSalome() method
771       try:
772           from mapengine.spec import factory
773           mapComponent = factory.new(composant)[0]
774
775           command = "map"
776           if mapComponent.getUseSalome():
777               command += " -r sappli"
778           textePython=(command + " run -n "+composant +" -i "+self.fichierMapInput)
779
780           #textePython="ls -l"
781           self._viewTextExecute( textePython,"map_run",".sh")
782           try:
783              commande="rm  "+self.fichierMapInput
784              os.system(commande)
785           except :
786              pass
787       except Exception, e:
788           print traceback.print_exc()
789
790     #-------------------#
791     def runZCRACKS(self):
792     #-------------------#
793       if not(self.jdc.isvalid()):
794          QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
795          return
796       if self.modified or self.fichier==None  :
797       #if 1:
798          self.fichierZcracksInput = self.__generateTempFilename(prefix = "zcracks_run", suffix = ".z7p")
799          texte=self.get_text_JDC("ZCRACKS",pourRun=1)
800          self.writeFile( self.fichierZcracksInput, txt = texte)
801       else :
802          self.fichierZcracksInput=self.fichier
803       try :
804           #commande ="Zrun -zp "
805           commande="more "
806           textePython=(commande + self.fichierZcracksInput)
807           self._viewTextExecute( textePython,"run_zcracks",".sh")
808       except Exception, e:
809           print traceback.print_exc()
810
811     #-------------------#
812     def runCARMELCND(self):
813     #-------------------#
814       #if not(self.jdc.isvalid()):
815       #   QMessageBox.critical( self, tr( "Execution impossible "),tr("le JDC doit etre valide pour une execution "))
816       #   return
817       if self.modified or self.fichier==None  :
818          QMessageBox.critical( self, tr( "Execution impossible "),tr("Sauvegarder SVP avant l'execution "))
819          return
820       if not hasattr(self,'generator'): texte=self.get_text_JDC(self.format)
821       from PrepareRunCarmel import prepareRunCarmel
822       fichierGenerique=os.path.basename(self.fichier).split(".")[0]
823       repMed=os.path.dirname(self.fichier)
824       repExeCarmel=self.generator.get_repExeCarmel()
825       textePython=prepareRunCarmel(repExeCarmel,repMed,fichierGenerique)
826       nomFichier = self.__generateTempFilename("carmel_run", suffix = ".sh")
827       f=open(nomFichier,'w')
828       f.write(textePython)
829       f.close()
830       commande="xterm -e sh "+nomFichier +"\n"
831       os.system(commande)
832       #try :
833       #    self._viewTextExecute( textePython,"carmel_run",".sh")
834       #except Exception, e:
835       #    print traceback.print_exc()
836
837     #-------------------#
838     def runCarmelCS(self):
839     #-------------------#
840       try :
841           commande="runSession pilotyacsCS.py"
842           os.system(commande)
843       except Exception, e:
844           print traceback.print_exc()
845
846     #-----------------------------------------------------#
847     def determineNomFichier(self,path,extension):
848     #-----------------------------------------------------#
849       if DictExtensions.has_key(self.appli.code) :
850          chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
851          extensions= self.trUtf8(chaine1+ "All Files (*)")
852       else :
853          extensions= self.trUtf8("JDC (*.comm);;" "All Files (*)")
854
855       if self.appli.code == "MAP" :
856          extensions = extensions + ";; Run (*.input);;"
857
858       fn = QFileDialog.getSaveFileName( self,
859              tr("sauvegarde"), path,
860              extensions,None,
861              QFileDialog.DontConfirmOverwrite)
862       if fn.isNull(): return (0, None)
863       ext = QFileInfo(fn).suffix()
864       if ext.isEmpty(): fn.append(extension)
865
866       if QFileInfo(fn).exists():
867            abort = QMessageBox.warning(self,
868                    tr("Sauvegarde du Fichier"),
869                    tr("Le fichier <b>%s</b> existe deja.",str(fn)),
870                    tr("&Ecraser"),
871                    self.trUtf8("&Abandonner"))
872            if abort == 1 :  return (0, "")
873       return (1,fn)
874
875     #-----------------#
876     def saveRunMAP(self):
877     #-----------------#
878         extension=".input"
879         if not(self.jdc.isvalid()):
880            QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
881                                 tr("Un JdC valide est necessaire pour creer un .input")
882                                  )
883            return
884         try :
885           composant=self.jdc.etapes[0].nom.lower()[0:-5]
886         except :
887            QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
888                                 tr("Choix du composant obligatoire")
889                                  )
890            return
891         if hasattr(self.CONFIGURATION, "savedir"): path=self.CONFIGURATION.savedir
892         else : path=os.environ['HOME']
893
894         monNomFichier=""
895         if self.fichier is not None and self.fichier != "" :
896              maBase=str(QFileInfo(self.fichier).baseName())+".input"
897              monPath=str(QFileInfo(self.fichier).absolutePath())
898              monNomFichier=os.path.join(monPath,maBase)
899         elif hasattr(self,'monNomFichierInput'):
900             monNomFichier=self.monNomFichierInput
901
902
903         monDialog=QFileDialog(self.appliEficas)
904         monDialog.setDirectory (path)
905         monDialog.setWindowTitle ("Save")
906
907         for c in monDialog.children():
908             if isinstance(c,QDialogButtonBox):
909                for b in c.children():
910                   if isinstance(b,QPushButton):
911                      avant=b.text()
912                      if avant.toLatin1()=="&Open":
913                         b.setText("Save")
914         mesFiltres=QStringList()
915         mesFiltres << "input Map (*.input)" << "All Files (*)"
916         monDialog.setNameFilters(mesFiltres)
917         if monNomFichier!="" : monDialog.selectFile(monNomFichier)
918         BOk=monDialog.exec_()
919         if BOk==0: return
920         fn=str(monDialog.selectedFiles()[0].toLatin1())
921         if fn == "" or fn == None : return
922         if not fn.endswith(".input"):
923             fn += ".input"
924         self.monNomFichierInput=fn
925
926         if not hasattr(self, 'fichierMapInput') or not self.fichierMapInput or not os.path.exists(self.fichierMapInput):
927             self.fichierMapInput = self.__generateTempFilename(prefix = "map_run", suffix = ".map")
928             texte=self.get_text_JDC("MAP")
929             self.writeFile( self.fichierMapInput, txt = texte)
930
931         cmd = ("map gen -t dat -n " + composant + " -i " + self.fichierMapInput + " -o " + fn)
932         p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
933         (output, err) = p.communicate()
934
935
936     #-----------------------------------------#
937     def cherche_Groupes(self):
938     #-----------------------------------------#
939         listeMA,listeNO=self.get_text_JDC("GroupMA")
940         return listeMA,listeNO
941
942     #-----------------------------------------#
943     def cherche_Dico(self):
944     #-----------------------------------------#
945         dicoCourant={}
946         format =  self.appliEficas.format_fichier
947         if generator.plugins.has_key(format):
948            # Le generateur existe on l'utilise
949            self.generator=generator.plugins[format]()
950            jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
951            dicoCourant=self.generator.dico
952         return dicoCourant
953
954          
955
956     #-----------------------------------------#
957     def handleAjoutGroup(self,listeGroup):
958     #-----------------------------------------#
959         try :
960         #if 1:
961            from ajoutGroupe import handleAjoutGroupFiltre
962            #print listeGroup
963            handleAjoutGroupFiltre(self,listeGroup)
964            #print "apres handleAjoutGroupFiltre"
965         except :
966         #else :
967            pass
968
969     #-----------------------------------------#
970     def saveFile(self, path = None, saveas= 0):
971     #-----------------------------------------#
972         """
973         Public slot to save the text to a file.
974
975         @param path directory to save the file in (string or QString)
976         @return tuple of two values (boolean, string) giving a success indicator and
977             the name of the saved file
978         """
979
980         #self.modified=1
981         if not self.modified and not saveas:
982             return (0, None)      # do nothing if text wasn't changed
983
984         extension='.py'
985         if DictExtensions.has_key(self.appli.code) :
986            extension=DictExtensions[self.appli.code]
987         else :
988            extension='.comm'
989
990         newName = None
991         fn = self.fichier
992         if self.fichier is None or saveas:
993           if path is None:
994              path=self.CONFIGURATION.savedir
995           bOK, fn=self.determineNomFichier(path,extension)
996           if bOK == 0 : return (0, None)
997           if fn == None : return (0, None)
998           if fn.isNull(): return (0, None)
999
1000           ulfile = os.path.abspath(unicode(fn))
1001           self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1002           fn = unicode(QDir.convertSeparators(fn))
1003           newName = fn
1004
1005         if not (self.writeFile(fn)): return (0, None)
1006         self.fichier = fn
1007         self.modified  = False
1008         if self.fileInfo is None or saveas:
1009            self.fileInfo = QFileInfo(self.fichier)
1010            self.fileInfo.setCaching(0)
1011         self.lastModified = self.fileInfo.lastModified()
1012         if newName is not None:
1013            self.appliEficas.addToRecentList(newName)
1014            self.tree.racine.item.getObject().nom=os.path.basename(newName)
1015            self.tree.racine.update_node_label()
1016
1017         if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
1018             self.generator.writeDefault(fn)
1019
1020         if self.salome :
1021                self.appliEficas.addJdcInSalome( self.fichier)
1022         self.modified = 0
1023         nouveauTitre=self.titre+"              "+str(os.path.basename(self.fichier))
1024         self.appliEficas.setWindowTitle(nouveauTitre)
1025
1026         return (1, self.fichier)
1027 #
1028     #----------------------------------------------#
1029     def saveFileAs(self, path = None,fileName=None):
1030     #----------------------------------------------#
1031         """
1032         Public slot to save a file with a new name.
1033
1034         @param path directory to save the file in (string or QString)
1035         @return tuple of two values (boolean, string) giving a success indicator and
1036             the name of the saved file
1037         """
1038         if fileName != None :
1039            self.fichier = fileName
1040            return self.saveFile()
1041         return self.saveFile(path,1)
1042
1043
1044
1045     #---------------------------------------------#
1046     def get_file(self,unite=None,fic_origine = ''):
1047     #---------------------------------------------#
1048     # appele par I_JDC
1049         ulfile  = None
1050         jdcText = ""
1051
1052         titre  = ""
1053
1054         if unite :
1055             titre = tr("Choix unite %d ", unite)
1056             texte = tr("Le fichier %s contient une commande INCLUDE \n",  str(fic_origine)) +"\n"
1057             texte = texte+ tr("Donnez le nom du fichier correspondant a l unite logique ") + repr(unite)
1058             labeltexte = tr('Fichier pour unite ') + repr( unite)
1059         else:
1060             titre = tr("Choix d'un fichier de poursuite")
1061             texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
1062             texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
1063
1064         QMessageBox.information( self, titre,QString.fromUtf8(texte))
1065         fn = QFileDialog.getOpenFileName(self.appliEficas,
1066                    titre,
1067                    self.appliEficas.CONFIGURATION.savedir)
1068
1069         if fn.isNull():
1070         # ce retour est impose par le get_file d'I_JDC
1071            return None," "
1072
1073         ulfile = os.path.abspath(unicode(fn))
1074         self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
1075
1076         # On utilise le convertisseur defini par format_fichier
1077         source=self.get_source(ulfile)
1078         if source:
1079             # On a reussia convertir le fichier self.ulfile
1080             jdcText = source
1081         else:
1082             # Une erreur a ete rencontree
1083             jdcText = ''
1084         return ulfile, jdcText
1085
1086     #-------------------------------#
1087     def updateJdc(self, itemApres,texte):
1088     #--------------------------------#
1089         monItem=itemApres
1090         etape=monItem.item.object
1091
1092         CONTEXT.set_current_step(etape)
1093         etape.build_includeInclude(texte)
1094         self.tree.racine.build_children()
1095
1096
1097
1098
1099     #-------------------------------------#
1100     def ajoutVersionCataDsJDC(self,txt):
1101     #-------------------------------------#
1102         if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt
1103         ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata[0].VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n"
1104         texte=txt+ligneVersion
1105         return texte
1106
1107     #-------------------------------------#
1108     def verifieVersionCataDuJDC(self,text):
1109     #-------------------------------------#
1110         memeVersion=False
1111         indexDeb=text.find("#VERSION_CATALOGUE:")
1112         indexFin=text.find(":FIN VERSION_CATALOGUE")
1113         if indexDeb < 0 :
1114            self.versionCataDuJDC="sans"
1115            textJDC=text
1116         else :
1117            self.versionCataDuJDC=text[indexDeb+19:indexFin]
1118            textJDC=text[0:indexDeb]+text[indexFin+23:-1]
1119
1120         self.versionCata="sans"
1121         if hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata[0].VERSION_CATALOGUE
1122
1123         if self.versionCata==self.versionCataDuJDC : memeVersion=True
1124         return memeVersion,textJDC
1125
1126     #-------------------------------#
1127     def traduitCatalogue(self,texte):
1128     #-------------------------------#
1129         nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata
1130         sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur")))
1131         try :
1132             traducteur=__import__(nomTraducteur)
1133             monTraducteur=traducteur.MonTraducteur(texte)
1134             nouveauTexte=monTraducteur.traduit()
1135             return nouveauTexte
1136         except :
1137             return texte
1138
1139
1140     #------------------------------#
1141     def verifieCHECKSUM(self,text):
1142     #------------------------------#
1143         indexDeb=text.find("#CHECKSUM:")
1144         if indexDeb < 0 :
1145            return 1, text
1146         indexFin=text.find(":FIN CHECKSUM")
1147         checkAvant=text[indexDeb:indexFin+13]
1148         textJDC=text[0:indexDeb]+text[indexFin+13:-1]
1149         checksum=self.get_checksum(textJDC)
1150         pareil=(checkAvant==checksum)
1151         return pareil, textJDC
1152
1153     #---------------------------#
1154     def get_checksum(self,texte):
1155     #---------------------------#
1156         newtexte=texte.replace('"','\\"')
1157         commande='echo "'+newtexte+'"|md5sum'
1158         a=os.popen(commande)
1159         checksum=a.read()
1160         a.close()
1161         ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
1162         return ligne
1163
1164
1165     #---------------------------#
1166     def _newZCRACKS(self):
1167     #---------------------------#
1168         texte="MAILLAGES();REMESHING();"
1169         return texte
1170
1171     #---------------------------#
1172     def _newJDCCND(self):
1173     #---------------------------#
1174       extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
1175       
1176       #if self.salome == 0 :
1177       QMessageBox.information( self,
1178                       tr("Fichier Med"),
1179                       tr("Veuillez selectionner un fichier Med"))
1180       QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
1181                         caption='Fichier Med',
1182                         filter=extensions)
1183       self.fichierMED=str(QSfichier.toLatin1())
1184       from acquiertGroupes import getGroupes
1185       erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
1186       if erreur != "" : print "a traiter"
1187       texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
1188       texteSources=""
1189       texteCond=""
1190       texteNoCond=""
1191       texteVcut=""
1192       texteZs=""
1193       for groupe in self.listeGroupes :
1194           if groupe[0:8]=='CURRENT_': 
1195              texteSources +=groupe[8:]+"=SOURCE("
1196              texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
1197           if groupe[0:5]=='COND_':    texteCond    +=groupe[5:]+"=CONDUCTEUR();\n"
1198           if groupe[0:7]=='NOCOND_':  texteNoCond  +=groupe[7:]+"=NOCOND();\n"
1199           if groupe[0:5]=='VCUT_':    texteVcut    +='V_'+groupe[5:]+"=VCUT();\n"
1200           if groupe[0:3]=='ZS_':      texteZs      +=groupe[3:]+"=ZS();\n"
1201       texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
1202       self.newTexteCND=texte
1203       self.modified=1
1204       return texte
1205
1206
1207     #---------------------------#
1208     def  BoutonFileSelected(self):
1209     #---------------------------#
1210
1211       QSfichier=self.openfile.selectedFiles()[0]
1212       self.fichierMED=str(QSfichier.toLatin1())
1213       from acquiertGroupes import getGroupes
1214       erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
1215       if erreur != "" : print "a traiter"
1216
1217     #-----------------------------
1218     def BoutonSalomePressed(self):
1219     #----------------------------
1220       Msg,self.listeGroupes=self.appliEficas.ChercheGrpMailleInSalome()
1221       self.fichierMED="A_partir_de_SMESH"
1222       self.nomMaillage="A_partir_de_SMESH"
1223       self.openfile.close()
1224
1225
1226 if __name__ == "__main__":
1227     self.code='ASTER'
1228     name='prefs_'+prefs.code
1229     prefsCode=__import__(name)
1230
1231
1232     if hasattr(prefsCode,'encoding'):
1233        # Hack pour changer le codage par defaut des strings
1234        import sys
1235        reload(sys)
1236        sys.setdefaultencoding(prefs.encoding)
1237        del sys.setdefaultencoding
1238        # Fin hack
1239
1240 #    code=options.code
1241 #
1242     app = QApplication(sys.argv)
1243     mw = JDCEditor(None,'azAster.comm')
1244     app.setMainWidget(mw)
1245     app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
1246     mw.show()
1247
1248     res = app.exec_loop()
1249     sys.exit(res)