Salome HOME
fin portage python 3
[tools/eficas.git] / InterfaceQT4 / editor.py
old mode 100644 (file)
new mode 100755 (executable)
index 2be9a3c..9b79350
 #
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
+from __future__ import absolute_import
+from __future__ import print_function
+try :
+   from builtins import str
+   from builtins import range
+except : pass
+
 import types,sys,os, re
 import  subprocess
 import traceback
-from PyQt4 import *
-from PyQt4.QtGui  import *
-from PyQt4.QtCore import *
+
+import six
+from six.moves import range
+from PyQt5.QtWidgets import QWidget, QMessageBox, QFileDialog, QApplication, QSplitter
+from PyQt5.QtGui import QPalette
+from PyQt5.QtCore import QProcess, QFileInfo, QTimer, Qt, QDir, QSize
 import time
+import pdb
 from datetime import date
 from Extensions.i18n import tr
 
+import traceback
 
 # Modules Eficas
 
@@ -35,16 +47,17 @@ from Editeur        import session
 from Editeur        import comploader
 from Editeur        import Objecttreeitem
 from desBaseWidget  import Ui_baseWidget
-from monViewTexte   import ViewText 
+from InterfaceQT4.monViewTexte   import ViewText
 from monWidgetCreeParam import MonWidgetCreeParam 
-import browser
-import readercata
+from . import browser
+from . import readercata
 
-DictExtensions= {"MAP" : ".map"}
+DictExtensions= {"MAP" : ".map", "TELEMAC" : '.comm'}
 
