Salome HOME
synchronisation avec Yoann
[tools/eficas.git] / InterfaceQT4 / editor.py
index c5979b79933e025843ac902352ec46079a41d1c8..ed534c90ba357b6457e7fbfaff9e8e7ad7cdb3be 100755 (executable)
 #
 # 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 determine import monEnvQT5
-if monEnvQT5:
-    from PyQt5.QtWidgets import QWidget, QMessageBox, QFileDialog, QApplication, QSplitter
-    from PyQt5.QtGui import QPalette
-    from PyQt5.QtCore import QProcess, QFileInfo, QTimer, Qt, QDir, QSize
-else :
-    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
 
@@ -42,12 +47,12 @@ 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'}
 
     
 
@@ -78,15 +83,17 @@ class JDCEditor(Ui_baseWidget,QWidget):
         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.initSplitterSizes()
 
         #self.afficheListesPliees=False
         self.afficheListesPliees=True
@@ -96,7 +103,12 @@ class JDCEditor(Ui_baseWidget,QWidget):
         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.afficheOptionnelVide=self.appliEficas.CONFIGURATION.afficheOptionnelVide
+        self.nombreDeBoutonParLigne = self.appliEficas.CONFIGURATION.nombreDeBoutonParLigne
+        self.dicoImages = self.appliEficas.CONFIGURATION.dicoImages
+        self.simpleClic = self.appliEficas.CONFIGURATION.simpleClic
         #self.taille = self.appliEficas.taille
 
         #if self.code in ['MAP','CARMELCND','PSEN'] : self.afficheCommandesPliees=False
@@ -104,11 +116,11 @@ class JDCEditor(Ui_baseWidget,QWidget):
         if self.code in ['MAP',]:
            self.widgetTree.close()
            self.widgetTree=None
-
-      
+        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
@@ -126,6 +138,7 @@ class JDCEditor(Ui_baseWidget,QWidget):
         self.liste_simp_reel=[]
         self.ihm="QT"
         self.dicoNouveauxMC={}
+        self.dicoNouveauxFact={}
 
         nameConf='configuration_'+self.code
         configuration=__import__(nameConf)
@@ -179,12 +192,10 @@ class JDCEditor(Ui_baseWidget,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"
+               except :
+                   print ("mauvaise lecture")
             else :
                self.jdc=jdc
             if self.jdc is not None and units is not None:
@@ -232,6 +243,7 @@ class JDCEditor(Ui_baseWidget,QWidget):
     #-------------------#  Pour execution avec output et error dans le bash
     def runPSEN(self):
     #-------------------#
+    
       #if self.modified or self.fichier==None  : self.saveFile()
       self.saveFile()
         
@@ -241,8 +253,8 @@ class JDCEditor(Ui_baseWidget,QWidget):
       import subprocess
       p = subprocess.Popen(['python',WrapperFilePath])
       (out,err)=p.communicate()        
-      print out
-      print err
+      print (out)
+      print (err)
 
     #-------------------#  Pour execution avec output et error dans le bash
     def runPSEN_N1(self):
@@ -255,7 +267,7 @@ class JDCEditor(Ui_baseWidget,QWidget):
 
       if not(self.jdc.isvalid()):
          QMessageBox.information( self, tr( "Unvalid JDC"),tr("incorrect keywords will be ignored"))
-      if generator.plugins.has_key('dicoImbrique'):
+      if 'dicoImbrique' in generator.plugins:
          self.generator=generator.plugins['dicoImbrique']()
          jdc_formate=self.generator.gener(self.jdc)
          dico=self.generator.Dico 
@@ -263,13 +275,13 @@ class JDCEditor(Ui_baseWidget,QWidget):
          ###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), 'wb')
+         f = open( str(fileDico), 'w')
          f.write("Dico =" + str(dico) )
          f.close()
          ###
          
       
-      print 'in runPSEN_N1', dico
+      #print ('in runPSEN_N1', dico)
       from Run import run 
       run(dico)
       #res,txt_exception=run(dico)
@@ -284,15 +296,14 @@ class JDCEditor(Ui_baseWidget,QWidget):
       sys.path.append(path1)
 
 
-      if generator.plugins.has_key('dicoImbrique'):
+      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'].keys():
-             print k
-
+         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)+"'"
@@ -301,7 +312,7 @@ class JDCEditor(Ui_baseWidget,QWidget):
 
          ###to delete
          fileDico =  os.path.join(path1, 'dicoN1_process.py')