+    
 
 
-class JDCEditor(Ui_baseWidget,QtGui.QWidget):
+class JDCEditor(Ui_baseWidget,QWidget):
 # ----------------------------------------- #
     """
        Editeur de jdc
@@ -53,13 +66,15 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     def __init__ (self,appli,fichier = None, jdc = None, QWParent=None, units = None, include=0 , vm=None):
     #----------------------------------------------------------------------------------------------------------#
 
-        self.a=0
-        QtGui.QWidget.__init__(self,None)
+        QWidget.__init__(self,None)
+        self.i=0
         self.setupUi(self)
-        self.monOptionnel=None
+        self.inhibeSplitter=0
+        self.widgetOptionnel=None
         self.fenetreCentraleAffichee=None
         self.dejaDansPlieTout=False
         self.afficheCommandesPliees = True
+        self.listeDesListesOuvertes=set()
         self.appliEficas = appli
         self.appli       = appli  #---- attendu par IHM
         self.vm          = vm
@@ -67,41 +82,59 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         self.jdc         = jdc
         self.first      = True
         self.QWParent    = QWParent
+        self.couleur     = Qt.black
+        self.nodeEnCours=None
          
         if appli != None :
            self.salome =  self.appliEficas.salome
         else :
            self.salome=0
-           print "dans JDC pas d appli ????????"
+           print ("dans JDC pas d appli ????????")
 
         # ces attributs sont mis a jour par definitCode appelee par newEditor
-        self.code = self.appliEficas.CONFIGURATION.code
+        self.code   = self.appliEficas.CONFIGURATION.code
+        self.initSplitterSizes()
+
+        #self.afficheListesPliees=False
+        self.afficheListesPliees=True
+        if self.code == "ASTER" or self.code == "monCode" : self.afficheListesPliees =True
+        if self.code == 'PSEN_N1' : self.afficheListesPliees = False
+
         self.mode_nouv_commande=self.appliEficas.CONFIGURATION.mode_nouv_commande
+        self.closeAutreCommande=self.appliEficas.CONFIGURATION.closeAutreCommande
+        self.closeFrameRechercheCommande=self.appliEficas.CONFIGURATION.closeFrameRechercheCommande
+        self.closeArbre=self.appliEficas.CONFIGURATION.closeArbre
         self.affiche=self.appliEficas.CONFIGURATION.affiche
+        self.nombreDeBoutonParLigne = self.appliEficas.CONFIGURATION.nombreDeBoutonParLigne
+        #self.taille = self.appliEficas.taille
+
+        #if self.code in ['MAP','CARMELCND','PSEN'] : self.afficheCommandesPliees=False
         if self.code in ['MAP','CARMELCND'] : self.afficheCommandesPliees=False
-        if self.code in ['MAP',] : 
+        if self.code in ['MAP',]:
            self.widgetTree.close()
            self.widgetTree=None
-           self.appliEficas.resize(1440,self.appliEficas.height())
-        else :
-           self.appliEficas.resize(2000,self.appliEficas.height())
+        if self.closeArbre: self.fermeArbre()
 
         self.version_code = session.d_env.cata
 
+
         if not hasattr ( self.appliEficas, 'readercata') or  self.appliEficas.multi==True:
            self.readercata  = readercata.READERCATA( self, self.appliEficas )
            self.appliEficas.readercata=self.readercata
+           self.appliEficas.code=self.code
         else :
            self.readercata=self.appliEficas.readercata
         if self.readercata.fic_cata == None : return    #Sortie Salome
         self.titre=self.readercata.titre
         self.Ordre_Des_Commandes=self.readercata.Ordre_Des_Commandes
+        self.Classement_Commandes_Ds_Arbre=self.readercata.Classement_Commandes_Ds_Arbre
 
         self.format =  self.appliEficas.format_fichier
 
         self.dict_reels={}
         self.liste_simp_reel=[]
         self.ihm="QT"
+        self.dicoNouveauxMC={}
 
         nameConf='configuration_'+self.code
         configuration=__import__(nameConf)
@@ -118,6 +151,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
 
         try:
           self.CONFIGURATION.convert_module
+          #print self.CONFIGURATION.convert_module
           _module = __import__(self.CONFIGURATION.convert_module)
           info = _module.entryPoint()
           convert.plugins.addEntryPoint(info)
@@ -136,11 +170,11 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         self.node_selected = []
         self.deplier = True
         self.message=''
-        if self.code in ['Adao','MAP'] : self.afficheApresInsert=True
+        if self.code in ['Adao','ADAO','MAP'] : self.afficheApresInsert=True
         else :  self.afficheApresInsert=False
         if self.code in ['TELEMAC',] : self.enteteQTree='premier'
         else : self.enteteQTree='complet'
-        if self.code in ['Adao','TELEMAC'] : self.affichePlie=True
+        if self.code in ['Adao','ADAO','TELEMAC'] : self.affichePlie=True
         else : self.affichePlie=False
 
         self.Commandes_Ordre_Catalogue =self.readercata.Commandes_Ordre_Catalogue
@@ -154,12 +188,10 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
             self.fileInfo = QFileInfo(self.fichier)
             self.fileInfo.setCaching(0)
             if jdc==None :
-              # try :
-              if 1:
+               #try :
                    self.jdc = self.readFile(self.fichier)
                #except :
-              else :
-                   print "mauvaise lecture"
+               #    print ("mauvaise lecture")
             else :
                self.jdc=jdc
             if self.jdc is not None and units is not None:
@@ -174,7 +206,8 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
                 self.nouveau=1
 
         if self.jdc:
-            self.jdc.appli = self
+            self.jdc.appli = self # a resorber
+            self.jdc.editor = self 
             self.jdc.lang    = self.appli.langue
             self.jdc.aReafficher=False
             txt_exception  = None
@@ -183,7 +216,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
                 txt_exception = self.jdc.cr.get_mess_exception()
             if txt_exception:
                 self.jdc = None
-                qApp.restoreOverrideCursor()
+                QApplication.restoreOverrideCursor()
                 self.affiche_infos(tr("Erreur fatale au chargement de %s",str(fichier)),Qt.red)
                 if (self.appliEficas.ssIhm == False) : QMessageBox.critical( self, tr("Erreur fatale au chargement d'un fichier"), txt_exception)
             else:
@@ -192,13 +225,99 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
                 if (not self.jdc.isvalid()) and (not self.nouveau) and (self.appliEficas.ssIhm == False):
                     self.viewJdcRapport()
  
-       # if self.code=="TELEMAC" : print "kkkkkkkk"
 
 
-        if jdc_item:
+        if jdc_item and self.appliEficas.ssIhm==False:
             self.tree = browser.JDCTree( jdc_item,  self )
         self.appliEficas.construitMenu()
 
+        
+        #############
+        self.adjustSize()
+
+
+    #-------------------#  Pour execution avec output et error dans le bash
+    def runPSEN(self):
+    #-------------------#
+    
+      #if self.modified or self.fichier==None  : self.saveFile()
+      self.saveFile()
+        
+      #lancement avec le .bat
+      path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','PSEN_Eficas','PSEN'))
+      WrapperFilePath = os.path.join(path1, 'PSSEWrapper.py') 
+      import subprocess
+      p = subprocess.Popen(['python',WrapperFilePath])
+      (out,err)=p.communicate()        
+      print (out)
+      print (err)
+
+    #-------------------#  Pour execution avec output et error dans le bash
+    def runPSEN_N1(self):
+    #-------------------#
+      
+
+      self.saveFile()
+      path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','ProcessOutputs_Eficas','TreatOutputs'))
+      sys.path.append(path1)
+
+      if not(self.jdc.isvalid()):
+         QMessageBox.information( self, tr( "Unvalid JDC"),tr("incorrect keywords will be ignored"))
+      if 'dicoImbrique' in generator.plugins:
+         self.generator=generator.plugins['dicoImbrique']()
+         jdc_formate=self.generator.gener(self.jdc)
+         dico=self.generator.Dico 
+         
+         ###to delete
+         #fileDico =  r'C:\Logiciels DER\PSEN_V16\Code\ProcessOutputs_Eficas\TreatOutputs\dicoN1.py'
+         fileDico =  os.path.join(path1, 'dicoN1.py') #r'C:\Logiciels DER\PSEN_V16\Code\ProcessOutputs_Eficas\TreatOutputs\dicoN1.py'
+         f = open( str(fileDico), 'w')
+         f.write("Dico =" + str(dico) )
+         f.close()
+         ###
+         
+      
+      #print ('in runPSEN_N1', dico)
+      from Run import run 
+      run(dico)
+      #res,txt_exception=run(dico)
+      #if res : QMessageBox.information( self, tr("fin de script run"), txt_exception)
+      #else  : QMessageBox.critical( self, tr("Erreur fatale script run"), txt_exception)
+       
+    #-------------------#  Pour execution avec output et error dans le bash
+    def process_N1(self):
+    #-------------------#
+
+      path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','../','ProcessOutputs_Eficas','TreatOutputs'))
+      sys.path.append(path1)
+
+
+      if 'dicoImbrique' in generator.plugins:
+         self.generator=generator.plugins['dicoImbrique']()
+         jdc_formate=self.generator.gener(self.jdc)
+         dico=self.get_Dico() #generator.Dico
+
+
+         for k in dico['CONTINGENCY_PROCESSING']:
+             #print (k)
+             if k[0:19] == 'Component_List_For_' or k[0:21] =='Contingency_List_For_' :
+                newK=k.replace('___',' ')
+                l="'"+str(newK)+"'"
+                dico['CONTINGENCY_PROCESSING'][l]=dico['CONTINGENCY_PROCESSING'][k]
+                del dico['CONTINGENCY_PROCESSING'][k]
+
+         ###to delete
+         fileDico =  os.path.join(path1, 'dicoN1_process.py')
+         f = open( str(fileDico), 'w')
+         f.write("Dico =" + str(dico) )
+         f.close()
+         ###
+         return dico
+
+        #return self.get_Dico()
+
+
+
     #--------------------------------#
     def _newJDC( self ,units = None):
     #--------------------------------#
@@ -212,6 +331,12 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         if self.code == "CARMELCND" : texte=self._newJDCCND()
         if self.code == "ZCRACKS" : texte=self._newZCRACKS()
         if self.code == "TELEMAC" : texte=self._newTELEMAC()
+        if self.code == "PSEN"    : texte = self._newPSEN()
+        if self.code == "PSEN_N1" : texte = self._newPSEN_N1()
+
+        if hasattr(self.readercata.cata[0],'TEXTE_NEW_JDC') : texte=self.readercata.cata[0].TEXTE_NEW_JDC
+
+        #if self.code == "CF" : texte = self._new_CF()
         #   texte=self.newTexteCND
        
         jdc=self.readercata.cata[0].JdC( procedure =texte,
@@ -267,7 +392,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         Public slot to read the text from a file.
         @param fn filename to read from (string or QString)
         """
-        fn = unicode(fn)
+        fn = six.text_type(fn)
 
         # ------------------------------------------------------------------------------------
         #                         charge le JDC
@@ -275,7 +400,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
 
         jdcName=os.path.basename(fn)
         # Il faut convertir le contenu du fichier en fonction du format
-        if convert.plugins.has_key( self.appliEficas.format_fichier_in ):
+        if self.appliEficas.format_fichier_in in convert.plugins:
              # Le convertisseur existe on l'utilise
              #appli = self
              p=convert.plugins[self.appliEficas.format_fichier_in]()
@@ -327,7 +452,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     #-----------------------#
 
         # Il faut convertir le contenu du fichier en fonction du format
-        if convert.plugins.has_key(self.format):
+        if self.format in convert.plugins :
             # Le convertisseur existe on l'utilise
             p=convert.plugins[self.format]()
             p.readfile(file)
@@ -369,9 +494,9 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         f=open(nomFichier,'w')
         f.write(txt)
         f.close()
-        self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
-        self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
-        exe='sh /tmp/test.sh'
+        self.monExe.readyReadStandardOutput.connect( self.readFromStdOut)
+        self.monExe.readyReadStandardError.connect( self.readFromStdErr)
+        exe='sh ' + nomFichier
         self.monExe.start(exe)
         self.monExe.closeWriteChannel()
         self.w.exec_()
@@ -381,12 +506,19 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         except :
           pass
 
-
     def readFromStdErr(self):
+        a=self.monExe.readAllStandardError()
+        self.w.view.append(str(a.data(),len(a)))
+
+    def readFromStdErr(self) :
+        a=self.monExe.readAllStandardOutput()
+        self.w.view.append(str(a.data(),len(a)))
+
+    def readFromStdErrQT4(self):
         a=self.monExe.readAllStandardError()
         self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
 
-    def readFromStdOut(self) :
+    def readFromStdOutQT4(self) :
         a=self.monExe.readAllStandardOutput()
         self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
         
@@ -401,6 +533,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     #-----------------------#
     def viewJdcSource(self):
     #-----------------------#
+        if self.fichier == None : return
         f=open(self.fichier,'r')
         texteSource=f.read()
         f.close()
@@ -415,9 +548,17 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     #-----------------------#
     def viewJdcRapport(self):
     #-----------------------#
-        strRapport = unicode( self.jdc.report() )
+        strRapport = six.text_type( self.jdc.report() )
+        # on ajoute les regles
+        
         self._viewText(strRapport, "JDC_RAPPORT")
 
+    #-----------------------#
+    def viewJdcRegles(self):
+    #-----------------------#
+        if self.tree :self.tree.AppelleBuildLBRegles()
+
+
     #----------------#
     def closeIt(self):
     #----------------#
@@ -433,10 +574,10 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     #----------------------------------------------#
         if self.sb:
            mapalette=self.sb.palette()
-           from PyQt4.QtGui import QPalette
            mapalette.setColor( QPalette.WindowText, couleur )
            self.sb.setPalette( mapalette );
-           self.sb.showMessage(QString.fromUtf8(message))#,2000)
+           self.sb.showMessage(message,4000)
+           self.couleur=couleur
 
     #------------------------------#
     def affiche_alerte(self,titre,message):
@@ -444,6 +585,17 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     # appele par I_MACRO_ETAPE
         QMessageBox.information( self, titre, message)
 
+    #-----------------------------------#
+    def affiche_commentaire(self,message):
+    #-----------------------------------#
+        self.labelCommentaire.setText(message)
+        QTimer.singleShot(6000, self.rendInvisible)
+
+    #----------------------#
+    def rendInvisible(self):
+    #----------------------#
+        self.labelCommentaire.setText("")
+
     #-------------------#
     def init_modif(self):
     #-------------------#
@@ -477,14 +629,21 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     #---------------------#
     def handleRechercher(self):
     #---------------------#