-         f = open( str(fileDico), 'wb')
+         f = open( str(fileDico), 'w')
          f.write("Dico =" + str(dico) )
          f.close()
          ###
@@ -309,6 +320,28 @@ class JDCEditor(Ui_baseWidget,QWidget):
 
         #return self.get_Dico()
 
+    #-------------------#  Pour execution avec output et error dans le bash
+    def process_VP(self):
+    #-------------------#
+      if 'dicoImbrique' in generator.plugins:
+         self.generator=generator.plugins['dicoImbrique']()
+         jdc_formate=self.generator.gener(self.jdc)
+         dico=self.get_Dico() #generator.Dico
+         return dico
+
+   
+    #--------------------------------#
+    def ajoutCommentaire(self):
+    #--------------------------------#
+        if self.tree.selectedItems()==[] :
+          QMessageBox.warning( self, tr("Pas de noeud selectionne"),tr("Selectionnez un Noeud \nLe commentaire sera place apres le noeud selectionne"))
+          return 
+        noeudAvantCommentaire=self.tree.selectedItems()[0]
+        if noeudAvantCommentaire ==self.tree.racine : 
+            self.tree.racine.append_child("COMMENTAIRE",pos=0)
+            return
+        noeudAvantCommentaire.addComment(True)
+        
 
 
     #--------------------------------#
@@ -324,8 +357,11 @@ class JDCEditor(Ui_baseWidget,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"    : 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
        
@@ -382,7 +418,7 @@ class JDCEditor(Ui_baseWidget,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
@@ -390,7 +426,7 @@ class JDCEditor(Ui_baseWidget,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]()
@@ -442,7 +478,7 @@ class JDCEditor(Ui_baseWidget,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)
@@ -484,12 +520,8 @@ class JDCEditor(Ui_baseWidget,QWidget):
         f=open(nomFichier,'w')
         f.write(txt)
         f.close()
-        if monEnvQT5 :
-           self.monExe.readyReadStandardOutput.connect( self.readFromStdOut)
-           self.monExe.readyReadStandardError.connect( self.readFromStdErr)
-        else :
-           self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOutQT4 )
-           self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErrQT4 )
+        self.monExe.readyReadStandardOutput.connect( self.readFromStdOut)
+        self.monExe.readyReadStandardError.connect( self.readFromStdErr)
         exe='sh ' + nomFichier
         self.monExe.start(exe)
         self.monExe.closeWriteChannel()
@@ -502,11 +534,11 @@ class JDCEditor(Ui_baseWidget,QWidget):
 
     def readFromStdErr(self):
         a=self.monExe.readAllStandardError()
-        self.w.view.append(str(a.data(),len(a)))
+        self.w.view.append(str(a.data()))
 
-    def readFromStdErr(self) :
+    def readFromStdOut(self) :
         a=self.monExe.readAllStandardOutput()
-        self.w.view.append(str(a.data(),len(a)))
+        self.w.view.append(str(a.data()))
 
     def readFromStdErrQT4(self):
         a=self.monExe.readAllStandardError()
@@ -516,7 +548,14 @@ class JDCEditor(Ui_baseWidget,QWidget):
         a=self.monExe.readAllStandardOutput()
         self.w.view.append(QString.fromUtf8(a.data(),len(a))) ;
         
-
+    #-----------------------#
+    def generDico(self):
+    #-----------------------#
+       if 'dico' in generator.plugins:
+         self.generator=generator.plugins['dico']()
+         jdc_formate=self.generator.gener(self.jdc)
+         dico=self.generator.Dico
+         return dico
 
     #-----------------------#
     def gestionParam(self):