-      from monRecherche import DRecherche
+      from .monRecherche import DRecherche
       monRechercheDialg=DRecherche(parent=self,fl=0)
       monRechercheDialg.show()
 
+
+    #--------------------------------#
+    def handleRechercherDsCatalogue(self):
+    #-----------------------------#
+      from .monRechercheCatalogue import DRechercheCatalogue
+      monRechercheDialg=DRechercheCatalogue(self.QWParent,self)
+      monRechercheDialg.show()
+
     #---------------------#
     def handleDeplier(self):
     #---------------------#
-       print "je passe ici"
        if self.tree == None : return
        #self.tree.collapseAll()
        if self.deplier :
@@ -556,10 +715,12 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
          pos='before'
       else :
          indexNoeudOuColler=noeudOuColler.treeParent.children.index(noeudOuColler)
+         indexNoeudOuColler=self.getTreeIndex(noeudOuColler)
 
       try :
        noeudACopier=self.QWParent.noeud_a_editer[0]
        indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
+       indexNoeudACopier=self.getTreeIndex(noeudACopier)
       except :
        QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
        return
@@ -567,9 +728,9 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
       if (self.QWParent.edit != "couper"):
         try:
            if noeudOuColler == self.tree.racine :
-              child=noeudOuColler.doPastePremier(noeudACopier)
+               child=noeudOuColler.doPastePremier(noeudACopier)
            else :
-              child=noeudACopier.doPaste(noeudOuColler,pos)
+               child=noeudACopier.doPaste(noeudOuColler,pos)
            if child==None or child==0:
                QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
                self.message = ''
@@ -595,13 +756,13 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
       # si possible on renomme l objet comme le noeud couper
 
       if (self.QWParent.edit == "couper"):
-         #try :
          if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
            QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
 
          #if 1:
          try :
-            indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
+           # indexNoeudACopier=noeudACopier.treeParent.children.index(noeudACopier)
+            indexNoeudACopier=self.getTreeIndex(noeudACopier)
             noeudACopier.treeParent.item.deplaceEntite(indexNoeudACopier,indexNoeudOuColler,pos)
             noeudACopier.treeParent.build_children()
 
@@ -701,7 +862,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
      fichier = QFileDialog.getOpenFileName(self.appliEficas,
                    tr('Ouvrir Fichier'),
                    self.appliEficas.CONFIGURATION.savedir,
-                   self.appliEficas.trUtf8('Wrapper Files (*.xml);;''All Files (*)'))
+                   tr('Wrapper Files (*.xml);;''All Files (*)'))
      return  fichier
 
     #--------------------------------------------------#
@@ -710,11 +871,11 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         """
         Public slot to write the text to a file.
 
-        @param fn filename to write to (string or QString)
+        @param fn filename to write to string
         @return flag indicating success
         """
 
-        fn = unicode(fn)
+        fn = six.text_type(fn)
        
         if txt == None :
             txt = self.get_text_JDC(self.format,formatLigne=formatLigne)
@@ -727,29 +888,35 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
             txt=self.ajoutVersionCataDsJDC(txt)
             checksum=self.get_checksum(txt)
             txt=txt+checksum
+        if self.code=="TELEMAC" : return 1
         try:
-            f = open(fn, 'wb')
+            f = open(fn, 'w')
             f.write(txt)
             f.close()
             return 1
-        except IOError, why:
-            QMessageBox.critical(self, self.trUtf8('Save File'),
-                self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
-                    .arg(unicode(fn)).arg(str(why)))
+        except IOError as why:
+            if (self.appliEficas.ssIhm == False):
+                QMessageBox.critical(self, tr('Sauvegarde du Fichier'),
+                tr('Le fichier')+str(fn) + tr('n a pas pu etre sauvegarde : ') + str(why))
+            else :
+                print (why)
             return 0
 
     #-----------------------------------------------------------#
     def get_text_JDC(self,format,pourRun=0,formatLigne="beautifie"):
     #-----------------------------------------------------------#
-      if self.code == "MAP" and not(generator.plugins.has_key(format)): format = "MAP"
-      if generator.plugins.has_key(format):
+      if self.code == "MAP" and not(format in generator.plugins): format = "MAP"
+      if format in generator.plugins:
+         
          # Le generateur existe on l'utilise
          self.generator=generator.plugins[format]()
          try :
-            jdc_formate=self.generator.gener(self.jdc,format=formatLigne,config=self.appliEficas.CONFIGURATION)
+            jdc_formate=self.generator.gener(self.jdc,format=formatLigne,config=self.appliEficas.CONFIGURATION,appli=self.appliEficas)
             if pourRun : jdc_formate=self.generator.textePourRun
-         except ValueError,e:
+         except ValueError as e:
             QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
+            return
+
          if not self.generator.cr.estvide():
             self.affiche_infos(tr("Erreur a la generation"),Qt.red)
             QMessageBox.critical( self, tr("Erreur a la generation"),tr("EFICAS ne sait pas convertir ce JDC"))
@@ -762,17 +929,32 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
          QMessageBox.critical( self, "Format  non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
          return ""
 
+    #----------------------#
+    def get_Dico(self):
+    #---------------------#
+      if 'dicoImbrique' in generator.plugins:
+         self.generator=generator.plugins['dicoImbrique']()
+         jdc_formate=self.generator.gener(self.jdc)
+         dico=self.generator.Dico 
+         return dico
+      else : 
+         self.affiche_infos(tr("Format %s non reconnu" , self.format),Qt.red)
+         QMessageBox.critical( self, "Format  non reconnu" ,tr("EFICAS ne sait pas convertir le JDC selon le format "+ self.format))
+         return ""
+
+
     #------------#
     def run(self):
     #------------#
       fonction="run"+self.code
-      if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
+      #print fonction
+      if fonction in JDCEditor.__dict__: JDCEditor.__dict__[fonction],(self,)
 
     #------------#
     def saveRun(self):
     #------------#
       fonction="saveRun"+self.code
-      if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
+      if fonction in JDCEditor.__dict__: JDCEditor.__dict__[fonction],(self,)
 
     #---------------#
     def runMAP(self):
@@ -806,13 +988,13 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
 
           #textePython="ls -l"
           self._viewTextExecute( textePython,"map_run",".sh")
-          try:
-             commande="rm  "+self.fichierMapInput
-             os.system(commande)
-          except :
-             pass
-      except Exception, e:
-          print traceback.print_exc()
+          #try:
+          #  commande="rm  "+self.fichierMapInput
+          #   os.system(commande)
+          #except :
+          #   pass
+      except Exception as e:
+          print((traceback.print_exc()))
 
     #-------------------#
     def runZCRACKS(self):
@@ -832,8 +1014,8 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
           commande="more "
           textePython=(commande + self.fichierZcracksInput)
           self._viewTextExecute( textePython,"run_zcracks",".sh")
-      except Exception, e:
-          print traceback.print_exc()
+      except Exception as e:
+          print((traceback.print_exc()))
 
     #-------------------#
     def runCARMELCND(self):
@@ -856,10 +1038,6 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
       f.close()
       commande="xterm -e sh "+nomFichier +"\n"
       os.system(commande)
-      #try :
-      #    self._viewTextExecute( textePython,"carmel_run",".sh")
-      #except Exception, e:
-      #    print traceback.print_exc()
 
     #-------------------#
     def runCarmelCS(self):
@@ -867,17 +1045,17 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
       try :
           commande="runSession pilotyacsCS.py"
           os.system(commande)
-      except Exception, e:
-          print traceback.print_exc()
+      except Exception as e:
+          print((traceback.print_exc()))
 
     #-----------------------------------------------------#
     def determineNomFichier(self,path,extension):
     #-----------------------------------------------------#
-      if DictExtensions.has_key(self.appli.code) :
+      if self.appli.code in DictExtensions:
          chaine1="JDC (*"+DictExtensions[self.appli.code]+");;"
-         extensions= self.trUtf8(chaine1+ "All Files (*)")
+         extensions= tr(chaine1+ "All Files (*)")
       else :
-         extensions= self.trUtf8("JDC (*.comm);;" "All Files (*)")
+         extensions= tr("JDC (*.comm);;" "All Files (*)")
 
       if self.appli.code == "MAP" :
          extensions = extensions + ";; Run (*.input);;"
@@ -886,16 +1064,20 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
              tr("sauvegarde"), path,
              extensions,None,
              QFileDialog.DontConfirmOverwrite)
-      if fn.isNull(): return (0, None)
+      if fn == None : return (0, None)
+      fn=fn[0]
+      if fn=='': return (0, None)
+
       ext = QFileInfo(fn).suffix()
-      if ext.isEmpty(): fn.append(extension)
+      if ext == '': fn+=extension
 
       if QFileInfo(fn).exists():
-           abort = QMessageBox.warning(self,
-                   tr("Sauvegarde du Fichier"),
-                   tr("Le fichier <b>%s</b> existe deja.",str(fn)),
-                   tr("&Ecraser"),
-                   self.trUtf8("&Abandonner"))
+           msgBox = QMessageBox(self)
+           msgBox.setWindowTitle(tr("Sauvegarde du Fichier"))
+           msgBox.setText(tr("Le fichier <b>%s</b> existe deja.", six.text_type(fn)))
+           msgBox.addButton(tr("&Ecraser"),0)
+           msgBox.addButton(tr("&Abandonner"),1)
+           abort=msgBox.exec_()
            if abort == 1 :  return (0, "")
       return (1,fn)
 
@@ -916,7 +1098,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
                                  )
            return
         if hasattr(self.CONFIGURATION, "savedir"): path=self.CONFIGURATION.savedir
-        else : path=os.environ['HOME']
+        else : path='C:/'
 
         monNomFichier=""
         if self.fichier is not None and self.fichier != "" :
@@ -936,15 +1118,13 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
                for b in c.children():
                   if isinstance(b,QPushButton):
                      avant=b.text()
-                     if avant.toLatin1()=="&Open":
-                        b.setText("Save")
-        mesFiltres=QStringList()
-        mesFiltres << "input Map (*.input)" << "All Files (*)"
+                     if avant=="&Open": b.setText("Save")
+        mesFiltres= "input Map (*.input);;All Files (*)"
         monDialog.setNameFilters(mesFiltres)
         if monNomFichier!="" : monDialog.selectFile(monNomFichier)
         BOk=monDialog.exec_()
         if BOk==0: return
-        fn=str(monDialog.selectedFiles()[0].toLatin1())
+        fn=str(monDialog.selectedFiles()[0])
         if fn == "" or fn == None : return
         if not fn.endswith(".input"):
             fn += ".input"