@@ -527,6 +566,7 @@ class JDCEditor(Ui_baseWidget,QWidget):
     #-----------------------#
     def viewJdcSource(self):
     #-----------------------#
+        if self.fichier == None : return
         f=open(self.fichier,'r')
         texteSource=f.read()
         f.close()
@@ -541,7 +581,7 @@ class JDCEditor(Ui_baseWidget,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")
@@ -622,7 +662,7 @@ class JDCEditor(Ui_baseWidget,QWidget):
     #---------------------#
     def handleRechercher(self):
     #---------------------#
-      from monRecherche import DRecherche
+      from .monRecherche import DRecherche
       monRechercheDialg=DRecherche(parent=self,fl=0)
       monRechercheDialg.show()
 
@@ -630,7 +670,7 @@ class JDCEditor(Ui_baseWidget,QWidget):
     #--------------------------------#
     def handleRechercherDsCatalogue(self):
     #-----------------------------#
-      from monRechercheCatalogue import DRechercheCatalogue
+      from .monRechercheCatalogue import DRechercheCatalogue
       monRechercheDialg=DRechercheCatalogue(self.QWParent,self)
       monRechercheDialg.show()
 
@@ -696,34 +736,23 @@ class JDCEditor(Ui_baseWidget,QWidget):
                       tr("Copie impossible"),
                       tr("Veuillez selectionner un seul objet : la copie se fera apres le noeud selectionne"))
           return
+      noeudOuColler=self.node_selected[0]
 
       if len(self.QWParent.noeud_a_editer)!=1:
-         self.handleEditPasteMultiple()
+         #self.handleEditPasteMultiple()
+         QMessageBox.information( self, tr("Copie impossible"), tr("Aucun Objet n a ete copie ou coupe"))
          return
 
-      noeudOuColler=self.node_selected[0]
-      pos='after'
-      if noeudOuColler == self.tree.racine:
-         indexNoeudOuColler=0
-         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
+      noeudACopier=self.QWParent.noeud_a_editer[0]
 
       if (self.QWParent.edit != "couper"):
+        #print   (noeudOuColler.item.parent.get_child(noeudOuColler.item.nom)) 
         try:
            if noeudOuColler == self.tree.racine :
                child=noeudOuColler.doPastePremier(noeudACopier)
            else :
-               child=noeudACopier.doPaste(noeudOuColler,pos)
+               child=noeudACopier.doPaste(noeudOuColler,'after')
+
            if child==None or child==0:
                QMessageBox.critical( self,tr( "Copie refusee"),tr('Eficas n a pas reussi a copier l objet'))
                self.message = ''
@@ -749,6 +778,7 @@ class JDCEditor(Ui_baseWidget,QWidget):
       # si possible on renomme l objet comme le noeud couper
 
       if (self.QWParent.edit == "couper"):
+         print ('je pass la')
          if noeudACopier.treeParent.editor != noeudOuColler.treeParent.editor:
            QMessageBox.critical( self, tr("Deplacement refuse"),tr('Deplacement refuse entre 2 fichiers. Seule la copie est autorisee '))
 