@@ -960,6 +1140,13 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         (output, err) = p.communicate()
 
 
+    #-----------------#
+    def saveRunPSEN(self):
+    #-----------------#
+        #print ("saveRunPSEN")
+        self.saveFile()
+
+
     #-----------------------------------------#
     def cherche_Groupes(self):
     #-----------------------------------------#
@@ -971,7 +1158,7 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     #-----------------------------------------#
         dicoCourant={}
         format =  self.appliEficas.format_fichier
-        if generator.plugins.has_key(format):
+        if format in generator.plugins:
            # Le generateur existe on l'utilise
            self.generator=generator.plugins[format]()
            jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.CONFIGURATION)
@@ -993,6 +1180,36 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         #else :
            pass
 
+    #-----------------------------------------------------------------#
+    def saveFileLeger(self, path = None, saveas= 0,formatLigne="beautifie"):
+    #-----------------------------------------------------------------#
+        extension='.casR'
+        fn = self.fichier
+        #saveas=True # Pour forcer le nom
+        self.generator=generator.plugins[self.format]()
+        if self.fichier is None or saveas:
+          if path is None: path=self.CONFIGURATION.savedir
+          bOK, fn=self.determineNomFichier(path,extension)
+          if bOK == 0 : return (0, None)
+          if fn == None : return (0, None)
+          if fn== '' : return (0, None)
+
+          ulfile = os.path.abspath(six.text_type(fn))
+          self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
+          fn = six.text_type(QDir.toNativeSeparators(fn))
+
+        self.fichier = os.path.splitext(fn)[0]+extension
+
+        if hasattr(self.generator, "writeLeger"):
+            self.generator.writeLeger(self.fichier,self.jdc,config=self.appliEficas.CONFIGURATION,appli=self.appliEficas)
+
+        if self.salome : self.appliEficas.addJdcInSalome( self.fichier)
+
+        self.modified = 0
+        nouveauTitre=self.titre+"              "+str(os.path.basename(self.fichier))
+        self.appliEficas.setWindowTitle(nouveauTitre)
+        return (1, self.fichier)
+
     #-----------------------------------------------------------------#
     def saveFile(self, path = None, saveas= 0,formatLigne="beautifie"):
     #-----------------------------------------------------------------#