@@ -868,7 +898,7 @@ class JDCEditor(Ui_baseWidget,QWidget):
         @return flag indicating success
         """
 
-        fn = unicode(fn)
+        fn = six.text_type(fn)
        
         if txt == None :
             txt = self.get_text_JDC(self.format,formatLigne=formatLigne)
@@ -881,32 +911,36 @@ class JDCEditor(Ui_baseWidget,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:
+        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
+                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,appli=self.appliEficas)
             if pourRun : jdc_formate=self.generator.textePourRun
-         except ValueError,e:
+            if self.code == 'TELEMAC' : jdc_formate=self.generator.texteDico
+         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"))
@@ -922,7 +956,7 @@ class JDCEditor(Ui_baseWidget,QWidget):
     #----------------------#
     def get_Dico(self):
     #---------------------#
-      if generator.plugins.has_key('dicoImbrique'):
+      if 'dicoImbrique' in generator.plugins:
          self.generator=generator.plugins['dicoImbrique']()
          jdc_formate=self.generator.gener(self.jdc)
          dico=self.generator.Dico 
@@ -938,13 +972,13 @@ class JDCEditor(Ui_baseWidget,QWidget):
     #------------#
       fonction="run"+self.code
       #print fonction
-      if fonction in JDCEditor.__dict__.keys(): apply(JDCEditor.__dict__[fonction],(self,))
+      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):
@@ -983,8 +1017,8 @@ class JDCEditor(Ui_baseWidget,QWidget):
           #   os.system(commande)
           #except :
           #   pass
-      except Exception, e:
-          print traceback.print_exc()
+      except Exception as e:
+          print((traceback.print_exc()))
 
     #-------------------#
     def runZCRACKS(self):
@@ -1004,8 +1038,8 @@ class JDCEditor(Ui_baseWidget,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):
@@ -1028,10 +1062,6 @@ class JDCEditor(Ui_baseWidget,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):
@@ -1039,13 +1069,13 @@ class JDCEditor(Ui_baseWidget,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= tr(chaine1+ "All Files (*)")
       else :
@@ -1059,26 +1089,19 @@ class JDCEditor(Ui_baseWidget,QWidget):
              extensions,None,
              QFileDialog.DontConfirmOverwrite)
       if fn == None : return (0, None)
-      if monEnvQT5 :  fn=fn[0]
+      fn=fn[0]
       if fn=='': return (0, None)
 
       ext = QFileInfo(fn).suffix()
       if ext == '': fn+=extension
 
       if QFileInfo(fn).exists():
-           if monEnvQT5 :
-             msgBox = QMessageBox(self)
-             msgBox.setWindowTitle(tr("Sauvegarde du Fichier"))
-             msgBox.setText(tr("Le fichier <b>%s</b> existe deja.", unicode(fn)))
-             msgBox.addButton(tr("&Ecraser"),0)
-             msgBox.addButton(tr("&Abandonner"),1)
-             abort=msgBox.exec_()
-           else :
-             abort = QMessageBox.warning(self,
-                   tr("Sauvegarde du Fichier"),
-                   tr("Le fichier <b>%s</b> existe deja.",str(fn)),
-                   tr("&Ecraser"),
-                   tr("&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)
 
@@ -1119,19 +1142,13 @@ class JDCEditor(Ui_baseWidget,QWidget):
                for b in c.children():
                   if isinstance(b,QPushButton):
                      avant=b.text()
-                     if (not monEnvQT5) and avant.toLatin1()=="&Open": b.setText("Save")
-                     if monEnvQT5 and avant=="&Open": b.setText("Save")
-        if monEnvQT5 :
-           mesFiltres= "input Map (*.input);;All Files (*)"
-        else :
-           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
-        if monEnvQT5 : fn=str(monDialog.selectedFiles()[0])
-        else : fn=str(monDialog.selectedFiles()[0].toLatin1())
+        fn=str(monDialog.selectedFiles()[0])
         if fn == "" or fn == None : return
         if not fn.endswith(".input"):
             fn += ".input"
@@ -1150,36 +1167,8 @@ class JDCEditor(Ui_baseWidget,QWidget):
     #-----------------#
     def saveRunPSEN(self):
     #-----------------#
-        print "saveRunPSEN"
+        #print ("saveRunPSEN")
         self.saveFile()
-        return
-        if not(self.jdc.isvalid()):
-           QMessageBox.critical( self, tr( "Sauvegarde de l'input impossible "),
-                                tr("Un JdC valide est necessaire pour creer un .input")
-                                 )
-           return
-
-        #print generator.plugins.has_key(self.format)
-        if generator.plugins.has_key(self.format):
-             # Le generateur existe on l'utilise
-             self.generator=generator.plugins[self.format]()
-             try :
-                self.generator.gener(self.jdc)
-                self.generator.writeDefault('')
-             except ValueError,e:
-                QMessageBox.critical(self, tr("Erreur a la generation"),str(e))
-             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"))
-                return ""
-        else:
-             # Il n'existe pas c'est une erreur
-             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 ""
-        #print "HELLO"
-        
-
 
 
     #-----------------------------------------#
@@ -1193,7 +1182,7 @@ class JDCEditor(Ui_baseWidget,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)
@@ -1215,6 +1204,44 @@ class JDCEditor(Ui_baseWidget,QWidget):
         #else :
            pass
 
+    #-----------------------------------------------------------------#
+    def saveFileLegerAs(self, fileName = None) :
+    #-----------------------------------------------------------------#
+        if fileName != None :
+           self.fichier = fileName
+           return self.saveFileLeger()
+        return self.saveFileLeger()
+
+    #-----------------------------------------------------------------#
+    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"):
     #-----------------------------------------------------------------#
@@ -1230,8 +1257,7 @@ class JDCEditor(Ui_baseWidget,QWidget):
         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'
@@ -1245,9 +1271,9 @@ class JDCEditor(Ui_baseWidget,QWidget):
           if fn == None : 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.toNativeSeparators(fn))
+          fn = six.text_type(QDir.toNativeSeparators(fn))
           newName = fn
 
 
@@ -1328,9 +1354,9 @@ class JDCEditor(Ui_baseWidget,QWidget):
         # ce retour est impose par le get_file d'I_JDC
         if fn== '' : return None," "
         if not fn : return (0, " ")
-        if monEnvQT5 :  fn=fn[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
@@ -1343,24 +1369,37 @@ class JDCEditor(Ui_baseWidget,QWidget):
             jdcText = ''
         return ulfile, jdcText
 
-    #-------------------------------#
+    #-----------------------------------#
     def updateJdc(self, itemApres,texte):
-    #--------------------------------#
+    #------------------------------------#
+    # ajoute une etape  de JdC a partir d un texte
         monItem=itemApres
         etape=monItem.item.object
-
         CONTEXT.set_current_step(etape)
         etape.build_includeInclude(texte)
         self.tree.racine.build_children()
 
+    #-----------------------------------#
+    def updateJdcEtape(self, itemApres,texte):
+    #------------------------------------#
+    # ajoute une etape  de JdC a partir d un texte
+        monItem=itemApres
+        etape=monItem.item.object
+        CONTEXT.set_current_step(etape)
+        etape.build_includeEtape(texte)
+        self.tree.racine.build_children()
+
+
     #-------------------------------------#
     def deleteEtape(self,etape):
     #-------------------------------------#
+    # dans le JDC
         self.jdc.suppentite(etape)
 
     #-------------------------------------#
     def deleteMC(self,etape,MCFils,listeAvant=()):
     #-------------------------------------#
+    # dans le JDC
         ouChercher=etape
         for mot in listeAvant :
               ouChercher=ouChercher.get_child(mot,restreint="oui")
@@ -1372,6 +1411,7 @@ class JDCEditor(Ui_baseWidget,QWidget):
     #-------------------------------------#
     def ajoutMC(self,etape,MCFils,valeurs,listeAvant=()):
     #-------------------------------------#
+    # dans le JDC
         ouChercher=etape
         for mot in listeAvant :
               ouChercher=ouChercher.get_child(mot,restreint="oui")
@@ -1382,36 +1422,157 @@ class JDCEditor(Ui_baseWidget,QWidget):
         monMC.state='changed'
         monMC.isvalid()
 
+    #----------------------------------------------#
+    def ajoutMCFact(self,etape,MCFils,listeAvant=()):
+    #----------------------------------------------#
+    # dans le JDC
+        print ('ajoutMCFact')
+        ouChercher=etape
+        print (ouChercher)
+        for mot in listeAvant :
+              ouChercher=ouChercher.get_child(mot,restreint="oui")
+              print (mot)
+              print (ouChercher)
+        monMC=etape.get_child(ouChercher,restreint="oui")
+        if monMC== None : monMC= ouChercher.addentite(MCFils)
+        monMC.isvalid()
+
+    #-------------------------------------#
+    def getValeur(self,nomEtape,MCFils,listeAvant=()):
+    #-------------------------------------#
+    # dans le JDC
+
+        ouChercher=None
+        for e in self.jdc.etapes:
+            if e.nom == nomEtape : ouChercher=e; break
+        if ouChercher==None : return None
+        for mot in listeAvant :
+              ouChercher=ouChercher.get_child(mot,restreint="oui")
+              #print (mot, ouChercher)
+              if ouChercher==None : return None
+        monMC=ouChercher.get_child(MCFils,restreint="oui")
+        if monMC== None : return None
+        return monMC.valeur
+
+    #-----------------------------------------------------------#
+    def setValeur(self,nomEtape,MCFils,valeur,listeAvant=()):
+    #--------------------------------------------------------#
+    # dans le JDC
+
+        ouChercher=None
+        for e in self.jdc.etapes:
+            if e.nom == nomEtape : ouChercher=e; break
+        if ouChercher==None : return None
+        for mot in listeAvant :
+              ouChercher=ouChercher.get_child(mot,restreint="oui")
+              #print (mot, ouChercher)
+              if ouChercher==None : return None
+        monMC=ouChercher.get_child(MCFils,restreint="oui")
+        monMC.set_valeur(valeur)
+        monMC.isvalid()
+
     #-----------------------------------------------------------#
     def changeIntoMC(self,etape,MCFils,valeurs, listeAvant=()):
     #-----------------------------------------------------------#
+    # dans le JDC
         ouChercher=etape
+        if isinstance (etape, str):
+           ouChercher=None
+           for e in self.jdc.etapes:
+              if e.nom == etape : ouChercher=e; break
+        if ouChercher==None : return
         for mot in listeAvant :
               ouChercher=ouChercher.get_child(mot,restreint="oui")
-        if ouChercher ==None : print 'SOUCI'; return
+              if ouChercher==None : return 
         monMC=ouChercher.get_child(MCFils,restreint="oui")
         if monMC== None : monMC= ouChercher.addentite(MCFils)
+
         monMC.definition.into=valeurs
+        from Noyau.N_VALIDATOR import  IntoProtocol
+        monMC.definition.intoProto = IntoProtocol("into", into=monMC.definition.into, val_min=monMC.definition.val_min, val_max=monMC.definition.val_max)
         monMC.state='changed'
         monMC.isvalid()
 
+    #-------------------------------------------------------------------#
+    def reCalculeValiditeMCApresChgtInto(self,nomEtape,MCFils,listeAvant=()):
+    #-------------------------------------------------------------------#
+    # dans le JDC
+        for e in self.jdc.etapes:
+            if e.nom == nomEtape : ouChercher=e; break
+        
+        for mot in listeAvant :
+            try :
+              ouChercher=ouChercher.get_child(mot,restreint="oui")
+            # Le mot clef n est pas la
+            except : return 0
+        try :
+           monMC=ouChercher.get_child(MCFils,restreint="oui")
+        # Le mot clef n est pas la
+        except : return 0
+        if monMC == None : return 0
+
+        if hasattr(monMC.definition,'into') :
+           if type(monMC.definition.into) ==types.FunctionType : maListeDeValeur=monMC.definition.into()
+           else : maListeDeValeur=monMC.definition.into
+        else :
+           return 0
+        
+        monMC.state='changed'
+        return 1
+
     #-------------------------------------#
-    def changeIntoDefMC(self,etape,listeMC,valeurs):
+    def changeDefautDefMC(self,nomEtape,listeMC,valeurs):
     #-------------------------------------#
-        definitionEtape=getattr(self.jdc.cata[0],etape)
+    # dans le MDD
+
+        #if isinstance (etape, str):
+        #  for e in self.jdc.etapes:
+        #    if e.nom == etape : etape=e; break
+        #if etape == None : return
+        definitionEtape=getattr(self.jdc.cata[0],nomEtape)
         ouChercher=definitionEtape
         if len(listeMC) > 1 :
+
            for mc in listeMC[0:-1]:
              mcfact=ouChercher.entites[mc]
              ouChercher=mcfact
            
         mcAccas=ouChercher.entites[listeMC[-1]]
+        mcAccas.defaut=valeurs
+        return 1
+
+    #------------------------------------------------#
+    def changeIntoDefMC(self,nomEtape,listeMC,valeurs):
+    #------------------------------------------------#
+    # dans le MDD
+        definitionEtape=getattr(self.jdc.cata[0],nomEtape)
+        ouChercher=definitionEtape
+
+        if len(listeMC) > 1 :
+           for mc in listeMC[0:-1]:
+             mcfact=ouChercher.entites[mc]
+             ouChercher=mcfact
+        mcAccas=ouChercher.entites[listeMC[-1]]
+
+        if hasattr(mcAccas,'into') : oldValeurs=mcAccas.into
+        else : oldValeurs=None
+        if oldValeurs==valeurs : return 0
+
         mcAccas.into=valeurs
+        from Noyau.N_VALIDATOR import  IntoProtocol
+        mcAccas.intoProto = IntoProtocol("into", into=valeurs, val_min=mcAccas.val_min, val_max=mcAccas.val_max)
+        return 1
 
     #-------------------------------------------------------------#
     def deleteDefinitionMC(self,etape,listeAvant,nomDuMC):
     #-------------------------------------------------------------#
+    # dans le MDD
         #print 'in deleteDefinitionMC', etape,listeAvant,nomDuMC
+        if isinstance (etape, str):
+          for e in self.jdc.etapes:
+            if e.nom == etape : etape=e; break
+        if etape == None : return
         definitionEtape=getattr(self.jdc.cata[0],etape)
         ouChercher=definitionEtape
         for k in listeAvant : 
@@ -1423,9 +1584,10 @@ class JDCEditor(Ui_baseWidget,QWidget):
 
 
     #-------------------------------------------------------------#
-    def ajoutDefinitionMC(self,etape,listeAvant,nomDuMC,typ,**args):
+    def ajoutDefinitionMC(self,nomEtape,listeAvant,nomDuMC,typ,**args):
     #-------------------------------------------------------------#
-        definitionEtape=getattr(self.jdc.cata[0],etape)
+    # dans le MDD
+        definitionEtape=getattr(self.jdc.cata[0],nomEtape)
         ouChercher=definitionEtape
         for k in listeAvant : 
             ouChercher=ouChercher.entites[k]
@@ -1433,17 +1595,62 @@ class JDCEditor(Ui_baseWidget,QWidget):
         Nouveau=A_SIMP.SIMP(typ,**args)
         Nouveau.pere=ouChercher
         Nouveau.nom=nomDuMC
-        Nouveau.ordre_mc=[]
+        #Nouveau.ordre_mc=[]
         ouChercher.entites[nomDuMC]=Nouveau
         ouChercher.ordre_mc.append(nomDuMC)
-        self.dicoNouveauxMC[nomDuMC]=('ajoutDefinitionMC',etape,listeAvant,nomDuMC,typ,args)
+        self.dicoNouveauxMC[nomDuMC]=('ajoutDefinitionMC',nomEtape,listeAvant,nomDuMC,typ,args)
+        #print self.dicoNouveauxMC
+
+    #---------------------------------------------------------------------#
+    def ajoutDefinitionMCFact(self,nomEtape,listeAvant,nomDuMC,listeMC,**args):
+    #---------------------------------------------------------------------#
+    # dans le MDD
+        print ('ajoutDefinitionMCFact', nomDuMC)
+        definitionEtape=getattr(self.jdc.cata[0],nomEtape)
+        ouChercher=definitionEtape
+        for k in listeAvant : 
+            ouChercher=ouChercher.entites[k]
+        from Accas import A_SIMP
+        for mc in listeMC :
+            nomMC=mc[0]
+            typMC=mc[1]
+            argsMC=mc[2]
+            nouveauMC=A_SIMP.SIMP(typMC,**argsMC)
+            nouveauMC.nom=nomMC
+            args[nomMC]=nouveauMC
+        from Accas import A_FACT
+        nouveauFact=A_FACT.FACT(**args)
+        nouveauFact.pere=ouChercher
+        nouveauFact.nom=nomDuMC
+        from Editeur.autre_analyse_cata import traite_entite
+        traite_entite(nouveauFact,[])
+        ouChercher.entites[nomDuMC]=nouveauFact
+        ouChercher.ordre_mc.append(nomDuMC)
+        self.dicoNouveauxFact[nomDuMC]=('ajoutDefinitionMC',nomEtape,listeAvant,nomDuMC,listeMC,args)
         #print self.dicoNouveauxMC
 
     #----------------------------------------------------#
-    def changeIntoMCandSet(self,etape,MCFils,into,valeurs):
+
+    #----------------------------------------------------#
+    def changeIntoMCandSet(self,etape,listeMC,into,valeurs):
     #----------------------------------------------------#
-        monMC=etape.get_child(MCFils,restreint="oui")
+    # dans le MDD et le JDC
+
+        self.changeIntoDefMC(etape,listeMC,into)
+
+        if isinstance (etape, str):
+          for e in self.jdc.etapes:
+            if e.nom == etape : etape=e; break
+        if etape == None : return
+
+        ouChercher = etape
+        for mot in listeMC[:-1] :
+            ouChercher=ouChercher.get_child(mot,restreint="oui")
+            if ouChercher==None : return 
+        MCFils=listeMC[-1]
+        monMC=ouChercher.get_child(MCFils,restreint="oui")
         if monMC== None : monMC= etape.addentite(MCFils)
+
         monMC.definition.into=into
         monMC.valeur=valeurs
         monMC.val=valeurs
@@ -1565,11 +1772,11 @@ class JDCEditor(Ui_baseWidget,QWidget):
       QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
                         caption='Fichier Med',
                         filter=extensions)
-      if monEnvQT5 : QSfichier=QSfichier[0]
+      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=""
@@ -1598,7 +1805,7 @@ class JDCEditor(Ui_baseWidget,QWidget):
       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):
@@ -1612,37 +1819,40 @@ class JDCEditor(Ui_baseWidget,QWidget):
     #-----------------------------------------
     def initSplitterSizes(self, nbWidget=3):
     #-----------------------------------------
-       #print "je passe ds initSplitterSizes"
-       if nbWidget==3 :
-          if   self.code in [ 'Adao', 'ADAO', ] : self.splitterSizes=[1,1550,150]
-          elif self.code in [ 'MAP']            : self.splitterSizes=[700,300]
-          else                                  : self.splitterSizes=[150,800,500]
-          self.oldSizeWidgetOptionnel = 30
-       if nbWidget==2 :
-          if   self.code in [ 'Adao', 'ADAO', ] : self.splitterSizes=[5,1500]
-          else                                  : self.splitterSizes=[300,1000]
-          self.oldSizeWidgetOptionnel = 30
-       self.splitter.setSizes(self.splitterSizes)
+       #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):
     #----------------------------------------
-      #self.inhibeSplitter = 1
       
-      #print 'ds restoreSplitterSizes'
-      #print self.splitterSizes
+      #traceback.print_stack()
+      #print ("je passe ds restoreSplitterSizes")
       if not(hasattr(self,'splitter')) : return
-      if nbWidget==2 and len(self.splitterSizes) == 3 :
-         self.splitterSizes[1]+=self.splitterSizes[2]
-      newSizes=self.splitterSizes[:nbWidget]
+      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):
-      self.splitterSizes= self.splitter.sizes()
+    #-----------------------------------------
+      #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):
@@ -1650,27 +1860,40 @@ class JDCEditor(Ui_baseWidget,QWidget):
       if self.widgetOptionnel == None : return
 
       self.inhibeSplitter=1
-      self.splitterSizes[1] = self.splitterSizes[1] + self.splitterSizes[2]
-      if self.splitterSizes[2]!=0 : self.oldSizeWidgetOptionnel = self.splitterSizes[2]
-      self.splitterSizes[2]=0
-
       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
+      #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):
     #----------------------------