@@ -1004,12 +1221,11 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
             the name of the saved file
         """
 
-        #self.modified=1
+        self.modified=1
         if not self.modified and not saveas:
             return (0, None)      # do nothing if text wasn't changed
 
-        extension='.py'
-        if DictExtensions.has_key(self.appli.code) :
+        if self.appli.code in DictExtensions :
            extension=DictExtensions[self.appli.code]
         else :
            extension='.comm'
@@ -1017,18 +1233,18 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         newName = None
         fn = self.fichier
         if self.fichier is None or saveas:
-          if path is None:
-             path=self.CONFIGURATION.savedir
+          if path is None: path=self.CONFIGURATION.savedir
           bOK, fn=self.determineNomFichier(path,extension)
           if bOK == 0 : return (0, None)
           if fn == None : return (0, None)
-          if fn.isNull(): return (0, None)
+          if fn== '' : return (0, None)
 
-          ulfile = os.path.abspath(unicode(fn))
+          ulfile = os.path.abspath(six.text_type(fn))
           self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
-          fn = unicode(QDir.convertSeparators(fn))
+          fn = six.text_type(QDir.toNativeSeparators(fn))
           newName = fn
 
+
         if not (self.writeFile(fn,formatLigne=formatLigne)): return (0, None)
         self.fichier = fn
         self.modified  = False
@@ -1043,6 +1259,8 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
 
         if self.jdc.isvalid() != 0 and hasattr(self.generator, "writeDefault"):
             self.generator.writeDefault(fn)
+        elif self.code=="TELEMAC" and hasattr(self.generator, "writeDefault"):
+            self.generator.writeDefault(fn)
 
         if self.salome :
                self.appliEficas.addJdcInSalome( self.fichier)
@@ -1096,16 +1314,17 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
             texte = tr("Le fichier %s contient une commande POURSUITE\n", fic_origine)
             texte = texte+tr('Donnez le nom du fichier dont vous \n voulez faire une poursuite')
 
-        QMessageBox.information( self, titre,QString.fromUtf8(texte))
+        QMessageBox.information( self, titre,texte)
         fn = QFileDialog.getOpenFileName(self.appliEficas,
                    titre,
                    self.appliEficas.CONFIGURATION.savedir)
 
-        if fn.isNull():
         # ce retour est impose par le get_file d'I_JDC
-           return None," "
+        if fn== '' : return None," "
+        if not fn : return (0, " ")
+        fn=fn[0]
 
-        ulfile = os.path.abspath(unicode(fn))
+        ulfile = os.path.abspath(six.text_type(fn))
         self.appliEficas.CONFIGURATION.savedir=os.path.split(ulfile)[0]
 
         # On utilise le convertisseur defini par format_fichier
@@ -1128,8 +1347,102 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         etape.build_includeInclude(texte)
         self.tree.racine.build_children()
 
+    #-------------------------------------#
+    def deleteEtape(self,etape):
+    #-------------------------------------#
+        self.jdc.suppentite(etape)
+
+    #-------------------------------------#
+    def deleteMC(self,etape,MCFils,listeAvant=()):
+    #-------------------------------------#
+        ouChercher=etape
+        for mot in listeAvant :
+              ouChercher=ouChercher.get_child(mot,restreint="oui")
+        monMC=ouChercher.get_child(MCFils,restreint="oui")
+        if monMC != None :  ouChercher.suppentite(monMC)
+        ouChercher.state='changed'
+        ouChercher.isvalid()
+
+    #-------------------------------------#
+    def ajoutMC(self,etape,MCFils,valeurs,listeAvant=()):
+    #-------------------------------------#
+        ouChercher=etape
+        for mot in listeAvant :
+              ouChercher=ouChercher.get_child(mot,restreint="oui")
+        monMC=etape.get_child(ouChercher,restreint="oui")
+        if monMC== None : monMC= ouChercher.addentite(MCFils)
+        monMC.valeur=valeurs
+        monMC.val=valeurs
+        monMC.state='changed'
+        monMC.isvalid()
 
+    #-----------------------------------------------------------#
+    def changeIntoMC(self,etape,MCFils,valeurs, listeAvant=()):
+    #-----------------------------------------------------------#
+        ouChercher=etape
+        for mot in listeAvant :
+              ouChercher=ouChercher.get_child(mot,restreint="oui")
+        if ouChercher ==None : print ('SOUCI'); return
+        monMC=ouChercher.get_child(MCFils,restreint="oui")
+        if monMC== None : monMC= ouChercher.addentite(MCFils)
+        monMC.definition.into=valeurs
+        monMC.state='changed'
+        monMC.isvalid()
 
+    #-------------------------------------#
+    def changeIntoDefMC(self,etape,listeMC,valeurs):
+    #-------------------------------------#
+        definitionEtape=getattr(self.jdc.cata[0],etape)
+        ouChercher=definitionEtape
+        if len(listeMC) > 1 :
+           for mc in listeMC[0:-1]:
+             mcfact=ouChercher.entites[mc]
+             ouChercher=mcfact
+           
+        mcAccas=ouChercher.entites[listeMC[-1]]
+        mcAccas.into=valeurs
+
+    #-------------------------------------------------------------#
+    def deleteDefinitionMC(self,etape,listeAvant,nomDuMC):
+    #-------------------------------------------------------------#
+        #print 'in deleteDefinitionMC', etape,listeAvant,nomDuMC
+        definitionEtape=getattr(self.jdc.cata[0],etape)
+        ouChercher=definitionEtape
+        for k in listeAvant : 
+            ouChercher=ouChercher.entites[k]
+        MCADetruire=ouChercher.entites[nomDuMC]
+        ouChercher.ordre_mc.remove(nomDuMC)
+        del ouChercher.entites[nomDuMC]
+        del self.dicoNouveauxMC[nomDuMC]
+
+
+    #-------------------------------------------------------------#
+    def ajoutDefinitionMC(self,etape,listeAvant,nomDuMC,typ,**args):
+    #-------------------------------------------------------------#
+        definitionEtape=getattr(self.jdc.cata[0],etape)
+        ouChercher=definitionEtape
+        for k in listeAvant : 
+            ouChercher=ouChercher.entites[k]
+        from Accas import A_SIMP
+        Nouveau=A_SIMP.SIMP(typ,**args)
+        Nouveau.pere=ouChercher
+        Nouveau.nom=nomDuMC
+        Nouveau.ordre_mc=[]
+        ouChercher.entites[nomDuMC]=Nouveau
+        ouChercher.ordre_mc.append(nomDuMC)
+        self.dicoNouveauxMC[nomDuMC]=('ajoutDefinitionMC',etape,listeAvant,nomDuMC,typ,args)
+        #print self.dicoNouveauxMC
+
+    #----------------------------------------------------#
+    def changeIntoMCandSet(self,etape,MCFils,into,valeurs):
+    #----------------------------------------------------#
+        monMC=etape.get_child(MCFils,restreint="oui")
+        if monMC== None : monMC= etape.addentite(MCFils)
+        monMC.definition.into=into
+        monMC.valeur=valeurs
+        monMC.val=valeurs
+        monMC.state='changed'
+        monMC.isvalid() 
 
     #-------------------------------------#
     def ajoutVersionCataDsJDC(self,txt):
@@ -1197,13 +1510,35 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
         return ligne
 
 
+    #---------------------------#
+    def _new_CF(self):
+    #---------------------------#
+        texte="CONDUITE_FORCEE();"
+        return texte
+
+
     #---------------------------#
     def _newTELEMAC(self):
     #---------------------------#
-        texte="INITIALIZATION();BOUNDARY_CONDITIONS();GENERAL_PARAMETERS();PHYSICAL_PARAMETERS();NUMERICAL_PARAMETERS();"
+        #texte="INITIALIZATION();BOUNDARY_CONDITIONS();GENERAL_PARAMETERS();PHYSICAL_PARAMETERS();NUMERICAL_PARAMETERS();"
+        texte="COMPUTATION_ENVIRONMENT();HYDRO();GENERAL_PARAMETERS();NUMERICAL_PARAMETERS()"
+        #texte="TRACERS();"
+        return texte
+
+    #---------------------------#
+    def _newPSEN(self):
+    #---------------------------#
+        texte="DIRECTORY() ; PSSE_PARAMETERS() ; SIMULATION() ; sansnom=DISTRIBUTION() ; sansnom=DISTRIBUTION() ; CORRELATION() ;"
         #texte=""
         return texte
 
+    #---------------------------#
+    def _newPSEN_N1(self):
+    #---------------------------#
+        texte="CASE_SELECTION();N_PROCESSING_OPTIONS();CONTINGENCY_OPTIONS();CONTINGENCY_SELECTION();\nCONTINGENCY_PROCESSING(); "
+        texte="CONTINGENCY_SELECTION();\nCONTINGENCY_PROCESSING(); "
+        return texte
+
     #---------------------------#
 
     #---------------------------#
@@ -1224,10 +1559,11 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
       QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
                         caption='Fichier Med',
                         filter=extensions)
-      self.fichierMED=str(QSfichier.toLatin1())
+      QSfichier=QSfichier[0]
+      self.fichierMED=QSfichier
       from acquiertGroupes import getGroupes
       erreur,self.listeGroupes,self.nomMaillage,self.dicoCoord=getGroupes(self.fichierMED)
-      if erreur != "" : print "a traiter"
+      if erreur != "" : print ("a traiter")
       texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
       texteSources=""
       texteCond=""
@@ -1253,10 +1589,10 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
     #---------------------------#
 
       QSfichier=self.openfile.selectedFiles()[0]
-      self.fichierMED=str(QSfichier.toLatin1())
+      self.fichierMED=str(QSfichier)
       from acquiertGroupes import getGroupes
       erreur,self.listeGroupes,self.nomMaillage=getGroupes(self.fichierMED)
-      if erreur != "" : print "a traiter"
+      if erreur != "" : print ("a traiter")
 
     #-----------------------------
     def BoutonSalomePressed(self):
@@ -1267,6 +1603,105 @@ class JDCEditor(Ui_baseWidget,QtGui.QWidget):
       self.openfile.close()
 
 
+    #-----------------------------------------
+    def initSplitterSizes(self, nbWidget=3):
+    #-----------------------------------------
+       #print ("je passe ds initSplitterSizes", nbWidget)
+
+       if   self.code in [ 'Adao', 'ADAO', ] : self.splitterSizes3=[1,1550,150]
+       elif self.code in [ 'MAP']            : self.splitterSizes3=[700,300]
+       else                                  : self.splitterSizes3=[150,1000,300]
+
+       if   self.code in [ 'Adao', 'ADAO', ] : self.splitterSizes2=[5,1500]
+       else                                  : self.splitterSizes2=[300,1000]
+
+
+
+    #-----------------------------------------
+    def restoreSplitterSizes(self,nbWidget=3):
+    #----------------------------------------
+      
+      #traceback.print_stack()
+      #print ("je passe ds restoreSplitterSizes")
+      if not(hasattr(self,'splitter')) : return
+      if nbWidget==2  : newSizes=self.splitterSizes2
+      if nbWidget==3  : newSizes=self.splitterSizes3
+      #self.inhibeSplitter = 1
+      self.splitter.setSizes(newSizes)
+      #self.inhibeSplitter = 0
+      QApplication.processEvents()
+      # seule la fentetre du milieu est necessaire
+      self.splitter.widget(1).resizeEvent=self.saveSplitterSizes
+   
+    #-----------------------------------------
+    def saveSplitterSizes(self,event):
+    #-----------------------------------------
+      #print ("je passe ds saveSplitterSizes")
+      if self.inhibeSplitter : return
+      if self.widgetOptionnel == None  : self.splitterSizes2 = self.splitter.sizes()[0:2]
+      else                             : self.splitterSizes3 = self.splitter.sizes()[0:3]
+
+    #------------------------
+    def fermeOptionnel(self):
+    #------------------------
+      if self.widgetOptionnel == None : return
+
+      self.inhibeSplitter=1
+      self.widgetOptionnel.setParent(None)
+      self.widgetOptionnel.close()
+      self.widgetOptionnel.deleteLater()
+      self.widgetOptionnel=None
+      self.inhibeSplitter=0
+      self.restoreSplitterSizes(2)
+
+    #------------------------
+    def ajoutOptionnel(self):
+    #------------------------
+      #if len(self.splitterSizes) == 2 : self.splitterSizes.append(self.oldSizeWidgetOptionnel)
+      #else : self.splitterSizes[2] = self.oldSizeWidgetOptionnel # ceinture pour les close bizarres
+      #self.splitterSizes[1] = self.splitterSizes[1] - self.splitterSizes[2]
+      
+      self.restoreSplitterSizes(3)
+
+
+    #------------------------
+    def fermeArbre(self):
+    #------------------------
+       #print (self.widgetTree)
+       self.oldWidgetTree=self.widgetTree
+       self.widgetTree.hide()
+       #self.widgetTree=None
+
+    #------------------------
+    def ouvreArbre(self):
+    #------------------------
+       #print ('je passe la')
+       #print (self.widgetTree)
+       #self.widgetTree=self.oldWidgetTree
+       self.widgetTree.show()
+       #self.restoreSplitterSizes(3)
+
+    #-----------------------------
+    def getTreeIndex(self,noeud):
+    #----------------------------
+      indexNoeud=-1
+      if noeud in noeud.treeParent.children :
+          indexNoeud=noeud.treeParent.children.index(noeud)
+      else :
+          if hasattr(noeud,'vraiParent') :
+              noeudVrai = noeud
+              noeudVraiParent = noeud.vraiParent
+              while noeudVraiParent != noeud.treeParent and hasattr(noeudVraiParent,'vraiParent') :
+                  noeudVrai = noeudVraiParent
+                  noeudVraiParent = noeudVraiParent.vraiParent
+                  pass
+              if noeudVraiParent == noeud.treeParent :
+                  indexNoeud=noeud.treeParent.children.index(noeudVrai)
+                  pass
+              pass
+          pass
+      return indexNoeud
+
 if __name__ == "__main__":
     self.code='ASTER'
     name='prefs_'+prefs.code