]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
permet d obrenir editorSsIhm
authorpascale.noyret <pascale.noyret@edf.fr>
Thu, 24 Jun 2021 13:21:52 +0000 (15:21 +0200)
committerpascale.noyret <pascale.noyret@edf.fr>
Thu, 24 Jun 2021 13:21:52 +0000 (15:21 +0200)
Efi2Xsd/AccasXsd.py [new file with mode: 0755]
Efi2Xsd/MCAccasXML.py [new file with mode: 0755]
Efi2Xsd/balisesXSD.py [new file with mode: 0644]
Efi2Xsd/mapDesTypes.py [new file with mode: 0755]
InterfaceSsIhm/.qtEficasSsIhm.py.swp [deleted file]
InterfaceSsIhm/configuration.py [new file with mode: 0644]
InterfaceSsIhm/editorSsIhm.py [changed mode: 0644->0755]
InterfaceSsIhm/eficas_go.py
InterfaceSsIhm/qtEficasSsIhm.py
InterfaceSsIhm/viewManagerSsIhm.py
editorSsIhm.py [new file with mode: 0755]

diff --git a/Efi2Xsd/AccasXsd.py b/Efi2Xsd/AccasXsd.py
new file mode 100755 (executable)
index 0000000..0f63f0d
--- /dev/null
@@ -0,0 +1,1485 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2021   EDF R&D
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+
+import sys,os
+import types
+import Accas
+import imp
+from copy import deepcopy, copy
+import traceback
+
+# CONTEXT est accessible (__init__.py de Noyau)
+
+#import raw.efficas as efficas
+sys.path.insert(0,os.path.abspath(os.path.join(os.getcwd(),'..')))
+
+# ds l init du SIMP il manque siValide et fenetreIhm
+
+from .mapDesTypes import dictSIMPEficasXML, dictSIMPXMLEficas
+from .mapDesTypes import dictFACTEficasXML, dictFACTXMLEficas
+from .mapDesTypes import dictPROCEficasXML, dictPROCXMLEficas
+from .mapDesTypes import dictOPEREficasXML, dictOPERXMLEficas
+from .mapDesTypes import dictBLOCEficasXML, dictBLOCXMLEficas
+from .mapDesTypes import dictPourCast, dictNomsDesTypes
+from .mapDesTypes import listeParamDeTypeTypeAttendu, listeParamDeTypeStr, dictPourCast
+from .mapDesTypes import listeParamTjsSequence, listeParamSelonType
+from .mapDesTypes import Tuple
+
+PourTraduction = False
+
+from .balisesXSD import *
+
+# -----------------
+class X_definition:
+# -----------------
+    def adjoint(self, liste1, liste2):
+        #print ('adjoint', liste1, liste2)
+        l=[]
+        for elt1 in liste1:
+            for elt2 in liste2:
+                newListe=deepcopy(elt1)
+                if  elt2 != []: newListe.append(elt2)
+                l.append(newListe)
+        return l
+
+    def adjointUnMot(self, liste1, mot):
+        l=[]
+        for elt1 in liste1:
+            newListe=deepcopy(elt1)
+            newListe.append(mot)
+            l.append(newListe)
+        return l
+
+    def remplaceListeParContenuEtVide(self, liste1, liste2):
+        listeFinale=[]
+        for elt1 in liste1 :
+            for eltListe in liste2:
+                newListe=deepcopy(elt1)
+                if eltListe!=[] :newListe+=eltListe
+                if newListe not in listeFinale : listeFinale.append(newListe)
+        return listeFinale
+
+
+    def fusionne2Listes(self, liste1, liste2):
+        #print ('fusionne2Liste', liste1, liste2)
+        listeFinale=[]
+        for elt1 in liste1 :
+            for eltListe in liste2:
+                newListe=deepcopy(elt1)
+                if eltListe!=[] :newListe.append(eltListe)
+                listeFinale.append(newListe)
+        #print (listeFinale)
+        return listeFinale
+
+    def getNomDuCodeDumpe(self):
+        if hasattr(self,'nomDuCodeDumpe') : return
+        obj=self
+        while ( not hasattr(obj,'nomDuCodeDumpe') ): obj=obj.pere
+        self.nomDuCodeDumpe = obj.nomDuCodeDumpe
+        self.code=obj.code
+
+    def getXPathComplet(self):
+        obj=self
+        textePath='/'+self.code+":"+self.nom
+        while ( hasattr(obj,'pere') ):
+            obj=obj.pere
+            if isinstance(obj, X_BLOC) : continue
+            textePath= '/'+ self.code + ":" + obj.nom + textePath
+        textePath='.' + textePath
+        return textePath
+
+    def getXPathSansSelf(self):
+        obj=self
+        textePath=''
+        while ( hasattr(obj,'pere') ):
+            obj=obj.pere
+            if isinstance(obj, X_BLOC) : continue
+            textePath=  self.code + ":" + obj.nom + '/' + textePath
+        textePath='./'+ self.code + ":" + textePath
+        return textePath
+
+    def getNomCompletAvecBloc(self):
+        obj=self
+        texteNom=self.nom
+        while ( hasattr(obj,'pere') ):
+            texteNom=obj.pere.nom+'_'+texteNom
+            obj=obj.pere
+        return texteNom
+
+    def metAJourPyxb(self,nomDuTypePyxb) :
+        self.aCreer=False
+        self.nomDuTypePyxb=nomDuTypePyxb
+        cata = CONTEXT.getCurrentCata()
+        nom='T_'+self.nom
+        if (hasattr (self, 'nomXML')) and self.nomXML != None : nom='T_'+self.nomXML
+        if not (nom in cata.dictTypesXSD.keys()) :
+            cata.dictTypesXSD[nom] = [self,]
+        else :
+            cata.dictTypesXSD[nom].append(self)
+
+    def definitNomDuTypePyxb(self,forceACreer=False,debug=False):
+        #if self.nom == 'SubgridScaleModel' : debug=True
+        #print ('definitNomDuTypePyxb', self, self.nom,self.nomComplet(),forceACreer)
+        #PNPN
+        if hasattr(self,'nomDuTypePyxb') : self.aCreer = False; return self.nomDuTypePyxb
+        #debug=False
+        if debug : print ('definitNomDuTypePyxb traitement pour ',  self.nom)
+        self.aCreer = True
+        cata = CONTEXT.getCurrentCata()
+        nom='T_'+self.nom
+        if (hasattr (self, 'nomXML')) and self.nomXML != None : nom='T_'+self.nomXML
+        if not (nom in cata.dictTypesXSD.keys()) :
+            if debug : print ('definitNomDuTypePyxb encore jamais traite ',  self.nom , ' a pour type' , nom)
+            cata.dictTypesXSD[nom] = [self,]
+            self.nomDuTypePyxb=nom
+            return nom
+
+        if nom == 'T_Consigne' : return nom
+
+        if not forceACreer :
+            self.aCreer = False
+            listePossible=cata.dictTypesXSD[nom]
+            indice=0
+            while (indice < len(listePossible)) :
+                objAComparer=listePossible[indice]
+                if debug : print (self.compare)
+                if self.compare(objAComparer) :
+                    self.nomDuTypePyxb=objAComparer.nomDuTypePyxb
+                    if debug : print (self, objAComparer)
+                    if debug : print (type(self), type(objAComparer))
+                    if debug : print ('definitNomDuTypePyxb',  self.nom , 'type identique', objAComparer.nomDuTypePyxb )
+                # c est nul pour la comparaison mais cela permet d etre ok dans le dictionnaire passe a Accas
+                    cata.dictTypesXSD[nom].append(self)
+                    if self.label != 'SIMP' :
+                        if objAComparer not in list(cata.dictTypesXSDJumeaux.keys()) : cata.dictTypesXSDJumeaux[objAComparer]=[self,]
+                        else : cata.dictTypesXSDJumeaux[objAComparer].append(self)
+                    return objAComparer.nomDuTypePyxb
+                indice += 1
+        self.aCreer = True
+        cata.dictTypesXSD[nom].append(self)
+        nomAlter='T_'+self.nom+'_'+str(indice)
+        if (hasattr (self, 'nomXML')) and self.nomXML != None :
+            nomAlter='T_'+self.nomXML+'_'+str(indice)
+        self.nomDuTypePyxb=nomAlter
+        return nomAlter
+
+
+# ----------------------------------------
+class X_compoFactoriseAmbigu(X_definition):
+# ----------------------------------------
+
+    def __init__(self,nom,listeDeCreation,pere, debug=True):
+
+        if debug :
+            for i in listeDeCreation : print (i.nom)
+        self.label='BlocAmbigu'
+        self.nom=nom
+        self.pere=pere
+        self.statut='f'
+        self.entites={}
+        self.mcXSD=[]
+        self.typesXSDDejaDumpes=[]
+        self.ordre_mc=[]
+        self.lesConditions = 'Possible Conditions : '
+        for mc in listeDeCreation :
+            if hasattr(mc, 'condition'):self.lesConditions += '\n\t\t\t\t\t\t' + mc.condition
+            self.mcXSD.append(mc)
+            self.ordre_mc.append(mc.nom)
+
+        if debug : print (self.mcXSD)
+        if debug : print (self.ordre_mc)
+        self.construitEntites(self.mcXSD)
+        self.constructionArbrePossibles()
+        lesPossibles=deepcopy(self.arbrePossibles)
+        if debug : print ('lesPossibles ', lesPossibles)
+
+        self.getNomDuCodeDumpe()
+        self.nomDuTypePyxb = self.definitNomDuTypePyxb()
+        if debug : print (self.nomDuTypePyxb)
+        self.texteSimple = ''
+        self.texteComplexeVenantDesFils = ''
+        self.texteComplexe = debutTypeSubstDsBlocFactorise.format(self.nomDuTypePyxb)
+        # on enleve [] des possibles puisque l elt sera optionnel
+        lesPossibles.remove([])
+        if debug : print ('________________ init de compoAmbigu',self.nom, lesPossibles)
+        if debug : print ('self.entites', self.entites)
+        self.mcXSD=self.factoriseEtCreeDump(lesPossibles,nomAppel='Root')
+        if debug : print ('self.mcXSD',self.mcXSD)
+        self.texteComplexe += finTypeSubstDsBlocFactorise
+        self.texteComplexe +=self.texteComplexeVenantDesFils
+        #print ('fin pour prepareDumpXSD pour', self.nom)
+
+    def compare(self,autreMC):
+        if self.label != autreMC.label : return False
+        #PN : le bug est la
+        # arbre des possibles identiques mais les types different
+        # comment faire ?
+        #print (self.arbrePossibles)
+        #print (autreMC.arbrePossibles)
+        #if self.arbrePossibles== autreMC.arbrePossibles : return True
+        return False
+
+    def construitEntites(self, laListe):
+        for mc in laListe :
+            if mc.nom in self.entites.keys() : self.entites[mc.nom].append(mc)
+            else : self.entites[mc.nom] = [mc,]
+            if mc.label == 'BLOC' or  mc.label == 'BlocAmbigu':
+                self.ajouteLesMCFilsAEntite(mc)
+
+
+    def ajouteLesMCFilsAEntite(self,blocMc):
+        for mcFilsNom in blocMc.entites.keys():
+            if mcFilsNom == 'Consigne' or mcFilsNom == 'blocConsigne' : continue
+            if mcFilsNom not in self.entites.keys(): self.entites[mcFilsNom]=[]
+            if blocMc.label == 'BlocAmbigu' :
+                for mc in blocMc.entites[mcFilsNom] :
+                    self.entites[mcFilsNom].append(mc)
+                    if mc.label == 'BLOC' or  mc.label == 'BlocAmbigu':
+                        self.ajouteLesMCFilsAEntite(mc)
+            else :
+                self.entites[mcFilsNom].append(blocMc.entites[mcFilsNom])
+                if blocMc.entites[mcFilsNom].label == 'BLOC' or  blocMc.entites[mcFilsNom].label == 'BlocAmbigu':
+                    self.ajouteLesMCFilsAEntite(blocMc.entites[mcFilsNom])
+
+
+
+
+    def constructionArbrePossibles(self, debug = False):
+        if debug : print ('construction pour FACT ambigu _______________', self.nom)
+        toutesLesLignes=[[]]
+        for child in self.mcXSD :
+            if not hasattr(child, 'arbrePossibles') : child.construitArbrePossibles()
+            if child.label != 'BLOC' :
+                toutesLesLignes = deepcopy(self.fusionne2Listes(toutesLesLignes, child.arbrePossibles))
+            else :
+                toutesLesLignes = deepcopy(self.fusionne2Listes(toutesLesLignes, [child.nom, []]))
+
+        lignesAGarder=[]
+        for ligne in toutesLesLignes:
+            blocContenus=[]
+            aAjouter=True
+            for mc in ligne :
+                objMC=self.entites[mc][0]
+                if objMC.label == 'BLOC' :
+                    blocContenus.append(objMC)
+            for b in blocContenus :
+                for frere in blocContenus[blocContenus.index(b)+1:]:
+                    if b.isDisjoint(frere) : continue
+                    aAjouter=False
+                    break
+                if not aAjouter : break
+            if  aAjouter and ligne not in lignesAGarder :
+                lignesAGarder.append(ligne)
+
+        #print ("______________________________________")
+        #for l in lignesAGarder : print (l)
+        #print (len(lignesAGarder))
+        #print ("______________________________________")
+        self.arbrePossibles=[]
+        for ligne in lignesAGarder :
+            #print ('lignesAGarder', ligne)
+            for newLigne in self.deploye(ligne):
+                #print (newLigne)
+                if newLigne not in self.arbrePossibles : self.arbrePossibles.append(newLigne)
+        #for l in self.arbrePossibles : print (l)
+        #print ("______________________________________")
+
+
+    def deploye (self, ligne):
+        toutesLesLignes=[[]]
+        for mc in ligne :
+            #print ( 'mc in deploye', mc)
+            objMC=self.entites[mc][0]
+            #print ( 'nom', objMC.nom, objMC.label)
+            if objMC.label == 'BLOC' or objMC.label == 'BlocAmbigu':
+                toutesLesLignes = deepcopy(self.remplaceListeParContenuEtVide(toutesLesLignes, objMC.arbrePossibles))
+            else :
+                toutesLesLignes = deepcopy(self.adjointUnMot(toutesLesLignes,mc ))
+        return toutesLesLignes
+
+    def construitArbrePossibles(self):
+    # inutile car on a deja l arbre mais appele parfois
+        #print ('dans X_factCompoAmbigu ne fait rien', self.nom, self.arbrePossibles)
+        pass
+
+    def dumpXsd(self, dansFactorisation=False, multiple = False, first=False):
+        # on ne fait rien, tout a ete fait dans le init
+        self.texteElt=substDsSequence.format(self.code,self.nomDuTypePyxb,0,1, self.lesConditions)
+
+    def nomComplet(self) :
+        print ('dans nomComplet pourquoi ?',self, self.nom)
+
+
+    def factoriseEtCreeDump(self, laListe, indent=2 ,nomAppel=None, debug=False):
+        if debug : print ('_______________________________ factoriseEtCreeDump')
+        if debug : print(self.nom, laListe, indent, nomAppel)
+        maListeRetour=[]
+        aReduire={}
+
+        if [] in laListe :
+            declencheChoiceAvecSeqVid=True
+            while [] in laListe : laListe.remove([])
+            #min=0
+        else :
+            declencheChoiceAvecSeqVid=False
+            #min=1
+        
+
+
+        for ligne in laListe :
+            if ligne[0] in aReduire.keys():
+                if len(ligne) == 1 :aReduire[ligne[0]].append([])
+                else : aReduire[ligne[0]].append(ligne[1:])
+            else :
+                if len(ligne) == 1 : aReduire[ligne[0]]=[[]]
+                else : aReduire[ligne[0]]=[ligne[1:],]
+
+
+        if debug : print ('la Liste', laListe, declencheChoiceAvecSeqVid)
+        if debug : print (aReduire)
+        if len(aReduire.keys()) == 1 :
+            if declencheChoiceAvecSeqVid == False :
+                creeChoice=False
+                creeSequence=True
+                self.texteComplexe += '\t'*(indent) +  debSequenceDsBloc; indent=indent+1
+            else :
+                creeChoice=True
+                creeSequence=False
+                # pour regler le souci du 1er Niveau
+                self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
+                #if min == 1 : self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
+                #else        : self.texteComplexe += '\t'*indent + debutChoiceDsBlocAvecMin.format(min); indent=indent+1
+        else :
+            #self.texteComplexe += '\t'*indent + debutChoiceDsBlocAvecMin.format(min); indent=indent+1
+            self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
+            creeChoice=True
+            creeSequence=False
+
+        if debug : print ('creeSequence', creeSequence, aReduire)
+        for nomMC in aReduire.keys():
+            if debug : print (nomMC)
+            listeSuivante=aReduire[nomMC]
+            if creeChoice and  listeSuivante != [[]] :
+                self.texteComplexe += '\t'*(indent) +  debSequenceDsBloc; indent=indent+1
+            self.ajouteAuxTextes(nomMC,indent)
+            if listeSuivante == [[]] : continue # Est-ce toujours vrai ?
+            if len(listeSuivante) == 1 : self.ajouteAuxTextes(listeSuivante[0],indent)
+            else : self.factoriseEtCreeDump(listeSuivante, indent+int(creeSequence),nomMC)
+            if creeChoice   : indent=indent -1 ; self.texteComplexe += '\t'*(indent) + finSequenceDsBloc
+
+        if declencheChoiceAvecSeqVid :
+            self.texteComplexe +=  '\t'*indent +  debSequenceDsBloc
+            self.texteComplexe +=  '\t'*indent + finSequenceDsBloc
+        if creeChoice   : indent=indent -1 ; self.texteComplexe += '\t'*indent + finChoiceDsBloc
+        if creeSequence : indent=indent -1 ; self.texteComplexe += '\t'*(indent) + finSequenceDsBloc
+
+        #if doitFermerSequence : indent=indent-1;self.texteComplexe += '\t'*(indent) + finSequenceDsBloc
+        #print (self.texteSimple)
+        #print ('______',' self.texteComplexe')
+        #print (self.texteComplexe)
+        #print ('_____', 'self.texteComplexeVenantDesFils')
+        #print (self.texteComplexeVenantDesFils)
+        #print ('fin pour _______________________________', self.nom)
+        return (maListeRetour)
+
+
+    def ajouteAuxTextes(self,nomMC,indent,debug=False) :
+        if debug : 
+           print ('______________________________________________________')
+           print ('ajouteAuxTextes', nomMC, self.nom)
+        #  for i in self.entites.keys() : print (self.entites[i][0].nom)
+        if (indent  > 3) : indent = indent - 3
+
+        # PN change le 17 fevrier . Est-ce normal  d arriver la ?
+        # if faut traiter les Blocs exclusifs qui donnent des choices de sequences
+        # mais celles-ci risquent d etre ambigues
+        while (isinstance(nomMC,list)) :
+            nomMC=nomMC[0]
+
+        if nomMC == 'Consigne' or nomMC == 'blocConsigne' : return
+        if debug : print (nomMC, 'dans ajoute vraiment aux textes', self.entites )
+        if len(self.entites[nomMC]) == 1:
+            mc=self.entites[nomMC][0]
+            mc.dumpXsd(dansFactorisation=True)
+            self.texteComplexe += '\t'*(indent) + mc.texteElt
+            if mc.aCreer : self.texteComplexeVenantDesFils += mc.texteComplexe
+            if mc.aCreer : self.texteSimple   += mc.texteSimple
+            if mc.aCreer : mc.aCreer=False
+            return
+
+        leType=type(self.entites[nomMC][0])
+        for e in (self.entites[nomMC][1:]) :
+            if type(e) != leType:
+                print ('Projection XSD impossible, changez un des ', nomMC)
+                exit()
+
+        # cette boucle ne fonctionne que pour des SIMP
+        resteATraiter=copy(self.entites[nomMC])
+        #print ('________resteATraiter', resteATraiter)
+        listePourUnion=[]
+        first=1
+        while resteATraiter != [] :
+            nvlListeATraiter=[]
+            mc=resteATraiter[0]
+            listePourUnion.append(mc)
+            for autre in resteATraiter[1:]:
+                if not (mc.compare(autre)) :  nvlListeATraiter.append(autre)
+            resteATraiter=copy(nvlListeATraiter)
+
+        if len(listePourUnion) == 1:
+            mc=listePourUnion[0]
+            mc.dumpXsd(dansFactorisation=True,multiple=False,first=first)
+            self.texteComplexe += '\t'*(indent) + mc.texteElt
+            if mc.aCreer : self.texteComplexeVenantDesFils += mc.texteComplexe
+            if mc.aCreer : self.texteSimple   += mc.texteSimple
+            for mcIdent in self.entites[nomMC][1:]: mcIdent.metAJourPyxb(mc.nomDuTypePyxb)
+            if mc.aCreer : mc.aCreer=False
+            return
+
+        # on ajoute le nom de l element
+        if not (isinstance(self.entites[nomMC][0], Accas.SIMP)) :
+            sontTousDisjoint=True
+            index=1
+            if debug : print ('on cherche si ils sont disjoints : ',self.entites[nomMC])
+            for mc in self.entites[nomMC] :
+                if debug : print ('compare mc' , mc, ' avec :')
+                for mcFrere in self.entites[nomMC][index:]:
+                    ok = mc.isDisjoint(mcFrere) 
+                    if not ok : 
+                       sontTousDisjoint=False
+                       break
+                if not(sontTousDisjoint) : break 
+                index+=1
+            if not sontTousDisjoint: 
+               print ('2 blocs freres ont le meme nom et ne sont pas disjoints : pas encore traite')
+               print ('Projection XSD impossible, changez un des ', nomMC)
+               exit()
+            self.fusionneDsUnChoix(nomMC,indent)
+            if debug : print ('self.nom', self.nom)
+            if debug : print ('self.texteComplexe' , self.texteComplexe)
+            if debug : print ('self.texteSimple' , self.texteSimple)
+            if debug : print ('self.texteElt' , self.texteElt)
+            if debug : print ('________________________')
+            return
+        
+       
+        if hasattr(self.entites[nomMC][0], 'dejaDumpe') : # on a deja cree le type
+            if debug : print (self.entites[nomMC][0].nomDuTypePyxb, ' deja dumpe')
+        else :
+            if debug : print ('appel de dumpXsd')
+            self.entites[nomMC][0].dejaDumpe=True
+            self.entites[nomMC][0].dumpXsd(dansFactorisation=True,multiple=True,first=first)
+            if debug : print (self.entites[nomMC][0].nomDuTypePyxb)
+
+        texteDocUnion='\n'
+        i=1
+        for mc in self.entites[nomMC]:
+            if mc.ang != ''   : texteDocUnion += str(i) + '- ' + mc.ang + ' or \n'; i=i+1
+            elif mc .fr != '' : texteDocUnion += str(i) + '- ' + mc.fr  + ' ou \n'; i=i+1
+        if texteDocUnion == '\n' :
+            self.texteComplexe += '\t'*(indent) + self.entites[nomMC][0].texteElt
+        else :
+            texteDocUnion = texteDocUnion[0:-4]
+            debutTexteEltUnion = self.entites[nomMC][0].texteElt.split('maxOccurs=')[0]
+            self.texteComplexe += '\t'*(indent)+ reconstitueUnion.format(debutTexteEltUnion,texteDocUnion)
+        if self.entites[nomMC][0].nomDuTypePyxb in self.typesXSDDejaDumpes : return
+        self.typesXSDDejaDumpes.append(self.entites[nomMC][0].nomDuTypePyxb)
+        if debug : print ('et la j ajoute les definitions de type', self.entites[nomMC][0].nomDuTypePyxb)
+
+        nomTypePyxbUnion=self.entites[nomMC][0].nomDuTypePyxb
+        texteSimpleUnion = debutSimpleType.format(nomTypePyxbUnion)
+        texteSimpleUnion += debutUnion
+        texteSimpleUnion += '\t'*(indent)+self.entites[nomMC][0].texteSimplePart2
+        texteSimplePart1  = self.entites[nomMC][0].texteSimplePart1
+        for e in listePourUnion[1:] :
+            e.dumpXsd(dansFactorisation=True,multiple=True,first=False)
+            # si on ext un mc simple la ligne suivante est inutile
+            # en revanche on ajoute le texte a tous les coups
+            #self.texteComplexeVenantDesFils += e.texteComplexe
+            e.metAJourPyxb(nomTypePyxbUnion)
+            texteSimpleUnion += '\t'*(indent) + e.texteSimplePart2
+            texteSimplePart1 += e.texteSimplePart1
+        texteSimpleUnion += finUnion
+        texteSimpleUnion +=fermeSimpleType
+        self.texteSimple += texteSimplePart1 + texteSimpleUnion
+        if debug : 
+           print ('______________')
+           print (self.texteSimple)
+           print ('______________')
+        #print ('self.texteSimple', self.texteSimple)
+
+    def fusionneDsUnChoix(self, nomMC,indent, debug=False):
+        if debug : print ('_________________________________', self.nom, self, nomMC,indent)
+        if debug : print (self.texteComplexe)
+        texteDocUnion='\n'
+        texteComplexe=''
+        texteComplexeVenantDesFils=''
+        texteSimple=''
+        mcRef= self.entites[nomMC][0]
+        # max = 1 : a priori les choix sont exclusifs
+        if (hasattr (mcRef, 'aDejaEteDumpe')) : 
+          if debug : print ("je passe la NORMALEMENT car j ai deja ete dumpe")
+          return
+        leNomDuTypePyxb  = mcRef.definitNomDuTypePyxb(forceACreer=True)
+        if debug : print ('nomMC', nomMC)
+        for mc in self.entites[nomMC]:
+            if debug : print ('------------', mc)
+            # on laisse dansFactorisation a False car ce n est pas comme une fusion de bloc 
+            mc.texteComplexe = ''
+            mc.texteSimple = ''
+            mc.texteElt = ''
+            mc.dumpXsd(dansFactorisationDeFusion=True)
+            if debug : print ('texteSimple\n', mc.texteSimple, '\n fin\n')
+            if debug : print ('texteComplexeVenantDesFils\n',mc.texteComplexeVenantDesFils, '\n fin\n')
+            if debug : print ('texteComplexe\n', mc.texteComplexe, '\n fin\n')
+            if mc.ang != ''   : texteDocUnion += str(i) + '- ' + mc.ang + ' or \n'; i=i+1
+            elif mc .fr != '' : texteDocUnion += str(i) + '- ' + mc.fr  + ' ou \n'; i=i+1
+            texteComplexe += mc.texteComplexe
+            texteComplexeVenantDesFils += mc.texteComplexeVenantDesFils 
+            texteSimple += mc.texteSimple
+
+        if debug : print ('______________________________')
+        if debug : print ('textecomplexeVenantDesFils : \n' ,texteComplexeVenantDesFils )
+        if debug : print ('______________________________')
+        if debug : print ('______________________________')
+        if debug : print ('textecomplexe : \n' ,texteComplexe )
+        if debug : print ('______________________________')
+        self.entites[nomMC][0].aDejaEteDumpe=True 
+
+        self.texteElt = eltCompoDsSequence.format(nomMC, self.nomDuCodeDumpe,mcRef.nomDuTypePyxb,1,1)
+        self.texteDuFact = debutTypeCompo.format(self.entites[nomMC][0].nomDuTypePyxb)
+        self.texteDuFact += debutChoiceDsBloc
+        self.texteDuFact += texteComplexe 
+        self.texteDuFact += finChoiceDsBloc
+        self.texteDuFact += finTypeCompo
+        self.texteSimple += texteSimple
+        self.texteComplexeVenantDesFils   += texteComplexeVenantDesFils
+        self.texteComplexeVenantDesFils   += self.texteDuFact 
+        self.texteComplexe += self.texteElt 
+        if debug : print ('______________________________')
+        if debug : print ('texteSimple : \n' ,self.texteSimple )
+        if debug : print ('______________________________')
+        self.entites[nomMC][0].aDejaEteDumpe=True 
+
+
+
+# ----------------------------------------
+class X_definitionComposee (X_definition):
+# ------------------------------------------
+
+    def creeTexteComplexeVenantDesFils(self,dansFactorisation=False,debug=False):
+        texteComplexeVenantDesFils=""
+        blocsDejaDumpes=set()
+        #for nom in self.ordre_mc:
+        #  mcFils = self.entites[nom]
+        if debug : print ('creeTexteComplexeVenantDesFils', self.nom)
+        if self.nom == 'LeProc' : debug = True
+        for mcFils in self.mcXSD :
+            #print (mcFils,mcFils.nom)
+            if mcFils.nom == 'B1_B2' :debug=True 
+            else : debug=False
+            if not (isinstance(mcFils, Accas.BLOC)) :
+                mcFils.dumpXsd(dansFactorisation)
+                self.texteComplexe += mcFils.texteElt
+                if mcFils.aCreer : self.texteSimple   += mcFils.texteSimple
+                if mcFils.aCreer : texteComplexeVenantDesFils += mcFils.texteComplexe
+            else   :
+                if hasattr(mcFils,'nomXML')  and mcFils.nomXML in blocsDejaDumpes and mcFils.nomXML != None : continue
+                if hasattr(mcFils,'nomXML')  and mcFils.nomXML != None: blocsDejaDumpes.add(mcFils.nomXML)
+                mcFils.dumpXsd(dansFactorisation)
+                self.texteComplexe += mcFils.texteElt
+                if mcFils.aCreer : self.texteSimple   += mcFils.texteSimple
+                if mcFils.aCreer : texteComplexeVenantDesFils += mcFils.texteComplexe
+        return texteComplexeVenantDesFils
+
+    def dumpXsd(self, dansFactorisation=False, dansFactorisationDeFusion = False, multiple = False, first=True, debug=False):
+        if PourTraduction  : print (self.nom)
+        # le prepareDump est appele sur les fils
+        if not (self.dejaPrepareDump) : self.prepareDumpXSD()
+
+        self.getNomDuCodeDumpe()
+        if first :
+            if multiple : self.nomDuTypePyxb  = self.definitNomDuTypePyxb(forceACreer=True)
+            else        : self.nomDuTypePyxb  = self.definitNomDuTypePyxb()
+        self.texteSimple    = "" # on n ajoute pas de type simple
+
+        self.traduitMinMax()
+        # pour accepter les PROC et ...
+        #
+        if debug : print ('dumpXsd', self.nom, self.aCreer)
+        if self.aCreer or dansFactorisationDeFusion:
+            if not dansFactorisationDeFusion : self.texteComplexe = debutTypeCompo.format(self.nomDuTypePyxb)
+            if isinstance(self,X_OPER) or isinstance(self,X_PROC) :
+                self.texteComplexe += debutTypeCompoEtape.format(self.code)
+            self.texteComplexe += debutTypeCompoSeq
+            texteComplexeVenantDesFils= self.creeTexteComplexeVenantDesFils(dansFactorisation)
+            if not dansFactorisationDeFusion : 
+               self.texteComplexe  = texteComplexeVenantDesFils + self.texteComplexe
+               self.texteComplexeVenantDesFils  = ''
+            else : 
+               self.texteComplexeVenantDesFils  = texteComplexeVenantDesFils 
+            # la fin de l oper est traitee dans le dumpXSD de X_OPER
+            if not isinstance(self,X_OPER ) : self.texteComplexe += finTypeCompoSeq
+            if isinstance(self,X_PROC)      : self.texteComplexe += finTypeCompoEtape
+            if not isinstance(self,X_OPER ) and not dansFactorisationDeFusion: self.texteComplexe += finTypeCompo
+        else :
+            self.texteComplexe = ""
+
+        if self.ang != "" : self.texteElt=eltCompoDsSequenceWithHelp.format(self.nom,self.nomDuCodeDumpe,self.nomDuTypePyxb,self.minOccurs,self.maxOccurs, self.ang)
+        elif self.fr != ""  : self.texteElt=eltCompoDsSequenceWithHelp.format(self.nom,self.nomDuCodeDumpe,self.nomDuTypePyxb,self.minOccurs,self.maxOccurs, self.fr)
+        else : self.texteElt=eltCompoDsSequence.format(self.nom,self.nomDuCodeDumpe,self.nomDuTypePyxb,self.minOccurs,self.maxOccurs)
+        #print ('------------------------------------------------',self.nom)
+        #print (self.texteComplexe)
+
+    def traduitMinMax(self):
+    # ______________________
+    # valable pour PROC et OPER
+        self.minOccurs = 0
+        self.maxOccurs = 1
+
+    def compare(self,autreMC):
+        if self.label != autreMC.label : return False
+        if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None : return True
+        for attr in (  'regles', 'fr',  'defaut', 'min' ,'max', 'position' , 'docu' ) :
+            val1=getattr(self,attr)
+            val2=getattr(autreMC,attr)
+            if val1 != val2 : return False
+        if len(self.entites) != len(autreMC.entites) : return False
+        for defFille in self.entites.keys():
+            if defFille not in autreMC.entites.keys() : return False
+            if not self.entites[defFille].compare(autreMC.entites[defFille]) : return False
+        return True
+
+    def prepareDumpXSD(self):
+        self.dejaPrepareDump=True
+        self.inUnion=False
+        self.tousLesFils=[]
+        self.mcXSD=[]
+        for nomMC in self.ordre_mc:
+            mc=self.entites[nomMC]
+            self.mcXSD.append(mc)
+            mc.prepareDumpXSD()
+        self.chercheListesDeBlocsNonDisjoints()
+        for l in list(self.listeDesBlocsNonDisjoints) :
+            if not(self.besoinDeFactoriserTrivial(l)) : self.listeDesBlocsNonDisjoints.remove(l)
+            else : self.factorise(l)
+
+    def chercheListesDeBlocsNonDisjoints(self):
+        self.listeDesBlocsNonDisjoints=[]
+        for nomChild in self.ordre_mc :
+            child=self.entites[nomChild]
+            if child.label != 'BLOC' : continue
+            if self.listeDesBlocsNonDisjoints == [] :
+                self.listeDesBlocsNonDisjoints.append([child])
+                continue
+            vraimentIndependant=True
+            for liste in list(self.listeDesBlocsNonDisjoints):
+                independant=True
+                for bloc in liste :
+                    if bloc.isDisjoint(child)   : continue
+                    if bloc.estLeMemeQue(child) : continue
+                    independant=False
+                    vraimentIndependant=False
+                if not (independant) :
+                    liste.append(child)
+            if vraimentIndependant:
+                self.listeDesBlocsNonDisjoints.append([child])
+        # on nettoye la liste des blocs tous seuls
+        for l in list(self.listeDesBlocsNonDisjoints) :
+            if len(l) ==1 : self.listeDesBlocsNonDisjoints.remove(l)
+
+    def estLeMemeQue(self,autreMC):
+        if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None: return True
+        return False
+
+    def aUnPremierCommunDansLesPossibles(self, laListe) :
+     # fonctionne avec liste de mc ou une liste(mc,index)
+        import types
+        mesPremiers=set()
+        for elt,index in laListe :
+            if not type(e) == types.ListType :
+                if elt.nom in mesPremiers : return True
+                mesPremiers.add(elt.nom)
+            else :
+                if elt[0].nom in mesPremiers : return True
+                mesPremiers.add(elt[0].nom)
+        return False
+
+    def besoinDeFactoriserTrivial(self,laListe):
+        # tout faux
+        # a revoir
+        return True
+        besoin=False
+        lesPremiers=set()
+        for mcBloc in laListe  :
+            mc=mcBloc.mcXSD[0]
+            if mc.label == 'BLOC'    : return True
+            if not(mc.statut=='o')   : return True
+            if mc.nom in lesPremiers : return True
+            lesPremiers.add(mc.nom)
+        return False
+
+    def factorise(self,liste,debug=False):
+        self.listeConstruction=liste
+        nomDebut=liste[0].nom
+        indexDebut=self.mcXSD.index(liste[0])
+        nomFin=liste[-1].nom
+        indexFin=self.mcXSD.index(liste[-1]) + 1
+        nom=nomDebut+'_'+nomFin
+        if debug : print ('___________ dans factorise', nom)
+        listeAFactoriser=[]
+        for  i in range(indexDebut, indexFin) :
+            listeAFactoriser.append(self.mcXSD[i])
+
+        newListe=self.mcXSD[0:indexDebut]
+
+        monEltFacteur=X_compoFactoriseAmbigu(nom,listeAFactoriser,self)
+        newListe.append(monEltFacteur)
+        newListe=newListe+self.mcXSD[indexFin:]
+        self.mcXSD=newListe
+        if debug :print ('___________ fin fin factorise', nom)
+
+    def construitTousLesFils(self):
+        for nomChild in self.ordre_mc :
+            if nomChild == 'Consigne' or nomChild == 'blocConsigne' : continue
+            child=self.entites[nomChild]
+            if child.label != 'BLOC' :
+                self.tousLesFils.append(child.nom)
+            else:
+                if child.tousLesFils == [] : child.construitTousLesFils()
+                for nomPetitFils in child.tousLesFils : self.tousLesFils.append(nomPetitFils)
+        #print ('construitArbreEntier pour ', self.nom, self.tousLesFils)
+
+
+    def isDisjoint(self, mc1) :
+        if self.tousLesFils == [] : self.construitTousLesFils()
+        if not (hasattr(mc1, 'tousLesFils')) : mc1.tousLesFils  = []
+        if mc1.tousLesFils  == []  : mc1.construitTousLesFils()
+        for fils in mc1.tousLesFils :
+            if fils in  self.tousLesFils : return False
+        return True
+
+
+
+
+# ---------------------------------
+class X_FACT (X_definitionComposee):
+#--------- ------------------------
+#Un FACT avec max=** doit se projeter en XSD sous forme d'une sequence a cardinalite 1 et
+# l'element qui porte la repetition du FACT
+    def traduitMinMax(self):
+        if self.max     == '**' or self.max  == float('inf') : self.maxOccurs="unbounded"
+        else :                                                 self.maxOccurs = self.max
+        self.minOccurs = self.min
+        if self.statut =='f' : self.minOccurs=0
+        if self.statut =='o'  and self.min < 2: self.minOccurs=1
+
+    def construitArbrePossibles(self):
+        if self.statut   ==  'f' :
+            self.arbrePossibles = (self.nom,[])
+            self.arbreMCPossibles = (self,None)
+        else :
+            self.arbrePossibles = (self.nom,)
+            self.arbreMCPossibles = (self,)
+        #print ('XFACT arbre des possibles de ' ,self.nom, self.arbrePossibles)
+
+
+
+# ---------------------------------
+class X_OPER (X_definitionComposee):
+# ---------------------------------
+    def dumpXsd(self, dansFactorisation=False, multiple = False, first=False):
+        X_definitionComposee.dumpXsd(self,dansFactorisation)
+        self.texteComplexe += finTypeCompoSeq
+        self.texteComplexe += attributeNameName
+        self.texteComplexe += attributeTypeForASSD
+        self.texteComplexe += attributeTypeUtilisateurName.format(self.sd_prod.__name__)
+        self.texteComplexe += finTypeCompoEtape
+        self.texteComplexe += finTypeCompo
+
+
+        cata = CONTEXT.getCurrentCata()
+        if self.sd_prod.__name__ not in list(cata.dictTypesASSDorUserASSDCrees) :
+            cata.dictTypesASSDorUserASSDCrees[self.sd_prod.__name__]=[self,]
+        else :
+            cata.dictTypesASSDorUserASSDCrees[self.sd_prod.__name__].append(self)
+
+
+# ----------------------------------
+class X_PROC (X_definitionComposee):
+#-----------------------------------
+    pass
+
+#-----------------------------------
+class X_BLOC (X_definitionComposee):
+#-----------------------------------
+    def dumpXsd(self, dansFactorisation=False, multiple = False, first=False, debug = False):
+        if debug : print ('X_BLOC dumpXsd', self.nom)
+        self.tousLesFils=[]
+        if self.nom == 'blocConsigne' :
+            self.texteComplexe = ""
+            self.texteSimple   = ""
+            self.nomDuTypePyxb = "NonTraiteConsigne"
+            self.texteSimpleVenantDesFils = ""
+            self.aCreer = False
+            self.texteElt = ""
+
+            return
+        self.getNomDuCodeDumpe()
+        # dans ce cas les blocs successifs sont identiques et on ne dumpe que le 1er
+
+        self.nomDuTypePyxb  = self.definitNomDuTypePyxb()
+        self.texteSimple    = "" # on n ajoute pas de type simple
+
+        # Pour les blocs le minOccurs vaut 0 et le max 1
+        if self.aCreer :
+            self.texteComplexe = debutTypeSubst.format(self.nomDuTypePyxb)
+            texteComplexeVenantDesFils=self.creeTexteComplexeVenantDesFils(dansFactorisation)
+            self.texteComplexe  = texteComplexeVenantDesFils + self.texteComplexe
+            self.texteComplexe += finTypeSubst
+
+        else :
+            self.texteComplexe = ""
+
+        self.texteElt=substDsSequence.format(self.code,self.nomDuTypePyxb,0,1,'condition : ' +self.condition)
+
+        #print ('------------------------------------------------')
+
+    def compare(self,autreMC):
+        if self.label != autreMC.label : return False
+        if self.inUnion == True or autreMC.inUnion == True : return False
+        if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None : return True
+        for attr in ( 'condition', 'regles', ):
+            val1=getattr(self,attr)
+            val2=getattr(autreMC,attr)
+            if val1 != val2 : return False
+        if len(self.entites) != len(autreMC.entites) : return False
+        for defFille in self.entites.keys():
+            if defFille not in autreMC.entites.keys() : return False
+            if not self.entites[defFille].compare(autreMC.entites[defFille]) : return False
+        return True
+
+    def construitArbrePossibles(self):
+        self.arbrePossibles=[[],]
+        #print ('X_BLOC je construis l arbre des possibles pour ', self.nom)
+        for child in self.mcXSD :
+            if not hasattr(child, 'arbrePossibles') : child.construitArbrePossibles()
+            #print (child.nom, child.label, child.arbrePossibles)
+            if child.label == 'BLOC' :
+                self.arbrePossibles = deepcopy(self.remplaceListeParContenuEtVide(self.arbrePossibles, child.arbrePossibles))
+            elif child.label == 'BlocAmbigu':
+                #print ("je passe par la pour", self.nom, child.nom, self.arbrePossibles, child.arbrePossibles)
+                self.arbrePossibles = deepcopy(self.remplaceListeParContenuEtVide(self.arbrePossibles, child.arbrePossibles))
+                #print ('resultat', self.arbrePossibles)
+            else :
+                self.arbrePossibles = deepcopy(self.adjoint(self.arbrePossibles, child.arbrePossibles))
+        self.arbrePossibles.append([]) # un bloc n est pas obligatoire
+        #print ('arbre des possibles de ' ,self.nom, self.arbrePossibles)
+
+
+#--------------------------------
+class X_SIMP (X_definition):
+#--------------------------------
+    def dumpXsd(self, dansFactorisation=False, multiple=False, first=False, debug=False):
+        #debug = True
+        #if PourTraduction  : print (self.nom)
+        if debug : print ('X_SIMP dumpXsd pour', self.nom, '___________________________')
+        self.prepareDumpXSD()
+        # si inUnion la comparaison est fausse : on cree le nomDuType
+        if multiple : self.inUnion=True
+        #print ('exploreObjet SIMP')
+        self.getNomDuCodeDumpe()
+        self.aCreer = True
+        self.texteComplexe = ""
+        self.texteSimple   = ""
+        self.texteElt      = ""
+        if self.nom =='Consigne' : return
+
+        #  --> homonymie on peut utiliser genealogie ?
+        self.nomDuTypeDeBase = self.traduitType()
+        if debug : print ('nomDuTypeDeBase', self.nomDuTypeDeBase)
+        if debug : print ('multiple', multiple, 'first', first)
+        if not multiple :
+            self.nomDuTypePyxb   = self.definitNomDuTypePyxb()
+        else :
+            if first :
+                # on force la creation
+                self.nomDuTypePyxb   = self.definitNomDuTypePyxb()
+                self.aCreer = True
+            else :
+                self.nomDuTypePyxb='NonDetermine'
+
+        if debug : print ('nomDuTypePyxb', self.nomDuTypePyxb)
+        if debug : print ('aCreer', self.aCreer)
+
+
+        # on se sert des listes ou non pour  la gestion des minOccurs /maxOccurs est > 0
+        if self.statut =='f' : minOccurs = 0
+        else                 : minOccurs = 1
+        if dansFactorisation : minOccurs = 1
+
+        if self.suisUneMatrice :
+           self.dumpSpecifiqueMatrice(minOccurs)
+           return
+
+        if self.suisUnTuple :
+           self.dumpSpecifiqueTuple(minOccurs)
+           return
+
+        if self.avecBlancs and self.max > 1 :
+           self.dumpSpecifiqueTexteAvecBlancs(minOccurs,multiple)
+           return
+
+        #print ('minOccurs',minOccurs)
+        # le defaut est dans l elt Name -> tester la coherence d existence avec Accas
+        # regles Accas
+
+        # pas d elt si on est dans multiple
+        # sauf si on est le '1er'  dans un element ambigu
+        if not multiple :
+            #print ('je passe la pas multiple')
+            texteAide = ""
+            if self.ang != '' : texteAide = self.ang
+            else : texteAide = self.fr
+            if self.intoXML and self.into :
+               if self.intoXML != self.into :
+                  #print ('je passe la pour ', self.nom)
+                  texteAide :texteAide =  texteAide+'\nPossible choices for '+ self.nom + 'at this place : \n'+str(self.into)+'\n'
+
+            if self.defaut :
+               if self.max > 1 or self.max == '**' or self.max ==  float('inf') : 
+                    txtDefaut=""
+                    for val in self.defaut : txtDefaut+=str(val) + " " 
+                    # cela ne fonctionne pas tres bien. a revoir
+                    txtDefaut+=txtDefaut[0:-1]
+                    if not('TXM' in (self.type)) : 
+                        # a revoir pour les tuples avec defaut
+                        if texteAide != ''  : self.texteElt = eltDsSequenceWithDefautAndHelp.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut,texteAide)
+                        else : self.texteElt = eltDsSequenceWithDefaut.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
+                    else :
+                        texteAide +=  texteAide+'\ndefault Value in MDM : \n'+txtDefaut
+                        self.texteElt = eltDsSequenceWithHelp.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,texteAide)
+               else :
+                    if str(self.defaut)   == 'True'  : txtDefaut = 'true'
+                    elif str(self.defaut) == 'False' : txtDefaut = 'false'
+                    else : txtDefaut = str(self.defaut)
+                    if texteAide != ''  : self.texteElt = eltDsSequenceWithDefautAndHelp.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut,texteAide)
+                    else : self.texteElt = eltDsSequenceWithDefaut.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
+            else :
+               if texteAide  != '' : self.texteElt = eltDsSequenceWithHelp.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,texteAide)
+               else : self.texteElt = eltDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1)
+        elif first:
+            # l'aide est geree a la fusion 
+            self.texteElt = eltDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,1,1)
+
+        # self.aCreer est mis a jour ds definitNomDuTypePyxb
+        # ou si elt est le 1er d une liste identique
+        if debug : print ('je suis aCreer', self.aCreer)
+        if not self.aCreer : return
+
+        typeATraduire=self.type[0]
+
+        self.texteSimplePart1=""
+        if not(isinstance(typeATraduire,str)) and not(isinstance(typeATraduire,Accas.Tuple)) and issubclass(typeATraduire, Accas.UserASSD) :
+            cata = CONTEXT.getCurrentCata()
+            if len(self.type) == 2 and self.type[1]=='createObject' : suffixe = 'C'
+            else : suffixe = 'U' 
+            #print (cata.listeUserASSDDumpes)
+            #print (typeATraduire.__name__)
+            #print (typeATraduire.__name__ in cata.listeUserASSDDumpes)
+            if typeATraduire.__name__  not in cata.listeUserASSDDumpes :
+                cata.listeUserASSDDumpes.add(typeATraduire.__name__)
+                if issubclass(typeATraduire, Accas.UserASSDMultiple) : 
+                   self.texteSimplePart1 = defUserASSDMultiple.format(typeATraduire.__name__)
+                   if cata.definitUserASSDMultiple == False  :
+                      cata.definitUserASSDMultiple = True
+                      cata.texteSimple = cata.texteSimple + defBaseXSDUserASSDMultiple
+                else :
+                   self.texteSimplePart1 = defUserASSD.format(typeATraduire.__name__)
+                   if cata.definitUserASSD == False  :
+                      cata.definitUserASSD = True
+                      cata.texteSimple = cata.texteSimple + defBaseXSDUserASSD
+            if typeATraduire.__name__+'_'+suffixe not in cata.listeUserASSDDumpes :
+                cata.texteSimple = cata.texteSimple + defUserASSDOrUserASSDMultiple.format(typeATraduire.__name__, suffixe,typeATraduire.__name__)
+                cata.listeUserASSDDumpes.add(typeATraduire.__name__+'_'+suffixe)
+
+
+        if not multiple : self.texteSimple  += debutSimpleType.format(self.nomDuTypePyxb)
+        else : self.texteSimple  += debutSimpleTypeSsNom
+        # On est dans une liste
+        if self.max > 1 or self.max == '**' or self.max ==  float('inf') or  hasattr(self.type[0], 'ntuple') :
+            self.texteSimple  += debutTypeSimpleListe
+            self.texteSimple  += "\t\t\t\t"+debutRestrictionBase.format(self.nomDuTypeDeBase)
+            if self.val_min != float('-inf')  : self.texteSimple += "\t\t\t\t"+minInclusiveBorne.format(self.val_min)
+            if self.val_max != float('inf') and self.val_max != '**' : self.texteSimple +="\t\t\t\t"+ maxInclusiveBorne.format(self.val_max)
+            if self.into != None:
+                # PN --> traduction des into
+                into=self.into
+                if self.intoXML != None : into = self.intoXML
+                for val in into : self.texteSimple += "\t\t\t\t"+enumeration.format(val)
+                if PourTraduction  :
+                    for val in into : print (str(val))
+            self.texteSimple  += fermeBalisesMileu
+            if  self.max !=1 and self.max != '**' and self.max !=  float('inf') : self.texteSimple  += maxLengthTypeSimple.format(self.max)
+            if  self.min !=1 and self.min !=  float('-inf') : self.texteSimple  += minLengthTypeSimple.format(self.min)
+            self.texteSimple  += fermeRestrictionBase
+        else :
+        # ou pas
+            self.texteSimple  += debutRestrictionBase.format(self.nomDuTypeDeBase)
+            if self.val_min != float('-inf')  : self.texteSimple += minInclusiveBorne.format(self.val_min)
+            if self.val_max != float('inf') and self.val_max != '**' : self.texteSimple += maxInclusiveBorne.format(self.val_max)
+            if self.into != None:
+                into=self.into
+                if self.intoXML != None : into = self.intoXML
+                for val in into : self.texteSimple += enumeration.format(val)
+                if PourTraduction  :
+                    for val in into : print (str(val))
+            self.texteSimple  += fermeRestrictionBase
+        self.texteSimple  += fermeSimpleType
+        self.texteSimplePart2 = self.texteSimple
+        self.texteSimple = self.texteSimplePart1 + self.texteSimplePart2
+
+
+    def dumpSpecifiqueTexteAvecBlancs(self,minOccurs,multiple):
+        # attention multiple non traite
+        # pour l instant on n a pas max =1 et on ne traite pas les into
+
+        texteAide = ""
+        if  self.ang != '' : texteAide = self.ang
+        elif self.fr != '' : texteAide = self.fr
+
+        self.texteElt = eltDsSequenceWithHelp.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,texteAide)
+        txtDefaut=""
+        # Pas de Defaut pour les string en XSD
+        # max sert pour la taille de la liste
+        if self.defaut : texteAide += ' Valeur par defaut dans le comm : '+str(self.defaut)
+        if texteAide != ''  : self.texteElt = eltDsSequenceWithHelp.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,texteAide)
+        else : self.texteElt = eltDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1)
+         
+        
+        if self.max == '**' or self.max ==  float('inf') : max='unbounded'
+        else  : max = self.max
+  
+        if self.max > 1 : # juste au cas ou on traite 1 pareil
+            self.texteSimple = ''
+            cata = CONTEXT.getCurrentCata()
+            if self.nomDuTypePyxb in cata.listeTypeTXMAvecBlancs: return
+            cata.listeTypeTXMAvecBlancs.add(self.nomDuTypePyxb)
+            self.texteSimple = complexChaineAvecBlancs.format(self.nomDuTypePyxb,max,self.nomDuTypePyxb)
+            if self.intoXML != None : into = self.intoXML
+            else : into = self.into
+            if into  == None :
+               self.texteSimple += typeEltChaineAvecBlancSansInto.format(self.nomDuTypePyxb)
+            else : 
+               self.texteSimple += debutChaineAvecBlancsInto.format(self.nomDuTypePyxb)
+               for val in into : self.texteSimple += milieuChaineAvecBlancsInto.format(val)
+               self.texteSimple += finChaineAvecBlancsInto
+           
+        
+    def dumpSpecifiqueTuple(self,minOccurs):
+        self.nomDuTypeDeBase = self.traduitType()
+        tousPareil=True
+        # il faut gerer l aide et les defaut
+        if self.defaut : print ('il faut tester le defaut')
+        if self.max == '**' or self.max ==  float('inf') : max='unbounded'
+        else  : max = self.max
+        self.texteElt = tupleNonHomogeneElt.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,max)
+        leType=self.nomDuTypeDeBase[0]
+        for leTypeComp in self.nomDuTypeDeBase[1:] :
+            if leTypeComp != leType : 
+                tousPareil = False
+                break;
+        #if tousPareil :
+        #PN PN a statuer
+        #    self.texteSimple  += debutSimpleType.format(self.nomDuTypePyxb)
+        #    self.texteSimple  += debutTypeSimpleListe
+        #    self.texteSimple  += "\t\t\t\t"+debutRestrictionBase.format(leType)
+        #    if self.val_min != float('-inf')  : self.texteSimple += "\t\t\t\t"+minInclusiveBorne.format(self.val_min)
+        #    if self.val_max != float('inf') and self.val_max != '**' : self.texteSimple +="\t\t\t\t"+ maxInclusiveBorne.format(self.val_max)
+        #    if self.into != None:
+        #        into=self.into
+        #        if self.intoXML != None : into = self.intoXML
+        #        for val in into : self.texteSimple += "\t\t\t\t"+enumeration.format(val)
+        #        if PourTraduction  : 
+        #            for val in into : print (str(val))
+        #    self.texteSimple  += fermeBalisesMileu
+        #    if self.max !=1 and self.max != '**' and self.max !=  float('inf') : self.texteSimple  += maxLengthTypeSimple.format(self.max)
+        #    if self.min !=1 and self.min !=  float('-inf') : self.texteSimple  += minLengthTypeSimple.format(self.min)
+        #    self.texteSimple  += fermeSimpleType
+        #    return
+
+        self.texteSimple = ''
+        complexeTypeTuple = tupleDebutComplexeType.format(self.nomDuTypePyxb)
+        num = 1
+        for leType in self.nomDuTypeDeBase :
+            self.texteSimple  += tupleNonHomogeneSimpleType.format(self.nomDuTypePyxb,str(num),leType)
+            complexeTypeTuple += tupleMilieuComplexeType.format(str(num),self.nomDuTypePyxb,str(num))
+            num = num + 1
+        complexeTypeTuple += tupleFinComplexeType
+        self.texteSimple  += complexeTypeTuple
+              
+
+    def dumpSpecifiqueMatrice(self,minOccurs):
+    # if faut traiter le defaut
+        typeDeMatrice =self.type[0]
+
+        self.texteSimple  += debutSimpleType.format(self.nomDuTypePyxb+'_element')
+        self.texteSimple  += debutRestrictionBase.format(self.nomDuTypeDeBase)
+        if typeDeMatrice.typEltInto != None:
+            for val in typeDeMatrice.typEltInto : self.texteSimple += enumeration.format(val)
+        self.texteSimple  += fermeRestrictionBase
+        self.texteSimple += fermeSimpleType
+        nom=self.nomDuTypePyxb
+        nbCols=typeDeMatrice.nbCols
+        nbLigs=typeDeMatrice.nbCols
+        self.texteSimple += matriceSimpleType.format(nom,nom,nbCols,nom,self.code,nom,nbLigs,nbLigs,nom,self.code,nom,self.min,self.max)
+        self.texteElt = eltMatrice.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1)
+
+        
+    def prepareDumpXSD(self):
+        self.inUnion=False
+        if self.statut   ==  'f' : self.arbrePossibles = (self.nom,[])
+        else                     : self.arbrePossibles = (self.nom,)
+        self.mcXSD=[]
+
+
+
+    def traduitType(self,debug=False):
+        # il faut traduire le min et le max
+        # il faut ajouter les regles
+        # il faut gerer les types tuple et fichier
+        # on ne paut pas tester le type qui depend du cataloge
+        if hasattr(self.type[0], 'typElt') : 
+            #print ('je suis une Matrice de ' ,dictNomsDesTypes[self.type[0].typElt]) 
+            self.suisUneMatrice = True
+            # on presume que le type de l elt est un ASSD
+            if self.type[0].typElt not in dictNomsDesTypes.keys(): return 'xs:string'
+            return dictNomsDesTypes[self.type[0].typElt] 
+        else :
+            self.suisUneMatrice = False
+        if hasattr(self.type[0], 'ntuple') :
+            self.suisUnTuple = True
+            # Pour l instant pas de into dans les tuples non homogenes et pas de reference
+            # sinon, il faudra faire un for sur la suite avec les createObjet
+            leType=self.validators.typeDesTuples[0]
+            enRetour=[]
+            for i in range(self.type[0].ntuple):
+                enRetour.append(dictNomsDesTypes[self.validators.typeDesTuples[i]])
+            return enRetour
+            #typeATraduire=leType
+        else :
+            self.suisUnTuple = False
+            typeATraduire=self.type[0]
+        if not (typeATraduire in list(dictNomsDesTypes.keys())) :
+            #if (isinstance(typeATraduire, Accas.ASSD) or issubclass(typeATraduire, Accas.ASSD)) :
+            if (not(isinstance(typeATraduire,str)) and issubclass(typeATraduire, Accas.ASSD)) :
+            # cas d une creation
+                cata = CONTEXT.getCurrentCata()
+                # PNPNPN a Revoir pour la creation des keyrefs
+                if len(self.type) == 2 and self.type[1]=='createObject' :
+                    if typeATraduire.__name__ not in list(cata.dictTypesASSDorUserASSDCrees) :
+                        cata.dictTypesASSDorUserASSDCrees[typeATraduire.__name__]=[self,]
+                    else :
+                        cata.dictTypesASSDorUserASSDCrees[typeATraduire.__name__].append(self)
+                    if issubclass(typeATraduire, Accas.UserASSD) : return typeATraduire.__name__+'_C'
+                    else : return  'xs:string'
+
+                # cas d une consommation
+                if typeATraduire not in list(cata.dictTypesASSDorUserASSDUtilises) :
+                    cata.dictTypesASSDorUserASSDUtilises[typeATraduire]=[self,]
+                else :
+                    cata.dictTypesASSDorUserASSDUtilises[typeATraduire].append(self,)
+                if issubclass(typeATraduire, Accas.UserASSD) : return typeATraduire.__name__+'_U'
+                else : return  'xs:string'
+            else : return ('YYYYY')
+        return dictNomsDesTypes[typeATraduire]
+
+    def traduitValMinValMax(self):
+        self.maxInclusive=self.val_max
+        self.minInclusive=self.val_min
+        if self.val_min == float('-inf') and val_max== float('inf') : return
+        #print ('il faut affiner le type du SIMP ', self.nom)
+        if self.val_max == '**' or self.val_max == float('inf') : self.maxInclusive=None
+        else : self.maxInclusive = self.val_max
+        if self.val_min == '**' or self.val_max == float('-inf') : self.maxInclusive=None
+        else : self.minInclusive = self.val_min
+
+    def traduitMinMax(self):
+        if self.min == 1 and self.max == 1 :  return
+        #print ('il faut creer une liste ' , self.nom)
+
+    def compare(self,autreMC):
+        if self.label != autreMC.label : return False
+        if self.inUnion == True or autreMC.inUnion == True : return False
+        if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML and self.nomXML != None : return True
+        listeAComparer = [ 'type', 'defaut', 'min' ,'max' ,'val_min' , 'val_max' ]
+        if self.intoXML != None : listeAComparer.append('intoXML')
+        else : listeAComparer.append('into')
+        if (hasattr (self, 'nomXML')) and self.nomXML != None : nomUtil=self.nomXML
+        for attr in listeAComparer :
+            val1=getattr(self,attr)
+            val2=getattr(autreMC,attr)
+            if val1 != val2 : return False
+        return True
+
+    def construitArbrePossibles(self):
+        if self.statut   ==  'f' :
+            self.arbrePossibles = (self.nom,[])
+        else :
+            self.arbrePossibles = (self.nom,)
+        #print ('SIMP arbre des possibles de ' ,self.nom, self.arbrePossibles)
+
+
+#-----------------
+class X_JDC_CATA :
+#-----------------
+
+    def dumpXsd(self, avecEltAbstrait,  debug = True):
+        cata = CONTEXT.getCurrentCata()
+        if debug : print ('avecEltAbstrait   -------------------', avecEltAbstrait)
+
+        if debug : print ('self.importedBy -------------------', self.importedBy)
+        if debug : print ('self.code       -------------------', self.code)
+
+        self.texteSimple   = ""
+        self.texteComplexe = ""
+        self.texteCata     = ""
+        self.texteDeclaration  = ""
+        self.texteInclusion    = ""
+        self.texteElt          = ""
+        self.texteTypeAbstrait = ""
+
+        if self.implement == "" :
+            self.nomDuCodeDumpe = self.code
+            self.implement      = self.code
+            self.nomDuXsdPere   = self.code
+        else :
+            self.implement,self.nomDuXsdPere=self.implement.split(':')
+            self.nomDuCodeDumpe = self.implement
+
+        if debug : print ('self.implement       -------------------', self.implement)
+        if debug : print ('self.nomDuCodeDumpe   -------------------', self.nomDuCodeDumpe)
+        if debug : print ('self.nomDuXsdPere  -------------------', self.nomDuXsdPere)
+
+        self.nomDuTypePyxb    = 'T_'+self.nomDuCodeDumpe
+        self.dumpLesCommandes()
+
+        if self.implement == self.code :
+            self.texteCata += eltAbstraitCataPPal.format(self.code)
+            if 0 : pass
+            else  : self.texteCata += eltCataPPal.format(self.code,self.code,self.code)
+        else :
+            self.texteCata += eltAbstraitCataFils.format(self.implement,self.nomDuXsdPere,self.nomDuXsdPere)
+            if 0 : pass
+            else : self.texteCata += eltCataFils.format(self.implement,self.nomDuXsdPere,self.nomDuXsdPere,self.nomDuXsdPere)
+            self.texteInclusion += includeCata.format(self.nomDuXsdPere)
+
+    
+        self.texteCata += eltCata.format(self.implement,self.implement,self.implement,self.implement,self.nomDuXsdPere)
+        #if self.implement == self.code :
+        #   self.texteCata      += debutTypeCata.format(self.nomDuCodeDumpe)
+        #else :
+        #   self.texteCata      += debutTypeCataExtension.format(self.nomDuCodeDumpe)
+        #   self.texteCata      += debutExtension.format(self.code,self.nomDuCodeDumpe)
+        #   self.texteInclusion += includeCata.format(self.nomDuXsdPere)
+
+
+
+        #for codeHeritant in self.importedBy:
+        #    self.texteCata += eltCodeSpecDsCata.format(codeHeritant)
+        #    self.texteTypeAbstrait += eltAbstrait.format(codeHeritant,codeHeritant,self.code,codeHeritant)
+
+        #if self.implement != "" : self.texteCata = self.texteCata + finExtension + finTypeCompo
+        #else : self.texteCata  += finTypeCata
+
+        #if self.implement != "" :
+        #   self.texteElt=implementeAbstrait.format(self.nomDuCodeDumpe,self.code,self.nomDuTypePyxb,self.code,self.nomDuCodeDumpe)
+        #else :
+        #   self.texteElt  = eltCata.format(self.nomDuCodeDumpe,self.code, self.nomDuTypePyxb)
+
+        if self.implement == self.code :
+            self.texteXSD  = texteDebut.format(self.code,self.code,self.code,self.code,self.code,self.code)
+        elif self.nomDuXsdPere ==  self.code :
+            self.texteXSD  = texteDebutNiveau2.format(self.code,self.implement,self.code,self.code,self.code, self.code,self.code,self.code,self.code,self.code)
+        else :
+            self.texteXSD  = texteDebutNiveau3.format(self.code,self.implement,self.code,self.nomDuXsdPere,self.code,self.code,self.code, self.code,self.code,self.code,self.code,self.code)
+
+        if self.texteInclusion != ""   : self.texteXSD += self.texteInclusion
+        self.texteXSD += self.texteSimple
+        self.texteXSD += self.texteComplexe
+
+        #if self.texteTypeAbstrait != "" : self.texteXSD += self.texteTypeAbstrait
+        self.texteXSD += self.texteCata
+        #self.texteXSD += self.texteElt
+
+        toutesLesKeys=set()
+        texteKeyRef = ""
+        # Pour le nom des key_ref en creation : le type ( une seule key-ref par type. facile a retrouver)
+        for clef in self.dictTypesASSDorUserASSDCrees:
+            existeASSD=0
+            texteDesFields=""
+            for unOper in self.dictTypesASSDorUserASSDCrees[clef]:
+                if  not(isinstance(unOper, Accas.OPER)) : continue
+                existeASSD=1
+                texteDesFields+=texteFieldUnitaire.format(self.code, unOper.nom)
+            if existeASSD : texteDesFields=texteDesFields[0:-2]
+            texteDesUserASSD=''
+            existeunUserASSD=0
+            for unSimp in self.dictTypesASSDorUserASSDCrees[clef]:
+                if not (isinstance(unSimp, Accas.SIMP)) : continue
+                texteDesUserASSD += unSimp.getXPathSansSelf() + " | "
+                #print (unSimp.getXPathSansSelf())
+                #texteFieldUnitaire='/'+self.code+":"+unSimp.nom
+                existeunUserASSD=1
+            if existeunUserASSD:
+                if existeASSD : texteDesFields = texteDesFields + texteDesUserASSD[0:-2] +"/>\n\t\t"
+                else: texteDesFields = texteDesUserASSD[0:-2]
+            #print (texteDesUserASSD)
+            #print (texteDesFields)
+            if texteDesFields != "" :
+                texteKeyRef  += producingASSDkeyRefDeclaration.format( clef ,texteDesFields)
+
+
+        # Pour le nom des key-ref en utilisation : la genealogie complete  ( une  key-ref par utilisation et on retrouve facilement la )
+        for clef in self.dictTypesASSDorUserASSDUtilises:
+            for unSimp in self.dictTypesASSDorUserASSDUtilises[clef]:
+                # il faut la genealogie
+                texteKeyRef  += UsingASSDkeyRefDeclaration.format(unSimp.getNomCompletAvecBloc(), unSimp.type[0].__name__,self.code, unSimp.type[0].__name__,unSimp.getXPathComplet() )
+
+        #PNPN on debranche les keyref le temps de bien reflechir a leur forme
+        #if texteKeyRef != '' :
+        #   self.texteXSD = self.texteXSD[0:-3]+'>\n'
+        #   self.texteXSD += texteKeyRef
+        #   self.texteXSD += fermeEltCata
+
+
+
+        #if not PourTraduction : print (self.texteXSD)
+
+        import pprint
+        #pprint.pprint (cata.dictTypesXSDJumeaux)
+        #for k in cata.dictTypesXSDJumeaux:
+        #    print (k.nom, k.nomComplet())
+        #    print (cata.dictTypesXSDJumeaux[k][0].nom, cata.dictTypesXSDJumeaux[k][0].nomComplet())
+
+        #pprint.pprint (cata.dictTypesXSD)
+        #for k in cata.dictTypesXSD:
+        #    print (k)
+        #    print (cata.dictTypesXSD)
+
+        dico = {}
+        for  k in list(cata.dictTypesXSD.keys()):
+            dico[k]={}
+            different=False
+            for definition in cata.dictTypesXSD[k] :
+                if definition.label  == 'BLOC' or  definition.label == 'BlocAmbigu':continue
+                if definition.nomDuTypePyxb != 'T_'+definition.nom : different=True
+                listeATraiter=[definition.geneaCompleteSousFormeDeListe(),]
+                while listeATraiter != [] :
+                    listeGenea=listeATraiter[0]
+                    listeATraiter=listeATraiter[1:]
+                    txtNomComplet=''
+                    indexMC=0
+                    for MC in listeGenea:
+                        txtNomComplet=txtNomComplet+'_'+MC.nom
+                        if MC in list(cata.dictTypesXSDJumeaux.keys()) :
+                            for MCJumeau in cata.dictTypesXSDJumeaux[MC]:
+                                # attention nvlleGenalogie n a pas de sens en Accas
+                                nvlleGenalogie=listeGenea[:indexMC]+MCJumeau.geneaCompleteSousFormeDeListe()
+                                listeATraiter.append(nvlleGenalogie)
+                        indexMC=indexMC+1
+                    dico[k][txtNomComplet]=definition.nomDuTypePyxb
+            if dico[k]== {} or (not different) : del dico[k]
+        import pprint
+        #pprint.pprint(dico)
+        # PN reflechir a ce *** de nom
+        #if dico != {} : self.texteXSD += texteAnnotation.format(self.nomDuCodeDumpe,str(dico))
+        if dico != {} : self.texteXSD += texteAnnotation.format(str(dico))
+
+        #import pprint
+        #if (not PourTraduction) and  (dico != {}) : pprint.pprint(dico)
+        print ('__________________________ decommenter pour le texteXSD________________________')
+        #print (dico)
+        #print (self.texteXSD)
+        self.texteXSD += texteFin
+        return self.texteXSD
+
+
+    def dumpLesCommandes(self):
+        cata = CONTEXT.getCurrentCata()
+        fichierCataSourceExt=os.path.basename(cata.cata.__file__)
+        fichierCataSource, extension=os.path.splitext(fichierCataSourceExt)
+        importCataSource=__import__(fichierCataSource,{},{})
+
+        texte=""
+        for m in sys.modules:
+            monModule=sys.modules[m]
+            try :
+                if m in ('os', 'sys', 'inspect', 'six', 'pickle', 'codecs')      : continue
+                if m in ('cPickle', 'pprint', 'dis', '_sre', 'encodings.aliases'): continue
+                if m in ('numbers', 'optparse', 'binascii', 'posixpath')         : continue
+                if m in ('_locale', '_sysconfigdata_nd', 'gc', 'functools')      : continue
+                if m in ('posixpath', 'types', 'posix', 'prefs')                 : continue
+                if m in ('warnings', 'types', 'posix', 'prefs')                  : continue
+                if monModule.__name__[0:15] == '_sysconfigdata_' : continue
+                if monModule.__name__ == '__future__' :  continue
+                if monModule.__name__[0:3] == 'Ihm'   :  continue
+                if monModule.__name__[0:5] == 'numpy' :  continue
+                if monModule.__name__[0:5] == 'Noyau' :  continue
+                if monModule.__name__[0:5] == 'Accas' :  continue
+                if monModule.__name__[0:7] == 'convert'       :  continue
+                if monModule.__name__[0:7] == 'Efi2Xsd'       :  continue
+                if monModule.__name__[0:7] == 'Editeur'       :  continue
+                if monModule.__name__[0:9] == 'generator'     :  continue
+                if monModule.__name__[0:10] == 'Validation'   :  continue
+                if monModule.__name__[0:10] == 'Extensions'   :  continue
+                if monModule.__name__[0:12] == 'InterfaceQT4' :  continue
+                if monModule.__name__ == fichierCataSource    :  continue
+                texte= texte + "try : import "+ monModule.__name__ + " \n"
+                texte= texte + "except : pass \n"
+                texte= texte + "try : from  "+ monModule.__name__ + ' import * \n'
+                texte= texte + "except : pass \n"
+            except :
+                pass
+
+        newModule=imp.new_module('__main__')
+        exec (texte, newModule.__dict__)
+        allClassToDump=[]
+        for i in dir(importCataSource):
+            if i not in dir(newModule):
+                allClassToDump.append(importCataSource.__dict__[i])
+
+
+        self.texteSimple = ''
+        self.texteComplexe = ''
+        for c in allClassToDump :
+            if not(isinstance(c, Accas.OPER)) and not(isinstance(c, Accas.PROC))  : continue
+            c.nomDuCodeDumpe=self.nomDuCodeDumpe
+            c.code=self.implement
+            c.dumpXsd()
+
+            self.texteSimple   += c.texteSimple
+            self.texteComplexe += c.texteComplexe
+            if  c.ang != '' : c.texteElt = eltEtapeWithHelp.format(c.nom,self.implement,c.nomDuTypePyxb,self.implement,c.ang)
+            elif c.fr != '' : c.texteElt = eltEtapeWithHelp.format(c.nom,self.implement,c.nomDuTypePyxb,self.implement,c.fr)
+            else : c.texteElt = eltEtape.format(c.nom,self.implement,c.nomDuTypePyxb,self.implement)
+            self.texteCata   += c.texteElt
diff --git a/Efi2Xsd/MCAccasXML.py b/Efi2Xsd/MCAccasXML.py
new file mode 100755 (executable)
index 0000000..06966aa
--- /dev/null
@@ -0,0 +1,682 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2021   EDF R&D
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+import sys,os
+import inspect
+import traceback
+def trace():
+    traceback.print_stack()
+#import raw.efficas as efficas
+import types
+
+sys.path.insert(0,os.path.abspath(os.path.join(os.getcwd(),'..')))
+
+try :
+    import pyxb
+    import pyxb.binding
+    import pyxb.binding.basis
+    #import pyxb.utils.utility
+    #import pyxb.utils.domutils
+except : pass
+
+from Accas import A_ASSD
+
+class X_OBJECT:
+# -------------
+
+    def delObjPyxb(self, debug=False):
+        if not self.cata or not self.cata.modeleMetier : return
+        if self.nom == 'Consigne' : return None
+        trouve = False
+
+        if debug : print ('--------------- in delObjPyxb pour ' , self.nom)
+        if debug : print (self.perePyxb.objPyxb.orderedContent())
+        if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
+
+        elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=self.perePyxb.objPyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
+        if debug : print ('element moi = ', elt, 'id de moi = ', id(self.objPyxb), self.objPyxb)
+        if (elt.elementDeclaration.isPlural()):
+            if debug : print ('je suis Plural')
+        #   monIndexInOrderedContent=0
+        #   for c in self.perePyxb.objPyxb.orderedContent():
+        #     if isinstance(c._Content__value,list) and  isinstance(c._Content__value[0], type(self.objPyxb)): monIndexInOrderedContent += 1
+        #   listeObjetsAccas=self.parent.getChild(self.nom,restreint='oui')
+        #   if len(listeObjetsAccas) == 1 : monIndex=0
+        #   else : monIndex=listeObjetsAccas.index(self)
+        #   listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
+        #   listeObjetsPyxb.pop(monIndex)
+        #   self.perePyxb.objPyxb.orderedContent().pop(monIndexInOrderedContent)
+            for c in self.perePyxb.objPyxb.orderedContent():
+                trouve=False
+                if isinstance(c._Content__value,list) and  isinstance(c._Content__value[0],type(self.objPyxb)):
+                    monIndex=c.value.index(self.objPyxb)
+                    trouve = True
+                if trouve : break
+            if not trouve : print ("************ pas trouve au delete"); return
+            listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
+            listeObjetsPyxb.pop(monIndex)
+            # si dernier ?
+        else :
+            newOrderedContent = []
+            for i in self.perePyxb.objPyxb.orderedContent():
+                if id(self.objPyxb) == id(i._Content__value) : trouve = True ;continue
+                newOrderedContent.append(i)
+            if not trouve : print ('elt a supprimer ', self.nom, 'non trouve')
+            for i in range(len(newOrderedContent)):
+                self.perePyxb.objPyxb.orderedContent()[i]=newOrderedContent[i]
+            self.perePyxb.objPyxb.orderedContent().pop(len(newOrderedContent))
+
+            setattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key,None)
+            if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
+
+
+
+    def addObjPyxb(self,indiceDsLeContenu,debug=False):
+        if not self.cata or not self.cata.modeleMetier : return
+        if debug :print ('_____________ addObjPyxb ds X_OBJECT', self.nom, indiceDsLeContenu)
+        # adherence Accas sur le parent
+        parent=self.parent
+        while (parent.isBLOC()):
+            if parent != self.parent : indiceDsLeContenu += parent.rangDsPyxb()
+            parent=parent.parent
+        self.perePyxb=parent
+
+        if debug :print ('indiceDsLeContenu',indiceDsLeContenu)
+        if debug :print (pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
+
+        #if self.objPyxb ! = None : self.objPyxb.objAccas=self
+        elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=self.perePyxb.objPyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
+        self.perePyxb.objPyxb.orderedContent().insert(indiceDsLeContenu,elt)
+        if (elt.elementDeclaration.isPlural()):
+        # je suis donc un MCList
+            listeObjetsAccas=self.parent.getChild(self.nom,restreint='oui')
+            if len(listeObjetsAccas) == 1 : monIndex=1
+            else : monIndex=listeObjetsAccas.index(self)
+            listeObjetsPyxb=getattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key)
+            listeObjetsPyxb.insert(monIndex,self.objPyxb)
+        else :
+            setattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key,self.objPyxb)
+        if debug : print (list(map(lambda o:o.value, self.perePyxb.objPyxb.orderedContent())))
+        if debug : print ('fin _____________ addObjPyxb ds X_OBJECT', self.nom, indiceDsLeContenu)
+
+
+    def rangDsPyxb(self):
+        monRangEnAccas=self.parent.mcListe.index(self)
+        rangEnPyxb=0
+        for frere in self.parent.mcListe[0: monRangEnAccas] :
+            rangEnPyxb += frere.longueurDsArbre()
+        return rangEnPyxb
+
+
+class X_MCSIMP(X_OBJECT):
+# -----------------------
+
+    def buildObjPyxb(self, debug=True) :
+        if not self.cata or not self.cata.modeleMetier : return
+        if self.nom == 'Consigne' : return None
+        if debug : print (self.definition.nomComplet())
+        if debug : print ('_______________ X_MCSIMP buildObjPyxb', self.nom, self,self.valeur)
+        if debug and self.objPyxbDeConstruction == None : print (self.nom, ' pas de pyxb')
+        elif debug : print ('objPyxbDeConstruction', self.objPyxbDeConstruction)
+
+        if self.objPyxbDeConstruction != None :
+            self.objPyxb = self.objPyxbDeConstruction
+            self.maClasseModeleMetier =type(self.objPyxb)
+            self.objPyxbDeConstruction = None
+            if issubclass(self.maClasseModeleMetier, self.cata.modeleMetier.pyxb.binding.basis.STD_union):
+                self.needFactory=True
+                self.maClasseModeleMetierFactory=getattr(self.maClasseModeleMetier,'Factory')
+            else : self.needFactory=False
+        else :
+            self.monNomClasseModeleMetier ='T_'+self.nom
+            if hasattr(self.definition,'nomXML') and self.definition.nomXML != None : self.monNomClasseModeleMetier='T_'+self.definition.nomXML
+            if self.monNomClasseModeleMetier in list(self.cata.DicoNomTypeDifferentNomElt.keys()) :
+                nomComplet=self.definition.nomComplet()
+                if nomComplet in list(self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier].keys()):
+                    self.monNomClasseModeleMetier=self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier][nomComplet]
+            if debug : print ('Pour', self.nom, ' le type est ', self.monNomClasseModeleMetier)
+            self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
+
+            if self.waitMatrice() :
+               #PNPN : Attention rien ne relie les objets listeObjPyxb a un objAccas
+               # 27/04 je ne sais pas si cela posera pb
+               self.listeLines = []
+               self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
+               self.maClasseModeleMetier_line=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier+'_line')
+               if debug : print ('Matrice  de type ', self.maClasseModeleMetier)
+               for v in self.valeur: 
+                   l=self.maClasseModeleMetier_line(v)
+                   self.listeLines.append(l)
+               self.objPyxb=self.maClasseModeleMetier(*self.listeLines)
+               #if self.objPyxb !=None : self.objPyxb.objAccas=self
+               if debug : print ('Matrice ', self.nom, self.objPyxb)
+               return
+            if self.waitTuple() :
+               self.objPyxb = []
+               self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
+               # if faut traiter l autre cas
+               # et optimiser
+               if self.definition.max !=1 :
+                  for v in self.valeur :
+                    if debug : print ('je traite ', v)
+                    listeConstruction=[]
+                    for i in range(self.combienEltDsTuple()):
+                        num=i+1
+                        maClasseElt=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier+'_n'+str(num))
+                        listeConstruction.append(maClasseElt(v[i]))
+                    self.objPyxb.append(self.maClasseModeleMetier(*listeConstruction))
+                    if debug  : print (self.objPyxb)
+                  return
+            if self.waitChaineAvecBlancs() and self.definition.max > 1:
+               self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
+               if debug : print (self.valeur)
+               if self.valeur != None and self.valeur != [] : self.objPyxb = self.maClasseModeleMetier(*self.valeur)
+               else :self.objPyxb = self.maClasseModeleMetier()
+               if debug : print ('X_MCSIMP', self.nom, self.objPyxb, )
+               if debug : print ('__________ fin X_MCSIMP', self.objPyxb, self.nom, self, self.maClasseModeleMetier,self.valeur)
+               return
+
+                        
+            if issubclass(self.maClasseModeleMetier, self.cata.modeleMetier.pyxb.binding.basis.STD_union):
+                if debug : print ('needFactory')
+                self.needFactory=True
+                self.maClasseModeleMetierFactory=getattr(self.maClasseModeleMetier,'Factory')
+            else : self.needFactory=False
+
+            if self.valeur != None :
+                if self.needFactory :
+                    if self.definition.max > 1 :
+                       # PNPN A corriger 
+                       # self.objPyxb=self.maClasseModeleMetier(self.valeur)
+                            self.objPyxb=self.maClasseModeleMetierFactory(self.valeur)
+                    else :  self.objPyxb=self.maClasseModeleMetierFactory(self.valeur)
+                else                :  self.objPyxb=self.maClasseModeleMetier(self.valeur)
+            else                   :
+                if self.needFactory : self.objPyxb=None
+                else                : self.objPyxb=self.maClasseModeleMetier(_validate_constraints=False)
+
+
+            #if self.objPyxb !=None : self.objPyxb.objAccas=self
+        if debug : print ('X_MCSIMP', self.nom, self.objPyxb, )
+        if debug : print ('__________ fin X_MCSIMP', self.objPyxb, self.nom, self, self.maClasseModeleMetier,self.valeur)
+
+
+    def setValeurObjPyxb(self,newVal, debug=True):
+        if not self.cata or not self.cata.modeleMetier : return
+        if debug : print (' ___________________________ dans setValeurObjPyxb MCSIMP ', self.nom, newVal)
+        if debug : print (' self.perePyxb = ', self.perePyxb.nom)
+        if debug : print (self.nom , ' a pour pere', self.perePyxb, self.perePyxb.nom, self.perePyxb.objPyxb)
+        if debug : print ('debut du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
+
+        #if newVal != None : nvlObj=self.maClasseModeleMetier(newVal)
+        if newVal != None :
+            if self.needFactory : nvlObj=self.maClasseModeleMetierFactory(newVal)
+            else                : nvlObj=self.maClasseModeleMetier(newVal)
+        else                   :
+            if self.needFactory : nvlObj =None
+            else                : nvlObj=self.maClasseModeleMetier(_validate_constraints=False)
+        self.val=newVal
+        if debug : print ('fin du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
+
+        if inspect.isclass(newVal) and issubclass(newVal,A_ASSD)  :
+            newVal = newVal.nom
+        setattr(self.perePyxb.objPyxb,self.nom,nvlObj)
+        trouve=False
+        indice=0
+        for i in self.perePyxb.objPyxb.orderedContent():
+            if i.elementDeclaration.id() == self.nom:
+            #if isinstance(i._Content__value, self.maClasseModeleMetier) :
+                self.perePyxb.objPyxb.orderedContent()[indice]=self.perePyxb.objPyxb.orderedContent()[-1]
+                del(self.perePyxb.objPyxb.orderedContent()[-1])
+                trouve=True
+                break
+            indice+=1
+        if not trouve : print ('Attention souci au changement de valeur de ', self.nom)
+        self.objPyxb=nvlObj
+        #self.objPyxb.objAccas=self
+        if debug : print ('fin du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
+
+
+
+
+class X_MCCOMPO(X_OBJECT) :
+# -------------------------
+#
+    def buildObjPyxb(self,mc_list, debug=False) :
+        if not self.cata or not self.cata.modeleMetier : return
+
+        #if self.nom == 'Scenario_data' : debug=1
+        if debug : print ('X_MCCOMPO', self.nom)
+        deepDebug=False
+        self.listArg=[]
+        self.dicoArg={}
+        for objAccas in mc_list :
+            if objAccas.nature == 'MCBLOC' :
+                self.exploreBLOC(objAccas)
+            elif objAccas.nature == 'MCList' :
+                if objAccas[0].definition.max > 1 :
+                    self.listArg.append(objAccas) # les MCList n ont pas objPyxb
+                    self.dicoArg[objAccas.nom]=[]
+                    for fils in objAccas :
+                        fils.perePyxb=self
+                        self.dicoArg[objAccas.nom].append(fils.objPyxb)
+                else :
+                    objAccas[0].perePyxb=self
+                    self.dicoArg[objAccas.nom]=objAccas[0].objPyxb
+                    self.listArg.append(objAccas[0].objPyxb)
+            else :
+                if objAccas.nom == 'Consigne'     : continue
+                print ('______________', objAccas.nom, objAccas.objPyxb)
+                self.listArg.append(objAccas.objPyxb)
+                self.dicoArg[objAccas.nom]=objAccas.objPyxb
+                objAccas.perePyxb=self
+
+        if debug : print('X_MCCOMPO -- listArg ---',self.nom,self.listArg)
+        if debug : print('X_MCCOMPO -- dicoArg ---',self.nom,self.dicoArg)
+
+
+        self.monNomClasseModeleMetier='T_'+self.nom
+        if self.monNomClasseModeleMetier in list(self.cata.DicoNomTypeDifferentNomElt.keys()) :
+            self.nomComplet=self.definition.nomComplet()
+            self.monNomClasseModeleMetier=self.cata.DicoNomTypeDifferentNomElt[self.monNomClasseModeleMetier][self.nomComplet]
+        self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
+
+        # PN : Ne doit-on pas tester avant
+        if self.objPyxbDeConstruction != None :
+            self.objPyxb = self.objPyxbDeConstruction
+            self.objPyxbDeConstruction = None
+            if debug : print ('je passe dans le if pour ', self.nom, self.objPyxb, self)
+            if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb,self.listArg,self.objPyxb.orderedContent())
+        else :
+            if debug : print (self.listArg)
+            if debug : print (self.maClasseModeleMetier)
+            # self.objPyxb=self.maClasseModeleMetier(*self.listArg)
+            self.objPyxb=self.maClasseModeleMetier(**self.dicoArg)
+            if deepDebug :
+                print ('debut de __________ new ordered content')
+                for o in self.objPyxb.orderedContent():
+                    print ('o', o)
+                    print ('value', o.value)
+                    print ('type', type(o.value))
+                    print ('id', id(o.value))
+                print ('fin __________ new ordered content')
+                print ('debut de  __________ listArg')
+                for obj in self.listArg:
+                    print ('obj',obj)
+                    print ('type obj', type(obj))
+                    print ('id(obj)', id(obj))
+                print ('fin __________  listArg')
+
+            newOrderedContent=[]
+            if debug  : print ('list Arg')
+            for obj in self.listArg:
+                if debug :
+                    print ('obj',obj)
+                    print ('type obj', type(obj))
+                    print ('id(obj)', id(obj))
+
+                # on teste le caractere pluriel
+                if  isinstance(obj, list):
+                    for c in self.objPyxb.orderedContent() :
+                        if hasattr (c,'value') and c.value == obj :
+                           newOrderedContent.append(c)
+                    continue
+                if (hasattr(obj, 'nature')) : # attention on a un object Accas et non un pyxb car les MCList n ont pas de objPyxb
+                    max=obj[0].definition.max
+                else : max = 1
+                if  max == 1 :
+                    #if not(issubclass(type(obj), pyxb.binding.basis.enumeration_mixin) ):
+                    #   newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:id(o.value), self.objPyxb.orderedContent())).index(id(obj))] )
+                    #else :
+                    #   newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:type(o.value), self.objPyxb.orderedContent())).index(type(obj))] )
+                    # PN 22 sept 2020 . pourquoi pas toujours l id. le tyoe ne convient pas en cas d union d enum
+                    newOrderedContent.append(self.objPyxb.orderedContent()[list(map(lambda o:id(o.value), self.objPyxb.orderedContent())).index(id(obj))] )
+                else  : # element Pural
+                    for c in self.objPyxb.orderedContent() :
+                        if isinstance(c._Content__value,list) and  isinstance(c._Content__value[0], type(obj[0].objPyxb)): newOrderedContent.append(c)
+
+            for i in range(len(self.listArg)):
+                self.objPyxb.orderedContent()[i]=newOrderedContent[i]
+            debug=True
+            if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb)
+            if debug : print ('X_MCCOMPO', self.listArg)
+            if debug : print ('X_MCCOMPO', newOrderedContent)
+            if debug : print ( 'X_MCCOMPO',self.objPyxb.orderedContent())
+        if debug : print ('fin buildObjetPyxb _______________________________________')
+        # assert(self.objPyxb.validateBinding())
+
+
+    def exploreBLOC(self,objAccas,debug=False):
+        if debug : print (' ds exploreBLOC', objAccas.nom)
+        laListeSsLesBlocs=[]
+        for fils in objAccas.mcListe:
+            if fils.nature == 'MCBLOC' :
+                self.exploreBLOC(fils)
+            elif fils.nature == 'MCList' :
+                #print ('exploreBLOC des MCList', fils.nom)
+                self.dicoArg[fils.nom]=[]
+                if fils[0].definition.max > 1 :
+                    #print ('ajout de ', fils)
+                    self.listArg.append(fils) # les MCList n ont pas objPyxb
+                    for objFils in fils :
+                        objFils.perePyxb=self
+                        self.dicoArg[fils.nom].append(objFils.objPyxb)
+                else:
+                    fils[0].perePyxb=self
+                    self.dicoArg[fils.nom]=fils[0].objPyxb
+                    self.listArg.append(fils[0].objPyxb)
+            else :
+                if fils.nom == "Consigne" : continue
+                self.listArg.append(fils.objPyxb)
+                self.dicoArg[fils.nom]=fils.objPyxb
+                fils.perePyxb=self
+                if debug : print (fils.nom ,' est un SIMP a pour pere Pyxb', self, self.nom)
+        if debug : print ('fin  ds exploreBLOC', objAccas .nom)
+
+
+
+
+class X_MCBLOC (X_MCCOMPO):
+# --------------------------
+    def buildObjPyxb(self,mc_list,debug=False):
+        if not self.cata or not self.cata.modeleMetier : return
+        if debug : print ('X_MCBLOC buildObjPyxb', self.nom, self, mc_list, 'ne fait rien')
+        self.perePyxb=None
+        self.objPyxb=None
+
+    def addObjPyxb(self, indiceDsLeContenu, debug=False):
+        if not self.cata or not self.cata.modeleMetier : return
+        if debug : print ('X_MCBLOC addObjPyxb', self.nom, self, self.mcListe, indiceDsLeContenu)
+        rangDeLObjet=indiceDsLeContenu
+        for obj in self.mcListe:
+            obj.addObjPyxb( rangDeLObjet)
+            rangDeLObjet=rangDeLObjet+obj.longueurDsArbre()
+
+    def delObjPyxb(self, debug=False):
+        if not self.cata or not self.cata.modeleMetier : return
+        if debug : print ('X_MCBLOC delObjPyxb', self.nom, ' --------------------------')
+        for obj in self.mcListe:
+            obj.delObjPyxb()
+        if debug : print ('fin X_MCBLOC delObjPyxb --------------------------')
+
+class X_MCLIST (X_MCCOMPO):
+# --------------------------
+
+    def buildObjPyxb(self,mc_list, debug=False):
+        if debug : print ('X_MCLIST buildObjPyxb ne fait rien', self.nom, self, mc_list)
+        pass
+
+    def addObjPyxb(self,indiceDsLeContenu, debug=False):
+        if debug : print ('X_MCLIST addObjPyxb', self.nom, indiceDsLeContenu)
+        rangDeLObjet=indiceDsLeContenu
+        for objFils in self :
+            objFils.addObjPyxb(rangDeLObjet)
+            rangDeLObjet= rangDeLObjet + 1
+
+    def delObjPyxb(self, debug=False):
+        if not self.cata or not self.cata.modeleMetier : return
+        if debug : print ('X_MCLIST delObjPyxb', self.nom, ' --------------------------')
+        for obj in self:
+            obj.delObjPyxb()
+        if debug : print ('fin X_MCLIST delObjPyxb --------------------------')
+
+
+class X_MCFACT (X_MCCOMPO):
+# -------------------------
+    pass
+
+class X_ETAPE(X_MCCOMPO) :
+# -------------------------
+
+    def metAJourNomASSD(self, nom,debug=False):
+        if not self.cata or not self.cata.modeleMetier : return
+        if debug : print ('X_ETAPE metAJourLesAttributs', self.nom, nom,' --------------------------')
+        self.objPyxb.sdName=nom
+
+class X_JDC (X_MCCOMPO):
+# ---------------------
+
+    def  __init__(self):
+        self.perePyxb=None
+        if not self.cata or not self.cata.modeleMetier : return
+        #if hasattr(self.cata,'DicoNomTypeDifferentNomElt') : print ('jkllllllllllllllll')
+        if not(hasattr(self.cata,'DicoNomTypeDifferentNomElt')) : self.cata.DicoNomTypeDifferentNomElt={}
+        self.monNomClasseModeleMetier=self.code
+        self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
+        self.objPyxb=self.maClasseModeleMetier()
+        #self.objPyxb.objAccas=self
+        pyxb.GlobalValidationConfig._setContentInfluencesGeneration(pyxb.GlobalValidationConfig.NEVER)
+        pyxb.GlobalValidationConfig._setInvalidElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION)
+        pyxb.GlobalValidationConfig._setOrphanElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION)
+
+
+
+    def enregistreEtapePyxb(self,etape,indice=0):
+      # ne fonctionne pas : a reecrire avec les fonctions addObjPyxb et ReconstruitPerePyxb
+      # ne contient pas indice pour l insant
+      # print ( 'hhhhhhhhhhhhhhh enregistreEtapePyxb hhhhhhhhhhhhhhhhhhhhhhhhh')
+      # print ('enregistre ds ',self, etape.nom, 'indice = ', indice)
+        if not self.cata.modeleMetier : return
+        self.objPyxb.append(etape.objPyxb)
+        etape.perePyxb = self
+
+        #print (self.objPyxb.orderedContent())
+        #if indice   != (len(self.objPyxb.orderedContent()) ) :
+        #  tampon=self.objPyxb.orderedContent()[-1]
+        #  for i in reversed(range(len(self.objPyxb.orderedContent()))):
+        #    self.objPyxb.orderedContent()[i]=self.objPyxb.orderedContent()[i-1]
+        #    if i == indice + 1 : break
+        #  self.objPyxb.orderedContent()[indice]=tampon
+
+        #print (self.objPyxb.orderedContent())
+        #try:
+        #   self.objPyxb.validateBinding()
+        #except pyxb.ValidationError as e:
+        #   print(e.details())
+
+    def toXml(self,fichier=None, debug=False):
+        if debug : print ('ds to XML')
+        if not self.cata or not self.cata.modeleMetier : return
+        if debug : print (' to xml ***************',self.objPyxb,'***************',)
+        if debug : print (' to xml ***************',self,'***************',)
+        if debug : print (' to xml ***************',self.objPyxb.orderedContent(),'***************',)
+        if debug : print(self.objPyxb.toDOM().toprettyxml())
+        if debug : print(self.objPyxb.toxml())
+        return (self.objPyxb.toDOM().toprettyxml())
+
+
+    def analyseFromXML(self,debug=False):
+        print ("je suis ds analyseFromXML -- > appel ds analyseXML de I_JDC.py")
+        if self.procedure == "" : return
+        self.objPyxb=self.cata.modeleMetier.CreateFromDocument(self.procedure)
+        if not hasattr(self.cata.modeleMetier,'AccasUserAssd'):
+            from Accas import UserASSD
+            self.cata.modeleMetier.AccasUserAssd=UserASSD
+        for contentObjEtape in self.objPyxb.orderedContent():
+            objEtape=contentObjEtape.value
+            objEtape.dictArgs=(self.pyxbToDict(objEtape))
+            objEtape.monNomClasseAccas=objEtape._ExpandedName.localName()
+            objEtape.monNomClasseAccas=objEtape.monNomClasseAccas[2:]
+            # doute sur les 2 lignes suivantes : objEtape peut etre contentObjEtape 2juin20
+            objEtape.dictPyxb['objEnPyxb']=objEtape
+            objEtape.dictArgs['dicoPyxbDeConstruction']=objEtape.dictPyxb
+            if debug : print ('dicoPyxbDeConstruction', objEtape.dictArgs['dicoPyxbDeConstruction'])
+            maClasseAccas=getattr(self.cata,objEtape.monNomClasseAccas)
+            if debug : print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
+            if debug : print ('maClasseAccas ', maClasseAccas)
+            if debug : print ('objEtape ', objEtape , type(objEtape))
+            if debug : print ('nomClasseAccas ',objEtape.monNomClasseAccas, type(objEtape.monNomClasseAccas))
+            if debug : print ('_ExpandedName ', objEtape._ExpandedName, type(objEtape._ExpandedName))
+            if debug : print ('dictArgs ',objEtape.dictArgs)
+            if debug : print ('dictPyxb ',objEtape.dictPyxb)
+            # attention au call d Oper qui renomme l objet pyxb
+            if hasattr(objEtape,'sdName') :
+                if debug and hasattr(objEtape,'sdName') :print ('sdName',objEtape.sdName)
+                objAccasEtape=maClasseAccas(nomXML=objEtape.sdName, **(objEtape.dictArgs))
+            else : objAccasEtape=maClasseAccas(**(objEtape.dictArgs))
+            if debug : print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
+
+
+    def pyxbToDict(self,objAAnalyser, debug=True):
+        # la transformation de l objAAnalyser en type lu par eficas ne fonctionne pas pour tout
+        if objAAnalyser is None: return
+        if debug : print ('debut pour_____________________________ ',objAAnalyser)
+        dictArgs = {}
+        # traitement SIMP
+        # ---------------
+        # a revoir pour les matrices
+        # et les tuples
+        debug = 1
+        if isinstance(objAAnalyser, pyxb.binding.basis.simpleTypeDefinition):
+            if debug : print ('je suis un MCSimple', objAAnalyser)
+            # traitement scalaire
+            objAAnalyser.dictPyxb=objAAnalyser
+            if not (isinstance(objAAnalyser,pyxb.binding.basis.STD_list)):
+                if debug :  print ('je suis un scalaire')
+                if isinstance(objAAnalyser,self.cata.modeleMetier.AccasUserAssd) or isinstance(objAAnalyser,self.cata.modeleMetier.AccasUserAssdMultiple):
+                    if debug : print ('je suis un UserASSD')
+                    laClassePyxbUserAssd=type(objAAnalyser)
+                    return self.creeUserAssd(objAAnalyser,laClassePyxbUserAssd)
+                if isinstance(objAAnalyser, pyxb.binding.datatypes.boolean) : return bool(objAAnalyser)
+                if isinstance(objAAnalyser, str)  : return str(objAAnalyser)
+                if isinstance(objAAnalyser, int)  : return int(objAAnalyser)
+                if isinstance(objAAnalyser, float): return float(objAAnalyser)
+                if isinstance(objAAnalyser, pyxb.binding.basis.enumeration_mixin):    return str(objAAnalyser)
+                return objAAnalyser
+            else :
+                if debug : print ('je suis une liste')
+                laListe=[]
+                # liste homogene
+                if len(objAAnalyser)>0:
+                    if issubclass(objAAnalyser[0].__class__,self.cata.modeleMetier.AccasUserAssd) or issubclass(objAAnalyser[0].__class__,self.cata.modeleMetier.AccasUserAssdMultiple): estUnUserASSDorUserASSDMultiple = True
+                    else : estUnUserASSDorUserASSDMultiple=False
+                else : estUnUserASSDorUserASSDMultiple=False
+                if debug : print ('estUnUserASSDorUserASSDMultiple', estUnUserASSDorUserASSDMultiple)
+                for obj in objAAnalyser :
+                    if estUnUserASSDorUserASSDMultiple:
+                       laClassePyxbUserAssd=obj.__class__
+                       laListe.append(self.creeUserAssd(obj,laClassePyxbUserAssd))
+                    elif isinstance(obj, str): laListe.append (str(obj))
+                    elif isinstance(obj, int): laListe.append (int(obj))
+                    elif isinstance(obj, float): laListe.append (float(obj))
+                    elif isinstance(obj, pyxb.binding.basis.enumeration_mixin): laListe.append(str(obj))
+                    else :  laListe.append(obj)
+                return (laListe)
+            #  if debug : print ('je suis Plural')
+            # ou ? return objAAnalyser
+            #if isinstance(objAAnalyser, types.StringTypes): return pyxb.utils.utility.QuotedEscaped(objAAnalyser,)
+            #pour une enum getattr(value dans le type)
+            # return pythonLiteral(ReferenceFacet(facet=value, **kw))
+        #print ('je suis un mot complexe')
+        # traitement FACT ou BLOC
+        # ------------------------
+        # il faut traiter les fact multiples
+        objAAnalyser.dictPyxb = {}
+        objAAnalyser.dictPyxb['objEnPyxb']=objAAnalyser
+        #for expandedName, elementDeclaration in objAAnalyser._ElementMap.items():
+        #    objPyxbName  = expandedName.localName()
+        #    objPyxbValue = getattr(objAAnalyser, objPyxbName)
+        for objEltContentFils in objAAnalyser.orderedContent():
+            objPyxbValue = objEltContentFils.value
+            objPyxbName  = objEltContentFils.elementDeclaration.id()
+            elementDeclaration = objEltContentFils.elementDeclaration
+            #if objPyxbValue == None or objPyxbValue == [] : continue
+            if elementDeclaration.isPlural():
+                if objPyxbName not in list(dictArgs.keys()) : dictArgs[objPyxbName]=[]
+                if objPyxbName not in list(objAAnalyser.dictPyxb.keys()) : objAAnalyser.dictPyxb[objPyxbName]=[]
+                dictArgs[objPyxbName].append(self.pyxbToDict(objPyxbValue))
+                objAAnalyser.dictPyxb[objPyxbName].append(objPyxbValue.dictPyxb)
+            else:
+                dictArgs[objPyxbName] = self.pyxbToDict(getattr(objAAnalyser, objPyxbName))
+                objAAnalyser.dictPyxb[objPyxbName] = objPyxbValue.dictPyxb
+                # print ('ajout dans dictPyxb', objPyxbName, objPyxbValue.dictPyxb)
+                #print ('avec la valeur', 'de',  objAAnalyser.dictPyxb[objPyxbName])
+
+        #print ("***********************************")
+        #print ('pyxbToDict  fin pour ********** ', objAAnalyser)
+        #print ('pyxbToDict ', objAAnalyser, objAAnalyser.dictPyxb)
+        #print ('pyxbToDict  fin pour ********** ', objAAnalyser)
+        #print ("***********************************")
+        #print (dictArgs)
+        #print (dictPyxb)
+        #for i in dictArgs.keys(): print (i, " ", dictArgs[i], " ", type(dictArgs[i]))
+        #print ('fin pour ',objAAnalyser)
+        return dictArgs
+
+    def creeUserAssd(self,objAAnalyser,laClassePyxbUserAssd,debug=True):
+
+        enCreation=False
+        if debug : print ('creeUserAssd ', objAAnalyser, ' ',laClassePyxbUserAssd)
+        leTypeIntermediaire=laClassePyxbUserAssd.XsdSuperType()  
+        if debug : print ('leTypeIntermediaire ', leTypeIntermediaire)
+        if debug : print ('leTypeIntermediaire ', leTypeIntermediaire.XsdSuperType())
+        if leTypeIntermediaire.__name__[-2:]== '_C' : enCreation = True
+        elif leTypeIntermediaire.__name__[-2:] != '_U' : print ('pb avec', laClassePyxbUserAssd); return None #exit() 
+        nomClasseAccasUserAssd=leTypeIntermediaire.XsdSuperType().__name__
+        if debug : print ('nomClasseAccasUserAssd', nomClasseAccasUserAssd)
+        laClasseAccas=getattr(self.cata,nomClasseAccasUserAssd)
+        print (laClasseAccas)
+        if not(enCreation):
+            if str(objAAnalyser) in self.g_context.keys():return self.g_context[str(objAAnalyser)]
+            else :
+                obj=laClasseAccas()
+                self.g_context[str(objAAnalyser)]=obj
+                return obj
+        if str(objAAnalyser) in self.g_context.keys():
+            if isinstance(self.g_context[str(objAAnalyser)],laClasseAccas):
+                return self.g_context[str(objAAnalyser)]
+            else :
+                nvlObj=laClasseAccas()
+                oldObj=self.g_context[str(objAAnalyser)]
+                nvlObj.transfere(oldObj)
+                self.g_context[str(objAAnalyser)]=nvlObj
+                return nvlObj
+        else :
+            obj=laClasseAccas()
+            self.g_context[str(objAAnalyser)]=obj
+            return obj
+
+#   def analyseContent(self,objAAnalyser):
+#       objAAnalyser.dictArgs={}
+#       for objContenu in objAAnalyser.content():
+#          #print ('j analyse ', objContenu)
+#          objContenu.monNomClasseModeleMetier=str(objContenu.__class__).split('.')[-1]
+#          objContenu.monNomClasseAccas=objContenu.monNomClasseModeleMetier[2:-2]
+#          #maClasseAccas=classeAccasPere.entites[objContenu.monNomClasseAccas]
+#          if objContenu._IsSimpleTypeContent():
+#             print (objContenu.monNomClasseAccas,objContenu.pythonLiteral())
+#             print (objContenu.monNomClasseAccas,objContenu.xsdLiteral())
+#             #chaine=objContenu.pythonLiteral().split('(')[1].split(')')[0]
+#             print (dir(objContenu))
+#             objAAnalyser.dictArgs[objContenu.monNomClasseAccas]=None
+#             #objAAnalyser.dictArgs[objContenu.monNomClasseAccas]=objContenu.pythonLiteral()
+#          else :
+#             self.analyseContent(objContenu)
+#             objAAnalyser.dictArgs[objContenu.monNomClasseAccas]=objContenu.dictArgs
+            #print ( '________________')
+            #print (objAAnalyser.monNomClasseAccas)
+            #for i in objAAnalyser.dictArgs : print (i, objAAnalyser.dictArgs[i])
+            #print ( '________________')
+
+
+
+if __name__ == "__main__":
+    print ('a faire')
diff --git a/Efi2Xsd/balisesXSD.py b/Efi2Xsd/balisesXSD.py
new file mode 100644 (file)
index 0000000..a9becb5
--- /dev/null
@@ -0,0 +1,149 @@
+texteDebut='<?xml version="1.0" encoding="UTF-8"?>\n<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"\nxmlns="http://chercheurs.edf.com/logiciels/{}"\nxmlns:{}="http://chercheurs.edf.com/logiciels/{}"\ntargetNamespace="http://chercheurs.edf.com/logiciels/{}"\nelementFormDefault="qualified" attributeFormDefault="unqualified" version="0">\n'
+texteDebutNiveau2='<?xml version="1.0" encoding="UTF-8"?>\n<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"\nxmlns="http://chercheurs.edf.com/logiciels/{}"\nxmlns:{}="http://chercheurs.edf.com/logiciels/{}"\nxmlns:{}="http://chercheurs.edf.com/logiciels/{}"\ntargetNamespace="http://chercheurs.edf.com/logiciels/{}"\nelementFormDefault="qualified" attributeFormDefault="unqualified" version="0">\n'
+texteDebutNiveau3='<?xml version="1.0" encoding="UTF-8"?>\n<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"\nxmlns="http://chercheurs.edf.com/logiciels/{}"\nxmlns:{}="http://chercheurs.edf.com/logiciels/{}"\nxmlns:{}="http://chercheurs.edf.com/logiciels/{}"\nxmlns:{}="http://chercheurs.edf.com/logiciels/{}"\ntargetNamespace="http://chercheurs.edf.com/logiciels/{}"\nelementFormDefault="qualified" attributeFormDefault="unqualified" version="0">\n'
+texteFin='</xs:schema>'
+
+#texteAnnotation= '\t<xs:simpleType name="PNEFdico_{}">\n\t\t<xs:annotation>\n\t\t<xs:documentation>{}\n\t\t</xs:documentation>\n\t\t</xs:annotation>\n\t<xs:restriction base="xs:string"></xs:restriction>\n\t</xs:simpleType>\n'
+texteAnnotation= '\t<xs:simpleType name="PNEFdico">\n\t\t<xs:annotation>\n\t\t<xs:documentation>{}\n\t\t</xs:documentation>\n\t\t</xs:annotation>\n\t<xs:restriction base="xs:string"></xs:restriction>\n\t</xs:simpleType>\n'
+
+# SIMP
+debutSimpleType      = '\t<xs:simpleType name="{}">\n'
+debutSimpleTypeSsNom = '\t<xs:simpleType>\n'
+fermeSimpleType      = '\t</xs:simpleType>\n'
+debutRestrictionBase = '\t\t<xs:restriction base="{}">\n'
+fermeRestrictionBase = '\t\t</xs:restriction>\n'
+enumeration          = '\t\t\t<xs:enumeration value="{}"/>\n'
+maxInclusiveBorne    = '\t\t\t<xs:maxInclusive value = "{}"/>\n'
+minInclusiveBorne    = '\t\t\t<xs:minInclusive value = "{}"/>\n'
+
+debutTypeSimpleListe = '\t\t<xs:restriction>\n\t\t\t<xs:simpleType>\n\t\t\t\t<xs:list>\n\t\t\t\t\t<xs:simpleType>\n'
+finTypeSimpleListe   = '\t\t</xs:restriction>\n\t\t\t</xs:simpleType>\n\t\t\t\t</xs:list>\n\t\t\t\t\t</xs:simpleType>\n'
+fermeBalisesMileu    = '\t\t\t\t\t\t</xs:restriction>\n\t\t\t\t\t</xs:simpleType>\n\t\t\t\t</xs:list>\n\t\t\t </xs:simpleType>\n'
+
+maxLengthTypeSimple   = '\t\t\t<xs:maxLength value = "{}"/>\n'
+minLengthTypeSimple   = '\t\t\t<xs:minLength value = "{}"/>\n'
+eltDsSequence         = '\t\t\t<xs:element name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}"/>\n'
+eltDsSequenceWithHelp = '\t\t\t<xs:element name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}">\n\t\t\t\t<xs:annotation>\n\t\t\t\t\t<xs:documentation>{}</xs:documentation>\n\t\t\t\t</xs:annotation>\n\t\t\t</xs:element>\n'
+eltDsSequenceWithDefautAndHelp  = '\t\t\t<xs:element name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}" default="{}">\n\t\t\t\t<xs:annotation>\n\t\t\t\t\t<xs:documentation>{}</xs:documentation>\n\t\t\t\t</xs:annotation>\n\t\t\t</xs:element>\n'
+eltDsSequenceWithDefaut    = '\t\t\t<xs:element name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}" default="{}"/>\n'
+UsingASSDkeyRefDeclaration = '\n\t<xs:keyref name="{}_Name_ref_a{}" refer="{}:Key_Name_For_{}"> \n\t\t<xs:selector xpath="{}"/>\n\t\t<xs:field xpath="."/>\n\t</xs:keyref>\n'
+#    <xs:key name="Key_Name_For_ElementarySurface">
+#            <xs:selector xpath="./Vimmp:CDM/Vimmp:Geometric_Domain/Vimmp:Surface"/>
+#            <xs:field    xpath="./Vimmp:SurfaceName"/>
+#        </xs:key>
+
+     #<xs:keyref name="MyField_Ref_A_CreateMesh" refer="Test1:Key_Name_In_ReadMesh_CreateMesh">
+     #<xs:selector xpath="./Test1:MyField/Test1:onMesh"/>
+
+
+
+
+# COMPO
+debutTypeCompo      = '\t<xs:complexType name="{}" >\n'
+debutTypeCompoEtape = '\t <xs:complexContent>\n\t  <xs:extension base="T_step_{}">\n'
+finTypeCompoEtape   = '\t  </xs:extension>\n\t </xs:complexContent>\n'
+debutTypeCompoSeq   = '\t\t<xs:sequence>\n'
+finTypeCompoSeq     = '\t\t</xs:sequence>\n'
+finTypeCompo        = '\t</xs:complexType>\n'
+eltCompoDsSequence  = '\t\t\t<xs:element name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}"/>\n'
+eltCompoDsSequenceWithHelp = '\t\t\t<xs:element name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}"/>\n' 
+#name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}">\n\t\t\t\t<xs:annotation>\n\t\t\t\t\t<xs:documentation>{}</xs:documentation>\n\t\t\t\t</xs:annotation>\n\t\t\t</xs:element>\n'
+#eltCompoDsSequenceInExtension = '\t\t\t<xs:element name="{}" type="{}:{}"/>\n'
+
+# ETAPE
+eltEtape = '\t<xs:element name="{}" type="{}:{}" substitutionGroup="step_{}"/>\n'
+eltEtapeWithHelp = '\t<xs:element name="{}" type="{}:{}" substitutionGroup="step_{}">\n\t\t\t\t<xs:annotation>\n\t\t\t\t\t<xs:documentation>{}</xs:documentation>\n\t\t\t\t</xs:annotation>\n\t\t\t</xs:element>\n'
+
+# BLOC
+debutTypeSubst    = '\t<xs:group name="{}">   \n\t\t<xs:sequence>\n'
+finTypeSubst      = '\t\t</xs:sequence>\n\t</xs:group>\n'
+substDsSequence   = '\t\t\t<xs:group ref="{}:{}"  minOccurs="{}" maxOccurs="{}">\n\t\t\t\t<xs:annotation>\n\t\t\t\t\t<xs:documentation>{}</xs:documentation>\n\t\t\t\t</xs:annotation>\n\t\t\t</xs:group>\n'
+#choiceDsBloc     = '\t\t\t<xs:choice minOccurs={}>\n'
+debutChoiceDsBloc = '\t\t<xs:choice>\n'
+debutChoiceDsBlocAvecMin = '<xs:choice minOccurs="{}">\n'
+finChoiceDsBloc   = '\t\t</xs:choice>\n'
+debSequenceDsBloc = '<xs:sequence>\n'
+finSequenceDsBloc = '</xs:sequence>\n'
+debutTypeSubstDsBlocFactorise = '\t<xs:group name="{}">\n'
+finTypeSubstDsBlocFactorise   = '\t</xs:group>\n'
+debutUnion        = '\t\t\t<xs:union>\n'
+finUnion          = '\t\t\t</xs:union>\n'
+reconstitueUnion  = '{} maxOccurs="1">\n\t\t\t\t<xs:annotation>\n\t\t\t\t\t<xs:documentation>{}</xs:documentation>\n\t\t\t\t</xs:annotation>\n\t\t\t</xs:element>\n'
+
+
+
+# User OR ASSD
+attributeNameName    = '\t\t<xs:attribute name="sdName" type="xs:string"/>\n'
+attributeTypeForASSD = '\t\t<xs:attribute name="sdType" type="xs:string" fixed="ASSD"/>\n'
+attributeTypeUtilisateurName = '\t\t<xs:attribute name="typeUtilisateur" type="xs:string" fixed="{}"/>\n'
+producingASSDkeyRefDeclaration='\t<xs:key name="Key_Name_For_{}">\n\t\t<xs:selector xpath="."/>\n\t\t<xs:field xpath="{}"/>\n\t</xs:key>\n'
+texteFieldUnitaire="./{}:{}/@name |"
+defBaseXSDUserASSD='\t<xs:simpleType name="AccasUserAssd">\n\t\t<xs:restriction base="xs:string">\n\t\t</xs:restriction>\n\t</xs:simpleType>\n'
+defBaseXSDUserASSDMultiple='\t<xs:simpleType name="AccasUserAssdMultiple">\n\t\t<xs:restriction base="xs:string">\n\t\t</xs:restriction>\n\t</xs:simpleType>\n'
+
+defUserASSDMultiple='\t<xs:simpleType name="{}">\n\t\t<xs:restriction base="AccasUserAssdMultiple">\n\t\t</xs:restriction>\n\t</xs:simpleType>\n'
+defUserASSD ='\t<xs:simpleType name="{}">\n\t\t<xs:restriction base="AccasUserAssd">\n\t\t</xs:restriction>\n\t</xs:simpleType>\n'
+
+defUserASSDOrUserASSDMultiple='\t<xs:simpleType name="{}_{}">\n\t\t<xs:restriction base="{}">\n\t\t</xs:restriction>\n\t</xs:simpleType>\n'
+
+
+# CATA
+debutTypeCata     = '\t<xs:complexType name="T_{}">\n\t\t<xs:choice minOccurs="0" maxOccurs="unbounded">\n'
+debutTypeCataExtension = '\t<xs:complexType name="T_{}">\n'
+finTypeCata       = '\t\t</xs:choice>\n\t</xs:complexType>\n'
+finSchema         = '</xs:schema>'
+#eltCata           = '\t<xs:element name="{}" type="{}:{}"/>\n'
+#eltCodeSpecDsCata = '\t\t\t<xs:element ref="{}_Abstract" minOccurs="0" maxOccurs="1"/>\n'
+#fermeEltCata      = '\t</xs:element>\n'
+includeCata       = '<xs:include schemaLocation="cata_{}.xsd" />\n\n'
+
+
+# EXTENSION
+debutExtension = '\t\t<xs:complexContent>\n\t\t<xs:extension base="{}:T_{}_Abstract">\n\t\t<xs:choice minOccurs="0" maxOccurs="unbounded">\n'
+finExtension  = '\t\t</xs:choice>\n\t\t</xs:extension>\n\t\t</xs:complexContent>\n'
+
+# TYPE ABSTRAIT
+eltAbstraitCataPPal  = '\t<xs:complexType name="T_step_{}" abstract="true"/>\n'
+eltAbstraitCataFils  = '\t<xs:complexType name="T_step_{}" abstract="true">\n\t\t<xs:complexContent>\n\t\t\t<xs:extension base="{}:T_step_{}"/>\n\t\t</xs:complexContent>\n\t</xs:complexType>\n'
+eltCataPPal = '\t<xs:element name="step_{}" type="{}:T_step_{}"/>\n'
+eltCataPPalWithHelp = '\t<xs:element name="step_{}" type="{}:T_step_{}"/>\n\t\t\t\t<xs:annotation>\n\t\t\t\t\t<xs:documentation>{}</xs:documentation>\n\t\t\t\t</xs:annotation>\n\t\t\t</xs:element>\n'
+eltCataFils = '\t<xs:element name="step_{}" type="{}:T_step_{}" substitutionGroup="step_{}"/>\n'
+eltCataFilsWithHelp = '\t<xs:element name="step_{}" type="{}:T_step_{}" substitutionGroup="step_{}"/>\n\t\t\t\t<xs:annotation>\n\t\t\t\t\t<xs:documentation>{}</xs:documentation>\n\t\t\t\t</xs:annotation>\n\t\t\t</xs:element>\n'
+
+eltCata = '\t<xs:element name="{}" type="{}:T_{}"/>\n\t\t<xs:complexType name="T_{}">\n\t\t  <xs:choice minOccurs="0" maxOccurs="unbounded">\n\t\t\t<xs:element ref="step_{}" minOccurs="0" maxOccurs="1"/>\n\t\t  </xs:choice>\n\t\t</xs:complexType>\n'
+
+#\n\t<xs:element name="{}_Abstract" type="{}:T_{}_Abstract"/>\n'
+#implementeAbstrait  = '\t<xs:element name="{}" type="{}:{}" substitutionGroup="{}:{}_Abstract"/>\n'
+
+# MATRICE oldVersion
+# (_matrix ou pas ?)
+#matriceSimpleType = '\t<xs:simpleType name="{}_matrix">\n\t\t<xs:restriction>\n\t\t\t<xs:simpleType>\n\t\t\t\t<xs:list>\n\t\t\t\t\t<xs:simpleType>\n\t\t\t\t\t\t<xs:restriction  base="{}_element"/>\n\t\t\t\t\t</xs:simpleType>\n\t\t\t\t</xs:list>\n\t\t\t</xs:simpleType>\n\t\t\t<xs:length value="{}"/>\n\t\t</xs:restriction>\n\t</xs:simpleType>\n'
+#matriceSimpleType = '\t<xs:simpleType name="{}">\n\t\t<xs:restriction>\n\t\t\t<xs:simpleType>\n\t\t\t\t<xs:list>\n\t\t\t\t\t<xs:simpleType>\n\t\t\t\t\t\t<xs:restriction  base="{}_element"/>\n\t\t\t\t\t</xs:simpleType>\n\t\t\t\t</xs:list>\n\t\t\t</xs:simpleType>\n\t\t\t<xs:length value="{}"/>\n\t\t</xs:restriction>\n\t</xs:simpleType>\n'
+#matriceSimpleType +='\t<xs:group name="{}_lines">\n\t\t<xs:sequence>\n\t\t\t<xs:element name="{}" type="{}:{}_matrix" minOccurs="{}" maxOccurs="{}"/>\t\n\t\t</xs:sequence>\n\t</xs:group>\n\t\n'
+#matriceSimpleType +='\t<xs:group name="{}_lines">\n\t\t<xs:sequence>\n\t\t\t<xs:element name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}"/>\t\n\t\t</xs:sequence>\n\t</xs:group>\n\t\n'
+#matriceSimpleType +='\t<xs:group name="{}_content">\n\t\t<xs:sequence>\n\t\t\t<xs:group ref="{}:{}_lines" minOccurs="1" maxOccurs="1"/>\t\n\t\t</xs:sequence>\n\t</xs:group>'
+#eltMatrice = ' <xs:group ref="{}:{}_content" minOccurs="{}" maxOccurs="{}"/>'
+
+# TUPLE
+tupleNonHomogeneSimpleType = '\t<xs:simpleType name="{}_n{}_tuple">\n\t\t<xs:restriction base="{}"/>\n\t\t</xs:simpleType>\n'
+tupleNonHomogeneElt        = '\t\t\t<xs:element name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}"/>\n'
+tupleDebutComplexeType     = '\t<xs:complexType name="{}">\n\t\t<xs:sequence>'
+tupleMilieuComplexeType    = '\n\t\t\t<xs:element name="n{}" type="{}_n{}_tuple" minOccurs="1" maxOccurs="1"/>'
+tupleFinComplexeType       = '\n\t\t</xs:sequence>\n\t</xs:complexType>\n'
+
+# MATRICE
+eltMatrice = '\t\t\t <xs:element name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}"/>\n'
+matriceSimpleType = '\t<xs:simpleType name="{}_line">\n\t\t<xs:restriction>\n\t\t\t<xs:simpleType>\n\t\t\t\t<xs:list>\n\t\t\t\t\t<xs:simpleType>\n\t\t\t\t\t\t<xs:restriction  base="{}_element"/>\n\t\t\t\t\t</xs:simpleType>\n\t\t\t\t</xs:list>\n\t\t\t</xs:simpleType>\n\t\t\t<xs:length value="{}"/>\n\t\t</xs:restriction>\n\t</xs:simpleType>\n'
+matriceSimpleType +='\t<xs:group name="{}_matrix">\n\t\t<xs:sequence>\n\t\t\t<xs:element name="line" type="{}:{}_line" minOccurs="{}" maxOccurs="{}"/>\n\t\t </xs:sequence>\n\t</xs:group>\n'
+matriceSimpleType +='\t<xs:complexType name="{}"> \n\t\t<xs:group ref="{}:{}_matrix" minOccurs="1" maxOccurs="1"/>\n\t</xs:complexType>\n'
+
+# CHAINES AVEC BLANC
+debutChaineAvecBlancsInto  = '\t<xs:simpleType name="{}_enum">\n\t\t<xs:restriction base="xs:string">\n'
+milieuChaineAvecBlancsInto = '\t\t\t<xs:enumeration value="{}"/>\n'
+finChaineAvecBlancsInto    = '\t\t</xs:restriction>\n\t\t</xs:simpleType>\n'
+       
+complexChaineAvecBlancs = '\t<xs:complexType name="{}">\n\t\t<xs:sequence maxOccurs="{}">\n\t\t\t\t<xs:element name="s__" type="{}_enum"/>\n\t\t\t</xs:sequence>\n\t</xs:complexType>\n'
+
+typeEltChaineAvecBlancSansInto = '\t\t<xs:simpleType name="{}_enum">\n\t\t\t<xs:restriction base="xs:string">\n\t\t\t</xs:restriction>\n\t\t</xs:simpleType>'
+if __name__ == '__main__' :
+    print ('ne fait rien')
diff --git a/Efi2Xsd/mapDesTypes.py b/Efi2Xsd/mapDesTypes.py
new file mode 100755 (executable)
index 0000000..5d8126d
--- /dev/null
@@ -0,0 +1,117 @@
+class Tuple:
+    def __init__(self,ntuple):
+        self.ntuple=ntuple
+
+    def __convert__(self,valeur):
+        if type(valeur) == types.StringType:
+            return None
+        if len(valeur) != self.ntuple:
+            return None
+        return valeur
+
+    def info(self):
+        return "Tuple de %s elements" % self.ntuple
+
+    __repr__=info
+    __str__=info
+
+
+
+def inverseDico(dicoSource) :
+#---------------------------
+    dicoInverse = {}
+    for (clef,valeur) in dicoSource.items():
+        if not(type(valeur) is tuple):
+            dicoInverse[valeur]=clef
+            continue
+        (elt,att)=valeur
+        if elt not in dicoInverse : dicoInverse[elt]={}
+        dicoInverse[elt][att]=clef
+    return dicoInverse
+
+dictSIMPEficasXML= { 'typ'        : 'nomTypeAttendu',
+                     'statut'     : 'statut',
+                     'min'        : 'minOccurences',
+                     'max'        : 'maxOccurences',
+                     'homo'       : 'homo'       ,
+                     'position'   : 'portee',
+                     'validators' : 'validators' ,
+                     'sug'        : 'valeurSugg',
+                     'defaut'     : 'valeurDef' ,
+                     'into'       : ('plageValeur','into'),
+                     'val_min'    : ('plageValeur','borneInf'),
+                     'val_max'    : ('plageValeur','borneSup'),
+                     'ang'        : ('doc','ang'),
+                     'fr'         : ('doc','fr',),
+                     'docu'       : ('doc','docu'),
+                   }
+
+dictSIMPXMLEficas= inverseDico(dictSIMPEficasXML)
+
+
+
+dictFACTEficasXML = { 'statut'     : 'statut',
+                      'min'        : 'minOccurences',
+                      'max'        : 'maxOccurences',
+                      'ang'        : ('doc','ang'),
+                      'fr'         : ('doc','fr',),
+                      'docu'       : ('doc','docu'),
+                      'regles'     : 'regles',
+                      'validators' : 'validators' ,
+                    }
+
+dictFACTXMLEficas =  inverseDico(dictFACTEficasXML)
+
+dictBLOCEficasXML = { 'statut'     : 'statut',
+                      'ang'        : ('doc','ang'),
+                      'fr'         : ('doc','fr',),
+                      'regles'     : 'regles',
+                      'condition'  : 'condition' ,
+                    }
+
+dictBLOCXMLEficas =  inverseDico(dictBLOCEficasXML)
+
+dictPROCEficasXML =  { 'nom'        : 'nom',
+                       'regles'     : 'regles',
+                       'ang'        : ('doc','ang'),
+                       'fr'         : ('doc','fr',),
+                       'docu'       : ('doc','docu'),
+                      }
+
+dictPROCXMLEficas = inverseDico(dictPROCEficasXML)
+
+dictOPEREficasXML = dictPROCEficasXML
+dictOPERXMLEficas = dictPROCXMLEficas
+
+dictPourCast                = { 'I' : int, 'R' : float, 'bool' : bool ,   }
+dictNomsDesTypes = { 'I' : 'xs:int', 'R' : 'xs:float', bool : 'xs:boolean' , 'TXM' : 'xs:string', 'Fichier' : 'xs:string', 'Repertoire':'xs:string', 'FichierNoAbs' : 'xs:string', 'FichierOuRepertoire':'xs:string'   }
+
+listeParamDeTypeTypeAttendu = ( 'defaut', 'sug', 'val_min', 'val_max', 'into', 'intoSug')
+listeParamDeTypeStr         = ('fr', 'docu', 'ang', 'nom' )
+
+listeParamTjsSequence        = ('into' , 'intoSug')
+listeParamSelonType           = ('defaut', 'sug', 'into', 'intoSug')
+
+if __name__ == "__main__":
+    import pprint
+    pp=pprint.PrettyPrinter(indent=4)
+    print ('dictSIMPEficasXML')
+    pp.pprint(dictSIMPEficasXML)
+    print ('\n\n')
+    print ('dictSIMPXMLEficas')
+    pp.pprint(dictSIMPXMLEficas)
+    print ('\n\n')
+    print ('dictFACTEficasXML')
+    pp.pprint(dictFACTEficasXML)
+    print ('\n\n')
+    print ('dictFACTXMLEficas')
+    pp.pprint(dictFACTXMLEficas)
+    print ('\n\n')
+    print ('dictPROCEficasXML')
+    pp.pprint(dictPROCEficasXML)
+    print ('\n\n')
+    print ('dictPROCXMLEficas')
+    pp.pprint(dictPROCXMLEficas)
+    print ('\n\n')
+    print ('dictNomsDesTypes')
+    pp.pprint(dictNomsDesTypes )
diff --git a/InterfaceSsIhm/.qtEficasSsIhm.py.swp b/InterfaceSsIhm/.qtEficasSsIhm.py.swp
deleted file mode 100644 (file)
index fa214f5..0000000
Binary files a/InterfaceSsIhm/.qtEficasSsIhm.py.swp and /dev/null differ
diff --git a/InterfaceSsIhm/configuration.py b/InterfaceSsIhm/configuration.py
new file mode 100644 (file)
index 0000000..a9cb337
--- /dev/null
@@ -0,0 +1,260 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2021   EDF R&D
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+"""
+    Ce module sert pour charger les parametres de configuration d'EFICAS
+"""
+# Modules Python
+from __future__ import absolute_import
+try :
+    from builtins import str
+    from builtins import range
+    from builtins import object
+except : pass
+
+import os, sys,  types, re
+import traceback
+from  Editeur.Eficas_utils import read_file
+from Extensions.i18n import tr
+
+
+class configBase(object):
+
+    #-------------------------------
+    def __init__(self,appliEficas,repIni):
+    #-------------------------------
+
+    # Classe de base permettant de lire, afficher
+    # et sauvegarder les fichiers utilisateurs
+    # On a deux directories : la directory generale (Repertoire d install + Nom du code
+    #                       Par exemple : ~/Install_Eficas/EficasV1_14/Openturns_Wrapper
+    # et la directorie de l utilisateur
+    #                       HOME/.Eficas_Openturns
+    # Le fichier prefs.py va etre lu dans la directory generale
+    #         puis surcharge eventuellement par celui contenu dans ${PREFS_CATA_$CODE}
+    #         par celui de l utilisateur
+    # le fichier de catalogue va etre lu dans la directory de l utilisateur s il exite
+    # dans le fichier general sinon
+
+        self.appliEficas   = appliEficas
+        self.code    = appliEficas.code
+        self.salome  = appliEficas.salome
+        if self.salome : self.name="editeur_salome.ini"
+        else           : self.name="editeur.ini"
+        self.rep_mat = None
+        self.repIni  = repIni
+
+        if self.code == None : self.code=''
+        if sys.platform[0:5]=="linux" :
+            self.rep_user   = os.path.join(os.environ['HOME'],'.config/Eficas',self.code)
+        else :
+            self.rep_user   = os.path.join('C:/','.config/Eficas',self.code)
+
+
+        self.setValeursParDefaut()
+
+        if self.code != '' :
+            self.lectureFichierIniStandard()
+            self.lectureFichierIniIntegrateur()
+            self.lectureFichierIniUtilisateur()
+
+        if self.boutonDsMenuBar:
+            self.closeAutreCommande = True
+            self.closeFrameRechercheCommande = True
+
+        #Particularite des schemas MAP
+        if hasattr(self,'make_ssCode'): self.make_ssCode(self.ssCode)
+
+        #if self.appliEficas: self.parent=appliEficas.top
+        #else:         self.parent=None
+
+        if not os.path.isdir(self.savedir) :
+            if sys.platform[0:5]=="linux" :
+                self.savedir=os.environ['HOME']
+            else:
+                self.savedir='C:/'
+
+
+
+    def setValeursParDefaut(self):
+    #-----------------------------
+
+        # Valeurs par defaut
+        if not os.path.isdir(self.rep_user) : os.makedirs(self.rep_user)
+        self.path_doc     = os.path.abspath(os.path.join(self.repIni,'..','Doc'))
+        self.exec_acrobat = 'acroread'
+        nomDir="Eficas_"+self.code
+        if sys.platform[0:5]=="linux" :
+            self.savedir   = os.path.abspath(os.path.join(os.environ['HOME'],nomDir))
+        else:
+            self.savedir = os.path.abspath('C:/')
+        self.modeNouvCommande='initial'
+        self.affiche="alpha"
+        self.closeAutreCommande = False
+        self.closeFrameRechercheCommande = False
+        self.closeFrameRechercheCommandeSurPageDesCommandes = False
+        self.closeEntete = False
+        self.closeArbre = False
+        self.demandeLangue=False
+        self.suiteTelemac=False
+        self.nombreDeBoutonParLigne=0
+        self.translatorFichier=None
+        self.dicoImages= {}
+        self.dicoIcones= {}
+        self.afficheCommandesPliees = True
+        self.afficheFirstPlies =  False
+        self.simpleClic = False
+        self.afficheOptionnelVide=False
+        self.afficheListesPliees=True
+        self.boutonDsMenuBar=False
+        self.ficIcones=None
+        self.repIcones=None
+        self.differencieSiDefaut=False
+        self.typeDeCata='Python'
+        self.closeParenthese=False
+        self.closeOptionnel=False
+        self.afficheFactOptionnel=False
+        self.enleverActionStructures=False
+        self.enleverPoubellePourCommande=False
+        self.enleverParametres=False
+        self.enleverSupprimer=False
+        self.ajoutExecution=False
+        self.utilParExtensions=[]
+        self.rendVisiblesLesCaches=False
+        self.pasDeMCOptionnels=False
+
+        self.dumpXSD=False
+        self.withXSD=False
+        self.afficheIhm=True
+
+        self.afficheUQ=False
+        self.afficheUQ=True
+
+
+
+    #--------------------------------------
+    def lectureFichierIniStandard(self):
+    #--------------------------------------
+
+        name='prefs_'+self.appliEficas.code
+        try :
+            prefsCode=__import__(name)
+        except :
+            self.catalogues=[]
+            print ('pas de fichier de prefs')
+            return
+        for k in dir(prefsCode):
+            if (k[0:1] != "__" and k[-1:-2] !='__'):
+                valeur=getattr(prefsCode,k)
+                setattr(self,k,valeur)
+
+
+
+    #--------------------------------------
+    def lectureFichierIniIntegrateur(self):
+    #--------------------------------------
+    # Verifie l'existence du fichier "standard"
+    # appelle la lecture de ce fichier
+        clef="PREFS_CATA_"+self.code
+        try :
+            repIntegrateur=os.path.abspath(os.environ[clef])
+        except :
+            return
+
+        fic_ini_integrateur=os.path.join(repIntegrateur,self.name)
+        if not os.path.isfile(fic_ini_integrateur): return
+        txt = read_file(fic_ini_integrateur)
+        d=locals()
+        try:
+            exec(txt, d)
+        except :
+            try :
+                from PyQt5.QtWidgets import QMessageBox
+                QMessageBox.critical( None, tr("Import du fichier de Configuration"),
+                             tr("Erreur a la lecture du fichier de configuration %s " , str(fic_ini_integrateur)))
+            except :
+                print("Erreur a la lecture du fichier de configuration %s " , str(fic_ini_integrateur))
+            return
+        self.labels_eficas.append('rep_aide')
+        for k in self.labels_eficas :
+            try :
+                setattr(self,k,d[k])
+            except :
+                pass
+        #Glut pour les repertoires materiaux
+        #et pour la doc
+        for k in d :
+            if (k[0:8]=="rep_mat_") or (k[0:8]=="rep_doc_"):
+                setattr(self,k,d[k])
+
+
+    #--------------------------------------
+    def lectureFichierIniUtilisateur(self):
+    #--------------------------------------
+    # Surcharge les parametres standards par les parametres utilisateur s'ils existent
+        self.fic_ini_utilisateur = os.path.join(self.rep_user,self.name)
+        if not os.path.isfile(self.fic_ini_utilisateur): return
+
+        txt = read_file(self.fic_ini_utilisateur)
+        d=locals()
+        try:
+            exec(txt, d)
+        except :
+            l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
+            try :
+                from PyQt5.QtWidgets import QMessageBox
+                QMessageBox.critical( None, tr("Import du fichier de Configuration"),
+                             tr("Erreur a la lecture du fichier de configuration %s " , str(fic_ini_integrateur)))
+            except :
+                print ("Erreur a la lecture du fichier de configuration %s " , str(fic_ini_integrateur))
+        for k in self.labels_user :
+            try :
+                setattr(self,k,d[k])
+            except :
+                pass
+        for k in d :
+            if (k[0:8]=="rep_mat_") or (k[0:8]=="rep_doc_"):
+                setattr(self,k,d[k])
+
+    #--------------------------------------
+    def saveParams(self):
+    #--------------------------------------
+    # sauvegarde
+    # les nouveaux parametres dans le fichier de configuration utilisateur
+    #
+        texte=""
+        for clef in self.labels_user :
+            if hasattr(self,clef):
+                valeur=getattr(self,clef)
+                texte= texte + clef+"      = " + repr(valeur) +"\n"
+        #Glut pour les repertoires materiaux
+        #et pour la doc
+        for k in dir(self):
+            if (k[0:8]=="rep_mat_") or (k[0:8]=="rep_doc_"):
+                valeur=getattr(self,k)
+                texte= texte + k+" = " + repr(valeur) +"\n"
+
+        f=open(self.fic_ini_utilisateur,'w+')
+        f.write(texte)
+        f.close()
+#
+
+
+def makeConfig(appliEficas,rep):
+    return configBase(appliEficas,rep)
old mode 100644 (file)
new mode 100755 (executable)
index bd5efb7..7c12bdd
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Copyright (C) 2007-2013   EDF R&D
+# Copyright (C) 2007-2021   EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
 from __future__ import absolute_import
 from __future__ import print_function
 try :
-   from builtins import str
-   from builtins import range
+    from builtins import str
+    from builtins import range
 except : pass
 
 import types,sys,os, re
 import  subprocess
 import traceback
 
-import six
-from six.moves import range
 
 import traceback
 
@@ -55,49 +53,49 @@ class JDCEditorSsIhm :
 # Methodes Communes ou appelees depuis avec Ihm
 # ---------------------------------------------
 
-    def __init__ (self,appli,fichier = None, jdc = None,  units = None, include=0 ):
-    #------------------------------------------------------------------------------#
+    def __init__ (self,appliEficas,fichier = None, jdc = None,  units = None, include=0 ):
+    #-----------------------------------------------------------------------------------#
     # paticularisee avec Ihm
 
         if debug : print ('dans le init de JDCEditorSsIhm')
-        self.appliEficas = appli
-        self.appli       = appli
+        self.appliEficas = appliEficas
         self.fichier     = fichier
-        self.fichierComplet  = fichier
+        self.fichierComplet   = fichier
+        if fichier != None : self.extensionFichier = os.path.splitext(fichier)[1]
+        else : self.extensionFichier = None
         self.jdc         = jdc
-        self.first      = True
+        self.first       = True
         self.jdc_item    = None
         self.dicoNouveauxMC   = {}
         self.dicoNouveauxFact = {}
         self.dict_reels       = {}
         self.liste_simp_reel  = []
 
-        if appli != None : self.salome =  self.appliEficas.salome
+        if self.appliEficas != None : self.salome =  self.appliEficas.salome
         else             : self.salome =  0
 
         # ces attributs sont mis a jour par definitCode appelee par newEditor
         self.code              = self.appliEficas.maConfiguration.code
         self.maConfiguration   = self.appliEficas.maConfiguration
 
-        self.version_code = session.d_env.cata
-
 
         if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.readercata.demandeCatalogue==True or self.appliEficas.multi==True:
-           if self.maConfiguration.typeDeCata == 'XML' :
-              from . import readercataXML as readercata
-           else :
-              from . import readercata
-           self.readercata  = readercata.ReaderCata( self, self.appliEficas )
-           self.appliEficas.readercata=self.readercata
-           self.appliEficas.code=self.code
+            if self.maConfiguration.typeDeCata == 'XML' :
+                from . import readercataXML as readercata
+            else :
+                from . import readercata
+            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.readercata=self.appliEficas.readercata
+        if self.readercata.fichierCata == None : return    #Sortie Salome
         self.titre=self.readercata.titre
 
-        self.format =  self.appliEficas.format_fichier
+        self.formatFichierOut =  self.appliEficas.formatFichierOut
+        self.formatFichierIn  =  self.appliEficas.formatFichierIn
 
-        if self.appliEficas.maConfiguration.dumpXSD==True : self.appliEficas.dumpXsd()
+        #if self.appliEficas.maConfiguration.dumpXSD==True : self.appliEficas.dumpXsd()
         self.dict_reels={}
         self.liste_simp_reel=[]
         self.dicoNouveauxMC={}
@@ -105,24 +103,31 @@ class JDCEditorSsIhm :
 
 
         try:
-          self.maConfiguration.generator_module
-          _module = __import__(self.maConfiguration.generator_module)
-          info    = _module.entryPoint()
-          generator.plugins.addEntryPoint(info)
+            self.maConfiguration.generator_module
+            _module = __import__(self.maConfiguration.generator_module)
+            info    = _module.entryPoint()
+            generator.plugins.addEntryPoint(info)
         except:
-          pass
+            pass
 
         try:
-          self.maConfiguration.convert_module
-          #print self.maConfiguration.convert_module
-          _module = __import__(self.maConfiguration.convert_module)
-          info = _module.entryPoint()
-          convert.plugins.addEntryPoint(info)
+            self.maConfiguration.convert_module
+            #print self.maConfiguration.convert_module
+            _module = __import__(self.maConfiguration.convert_module)
+            info = _module.entryPoint()
+            convert.plugins.addEntryPoint(info)
         except :
-          pass
+            pass
 
         self.maConfiguration.mesGenerators     = generator
         self.maConfiguration.mesconvertisseurs = convert
+        try    : self.XMLgenerator=generator.plugins['xml']()
+        except : self.XMLgenerator=None
+
+
+        if self.formatFichierOut in generator.plugins.keys():
+            self.generator = generator.plugins[self.formatFichierOut]()
+
 
         self.fileInfo       = None
         self.lastModified   = 0
@@ -136,48 +141,45 @@ class JDCEditorSsIhm :
         self.nouveau=0
         if self.fichier is not None:        #  fichier jdc fourni
             if jdc==None :
-               #print ('PNPN : chgt try en if')
-               try :
-               #if 1 :
-                   self.jdc = self.readFile(self.fichier)
-               except :
-                   print ("mauvaise lecture du fichier")
-               if self.salome :
-                  try :
-                     self.appliEficas.addJdcInSalome( self.fichier)
-                  except :
-                     print ("mauvais enregistrement dans Salome")
+                #print ('PNPN : chgt try en if')
+                try :
+                #if 1 :
+                    self.jdc = self.readFile(self.fichier)
+                except :
+                    print ("mauvaise lecture du fichier")
+                if self.salome :
+                    try    : self.appliEficas.addJdcInSalome( self.fichier)
+                    except : print ("mauvais enregistrement dans Salome")
             else :
-               self.jdc=jdc
+                self.jdc=jdc
 
             if self.jdc is not None and units is not None:
-               self.jdc.recorded_units=units
-               self.jdc.old_recorded_units=units
+                self.jdc.recorded_units=units
+                self.jdc.old_recorded_units=units
 
         else:
             if not self.jdc:                   #  nouveau jdc
-                if not include :
-                   self.jdc = self._newJDC(units=units)
-                else :
-                   self.jdc = self._newJDCInclude(units=units)
+                if not include : self.jdc = self._newJDC(units=units)
+                else : self.jdc = self._newJDCInclude(units=units)
                 self.nouveau=1
 
         if self.jdc:
-            self.jdc.appli = self # a resorber
             self.jdc.editor = self
-            self.jdc.lang    = self.appli.langue
+            self.jdc.lang    = self.appliEficas.langue
             self.jdc.aReafficher=False
             txt_exception  = None
             if not jdc:
-                self.jdc.analyse()
+                if self.extensionFichier == '.xml' :
+                    if self.appliEficas.maConfiguration.withXSD: self.jdc.analyseXML()
+                    else : print ('run MDM with -x option  (MDM for XML)'); exit()
+                else : self.jdc.analyse()
                 txt_exception = self.jdc.cr.getMessException()
             if txt_exception :
                 self.jdc = None
                 self.informe('pb chargement jdc',txt_exception)
-            else:
+            #else:
                 #comploader.chargerComposants()
-                #cette ligne devrait etre dans editor ???
-                self.jdc_item=Objecttreeitem.makeObjecttreeitem( self, "nom", self.jdc )
+                #self.jdc_item=Objecttreeitem.makeObjecttreeitem( self, "nom", self.jdc )
 
     #-------------------------------#
     def readFile(self, fn):
@@ -190,42 +192,42 @@ class JDCEditorSsIhm :
         # charge un JDC
         # paticularisee avec Ihm
 
-        fn = six.text_type(fn)
+        fn = str(fn)
         jdcName=os.path.basename(fn)
 
         # Il faut convertir le contenu du fichier en fonction du format
-        if self.appliEficas.format_fichier_in in convert.plugins:
-             # Le convertisseur existe on l'utilise
-
-             p=convert.plugins[self.appliEficas.format_fichier_in]()
-             p.readfile(fn)
-
-             if p.text=="" : self.nouveau=1
-             #print ('PNPN --> CIST a faire')
-
-             pareil,texteNew=self.verifieChecksum(p.text)
-             if  not pareil :
-                self.informe(("fichier modifie"),("Attention! fichier change hors EFICAS"),False)
-
-             p.text=texteNew
-             memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
-             if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
-             p.text=texteNew
-
-             text=p.convert('exec',self.appliEficas)
-
-             if not p.cr.estvide(): self.afficheInfos("Erreur a la conversion",'red')
+        formatIn=self.appliEficas.formatFichierIn
+        if self.extensionFichier == '.xml' and self.appliEficas.maConfiguration.withXSD: formatIn='xml'
+        if formatIn in convert.plugins:
+            # Le convertisseur existe on l'utilise
+            p=convert.plugins[formatIn]()
+            p.readfile(fn)
+
+            if p.text=="" : self.nouveau=1
+            #print ('PNPN --> CIST a faire')
+
+            if formatIn != 'xml':
+                pareil,texteNew=self.verifieChecksum(p.text)
+                if  not pareil : self.informe(("fichier modifie"),("Attention! fichier change hors EFICAS"),False)
+                p.text=texteNew
+                memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
+                if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
+                p.text=texteNew
+                text=p.convert('exec',self.appliEficas)
+                if not p.cr.estvide(): self.afficheInfos("Erreur a la conversion",'red')
+            else:
+                text=p.text
         else :
             self.afficheInfos("Type de fichier non reconnu",'red')
             self.informe( "Type de fichier non reconnu",
-                    "EFICAS ne sait pas ouvrir le type de fichier " + self.appliEficas.format_fichier_in)
+                    "EFICAS ne sait pas ouvrir le type de fichier " + self.appliEficas.formatFichierIn)
             return None
 
         CONTEXT.unsetCurrentStep()
 
         #jdc=self.readercata.cata[0].JdC(procedure=text,
         jdc=self.readercata.cata.JdC(procedure=text,
-                                    appli=self,
+                                    appliEficas=self.appliEficas,
                                     cata=self.readercata.cata,
                                     cata_ord_dico=self.readercata.cata_ordonne_dico,
                                     nom=jdcName,
@@ -250,33 +252,27 @@ class JDCEditorSsIhm :
         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 hasattr(self.readercata.cata,'TEXTE_NEW_JDC') : texte=self.readercata.cata.TEXTE_NEW_JDC
 
 
-        #jdc=self.readercata.cata[0].JdC( procedure =texte,
-        #print (self.readercata.cata)
         jdc=self.readercata.cata.JdC( procedure =texte,
-                                         appli=self,
+                                         appliEficas=self.appliEficas,
                                          cata=self.readercata.cata,
                                          cata_ord_dico=self.readercata.cata_ordonne_dico,
                                          rep_mat=self.maConfiguration.rep_mat
                                         )
 
-        jdc.lang    = self.appli.langue
+        jdc.lang    = self.appliEficas.langue
         if units is not None:
-           jdc.recorded_units=units
-           jdc.old_recorded_units=units
-        ## PNPN est ce que la ligne suivante est bien utile ?
-        # elle positionne le contexte
+            jdc.recorded_units=units
+            jdc.old_recorded_units=units
+        # chgt le 15/10/19
+        # Attention positionne  contexte ?
         # est ce qu on ne doit pas changer le format en Accas si on vient d accas ?
-        if self.format == 'xml' : return jdc
-        if texte == "" :
-           jdc.editor=self
-           jdc.analyse()
+        jdc.editor=self
         return jdc
 
-   #--------------------------------#
+    #--------------------------------#
     def _newJDCInclude( self ,units = None):
     #--------------------------------#
         """
@@ -288,24 +284,26 @@ class JDCEditorSsIhm :
 
         #jaux=self.readercata.cata[0].JdC( procedure="",
         jaux=self.readercata.cata.JdC( procedure="",
-                               appli=self,
+                               appliEficas=self.appliEficas,
                                cata=self.readercata.cata,
                                cata_ord_dico=self.readercata.cata_ordonne_dico,
                                rep_mat=self.maConfiguration.rep_mat,
                               )
+        jaux.editor=self
         jaux.analyse()
 
         J=JdC_aux( procedure="",
-                   appli=self,
+                   appliEficas=self.appliEficas,
                    cata=self.readercata.cata,
                    cata_ord_dico=self.readercata.cata_ordonne_dico,
                    jdc_pere=jaux,
                    rep_mat=self.maConfiguration.rep_mat,
                    )
+        J.editor=self
         J.analyse()
         if units is not None:
-           J.recorded_units=units
-           J.old_recorded_units=units
+            J.recorded_units=units
+            J.old_recorded_units=units
         return J
 
 
@@ -315,9 +313,9 @@ class JDCEditorSsIhm :
     #-----------------------#
 
         # Il faut convertir le contenu du fichier en fonction du format
-        if self.format in convert.plugins :
+        if self.formatFichierIn in convert.plugins :
             # Le convertisseur existe on l'utilise
-            p=convert.plugins[self.format]()
+            p=convert.plugins[self.formatFichierIn]()
             p.readfile(file)
             text=p.convert('execnoparseur')
             if not p.cr.estvide():
@@ -327,7 +325,7 @@ class JDCEditorSsIhm :
             # Il n'existe pas c'est une erreur
             self.afficheInfos("Type de fichier non reconnu",'red')
             self.informe( "Type de fichier non reconnu",
-                    "EFICAS ne sait pas ouvrir le type de fichier " + self.appliEficas.format_fichier_in)
+                    "EFICAS ne sait pas ouvrir le type de fichier " + self.appliEficas.formatFichierIn)
             return None
 
     #----------------------------------------------#
@@ -341,64 +339,68 @@ class JDCEditorSsIhm :
     #-----------------------#
     def generDico(self):
     #-----------------------#
-       if 'dico' in generator.plugins:
-         self.generator=generator.plugins['dico']()
-         #print (self.generator)
-         jdc_formate=self.generator.gener(self.jdc)
-         #print (jdc_formate)
-         dico=self.generator.Dico
-         #print (dico)
-         return dico
+        if 'dico' in generator.plugins:
+            self.generator=generator.plugins['dico']()
+            #print (self.generator)
+            jdc_formate=self.generator.gener(self.jdc)
+            #print (jdc_formate)
+            dico=self.generator.Dico
+            #print (dico)
+            return dico
 
     #-----------------------#
     def viewJdcSource(self):
     #-----------------------#
         if self.fichier == None : return
-        f=open(self.fichier,'r')
-        texteSource=f.read()
-        f.close()
-        self._viewText(texteSource, "JDC_SOURCE")
+        if os.path.isfile(self.fichier):
+            f=open(self.fichier,'r')
+            texteSource=f.read()
+            f.close()
+            self._viewText(texteSource, "JDC_SOURCE")
+        else :
+            self._viewText("file doesn't exist", "JDC_SOURCE")
+
 
     #-----------------------#
     def viewJdcPy(self):
     #-----------------------#
-        strSource = str( self.getTextJDC(self.format) )
+        strSource = str( self.getTextJDC(self.formatFichierOut) )
         self._viewText(strSource, "JDC_RESULTAT")
 
     #-----------------------#
     def viewJdcRapport(self):
     #-----------------------#
         # on ajoute les regles
-        strRapport = six.text_type( self.jdc.report() )
+        strRapport = str( self.jdc.report() )
         self._viewText(strRapport, "JDC_RAPPORT")
 
     #-----------------------#
     def viewJdcRegles(self):
     #-----------------------#
         # on ajoute les regles
-        texte_global, test_global =  self.jdc.verifRegles() 
+        texte_global, test_global =  self.jdc.verifRegles()
         self._viewText(texte_global, "JDC_REGLES")
 
     #-----------------------#
     def getJdcRapport(self):
     #-----------------------#
         # on ajoute les regles
-        strRapport = six.text_type( self.jdc.report() )
+        strRapport = str( self.jdc.report() )
         return strRapport
 
     #---------------------#
     def getFileName(self):
     #---------------------#
-      return self.fichier
+        return self.fichier
 
     #-------------------#
     def initModif(self):
     #-------------------#
-      """
-          Met l'attribut modified a 'o' : utilise par Eficas pour savoir
-          si un JDC doit etre sauvegarde avant destruction ou non
-      """
-      self.modified = True
+        """
+            Met l'attribut modified a 'o' : utilise par Eficas pour savoir
+            si un JDC doit etre sauvegarde avant destruction ou non
+        """
+        self.modified = True
 
 
     #--------------------------------------------------#
@@ -411,14 +413,14 @@ class JDCEditorSsIhm :
         @return flag indicating success
         """
 
-        fn = six.text_type(fn)
+        fn = str(fn)
 
         if txt == None :
-            txt = self.getTextJDC(self.format,formatLigne=formatLigne)
+            txt = self.getTextJDC(self.formatFichierOut,formatLigne=formatLigne)
             eol = '\n'
             if len(txt) >= len(eol):
-               if txt[-len(eol):] != eol:
-                  txt += eol
+                if txt[-len(eol):] != eol:
+                    txt += eol
             else:
                 txt += eol
             txt=self.ajoutVersionCataDsJDC(txt)
@@ -432,34 +434,37 @@ class JDCEditorSsIhm :
             f.close()
             return 1
         except IOError as why:
-            self.afficheInfos('Sauvegarde du Fichier', 'Le fichier'+str(fn) + 'n a pas pu etre sauvegarde :'  + str(why))
+            print('Sauvegarde du Fichier', 'Le fichier'+str(fn) + 'n a pas pu etre sauvegarde :'  , str(why))
+            self.afficheInfos('Le fichier'+str(fn) + 'n a pas pu etre sauvegarde '  , 'red')
             return 0
 
+
     #-----------------------------------------------------------#
-    def getTextJDC(self,format,pourRun=0,formatLigne="beautifie"):
+    def getTextJDC(self,format = None,pourRun=0,formatLigne="beautifie"):
     #-----------------------------------------------------------#
-      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.maConfiguration,appli=self.appliEficas)
-            if pourRun : jdc_formate=self.generator.textePourRun
-            if self.code == 'TELEMAC' : jdc_formate=self.generator.texteDico
-         except ValueError as e:
-            self.informe( "Erreur a la generation",str(e),'red')
-            return
-
-         if not self.generator.cr.estvide():
-            self.informe("Erreur a la generation","EFICAS ne sait pas convertir ce JDC",'red')
+        if self.code == "MAP" and not(format in generator.plugins): format = "MAP"
+        if format == None : format = self.formatFichierOut
+        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.maConfiguration,appliEficas=self.appliEficas)
+                if pourRun : jdc_formate=self.generator.textePourRun
+                if self.code == 'TELEMAC' : jdc_formate=self.generator.texteDico
+            except ValueError as e:
+                self.informe( "Erreur a la generation",str(e),'red')
+                return
+
+            if not self.generator.cr.estvide():
+                self.informe("Erreur a la generation","EFICAS ne sait pas convertir ce JDC",'red')
+                return ""
+            else:
+                return jdc_formate
+        else:
+            # Il n'existe pas c'est une erreur
+            self.informe("Format inconnu", self.format +  " non reconnu" )
             return ""
-         else:
-            return jdc_formate
-      else:
-         # Il n'existe pas c'est une erreur
-         self.informe("Format inconnu", self.format +  " non reconnu" )
-         return ""
 
     #------------------------------#
     def verifieChecksum(self,text):
@@ -472,48 +477,48 @@ class JDCEditorSsIhm :
         checkAvant=text[indexDeb:indexFin+13]
         textJDC=text[0:indexDeb]+text[indexFin+13:-1]
         if self.code != 'PSEN'  and self.code != 'PSEN_N1':
-           checksum=self.getChecksum(textJDC)
-           pareil=(checkAvant==checksum)
+            checksum=self.getChecksum(textJDC)
+            pareil=(checkAvant==checksum)
         else :
-           pareil=1
+            pareil=1
         return pareil, textJDC
 
     #---------------------------#
     def getChecksum(self,texte):
     #---------------------------#
         try :
-           import haslib
-           newtexte=texte.replace('"','\\"')
-           hash_checksum = hashlib.md5()
-           hash_checksum.update(newtexte.encode('utf-8'))
-           checksum = hash_checksum.hexdigest()
-           ligne = "#CHECKSUM:"+checksum+":FIN CHECKSUM"
-        except : 
-           try :
-              newtexte=texte.replace('"','\\"')
-              commande='echo "'+newtexte+'"|md5sum'
-              a=os.popen(commande)
-              checksum=a.read()
-              a.close()
-           except :
-              checksum='Fichier trop long \n'
-           ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
-           return ligne
+            import haslib
+            newtexte=texte.replace('"','\\"')
+            hash_checksum = hashlib.md5()
+            hash_checksum.update(newtexte.encode('utf-8'))
+            checksum = hash_checksum.hexdigest()
+            ligne = ligne="#CHECKSUM:"+checksum+":FIN CHECKSUM"
+        except :
+            try :
+                newtexte=texte.replace('"','\\"')
+                commande='echo "'+newtexte+'"|md5sum'
+                a=os.popen(commande)
+                checksum=a.read()
+                a.close()
+            except :
+                checksum='Fichier trop long \n'
+            ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
+            return ligne
 
     #----------------------#
     def getDico(self):
     #---------------------#
-      if 'dicoImbrique' in generator.plugins:
-         self.generator=generator.plugins['dicoImbrique']()
-         #print (self.generator)
-         jdc_formate=self.generator.gener(self.jdc)
-         dico=self.generator.Dico
-         return dico
-      else :
-         self.afficheInfos(tr("Format %s non reconnu" , self.format),Qt.red)
-         return ""
-
-   #-----------------------------------------#
+        if 'dicoImbrique' in generator.plugins:
+            self.generator=generator.plugins['dicoImbrique']()
+            #print (self.generator)
+            jdc_formate=self.generator.gener(self.jdc)
+            dico=self.generator.Dico
+            return dico
+        else :
+            self.afficheInfos(tr("Format %s non reconnu" , 'Dictionnaire Imbrique' ),'red')
+            return ""
+
+    #-----------------------------------------#
     def chercheGroupes(self):
     #-----------------------------------------#
         listeMA,listeNO=self.getTextJDC("GroupMA")
@@ -523,20 +528,20 @@ class JDCEditorSsIhm :
     def chercheDico(self):
     #-----------------------------------------#
         dicoCourant={}
-        format =  self.appliEficas.format_fichier
+        format =  self.appliEficas.formatFichierOut
         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.maConfiguration)
-           dicoCourant=self.generator.dico
+            # Le generateur existe on l'utilise
+            self.generator=generator.plugins[format]()
+            jdc_formate=self.generator.gener(self.jdc,format='beautifie',config=self.appliEficas.maConfiguration)
+            dicoCourant=self.generator.dico
         return dicoCourant
 
     #-----------------------------------------------------------------#
     def saveFileLegerAs(self, fileName = None) :
     #-----------------------------------------------------------------#
         if fileName != None :
-           self.fichier = fileName
-           return self.saveFileLeger(fileName)
+            self.fichier = fileName
+            return self.saveFileLeger(fileName)
         return self.saveFileLeger()
 
     #-----------------------------------------------------------------#
@@ -546,7 +551,7 @@ class JDCEditorSsIhm :
         self.generator=generator.plugins[self.format]()
         print (self.generator)
         if hasattr(self.generator, "writeComplet"):
-            self.generator.writeComplet(fichier,self.jdc,config=self.appliEficas.maConfiguration,appli=self.appliEficas)
+            self.generator.writeComplet(fichier,self.jdc,config=self.appliEficas.maConfiguration,appliEficas=self.appliEficas)
 
 
 # ---------------------------------------------
@@ -556,24 +561,24 @@ class JDCEditorSsIhm :
     #--------------------------------#
     def ajoutCommentaire(self):
     #--------------------------------#
-      print ('pas programme sans Ihm')
-      print ('prevenir la maintenance du besoin')
+        print ('pas programme sans Ihm')
+        print ('prevenir la maintenance du besoin')
 
 
     #--------------------------------------#
     def informe(self,titre,txt,critique=True):
     #--------------------------------------#
     # methode differenre avec et sans ihm
-      if critique : print ('!!!!!!!!!!!!!!!!!!!!!!!!!!!')
-      print (titre)
-      print (txt)
-      if critique : print ('!!!!!!!!!!!!!!!!!!!!!!!!!!!')
+        if critique : print ('!!!!!!!!!!!!!!!!!!!!!!!!!!!')
+        print (titre)
+        print (txt)
+        if critique : print ('!!!!!!!!!!!!!!!!!!!!!!!!!!!')
 
     #--------------------------------------#
     def afficheInfos(self,txt,couleur=None):
     #--------------------------------------#
     # methode differenre avec et sans ihm
-      print (txt)
+        print (txt)
 
     #-----------------------------------------------------------------------#
     def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
@@ -595,16 +600,19 @@ class JDCEditorSsIhm :
         """
 
 
-        if not (self.writeFile(fichier,formatLigne=formatLigne)): return (0, None)
         self.fichierOut = fichier
-
-        if self.jdc.isValid() != 0 and hasattr(self.generator, "writeDefault"):
+        if self.appliEficas.maConfiguration.fichierXML !=None : self.jdc.analyseXML()
+        if not (self.writeFile(fichier,formatLigne=formatLigne)): return (0, None)
+        if  self.jdc.cata.modeleMetier and self.jdc.isValid():
+            if self.generator != self.XMLgenerator :
+                self.XMLgenerator.gener(self.jdc)
+                self.XMLgenerator.writeDefault(fichier)
+                return(1,self.fichier)
+        if self.jdc.isValid() and hasattr(self.generator, "writeDefault"):
             self.generator.writeDefault(fichier)
         elif self.code=="TELEMAC" and hasattr(self.generator, "writeDefault"):
             self.generator.writeDefault(fichier)
-
         self.modified = 0
-
         return (1, self.fichier)
 #
 
@@ -633,13 +641,13 @@ class JDCEditorSsIhm :
         etape=monItem.item.object
         CONTEXT.set_current_step(etape)
         try :
-          ok=etape.build_includeEtape(texte)
+            ok=etape.build_includeEtape(texte)
         except :
-          ok=0
+            ok=0
         if not ok :
-           QMessageBox.information( self,
-                      tr("Import texte"),
-                      tr("Impossible d importer le texte"))
+            QMessageBox.information( self,
+                       tr("Import texte"),
+                       tr("Impossible d importer le texte"))
         self.tree.racine.build_children()
         return ok
 
@@ -657,7 +665,7 @@ class JDCEditorSsIhm :
     # dans le JDC
         ouChercher=etape
         for mot in listeAvant :
-              ouChercher=ouChercher.getChild(mot,restreint="oui")
+            ouChercher=ouChercher.getChild(mot,restreint="oui")
         monMC=ouChercher.getChild(MCFils,restreint="oui")
         if monMC != None :  ouChercher.suppentite(monMC)
         ouChercher.state='changed'
@@ -672,7 +680,7 @@ class JDCEditorSsIhm :
         ouChercher=etape
         if debug : print (ouChercher)
         for mot in listeAvant :
-           ouChercher=ouChercher.getChild(mot,restreint="oui", debug=1)
+            ouChercher=ouChercher.getChild(mot,restreint="oui")
         monMC=ouChercher.getChild(MCFils,restreint="oui")
         if monMC == None : monMC = ouChercher.addEntite(MCFils)
         monMC.valeur=valeurs
@@ -691,7 +699,7 @@ class JDCEditorSsIhm :
         ouChercher=etape
         if debug : print (ouChercher)
         for mot in listeAvant :
-           ouChercher=ouChercher.getChild(mot,restreint="oui", debug=1)
+            ouChercher=ouChercher.getChild(mot,restreint="oui")
         # Attention si +sieursMCFACT
         ouChercher=ouChercher[0]
         if debug : print (ouChercher)
@@ -709,7 +717,7 @@ class JDCEditorSsIhm :
     # dans le JDC
         ouChercher=etape
         for mot in listeAvant :
-              ouChercher=ouChercher.getChild(mot,restreint="oui")
+            ouChercher=ouChercher.getChild(mot,restreint="oui")
         monMC=etape.getChild(ouChercher,restreint="oui")
         if monMC== None : monMC= ouChercher.addEntite(MCFils)
         monMC.isvalid()
@@ -720,14 +728,14 @@ class JDCEditorSsIhm :
     # pour VP
         monObj=etape
         for mot in listeAvant :
-              monObj=monObj.getChild(mot,restreint="oui")
-              if monObj==None : return False
+            monObj=monObj.getChild(mot,restreint="oui")
+            if monObj==None : return False
         if monObj == None : return False
         if monObj.valeur != valeur :
-           # PNPN le setValeur fait des bugs --> pourquoi
-           #monObj.setValeur(valeur)
-           monObj.valeur=valeur
-           monObj.isValid()
+            # PNPN le setValeur fait des bugs --> pourquoi
+            #monObj.setValeur(valeur)
+            monObj.valeur=valeur
+            monObj.isValid()
         return True
 
     #-------------------------------------------------#
@@ -742,9 +750,9 @@ class JDCEditorSsIhm :
         if debug : print ('etape trouvee', ouChercher)
         if ouChercher==None : return None
         for mot in listeAvant :
-              ouChercher=ouChercher.getChild(mot,restreint="oui")
-              if debug : print (mot, ouChercher)
-              if ouChercher==None : return None
+            ouChercher=ouChercher.getChild(mot,restreint="oui")
+            if debug : print (mot, ouChercher)
+            if ouChercher==None : return None
         monMC=ouChercher.getChild(MCFils,restreint="oui")
         if debug : print ('monMC', monMC)
         if monMC== None : return None
@@ -759,9 +767,9 @@ class JDCEditorSsIhm :
         ouChercher=etape
         debug=0
         for mot in listeAvant :
-              ouChercher=ouChercher.getChild(mot,restreint="oui")
-              if debug : print (mot, ouChercher)
-              if ouChercher==None : return None
+            ouChercher=ouChercher.getChild(mot,restreint="oui")
+            if debug : print (mot, ouChercher)
+            if ouChercher==None : return None
         monMC=ouChercher.getChild(MCFils,restreint="oui")
         if debug : print ('monMC', monMC)
         return monMC
@@ -776,9 +784,9 @@ class JDCEditorSsIhm :
             if e.nom == nomEtape : ouChercher=e; break
         if ouChercher==None : return None
         for mot in listeAvant :
-              ouChercher=ouChercher.getChild(mot,restreint="oui")
-              #print (mot, ouChercher)
-              if ouChercher==None : return None
+            ouChercher=ouChercher.getChild(mot,restreint="oui")
+            #print (mot, ouChercher)
+            if ouChercher==None : return None
         monMC=ouChercher.getChild(MCFils,restreint="oui")
         monMC.set_valeur(valeur)
         monMC.isvalid()
@@ -789,14 +797,14 @@ class JDCEditorSsIhm :
     # dans le JDC
         ouChercher=etape
         if isinstance (etape, str):
-           ouChercher=None
-           for e in self.jdc.etapes:
-              if e.nom == etape : ouChercher=e; break
+            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.getChild(mot,restreint="oui")
-              if ouChercher==None : return
+            ouChercher=ouChercher.getChild(mot,restreint="oui")
+            if ouChercher==None : return
         monMC=ouChercher.getChild(MCFils,restreint="oui")
         if monMC== None : monMC= ouChercher.addEntite(MCFils)
 
@@ -815,24 +823,34 @@ class JDCEditorSsIhm :
 
         for mot in listeAvant :
             try :
-              ouChercher=ouChercher.getChild(mot,restreint="oui")
+                ouChercher=ouChercher.getChild(mot,restreint="oui")
             # Le mot clef n est pas la
             except : return 0
         try :
-           monMC=ouChercher.getChild(MCFils,restreint="oui")
+            monMC=ouChercher.getChild(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
+            if type(monMC.definition.into) ==types.FunctionType : maListeDeValeur=monMC.definition.into()
+            else : maListeDeValeur=monMC.definition.into
         else :
-           return 0
+            return 0
 
         monMC.state='changed'
         return 1
 
+    def dumpXsd(self, avecEltAbstrait = False):
+    #-----------------------------------------#
+        texteXSD = self.readercata.cata.JdC.dumpXsd(avecEltAbstrait)
+        return texteXSD
+
+    def dumpStructure(self):
+    #----------------------------#
+        texteStructure = self.readercata.cata.JdC.dumpStructure()
+        return texteStructure
+
     #-------------------------------------#
     def changeDefautDefMC(self,nomEtape,listeMC,valeurs):
     #-------------------------------------#
@@ -847,9 +865,9 @@ class JDCEditorSsIhm :
         ouChercher=definitionEtape
         if len(listeMC) > 1 :
 
-           for mc in listeMC[0:-1]:
-             mcfact=ouChercher.entites[mc]
-             ouChercher=mcfact
+            for mc in listeMC[0:-1]:
+                mcfact=ouChercher.entites[mc]
+                ouChercher=mcfact
 
         mcAccas=ouChercher.entites[listeMC[-1]]
         mcAccas.defaut=valeurs
@@ -890,8 +908,8 @@ class JDCEditorSsIhm :
     # 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
+            for e in self.jdc.etapes:
+                if e.nom == etape : etape=e; break
         if etape == None : return
         #definitionEtape=getattr(self.jdc.cata[0],etape)
         definitionEtape=getattr(self.jdc.cata,etape)
@@ -967,8 +985,8 @@ class JDCEditorSsIhm :
         self.changeIntoDefMC(etape,listeMC,into)
 
         if isinstance (etape, str):
-          for e in self.jdc.etapes:
-            if e.nom == etape : etape=e; break
+            for e in self.jdc.etapes:
+                if e.nom == etape : etape=e; break
         if etape == None : return
 
         ouChercher = etape
@@ -1001,11 +1019,11 @@ class JDCEditorSsIhm :
         indexDeb=text.find("#VERSION_CATALOGUE:")
         indexFin=text.find(":FIN VERSION_CATALOGUE")
         if indexDeb < 0 :
-           self.versionCataDuJDC="sans"
-           textJDC=text
+            self.versionCataDuJDC="sans"
+            textJDC=text
         else :
-           self.versionCataDuJDC=text[indexDeb+19:indexFin]
-           textJDC=text[0:indexDeb]+text[indexFin+23:-1]
+            self.versionCataDuJDC=text[indexDeb+19:indexFin]
+            textJDC=text[0:indexDeb]+text[indexFin+23:-1]
 
         self.versionCata="sans"
         if hasattr(self.readercata.cata,'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata.VERSION_CATALOGUE
@@ -1062,39 +1080,39 @@ class JDCEditorSsIhm :
     #---------------------------#
     def _newJDCCND(self):
     #---------------------------#
-      extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
-
-      #if self.salome == 0 :
-      QMessageBox.information( self,
-                      tr("Fichier Med"),
-                      tr("Veuillez selectionner un fichier Med"))
-      QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
-                        caption='Fichier Med',
-                        filter=extensions)
-      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")
-      texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
-      texteSources=""
-      texteCond=""
-      texteNoCond=""
-      texteVcut=""
-      texteZs=""
-      for groupe in self.listeGroupes :
-          if groupe[0:8]=='CURRENT_':
-             texteSources +=groupe[8:]+"=SOURCE("
-             texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
-          if groupe[0:5]=='COND_':    texteCond    +=groupe[5:]+"=CONDUCTEUR();\n"
-          if groupe[0:7]=='NOCOND_':  texteNoCond  +=groupe[7:]+"=NOCOND();\n"
-          if groupe[0:5]=='VCUT_':    texteVcut    +='V_'+groupe[5:]+"=VCUT();\n"
-          if groupe[0:3]=='ZS_':      texteZs      +=groupe[3:]+"=ZS();\n"
-      texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
-      self.newTexteCND=texte
-      self.modified=1
-      return texte
+        extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
+
+        #if self.salome == 0 :
+        QMessageBox.information( self,
+                        tr("Fichier Med"),
+                        tr("Veuillez selectionner un fichier Med"))
+        QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
+                          caption='Fichier Med',
+                          filter=extensions)
+        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")
+        texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
+        texteSources=""
+        texteCond=""
+        texteNoCond=""
+        texteVcut=""
+        texteZs=""
+        for groupe in self.listeGroupes :
+            if groupe[0:8]=='CURRENT_':
+                texteSources +=groupe[8:]+"=SOURCE("
+                texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
+            if groupe[0:5]=='COND_':    texteCond    +=groupe[5:]+"=CONDUCTEUR();\n"
+            if groupe[0:7]=='NOCOND_':  texteNoCond  +=groupe[7:]+"=NOCOND();\n"
+            if groupe[0:5]=='VCUT_':    texteVcut    +='V_'+groupe[5:]+"=VCUT();\n"
+            if groupe[0:3]=='ZS_':      texteZs      +=groupe[3:]+"=ZS();\n"
+        texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
+        self.newTexteCND=texte
+        self.modified=1
+        return texte
 
 
 if __name__ == "__main__":
-   print ('a faire')
+    print ('a faire')
index a4ef937bb0950ccc59cbf470705f6910cd24b640..9609025c8d5b855a79d540adb3791336b4e995b1 100755 (executable)
 from __future__ import absolute_import
 from __future__ import print_function
 try :
-   from builtins import str
+    from builtins import str
 except : pass
 
 
 import sys,os
-repIni=os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),".."))
-ihmQTDir=os.path.join(repIni,"UiQT5")
-editeurDir=os.path.join(repIni,"Editeur")
-ihmDir=os.path.join(repIni,"InterfaceQT4")
+repIni     = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),".."))
+ihmQTDir   = os.path.join(repIni,"UiQT5")
+editeurDir = os.path.join(repIni,"Editeur")
+ihmDir     = os.path.join(repIni,"InterfaceQT4")
 
-if ihmDir not in sys.path : sys.path.append(ihmDir)
-if ihmQTDir not in sys.path : sys.path.append(ihmQTDir)
-if editeurDir not in sys.path :sys.path.append(editeurDir)
-
-def getEficasSsIhm(code=None,fichier=None,ssCode=None,multi=False,langue='en',versionCode=None):
-    #print (versionCode)
-    from .qtEficasSsIhm import AppliSsIhm
-    Eficas=AppliSsIhm(code=code,salome=0,ssCode=ssCode,multi=multi,langue=langue,versionCode=versionCode)
-    from Editeur  import session
-    options=session.parse(['ssIhm','-k',code,'-v',versionCode])
-    return Eficas
+if ihmDir     not in sys.path : sys.path.append(ihmDir)
+if ihmQTDir   not in sys.path : sys.path.append(ihmQTDir)
+if editeurDir not in sys.path : sys.path.append(editeurDir)
 
+if sys.version_info[0] < 3:
+    print("Must be using Python 3")
+    sys.exit()
 
-def lanceEficas(code=None,fichier=None,ssCode=None,multi=False,langue='en'):
+def lanceEficas(code=None, multi=False, langue='en', labelCode=None):
+#-------------------------------------------------------------------
     """
-        Lance l'appli EFICAS
+        Lance l'appli EFICAS avec Ihm
     """
-    # Analyse des arguments de la ligne de commande
     try :
-      from PyQt5.QtWidgets import QApplication
+        from PyQt5.QtWidgets import QApplication
     except :
-      print('Please, set qt environment')
-      return
+        print('Please, set qt environment')
+        return
 
     from Editeur  import session
-    options=session.parse(sys.argv)
-    if options.code!= None : code=options.code
-    if options.ssCode!= None : ssCode=options.ssCode
+    options = session.parse(sys.argv)
+    if options.code          != None : code=options.code
 
     from InterfaceQT4.qtEficas import Appli
     app = QApplication(sys.argv)
 
-    #import cProfile, pstats, StringIO
-    #pr = cProfile.Profile()
-    #pr.enable()
-
-    Eficas=Appli(code=code,salome=0,ssCode=ssCode,multi=multi,langue=langue)
-    #pr.disable()
-    #s = StringIO.StringIO()
-    #sortby = 'cumulative'
-    #ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
-    #ps.print_stats()
-    #print (s.getValue())
-
+    Eficas=Appli(code=code,salome=0,multi=multi,langue=langue,labelCode=labelCode)
     Eficas.show()
 
     res=app.exec_()
     sys.exit(res)
 
+def getEficasSsIhm(code=None, multi=False, langue='en', labelCode=None,forceXML=False, genereXSD=False, fichierCata=None):
+#-------------------------------------------------------------------------------------------------------------------------
+    """
+        Lance l'appli EFICAS sans Ihm
+    """
+    from Editeur  import session
+    options = session.parse(sys.argv)
+    if options.code   != None : code=options.code
+    if forceXML : options.withXSD=True
+
+    from .qtEficasSsIhm import AppliSsIhm
+    Eficas=AppliSsIhm(code=code, salome=0, multi=multi, langue=langue, labelCode=labelCode, genereXSD=genereXSD, fichierCata=fichierCata)
+    return Eficas
+
+
+
+def genereXSD(code=None):
+#------------------------
+    from Editeur  import session
+    options = session.parse(sys.argv)
+    if code != None : options.code = code
+    if options.fichierCata == None :
+        print ('Use -c cata_name.py')
+        return
+
+    monEficasSsIhm = getEficasSsIhm(code=options.code,genereXSD=True)
+    monEditor=monEficasSsIhm.getEditor()
+    #texteXSD=monEficasSsIhm.dumpXsd(avecEltAbstrait=options.avecEltAbstrait)
+    texteXSD=monEditor.dumpXsd(avecEltAbstrait=options.avecEltAbstrait)
+
+    fichierCataTrunc=os.path.splitext(os.path.basename(options.fichierCata))[0]
+    #if fichierCataTrunc[0:4] in ('cata','Cata'): fichierCataTrunc=fichierCataTrunc[4:]
+    #if fichierCataTrunc[0] in ('_','-') : fichierCataTrunc=fichierCataTrunc[1:]
+    fileXSD = fichierCataTrunc + '.xsd'
+
+    f = open( str(fileXSD), 'w')
+    f.write(str(texteXSD))
+
+def lanceEficas_Web(code=None):
+#------------------------------
+    from Editeur  import session
+    options=session.parse(sys.argv)
+    if code != None : options.code = code
+    try    : fichier=options.comm[0]
+    except : fichier=None
+
+    monEficasSsIhm = getEficasSsIhm(code=options.code )
+    from .editorSsIhm import JDCEditorSsIhm
+    monEditeur=JDCEditorSsIhm(monEficasSsIhm,fichier)
+    print ('voici le JDCEditor', monEditeur)
+
+def genereXML(code=None):
+#-----------------------
+    from Editeur  import session
+    options=session.parse(sys.argv)
+    if code != None : options.code = code
+    if options.fichierCata == None :
+        print ('Use -c cata_name.py')
+        return
+    try    : fichier=options.comm[0]
+    except : fichier=None
+    if fichier==None :
+        print ('comm file is needed')
+        return
+
+    monEficasSsIhm = getEficasSsIhm(code=options.code, forceXML=True)
+
+    from .editorSsIhm import JDCEditorSsIhm
+    monEditeur=JDCEditorSsIhm(monEficasSsIhm,fichier)
+    print (options)
+    if options.fichierXMLOut == None :
+        fichierXMLOut=fichier[:fichier.rfind(".")]+'.xml'
+    else :
+        fichierXMLOut=options.fichierXMLOut
+    if not(monEditeur.jdc.isValid()):
+        print ('Fichier comm is not valid')
+        return
+    #print ('Fichier comm is not valid')
+    monEditeur.XMLgenerator.gener(monEditeur.jdc)
+    monEditeur.XMLgenerator.writeDefault(fichierXMLOut)
+
+def genereStructure(code=None):
+#------------------------------
+    from Editeur  import session
+    options=session.parse(sys.argv)
+    if code != None : options.code = code
+    if options.fichierCata == None :
+        print ('Use -c cata_name.py')
+        return
+
+    monEficasSsIhm = getEficasSsIhm(code=options.code,genereXSD=True)
+    monEditor=monEficasSsIhm.getEditor()
+    texteStructure=monEditor.dumpStructure()
+
+    fichierCataTrunc=os.path.splitext(os.path.basename(options.fichierCata))[0]
+    fileStructure = fichierCataTrunc + '.txt'
+    f = open( str(fileStructure), 'w')
+    f.write(str(texteStructure))
+    f.close()
 
+
+def validateDataSet(code=None):
+#------------------------------
+    from Editeur  import session
+    options=session.parse(sys.argv)
+    if code != None : options.code = code
+    if options.fichierCata == None :
+        print ('Use -c cata_name.py')
+        return
+    fichier=options.comm[0]
+    if fichier==None :
+        print ('comm file is needed')
+        return
+    from .editorSsIhm import JDCEditorSsIhm
+    monEficasSsIhm = getEficasSsIhm(code=options.code)
+    monEditeur=JDCEditorSsIhm(monEficasSsIhm,fichier)
+    if not (monEditeur.jdc.isValid()) : print (monEditeur.getJdcRapport())
+    else : print ('Jdc is valid')
+    return monEditeur.jdc.isValid()
+
+def validateFonction(laFonction, debug=False):
+#-------------------------------
+    # ici un singleton pour avoir l editor, le catalogue et...
+    monEficasSsIhm = getEficasSsIhm(code='Essai')
+    monEditor=monEficasSsIhm.getEditor()
+    #print ('_______ validateFonction', laFonction,  laFonction.__name__)
+    from functools  import wraps
+    from collections  import OrderedDict
+    from inspect  import getargspec
+    @wraps(laFonction)
+    def fonctionValidee(*args, **kwargs):
+        laFonctionName = laFonction.__name__
+        if debug : print('Appel {} avec args={} et kwargs={}'.format( laFonction.__name__, args, kwargs))
+        laDefDeLaFonctionDansAccas = getattr(monEditor.readercata.cata,laFonctionName)
+        objConstruit = laDefDeLaFonctionDansAccas.makeObjetPourVerifSignature(*args,**kwargs)
+        if (objConstruit.isValid()) :
+            ret = laFonction(*args, **kwargs)
+            return ret
+        else :
+            print ('mauvais arguments')
+            print (objConstruit.CR())
+            return None
+    return fonctionValidee
+
+        #maClasseAccas=getattr(self.cata,objEtape.monNomClasseAccas)
+    return fonctionValidee
+
+    return laFonction
+
+def createFromDocumentAccas(fichierCata=None,fichier=None,code=None):
+#------------------------------------------------------------
+    if fichier == None : print ('file is needed'); return None
+    if fichierCata == None    : print ('cata file is needed'); return None
+
+    from Noyau.N_OBJECT import activeSurcharge
+    activeSurcharge()
+
+    from .editorSsIhm import JDCEditorSsIhm
+    monEficasSsIhm = getEficasSsIhm(code='Essai', fichierCata=fichierCata)
+    monEditeur=JDCEditorSsIhm(monEficasSsIhm,fichier)
+    return monEditeur.jdc
+    #from Noyau
+
+
+# --------------------------- toutes les fonctions après sont obseletes
 def lanceEficas_ssIhm(code=None,fichier=None,ssCode=None,version=None,debug=False,langue='en'):
     """
-        Lance l'appli EFICAS pour trouver les noms des groupes
+        Lance l'appli EFICAS SsIhm
     """
     # Analyse des arguments de la ligne de commande
+    print ('deprecated')
     from Editeur  import session
     options=session.parse(sys.argv)
-    if version!=None and options.cata==None : options.cata=version
-    if fichier==None : fichier=options.comm[0]
-    if code == None : code=options.code
+    if version!=None and options.version == None : options.version=version
+    if fichier == None : fichier=options.comm[0]
+    if code    == None : code=options.code
 
     from .qtEficas import Appli
     Eficas=Appli(code=code,salome=0,ssCode=ssCode,ssIhm=True,langue=langue)
@@ -102,73 +250,75 @@ def lanceEficas_ssIhm(code=None,fichier=None,ssCode=None,version=None,debug=Fals
 
     from . import readercata
     if not hasattr ( Eficas, 'readercata'):
-           monreadercata  = readercata.ReaderCata( parent, Eficas )
-           Eficas.readercata=monreadercata
+        monreadercata  = readercata.ReaderCata( parent, Eficas )
+        Eficas.readercata=monreadercata
 
     from .editor import JDCEditor
     monEditeur=JDCEditor(Eficas,fichier)
     return monEditeur
 
 def lanceEficas_ssIhm_chercheGroupes(code=None,fichier=None,ssCode=None,version=None):
+    print ('deprecated')
     monEditeur=lanceEficas_ssIhm(code,fichier,ssCode,version)
     print((monEditeur.chercheGroupes()))
 
 def lanceEficas_ssIhm_cherche_cr(code=None,fichier=None,ssCode=None,version=None):
+    print ('deprecated')
     monEditeur=lanceEficas_ssIhm(code,fichier,ssCode,version)
     print((monEditeur.jdc.cr))
 
 def lanceEficas_ssIhm_reecrit(code=None,fichier=None,ssCode=None,version=None,ou=None,cr=False,debug=False,leger=False,langue='ang'):
+    print ('deprecated')
     #print 'lanceEficas_ssIhm_reecrit', fichier
     monEditeur=lanceEficas_ssIhm(code,fichier,ssCode,version,langue=langue)
-    if ou == None : 
-       fileName=fichier.split(".")[0]+"_reecrit.comm"
-       fn=fichier.split(".")[0]+"_cr.txt"
+    if ou == None :
+        fileName=fichier.split(".")[0]+"_reecrit.comm"
+        fn=fichier.split(".")[0]+"_cr.txt"
     else :
-       f=fichier.split(".")[0]+"_reecrit.comm"
-       f1=os.path.basename(f)
-       fn=fichier.split(".")[0]+"_cr.txt"
-       f2=os.path.basename(fn)
-       fileName=os.path.join(ou,f1)
-       fileCr=os.path.join(ou,f2)
+        f=fichier.split(".")[0]+"_reecrit.comm"
+        f1=os.path.basename(f)
+        fn=fichier.split(".")[0]+"_cr.txt"
+        f2=os.path.basename(fn)
+        fileName=os.path.join(ou,f1)
+        fileCr=os.path.join(ou,f2)
     debut=False
     if debug :
-         import cProfile, pstats, StringIO
-         pr = cProfile.Profile()
-         pr.enable()
-         monEditeur.saveFileAs(fileName=fileName)
-         pr.disable()
-         s = StringIO.StringIO()
-         sortby = 'cumulative'
-         ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
-         ps.print_stats()
-         print (s.getValue())
+        import cProfile, pstats, StringIO
+        pr = cProfile.Profile()
+        pr.enable()
+        monEditeur.saveFileAs(fileName=fileName)
+        pr.disable()
+        s = StringIO.StringIO()
+        sortby = 'cumulative'
+        ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
+        ps.print_stats()
+        print (s.getValue())
 
     elif not leger : monEditeur.saveFileAs(fileName=fileName)
     else : monEditeur.saveFileLegerAs(fileName=fileName)
     if cr:
-       f = open(fileCr, 'w')
-       f.write(str(monEditeur.jdc.report()))
-       f.close()
+        f = open(fileCr, 'w')
+        f.write(str(monEditeur.jdc.report()))
+        f.close()
 
 def lanceEficas_param(code='Adao',fichier=None,version='V0',macro='ASSIMILATION_STUDY'):
     """
         Lance l'appli EFICAS pour trouver les noms des groupes
     """
+    print ('deprecated')
     # Analyse des arguments de la ligne de commande
     from Editeur  import session
     options=session.parse(sys.argv)
 
     from .qtEficas import Appli
-    #app = QApplication(sys.argv)
-    #Eficas=Appli(code=code,ssCode=None,salome=0)
 
     from .ssIhm  import QWParentSSIhm
     Eficas=QWParentSSIhm(code,version)
 
     from . import readercata
     if not hasattr ( Eficas, 'readercata'):
-           monreadercata  = readercata.ReaderCata( parent, Eficas )
-           Eficas.readercata=monreadercata
+        monreadercata  = readercata.ReaderCata( parent, Eficas )
+        Eficas.readercata=monreadercata
 
     from .editor import JDCEditor
     monEditeur=JDCEditor(Eficas,fichier)
@@ -176,10 +326,6 @@ def lanceEficas_param(code='Adao',fichier=None,version='V0',macro='ASSIMILATION_
     parameters=getJdcParameters(texte,macro)
     return parameters
 
-#def getEficasSsIhm(code='Adao',versionCode='V0'):
-#    from .qtEficasSsIhm import AppliSsIhm
-#    Eficas=AppliSsIhm(code=code,ssCode=None,salome=0)
-#    return Eficas
 
 def getJdcParameters(jdc,macro):
     """
@@ -187,6 +333,7 @@ def getJdcParameters(jdc,macro):
     specified jdc text to a python dictionnary whose keys are the
     names of the data of the macro.
     """
+    print ('deprecated')
     context = {}
     source = "def args_to_dict(**kwargs): return kwargs \n"
     source+= "%s = _F = args_to_dict          \n"%macro
@@ -202,42 +349,18 @@ def loadJDC(filename):
     This function loads the text from the specified JdC file. A JdC
     file is the persistence file of Eficas (*.comm).
     """
+    print ('deprecated')
     fcomm=open(filename,'r')
     jdc = ""
     for line in fcomm.readlines():
         if not (line[0]=='#'):
-           jdc+="%s"%line
+            jdc+="%s"%line
 
     # Warning, we have to make sure that the jdc comes as a simple
     # string without any extra spaces/newlines
     return jdc.strip()
 
-def lanceEficas_Web(code=None,fichier=None,ssCode=None,version=None,debug=False,langue='en',multi=False,versionCode=None):
-    from Editeur  import session
-    options=session.parse(sys.argv)
-    if version!=None and options.cata == None : options.cata=version
-    if fichier==None and options.comm != [] : fichier=options.comm[0]
-    if code == None : code=options.code
-
-    from .qtEficasSsIhm import AppliSsIhm
-    Eficas=AppliSsIhm(code=code,salome=0,ssCode=ssCode,multi=multi,langue=langue,versionCode=versionCode)
-
-    from .ssIhm  import QWParentSSIhm
-    parent=QWParentSSIhm(code,Eficas,version)
-
-    from . import readercata
-    if not hasattr ( Eficas, 'readercata'):
-           monreadercata  = readercata.ReaderCata( parent, Eficas )
-           Eficas.readercata=monreadercata
-
-    from .editor import JDCEditor
-    monEditeur=JDCEditor(Eficas,fichier)
-    return monEditeur
-
-
 if __name__ == "__main__":
     import sys
     sys.path.insert(0,os.path.abspath(os.path.join(os.getcwd(),'..')))
-    lanceEficas(code=None,fichier=None,ssCode=None,multi=True)
-    
-
+    lanceEficas(code=None,multi=True)
index af26c198a0924b62e9e3ca9eb96624184c38ebc2..ea74407653eaa2f18d9bd24143282918003a17a6 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 str
 except : pass
 
 import os, sys
-import six
 
 from Extensions.eficas_exception import EficasException
 from Extensions import param2
@@ -33,22 +33,25 @@ from Extensions import param2
 from .getVersion import getEficasVersion
 from .viewManagerSsIhm import MyViewManagerSsIhm
 
+from Editeur        import session
+
 
 class AppliSsIhm:
     """
     Class implementing the main user interface.
     """
-    def __init__(self,code=None,salome=1,parent=None,ssCode=None,multi=False,langue='fr',ssIhm=True,versionCode=None):
+    def __init__(self,code=None,salome=1,parent=None,multi=False,langue='fr',ssIhm=True,labelCode=None,genereXSD=False,fichierCata=None):
         """
         Constructor
         """
         version=getEficasVersion()
         self.VERSION_EFICAS="Eficas QT5 Salome " + version
-        self.versionCode=versionCode
+        self.labelCode=labelCode
 
         self.salome=salome
         self.ssIhm=True
         self.code=code
+        self.genereXSD=genereXSD
 
         self.dict_reels={}
         self.fichierIn=None
@@ -62,25 +65,30 @@ class AppliSsIhm:
         self.listeCode=['Adao','ADAO','Carmel3D','Telemac','CF','MAP','ZCracks', 'SEP','SPECA','PSEN_Eficas','PSEN_N1']
         self.repIcon=os.path.join( os.path.dirname(os.path.abspath(__file__)),'..','Editeur','icons')
 
+        if fichierCata== None: self.fichierCata=session.d_env.fichierCata
+        else : self.fichierCata=fichierCata
+        if session.d_env.labelCode : self.labelCode=session.d_env.labelCode
+        self.withXSD=session.d_env.withXSD
+
         if self.salome:
-          import Accas
-          try :
-            import eficasSalome
-            Accas.SalomeEntry = eficasSalome.SalomeEntry
-          except : 
-            print ('eficas hors salome')
+            import Accas
+            try :
+                import eficasSalome
+                Accas.SalomeEntry = eficasSalome.SalomeEntry
+            except :
+                print ('eficas hors salome')
 
         self.multi=multi
-        if self.multi : 
-              print ('pas de multi sans ihm')
+        if self.multi :
+            print ('pas de multi sans ihm')
 
 
         if langue=='fr': self.langue=langue
         else           : self.langue="ang"
 
         if self.multi == False :
-             self.definitCode(code,ssCode)
-             if code==None: return
+            self.definitCode(code,None)
+            if code==None: return
 
         self.suiteTelemac=False
         self.viewmanager=MyViewManagerSsIhm(self)
@@ -91,23 +99,34 @@ class AppliSsIhm:
         self.ssCode=ssCode
         if self.code == None:return # pour le cancel de la fenetre choix code
 
-        name='prefs_'+self.code
-        prefsCode=__import__(name)
+        try :
+            name='prefs_'+self.code
+            prefsCode=__import__(name)
+            self.repIni=prefsCode.repIni
+        except :
+            self.repIni=os.path.dirname(os.path.abspath(__file__))
+
 
-        self.repIni=prefsCode.repIni
         if ssCode != None :
-           self.format_fichier= ssCode  #par defaut
-           prefsCode.NAME_SCHEME=ssCode
+            self.formatFichierOut = ssCode  #par defaut
+            prefsCode.NAME_SCHEME = ssCode
         else :
-           self.format_fichier="python" #par defaut
+            self.formatFichierIn  = "python" #par defaut
+            self.formatFichierOut = "python" #par defaut
 
         nameConf='configuration_'+self.code
-        configuration=__import__(nameConf)
-        self.maConfiguration = configuration.make_config(self,prefsCode.repIni)
+        try :
+            configuration=__import__(nameConf)
+            self.maConfiguration = configuration.make_config(self,self.repIni)
+        except :
+            from .configuration import makeConfig
+            #self.maConfiguration = configuration.makeConfig(self,prefsCode.repIni)
+            self.maConfiguration = makeConfig(self,self.repIni)
 
         if hasattr (self,'maConfiguration') and self.maConfiguration.translatorFichier :
-           from Extensions import localisation
-           localisation.localise(None,self.langue,translatorFichier=self.maConfiguration.translatorFichier)
+            from Extensions import localisation
+            localisation.localise(None,self.langue,translatorFichier=self.maConfiguration.translatorFichier)
+        if self.withXSD : self.maConfiguration.withXSD=True
 
 
     def getSource(self,file):
@@ -120,20 +139,29 @@ class AppliSsIhm:
 
 
     def initEditor(self,fichier = None,jdc = None, units = None,include=0):
-        if self.editor != None : 
-           print ('un seul editeur par appli')
-           sys.Exit()
-        self.editor = JDCEditorSsIhm(self,fichier, jdc, self.myQtab,units=units,include=include)
-        
+        if (hasattr(self, 'editor')) and self.editor != None :
+            print ('un seul editeur par application')
+            sys.exit()
+        self.editor = self.viewmanager.getNewEditorNormal()
+
+    def initEditorNormal(self,fichier = None,jdc = None, units = None,include=0):
+        if (hasattr(self, 'editor')) and self.editor != None :
+            print ('un seul editeur par application')
+            sys.Exit()
+        #self.editor = JDCEditorSsIhm(self,fichier, jdc, self.myQtab,units=units,include=include)
+        self.editor = self.viewmanager.getNewEditorNormal()
+
 
     def fileNew(self):
-        self.editor=initEditor(self)
+        self.editor=self.initEditor()
 
     def getEditor(self):
+        if (hasattr(self, 'editor')) and self.editor != None : return self.editor
+        self.initEditor()
         return self.editor
 
     def fileOpen(self,fichier):
-        fichierIn = os.path.abspath(six.text_type(fichier))
+        fichierIn = os.path.abspath(fichier)
         try:
             monEditor=self.viewmanager.handleOpen(fichierIn)
         except EficasException as exc:
@@ -151,10 +179,13 @@ class AppliSsIhm:
         ok = editor.saveFileAs()
         print ('ok ',ok)
 
-    def dumpXsd(self):
-        current_cata    = CONTEXT.getCurrentCata()
-        current_cata.dumpXsd()
-        if self.maConfiguration.afficheIhm==False : exit()
+    def dumpXsd(self, avecEltAbstrait = False):
+        currentCata    = CONTEXT.getCurrentCata()
+        texteXSD = currentCata.dumpXsd( avecEltAbstrait)
+        return texteXSD
+        #if self.maConfiguration.afficheIhm==False : exit()
+        #else : return texteXSD
+
 
 #,self.fileSaveAs
 #,self.fileClose
@@ -163,10 +194,10 @@ class AppliSsIhm:
 #,self.jdcRegles
 #,self.jdcFichierSource
 #,self.visuJdcPy
-       
+
 
 
 if __name__=='__main__':
 
     # Modules Eficas
-    monEficas= AppliSsIhm(code='Adao',salome=0,versionCode='V83')
+    monEficas= AppliSsIhm(code='Adao',salome=0,labelCode='V83')
index 6d83df3cb67f948fdc4d92f479e22fc9045e46ff..358cf6cb7eb3ef12accf77280d069286cd8ddd72 100644 (file)
 
 from __future__ import absolute_import
 try :
-   from builtins import str
-   from builtins import object
+    from builtins import str
+    from builtins import object
 except : pass
 
 import os
 from Extensions.i18n import tr
-import six
-from  PyQt5.QtWidgets  import QFileDialog, QMessageBox
-from  PyQt5.QtCore     import QFileInfo
 
 # --------------------------------
 class JdcSsIhmHandler(object):
 # --------------------------------
 # retourne a l utilisateur
 
-   def __init__(self,viewManager):
+    def __init__(self,viewManager):
 #  --------------------------------------
-       self.viewManagerSsIhm=viewManager
+        self.viewManagerSsIhm=viewManager
 
-   def viewJdcPy(self) :
+    def viewJdcPy(self) :
 #  ---------------------
-       self.viewManagerSsIhm.handleViewJdcPy(self)
+        self.viewManagerSsIhm.handleViewJdcPy(self)
 
-   def viewJdcSource(self) :
+    def viewJdcSource(self) :
 #  ---------------------
-       self.viewManagerSsIhm.handleViewJdcSource(self)
+        self.viewManagerSsIhm.handleViewJdcSource(self)
 
-   def getFileName(self):
+    def getFileName(self):
 #  ---------------------
-       self.viewManagerSsIhm.getFileName(self)
+        self.viewManagerSsIhm.getFileName(self)
 
-   def viewJdcRapport(self) :
+    def viewJdcRapport(self) :
 #  ---------------------
-       self.viewManagerSsIhm.handleViewJdcRapport(self)
+        self.viewManagerSsIhm.handleViewJdcRapport(self)
 
-   def getJdcRapport(self) :
+    def getJdcRapport(self) :
 #  ---------------------
-       return self.viewManagerSsIhm.handleGetJdcRapport(self)
+        return self.viewManagerSsIhm.handleGetJdcRapport(self)
 
-   def getDicoPython(self) :
+    def getDicoPython(self) :
 #  -------------------------
-       return self.viewManagerSsIhm.generDico(self)
+        return self.viewManagerSsIhm.generDico(self)
 
-   def isJdcValid(self) :
+    def isJdcValid(self) :
 #  -------------------------
-       return self.viewManagerSsIhm.isJdcValid(self)
+        return self.viewManagerSsIhm.isJdcValid(self)
 
-   def fileSaveAs(self,fileName):
+    def fileSaveAs(self,fileName):
 #  -------------------------
-       return self.viewManagerSsIhm.fileSaveAs(self,fileName)
+        return self.viewManagerSsIhm.fileSaveAs(self,fileName)
 
-   def fileLegerSaveAs(self,fileName):
+    def fileLegerSaveAs(self,fileName):
 #  -----------------------------------
-       return self.viewManagerSsIhm.fileLegerSaveAs(self,fileName)
+        return self.viewManagerSsIhm.fileLegerSaveAs(self,fileName)
 
 
 
@@ -82,335 +79,161 @@ class MyViewManagerSsIhm(object):
 #--------------------------------
 # Symetrique de ViewManager mais pas d heritage entre les 2
 # dans le viewManager pas de souci pour savoir qui est le jdc sur lequel on travaille
-# ici en revanche.... c est moins sur
+# ici en revanche.... c est moins sur . voir avec le fichier
 
 #  --------------------------------
-   def __init__(self,appliEficas):
+    def __init__(self,appliEficas):
 #  --------------------------------
-       self.appliEficas=appliEficas
-       self.tabWidgets = []
-       self.mesIndexes = {}
-       self.dictEditors={}
-       self.untitledCount = 0
-       self.doubles = {}
+        self.appliEficas=appliEficas
+        self.tabWidgets = []
+        self.mesIndexes = {}
+        self.dictEditors={}
+        self.untitledCount = 0
+        self.doubles = {}
 
 #  ------------------------------------------------------
-   def handleOpen(self,fichier=None, units=None):
+    def handleOpen(self,fichier=None, units=None):
 #  ------------------------------------------------------
-       result = None
-       if fichier is None: 
-             print ('nom de fichier obligatoire')
-             return None
+        result = None
+        if fichier is None:
+            print ('nom de fichier obligatoire')
+            return None
 
-       for handler in self.dictEditors :
-           editor=self.dictEditors[handler]
-           if self.samePath(fichier, editor.getFileName()):
-              print ('fichier deja ouvert . pas de nouvel editor')
-              return handler
+        for handler in self.dictEditors :
+            editor=self.dictEditors[handler]
+            if self.samePath(fichier, editor.getFileName()):
+                print ('fichier deja ouvert . pas de nouvel editor')
+                return handler
 
-       monNewHandler = self.getNewEditor(fichier,units)
-       return monNewHandler
+        monNewHandler = self.getNewEditor(fichier,units)
+        return monNewHandler
 
 #  ----------------------------------------------------------------------
-   def getNewEditor(self,fichier = None,jdc = None, units = None,include=0):
+    def getNewEditor(self,fichier = None,jdc = None, units = None,include=0):
 #  ----------------------------------------------------------------------
-
-       from .editorSsIhm import JDCEditorSsIhm
-       editor = JDCEditorSsIhm(self.appliEficas,fichier,jdc, units=units,include=include)
-
-       if editor.jdc: # le fichier est bien un jdc
-          monHandler = JdcSsIhmHandler(self)
-          self.dictEditors[monHandler]=editor
-          return monHandler
-       else:
-          print ('impossible de construire le jdc') 
-          return None
+# il faudrait decider entre e handler ou non
+# le cas d usage n est pas tout a fait identique  :
+# avec handler pour les utilisateurs avance
+# sans pour les utilisateurs encore plus ancvances et les tests
+
+        from .editorSsIhm import JDCEditorSsIhm
+        editor = JDCEditorSsIhm(self.appliEficas,fichier,jdc, units=units,include=include)
+
+        if editor.jdc: # le fichier est bien un jdc
+            monHandler = JdcSsIhmHandler(self)
+            self.dictEditors[monHandler]=editor
+            return monHandler
+        else:
+            print ('impossible de construire le jdc')
+            return None
+
+#  --------------------------------------------------------------------------------
+    def getNewEditorNormal(self,fichier = None,jdc = None, units = None,include=0):
+#  --------------------------------------------------------------------------------
+
+        from .editorSsIhm import JDCEditorSsIhm
+        editor = JDCEditorSsIhm(self.appliEficas,fichier,jdc, units=units,include=include)
+        self.editor=editor
+        return editor
 
 #  -----------------------------
-   def samePath(self,f1, f2):
+    def samePath(self,f1, f2):
 #  ------------------------------
-    """
-    compare two paths.
-    """
-    if f1 is None or f2 is None: return 0
-    if os.path.normcase(os.path.normpath(f1)) == os.path.normcase(os.path.normpath(f2)) : return 1
-    return 0
+        """
+        compare two paths.
+        """
+        if f1 is None or f2 is None: return 0
+        if os.path.normcase(os.path.normpath(f1)) == os.path.normcase(os.path.normpath(f2)) : return 1
+        return 0
 
 #  ---------------------------------
-   def handleViewJdcPy(self,handler):
+    def handleViewJdcPy(self,handler):
 #  ---------------------------------
         if not (handler in self.dictEditors) :
-           print ('editor non trouve')
-           return
+            print ('editor non trouve')
+            return
         self.dictEditors[handler].viewJdcPy()
 
 #  ---------------------------------
-   def getFileName(self,handler):
+    def getFileName(self,handler):
 #  ---------------------------------
         if not (handler in self.dictEditors) :
-           print ('editor non trouve')
-           return
+            print ('editor non trouve')
+            return
         return self.dictEditors[handler].getFileName()
 
 
 #  ---------------------------------------------
-   def handleViewJdcSource(self,handler):
+    def handleViewJdcSource(self,handler):
 #  ---------------------------------------------
         print (handler)
         if not (handler in self.dictEditors) :
-           print ('editor non trouve')
-           return
+            print ('editor non trouve')
+            return
         self.dictEditors[handler].viewJdcSource()
 
 
 #  ---------------------------------------------
-   def handleViewJdcRapport(self,handler):
+    def handleViewJdcRapport(self,handler):
 #  ---------------------------------------------
         print (handler)
         if not (handler in self.dictEditors) :
-           print ('editor non trouve')
-           return
+            print ('editor non trouve')
+            return
         self.dictEditors[handler].viewJdcRapport()
 
 #  ---------------------------------------------
-   def handleGetJdcRapport(self,handler):
+    def handleGetJdcRapport(self,handler):
 #  ---------------------------------------------
         if not (handler in self.dictEditors) :
-           print ('editor non trouve')
-           return
+            print ('editor non trouve')
+            return
         return self.dictEditors[handler].getJdcRapport()
 
 #  ---------------------------------------------
-   def handleViewJdcRapport(self,handler):
+    def handleViewJdcRapport(self,handler):
 #  ---------------------------------------------
         print (handler)
         if not (handler in self.dictEditors) :
-           print ('editor non trouve')
-           return
+            print ('editor non trouve')
+            return
         self.dictEditors[handler].viewJdcRapport()
 
 
 #  ---------------------------------------------
-   def generDico(self,handler):
+    def generDico(self,handler):
 #  ---------------------------------------------
         print (handler)
         if not (handler in self.dictEditors) :
-           print ('editor non trouve')
-           return
+            print ('editor non trouve')
+            return
         return self.dictEditors[handler].generDico()
 
 
 #  ---------------------------------------------
-   def isJdcValid(self,handler):
+    def isJdcValid(self,handler):
 #  ---------------------------------------------
         print (handler)
         if not (handler in self.dictEditors) :
-           print ('editor non trouve')
-           return
+            print ('editor non trouve')
+            return
         return self.dictEditors[handler].jdc.isValid()
 
 
 #  ---------------------------------------------
-   def fileSaveAs(self,handler,fileName):
+    def fileSaveAs(self,handler,fileName):
 #  ---------------------------------------------
         print (handler)
         if not (handler in self.dictEditors) :
-           print ('editor non trouve')
-           return
+            print ('editor non trouve')
+            return
         return self.dictEditors[handler].saveFile(fileName)
 
 #  ---------------------------------------------
-   def fileLegerSaveAs(self, handler,fileName):
+    def fileLegerSaveAs(self, handler,fileName):
 #  ---------------------------------------------
 #        print (handler)
         if not (handler in self.dictEditors) :
-           print ('editor non trouve')
-           return
+            print ('editor non trouve')
+            return
         self.dictEditors[handler].saveFileLegerAs(fileName)
-
-
-#   def handleClose(self,doitSauverRecent = 1,texte=tr('&Quitter')):
-#       if doitSauverRecent : self.appliEficas.sauveRecents()
-#       index=self.myQtab.currentIndex()
-#       if index < 0 : return
-#       res=self.checkDirty(self.dict_editors[index],texte)
-#       if res == 2 : return 2             # l utilisateur a annule
-#       index=self.myQtab.currentIndex()
-#       idx=index
-#       while idx < len(self.dict_editors) -1 :
-#             self.dict_editors[idx]=self.dict_editors[idx+1]
-#             idx = idx + 1
-#       del self.dict_editors[len (self.dict_editors) -1]
-#       try :
-#           del self.doubles[self.dict_editors[index]]
-#       except :
-#           pass
-#       self.myQtab.removeTab(index)
-#       return res
-#       
-
-#
-#   def handleCloseAll(self,texte=tr('Quitter')):
-#       res=0
-#       self.appliEficas.sauveRecents()
-#       while len(self.dict_editors) > 0 :
-#             self.myQtab.setCurrentIndex(0)
-#             res=self.handleClose(0,texte)
-#             if res==2 : return res   # l utilsateur a annule
-#       return res
-#        
-#
-#
-#   def newEditor(self,include=0):
-#       if self.appliEficas.demande==True : 
-#           self.appliEficas.definitCode(None,None)
-#           if self.appliEficas.code == None:return
-#       maPage=self.getEditor(include=include)
-#
-
-#
-#   def handleViewJdcRegles(self):
-#       index=self.myQtab.currentIndex()
-#       if index < 0 : return
-#       self.dict_editors[index].viewJdcRegles()
-#
-#   def handleGestionParam(self):
-#       index=self.myQtab.currentIndex()
-#       if index < 0 : 
-#          QMessageBox.warning( self.appliEficas,tr(u"Creation Parametre indisponible"),tr(u"les parametres sont lies a un jeu de donnees"))
-#          return
-#       self.dict_editors[index].gestionParam()
-#
-#
-#
-#   def saveCurrentEditor(self):
-#       index=self.myQtab.currentIndex()
-#       if index < 0 : return
-#       editor=self.dict_editors[index]
-#       if editor in self.doubles :
-#           QMessageBox.warning(
-#                     None,
-#                     tr("Fichier Duplique"),
-#                     tr("Le fichier ne sera pas sauvegarde."),)
-#           return
-#       ok, newName = editor.saveFile()
-#       if ok :
-#           fileName=os.path.basename(six.text_type(newName))
-#           self.myQtab.setTabText(index,fileName)
-#       return ok
-#
-#   def saveLegerCurrentEditor(self):
-#       index=self.myQtab.currentIndex()
-#       if index < 0 : return
-#       editor=self.dict_editors[index]
-#       ok, newName = editor.saveFileLeger()
-#       return ok
-#
-#   def sauveLigneCurrentEditor(self):
-#       index=self.myQtab.currentIndex()
-#       if index < 0 : return
-#       editor=self.dict_editors[index]
-#       if editor in self.doubles :
-#           QMessageBox.warning(
-#                     None,
-#                     tr("Fichier Duplique"),
-#                     tr("Le fichier ne sera pas sauvegarde."),)
-#           return
-#       ok, newName = editor.sauveLigneFile()
-#       if ok :
-#           fileName=os.path.basename(six.text_type(newName))
-#           self.myQtab.setTabText(index,fileName)
-#       return ok
-#
-#
-#   def saveAsCurrentEditor(self):
-#       index=self.myQtab.currentIndex()
-#       editor=self.dict_editors[index]
-#       oldName=editor.fichier
-#       ok,newName = editor.saveFileAs()
-#       if ok :
-#           fileName=os.path.basename(six.text_type(newName))
-#           self.myQtab.setTabText(index,fileName)
-#       if editor in self.doubles :
-#          if oldName != newName :
-#             del self.doubles[editor]
-#       return ok
-#
-#   def displayJDC(self,jdc,fn=None):
-#        """
-#        Public slot to display a file in an editor.
-#        @param fn name of file to be opened
-#        # insert filename into list of recently opened files
-#        """
-#        titre=None
-#        if fn != None : titre=fn.split("/")[-1]
-#        editor = self.getEditor(fichier= fn, jdc = jdc ,include=1)
-#        self.appliEficas.addToRecentList(editor.getFileName())
-#
-
-##PNPNPNPN --> a affiner
-#        if fichier is None:
-#            self.untitledCount += 1
-#            self.myQtab.addTab(win, tr("Fichier non encore nomme ", self.untitledCount))
-#            #self.myQtab.addTab(win, str(self.appliEficas.code))
-#        else:
-#            liste=fichier.split('/')
-#            txt =  liste[-1]
-#            if not QFileInfo(fichier).isWritable():
-#                txt = '%s (ro)' % txt
-#            self.myQtab.addTab(win,txt )
-#        self.myQtab.setCurrentWidget(win)
-#        self.currentEditor=win
-#        win.setFocus()
-#
-#   def getOpenStartDir(self) :
-#       #PN --> Les Preferences
-#        try :
-#            userDir=os.path.expanduser("~/Eficas_install/")
-#            return userDir
-#        except :
-#            return ""
-#
-#
-#   def checkDirty(self, editor,texte):
-#        """
-#        Private method to check dirty status and open a message window.
-#        
-#        @param editor editor window to check
-#        @return flag indicating successful reset of the dirty flag (boolean)
-#        """        
-#        res=1 
-#        if (editor.modified) and (editor in self.doubles) :
-#            msgBox = QMessageBox(None)
-#            msgBox.setWindowTitle(tr("Fichier Duplique"))
-#            msgBox.setText(tr("Le fichier ne sera pas sauvegarde."))
-#            msgBox.addButton(texte,0)
-#            msgBox.addButton(tr("&Annuler"),1)
-#            res=msgBox.exec_()
-#            if res == 0 : return 1
-#            return 2
-#        if editor.modified:
-#            fn = editor.getFileName()
-#            if fn is None: fn = tr('Noname')
-#            msgBox = QMessageBox(None)
-#            msgBox.setWindowTitle(tr("Fichier Modifie"))
-#            msgBox.setText(tr("Le fichier ne sera pas sauvegarde."))
-#            msgBox.addButton(tr("&Sauvegarder"),1)
-#            msgBox.addButton(tr("&Quitter sans sauvegarder"),0)
-#            msgBox.addButton(tr("&Annuler"),2)
-#            res=msgBox.exec_()
-#            if res == 2 : return res
-#            if res == 0:
-#                (ok, newName) = editor.saveFile()
-#                if ok:
-#                    fileName=os.path.basename(six.text_type(newName))
-#                    index=self.myQtab.currentIndex()
-#                    self.myQtab.setTabText(index,fileName)
-#                return ok
-#        return res
-#
-#   def handleAjoutGroup(self,listeGroup):
-#       index=self.myQtab.currentIndex()
-#       if index < 0 : return
-#       editor=self.dict_editors[index]
-#       editor.handleAjoutGroup(listeGroup)
diff --git a/editorSsIhm.py b/editorSsIhm.py
new file mode 100755 (executable)
index 0000000..7c12bdd
--- /dev/null
@@ -0,0 +1,1118 @@
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2021   EDF R&D
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# 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
+
+
+import traceback
+
+# Modules Eficas
+
+import convert, generator
+from Editeur        import session
+from Editeur        import comploader
+from Editeur        import Objecttreeitem
+
+DictExtensions= {"MAP" : ".map", "TELEMAC" : '.cas'}
+debug = False
+
+
+
+class JDCEditorSsIhm :
+# ------------------- #
+    """
+       Editeur de jdc
+    """
+
+# ---------------------------------------------
+# Methodes Communes ou appelees depuis avec Ihm
+# ---------------------------------------------
+
+    def __init__ (self,appliEficas,fichier = None, jdc = None,  units = None, include=0 ):
+    #-----------------------------------------------------------------------------------#
+    # paticularisee avec Ihm
+
+        if debug : print ('dans le init de JDCEditorSsIhm')
+        self.appliEficas = appliEficas
+        self.fichier     = fichier
+        self.fichierComplet   = fichier
+        if fichier != None : self.extensionFichier = os.path.splitext(fichier)[1]
+        else : self.extensionFichier = None
+        self.jdc         = jdc
+        self.first       = True
+        self.jdc_item    = None
+        self.dicoNouveauxMC   = {}
+        self.dicoNouveauxFact = {}
+        self.dict_reels       = {}
+        self.liste_simp_reel  = []
+
+        if self.appliEficas != None : self.salome =  self.appliEficas.salome
+        else             : self.salome =  0
+
+        # ces attributs sont mis a jour par definitCode appelee par newEditor
+        self.code              = self.appliEficas.maConfiguration.code
+        self.maConfiguration   = self.appliEficas.maConfiguration
+
+
+        if not hasattr ( self.appliEficas, 'readercata') or self.appliEficas.readercata.demandeCatalogue==True or self.appliEficas.multi==True:
+            if self.maConfiguration.typeDeCata == 'XML' :
+                from . import readercataXML as readercata
+            else :
+                from . import readercata
+            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.fichierCata == None : return    #Sortie Salome
+        self.titre=self.readercata.titre
+
+        self.formatFichierOut =  self.appliEficas.formatFichierOut
+        self.formatFichierIn  =  self.appliEficas.formatFichierIn
+
+        #if self.appliEficas.maConfiguration.dumpXSD==True : self.appliEficas.dumpXsd()
+        self.dict_reels={}
+        self.liste_simp_reel=[]
+        self.dicoNouveauxMC={}
+        self.dicoNouveauxFact={}
+
+
+        try:
+            self.maConfiguration.generator_module
+            _module = __import__(self.maConfiguration.generator_module)
+            info    = _module.entryPoint()
+            generator.plugins.addEntryPoint(info)
+        except:
+            pass
+
+        try:
+            self.maConfiguration.convert_module
+            #print self.maConfiguration.convert_module
+            _module = __import__(self.maConfiguration.convert_module)
+            info = _module.entryPoint()
+            convert.plugins.addEntryPoint(info)
+        except :
+            pass
+
+        self.maConfiguration.mesGenerators     = generator
+        self.maConfiguration.mesconvertisseurs = convert
+        try    : self.XMLgenerator=generator.plugins['xml']()
+        except : self.XMLgenerator=None
+
+
+        if self.formatFichierOut in generator.plugins.keys():
+            self.generator = generator.plugins[self.formatFichierOut]()
+
+
+        self.fileInfo       = None
+        self.lastModified   = 0
+
+        self.modified   = False
+        self.isReadOnly = False
+
+        #------- construction du jdc --------------
+
+
+        self.nouveau=0
+        if self.fichier is not None:        #  fichier jdc fourni
+            if jdc==None :
+                #print ('PNPN : chgt try en if')
+                try :
+                #if 1 :
+                    self.jdc = self.readFile(self.fichier)
+                except :
+                    print ("mauvaise lecture du fichier")
+                if self.salome :
+                    try    : self.appliEficas.addJdcInSalome( self.fichier)
+                    except : print ("mauvais enregistrement dans Salome")
+            else :
+                self.jdc=jdc
+
+            if self.jdc is not None and units is not None:
+                self.jdc.recorded_units=units
+                self.jdc.old_recorded_units=units
+
+        else:
+            if not self.jdc:                   #  nouveau jdc
+                if not include : self.jdc = self._newJDC(units=units)
+                else : self.jdc = self._newJDCInclude(units=units)
+                self.nouveau=1
+
+        if self.jdc:
+            self.jdc.editor = self
+            self.jdc.lang    = self.appliEficas.langue
+            self.jdc.aReafficher=False
+            txt_exception  = None
+            if not jdc:
+                if self.extensionFichier == '.xml' :
+                    if self.appliEficas.maConfiguration.withXSD: self.jdc.analyseXML()
+                    else : print ('run MDM with -x option  (MDM for XML)'); exit()
+                else : self.jdc.analyse()
+                txt_exception = self.jdc.cr.getMessException()
+            if txt_exception :
+                self.jdc = None
+                self.informe('pb chargement jdc',txt_exception)
+            #else:
+                #comploader.chargerComposants()
+                #self.jdc_item=Objecttreeitem.makeObjecttreeitem( self, "nom", self.jdc )
+
+    #-------------------------------#
+    def readFile(self, fn):
+    #--------------------------------#
+        """
+        Public slot to read the text from a file.
+        @param fn filename to read from (string or QString)
+        """
+
+        # charge un JDC
+        # paticularisee avec Ihm
+
+        fn = str(fn)
+        jdcName=os.path.basename(fn)
+
+        # Il faut convertir le contenu du fichier en fonction du format
+        formatIn=self.appliEficas.formatFichierIn
+        if self.extensionFichier == '.xml' and self.appliEficas.maConfiguration.withXSD: formatIn='xml'
+        if formatIn in convert.plugins:
+            # Le convertisseur existe on l'utilise
+            p=convert.plugins[formatIn]()
+            p.readfile(fn)
+
+            if p.text=="" : self.nouveau=1
+            #print ('PNPN --> CIST a faire')
+
+            if formatIn != 'xml':
+                pareil,texteNew=self.verifieChecksum(p.text)
+                if  not pareil : self.informe(("fichier modifie"),("Attention! fichier change hors EFICAS"),False)
+                p.text=texteNew
+                memeVersion,texteNew=self.verifieVersionCataDuJDC(p.text)
+                if memeVersion == 0 : texteNew=self.traduitCatalogue(texteNew)
+                p.text=texteNew
+                text=p.convert('exec',self.appliEficas)
+                if not p.cr.estvide(): self.afficheInfos("Erreur a la conversion",'red')
+            else:
+                text=p.text
+        else :
+            self.afficheInfos("Type de fichier non reconnu",'red')
+            self.informe( "Type de fichier non reconnu",
+                    "EFICAS ne sait pas ouvrir le type de fichier " + self.appliEficas.formatFichierIn)
+            return None
+
+        CONTEXT.unsetCurrentStep()
+
+        #jdc=self.readercata.cata[0].JdC(procedure=text,
+        jdc=self.readercata.cata.JdC(procedure=text,
+                                    appliEficas=self.appliEficas,
+                                    cata=self.readercata.cata,
+                                    cata_ord_dico=self.readercata.cata_ordonne_dico,
+                                    nom=jdcName,
+                                    rep_mat=self.maConfiguration.rep_mat
+                                   )
+        self.modified = False
+        return jdc
+
+
+    #--------------------------------#
+    def _newJDC( self ,units = None):
+    #--------------------------------#
+        """
+        Initialise un nouveau JDC vierge
+        """
+        self.modified=1
+        CONTEXT.unsetCurrentStep()
+
+        texte=""
+        if self.code == "CARMELCND" : texte=self._newJDCCND()
+        if self.code == "ZCRACKS" : texte=self._newZCRACKS()
+        if self.code == "PSEN"    : texte = self._newPSEN()
+        if self.code == "PSEN_N1" : texte = self._newPSEN_N1()
+
+        if hasattr(self.readercata.cata,'TEXTE_NEW_JDC') : texte=self.readercata.cata.TEXTE_NEW_JDC
+
+
+        jdc=self.readercata.cata.JdC( procedure =texte,
+                                         appliEficas=self.appliEficas,
+                                         cata=self.readercata.cata,
+                                         cata_ord_dico=self.readercata.cata_ordonne_dico,
+                                         rep_mat=self.maConfiguration.rep_mat
+                                        )
+
+        jdc.lang    = self.appliEficas.langue
+        if units is not None:
+            jdc.recorded_units=units
+            jdc.old_recorded_units=units
+        # chgt le 15/10/19
+        # Attention positionne  contexte ?
+        # est ce qu on ne doit pas changer le format en Accas si on vient d accas ?
+        jdc.editor=self
+        return jdc
+
+    #--------------------------------#
+    def _newJDCInclude( self ,units = None):
+    #--------------------------------#
+        """
+        Initialise un nouveau JDC vierge
+        """
+        import Extensions.jdc_include
+        JdC_aux=Extensions.jdc_include.JdC_include
+        CONTEXT.unsetCurrentStep()
+
+        #jaux=self.readercata.cata[0].JdC( procedure="",
+        jaux=self.readercata.cata.JdC( procedure="",
+                               appliEficas=self.appliEficas,
+                               cata=self.readercata.cata,
+                               cata_ord_dico=self.readercata.cata_ordonne_dico,
+                               rep_mat=self.maConfiguration.rep_mat,
+                              )
+        jaux.editor=self
+        jaux.analyse()
+
+        J=JdC_aux( procedure="",
+                   appliEficas=self.appliEficas,
+                   cata=self.readercata.cata,
+                   cata_ord_dico=self.readercata.cata_ordonne_dico,
+                   jdc_pere=jaux,
+                   rep_mat=self.maConfiguration.rep_mat,
+                   )
+        J.editor=self
+        J.analyse()
+        if units is not None:
+            J.recorded_units=units
+            J.old_recorded_units=units
+        return J
+
+
+
+    #-----------------------#
+    def getSource(self,file):
+    #-----------------------#
+
+        # Il faut convertir le contenu du fichier en fonction du format
+        if self.formatFichierIn in convert.plugins :
+            # Le convertisseur existe on l'utilise
+            p=convert.plugins[self.formatFichierIn]()
+            p.readfile(file)
+            text=p.convert('execnoparseur')
+            if not p.cr.estvide():
+                self.afficheInfos("Erreur a la conversion",'red')
+            return text
+        else:
+            # Il n'existe pas c'est une erreur
+            self.afficheInfos("Type de fichier non reconnu",'red')
+            self.informe( "Type de fichier non reconnu",
+                    "EFICAS ne sait pas ouvrir le type de fichier " + self.appliEficas.formatFichierIn)
+            return None
+
+    #----------------------------------------------#
+    def __generateTempFilename(self, prefix, suffix):
+    #----------------------------------------------#
+        import tempfile
+        (fd, filename) = tempfile.mkstemp(prefix=prefix, suffix=suffix)
+        os.close(fd)
+        return filename
+
+    #-----------------------#
+    def generDico(self):
+    #-----------------------#
+        if 'dico' in generator.plugins:
+            self.generator=generator.plugins['dico']()
+            #print (self.generator)
+            jdc_formate=self.generator.gener(self.jdc)
+            #print (jdc_formate)
+            dico=self.generator.Dico
+            #print (dico)
+            return dico
+
+    #-----------------------#
+    def viewJdcSource(self):
+    #-----------------------#
+        if self.fichier == None : return
+        if os.path.isfile(self.fichier):
+            f=open(self.fichier,'r')
+            texteSource=f.read()
+            f.close()
+            self._viewText(texteSource, "JDC_SOURCE")
+        else :
+            self._viewText("file doesn't exist", "JDC_SOURCE")
+
+
+    #-----------------------#
+    def viewJdcPy(self):
+    #-----------------------#
+        strSource = str( self.getTextJDC(self.formatFichierOut) )
+        self._viewText(strSource, "JDC_RESULTAT")
+
+    #-----------------------#
+    def viewJdcRapport(self):
+    #-----------------------#
+        # on ajoute les regles
+        strRapport = str( self.jdc.report() )
+        self._viewText(strRapport, "JDC_RAPPORT")
+
+    #-----------------------#
+    def viewJdcRegles(self):
+    #-----------------------#
+        # on ajoute les regles
+        texte_global, test_global =  self.jdc.verifRegles()
+        self._viewText(texte_global, "JDC_REGLES")
+
+    #-----------------------#
+    def getJdcRapport(self):
+    #-----------------------#
+        # on ajoute les regles
+        strRapport = str( self.jdc.report() )
+        return strRapport
+
+    #---------------------#
+    def getFileName(self):
+    #---------------------#
+        return self.fichier
+
+    #-------------------#
+    def initModif(self):
+    #-------------------#
+        """
+            Met l'attribut modified a 'o' : utilise par Eficas pour savoir
+            si un JDC doit etre sauvegarde avant destruction ou non
+        """
+        self.modified = True
+
+
+    #--------------------------------------------------#
+    def writeFile(self, fn, txt = None,formatLigne="beautifie"):
+    #--------------------------------------------------#
+        """
+        Public slot to write the text to a file.
+
+        @param fn filename to write to string
+        @return flag indicating success
+        """
+
+        fn = str(fn)
+
+        if txt == None :
+            txt = self.getTextJDC(self.formatFichierOut,formatLigne=formatLigne)
+            eol = '\n'
+            if len(txt) >= len(eol):
+                if txt[-len(eol):] != eol:
+                    txt += eol
+            else:
+                txt += eol
+            txt=self.ajoutVersionCataDsJDC(txt)
+            if self.code != 'PSEN' and self.code != 'PSEN_N1' : checksum=self.getChecksum(txt)
+            else : checksum=''
+            txt=txt+checksum
+        if self.code=="TELEMAC" : return 1
+        try:
+            f = open(fn, 'w')
+            f.write(txt)
+            f.close()
+            return 1
+        except IOError as why:
+            print('Sauvegarde du Fichier', 'Le fichier'+str(fn) + 'n a pas pu etre sauvegarde :'  , str(why))
+            self.afficheInfos('Le fichier'+str(fn) + 'n a pas pu etre sauvegarde '  , 'red')
+            return 0
+
+
+    #-----------------------------------------------------------#
+    def getTextJDC(self,format = None,pourRun=0,formatLigne="beautifie"):
+    #-----------------------------------------------------------#
+        if self.code == "MAP" and not(format in generator.plugins): format = "MAP"
+        if format == None : format = self.formatFichierOut
+        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.maConfiguration,appliEficas=self.appliEficas)
+                if pourRun : jdc_formate=self.generator.textePourRun
+                if self.code == 'TELEMAC' : jdc_formate=self.generator.texteDico
+            except ValueError as e:
+                self.informe( "Erreur a la generation",str(e),'red')
+                return
+
+            if not self.generator.cr.estvide():
+                self.informe("Erreur a la generation","EFICAS ne sait pas convertir ce JDC",'red')
+                return ""
+            else:
+                return jdc_formate
+        else:
+            # Il n'existe pas c'est une erreur
+            self.informe("Format inconnu", self.format +  " non reconnu" )
+            return ""
+
+    #------------------------------#
+    def verifieChecksum(self,text):
+    #------------------------------#
+    # Attention : souci sous Windows
+    #
+        indexDeb=text.find("#CHECKSUM:")
+        if indexDeb < 0 : return 1, text
+        indexFin=text.find(":FIN CHECKSUM")
+        checkAvant=text[indexDeb:indexFin+13]
+        textJDC=text[0:indexDeb]+text[indexFin+13:-1]
+        if self.code != 'PSEN'  and self.code != 'PSEN_N1':
+            checksum=self.getChecksum(textJDC)
+            pareil=(checkAvant==checksum)
+        else :
+            pareil=1
+        return pareil, textJDC
+
+    #---------------------------#
+    def getChecksum(self,texte):
+    #---------------------------#
+        try :
+            import haslib
+            newtexte=texte.replace('"','\\"')
+            hash_checksum = hashlib.md5()
+            hash_checksum.update(newtexte.encode('utf-8'))
+            checksum = hash_checksum.hexdigest()
+            ligne = ligne="#CHECKSUM:"+checksum+":FIN CHECKSUM"
+        except :
+            try :
+                newtexte=texte.replace('"','\\"')
+                commande='echo "'+newtexte+'"|md5sum'
+                a=os.popen(commande)
+                checksum=a.read()
+                a.close()
+            except :
+                checksum='Fichier trop long \n'
+            ligne="#CHECKSUM:"+checksum[0:-1]+":FIN CHECKSUM"
+            return ligne
+
+    #----------------------#
+    def getDico(self):
+    #---------------------#
+        if 'dicoImbrique' in generator.plugins:
+            self.generator=generator.plugins['dicoImbrique']()
+            #print (self.generator)
+            jdc_formate=self.generator.gener(self.jdc)
+            dico=self.generator.Dico
+            return dico
+        else :
+            self.afficheInfos(tr("Format %s non reconnu" , 'Dictionnaire Imbrique' ),'red')
+            return ""
+
+    #-----------------------------------------#
+    def chercheGroupes(self):
+    #-----------------------------------------#
+        listeMA,listeNO=self.getTextJDC("GroupMA")
+        return listeMA,listeNO
+
+    #-----------------------------------------#
+    def chercheDico(self):
+    #-----------------------------------------#
+        dicoCourant={}
+        format =  self.appliEficas.formatFichierOut
+        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.maConfiguration)
+            dicoCourant=self.generator.dico
+        return dicoCourant
+
+    #-----------------------------------------------------------------#
+    def saveFileLegerAs(self, fileName = None) :
+    #-----------------------------------------------------------------#
+        if fileName != None :
+            self.fichier = fileName
+            return self.saveFileLeger(fileName)
+        return self.saveFileLeger()
+
+    #-----------------------------------------------------------------#
+    def saveFileComplet(self, fichier = None, formatLigne="beautifie"):
+    #-----------------------------------------------------------------#
+        fn = fichier
+        self.generator=generator.plugins[self.format]()
+        print (self.generator)
+        if hasattr(self.generator, "writeComplet"):
+            self.generator.writeComplet(fichier,self.jdc,config=self.appliEficas.maConfiguration,appliEficas=self.appliEficas)
+
+
+# ---------------------------------------------
+# Methodes Surchargees par avecIhm
+# ---------------------------------------------
+
+    #--------------------------------#
+    def ajoutCommentaire(self):
+    #--------------------------------#
+        print ('pas programme sans Ihm')
+        print ('prevenir la maintenance du besoin')
+
+
+    #--------------------------------------#
+    def informe(self,titre,txt,critique=True):
+    #--------------------------------------#
+    # methode differenre avec et sans ihm
+        if critique : print ('!!!!!!!!!!!!!!!!!!!!!!!!!!!')
+        print (titre)
+        print (txt)
+        if critique : print ('!!!!!!!!!!!!!!!!!!!!!!!!!!!')
+
+    #--------------------------------------#
+    def afficheInfos(self,txt,couleur=None):
+    #--------------------------------------#
+    # methode differenre avec et sans ihm
+        print (txt)
+
+    #-----------------------------------------------------------------------#
+    def _viewText(self, txt, caption = "FILE_VIEWER",largeur=1200,hauteur=600):
+    #--------------------------------------------------------------------#
+        print ('_____________________________')
+        print (txt)
+        print ('_____________________________')
+
+
+    #-----------------------------------------------------------------#
+    def saveFile(self, fichier, formatLigne="beautifie"):
+    #-----------------------------------------------------------------#
+        """
+        Public slot to save the text to a file.
+
+        @param path directory to save the file in (string or QString)
+        @return tuple of two values (boolean, string) giving a success indicator and
+            the name of the saved file
+        """
+
+
+        self.fichierOut = fichier
+        if self.appliEficas.maConfiguration.fichierXML !=None : self.jdc.analyseXML()
+        if not (self.writeFile(fichier,formatLigne=formatLigne)): return (0, None)
+        if  self.jdc.cata.modeleMetier and self.jdc.isValid():
+            if self.generator != self.XMLgenerator :
+                self.XMLgenerator.gener(self.jdc)
+                self.XMLgenerator.writeDefault(fichier)
+                return(1,self.fichier)
+        if self.jdc.isValid() and hasattr(self.generator, "writeDefault"):
+            self.generator.writeDefault(fichier)
+        elif self.code=="TELEMAC" and hasattr(self.generator, "writeDefault"):
+            self.generator.writeDefault(fichier)
+        self.modified = 0
+        return (1, self.fichier)
+#
+
+    #----------------------------------------------#
+    def sauveLigneFile(self):
+    #----------------------------------------------#
+        self.modified=1
+        return self.saveFile(formatLigne="Ligne")
+
+
+    #-----------------------------------#
+    def updateJdc(self, itemApres,texte):
+    #------------------------------------#
+    # ajoute une etape  de JdC a partir d un texte
+        monItem=itemApres
+        etape=monItem.item.object
+        CONTEXT.setCurrentStep(etape)
+        etape.buildIncludeInclude(texte)
+        self.tree.racine.buildChildren()
+
+    #-----------------------------------#
+    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)
+        try :
+            ok=etape.build_includeEtape(texte)
+        except :
+            ok=0
+        if not ok :
+            QMessageBox.information( self,
+                       tr("Import texte"),
+                       tr("Impossible d importer le texte"))
+        self.tree.racine.build_children()
+        return ok
+
+
+
+    #-------------------------------------#
+    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.getChild(mot,restreint="oui")
+        monMC=ouChercher.getChild(MCFils,restreint="oui")
+        if monMC != None :  ouChercher.suppentite(monMC)
+        ouChercher.state='changed'
+        ouChercher.isvalid()
+
+    #--------------------------------------------------------#
+    def ajoutMC(self,etape,MCFils,valeurs,listeAvant=()):
+    #--------------------------------------------------------#
+    # dans le JDC
+        debug=False
+        if debug : print ('ajoutMC', etape,MCFils,valeurs,listeAvant)
+        ouChercher=etape
+        if debug : print (ouChercher)
+        for mot in listeAvant :
+            ouChercher=ouChercher.getChild(mot,restreint="oui")
+        monMC=ouChercher.getChild(MCFils,restreint="oui")
+        if monMC == None : monMC = ouChercher.addEntite(MCFils)
+        monMC.valeur=valeurs
+        monMC.val=valeurs
+        monMC.state='changed'
+        monMC.isvalid()
+        return 1
+
+    #--------------------------------------------------------#
+    def ajoutMCinMCFactUnique(self,etape,MCFils,valeurs,listeAvant=()):
+    # Attention si +sieursMCFACT
+    #--------------------------------------------------------#
+    # dans le JDC
+        debug=False
+        if debug : print ('ajoutMC', etape,MCFils,valeurs,listeAvant)
+        ouChercher=etape
+        if debug : print (ouChercher)
+        for mot in listeAvant :
+            ouChercher=ouChercher.getChild(mot,restreint="oui")
+        # Attention si +sieursMCFACT
+        ouChercher=ouChercher[0]
+        if debug : print (ouChercher)
+        monMC=ouChercher.getChild(MCFils,restreint="oui")
+        if monMC == None : monMC = ouChercher.addEntite(MCFils)
+        monMC.valeur=valeurs
+        monMC.val=valeurs
+        monMC.state='changed'
+        monMC.isValid()
+        return 1
+
+    #----------------------------------------------#
+    def ajoutMCFact(self,etape,MCFils,listeAvant=()):
+    #----------------------------------------------#
+    # dans le JDC
+        ouChercher=etape
+        for mot in listeAvant :
+            ouChercher=ouChercher.getChild(mot,restreint="oui")
+        monMC=etape.getChild(ouChercher,restreint="oui")
+        if monMC== None : monMC= ouChercher.addEntite(MCFils)
+        monMC.isvalid()
+
+    #-----------------------------------------------------------------#
+    def setValeurMCSimpInEtape(self,etape,listeAvant,valeur):
+    #-----------------------------------------------------------------#
+    # pour VP
+        monObj=etape
+        for mot in listeAvant :
+            monObj=monObj.getChild(mot,restreint="oui")
+            if monObj==None : return False
+        if monObj == None : return False
+        if monObj.valeur != valeur :
+            # PNPN le setValeur fait des bugs --> pourquoi
+            #monObj.setValeur(valeur)
+            monObj.valeur=valeur
+            monObj.isValid()
+        return True
+
+    #-------------------------------------------------#
+    def getValeur(self,nomEtape,MCFils,listeAvant=()):
+    #-------------------------------------------------#
+    # dans le JDC
+
+        debug=0
+        ouChercher=None
+        for e in self.jdc.etapes:
+            if e.nom == nomEtape : ouChercher=e; break
+        if debug : print ('etape trouvee', ouChercher)
+        if ouChercher==None : return None
+        for mot in listeAvant :
+            ouChercher=ouChercher.getChild(mot,restreint="oui")
+            if debug : print (mot, ouChercher)
+            if ouChercher==None : return None
+        monMC=ouChercher.getChild(MCFils,restreint="oui")
+        if debug : print ('monMC', monMC)
+        if monMC== None : return None
+        return monMC.valeur
+
+    #-------------------------------------------------#
+    def getMCDsEtape(self,etape,MCFils,listeAvant=()):
+    #-------------------------------------------------#
+    # dans le JDC
+
+        if etape==None : return None
+        ouChercher=etape
+        debug=0
+        for mot in listeAvant :
+            ouChercher=ouChercher.getChild(mot,restreint="oui")
+            if debug : print (mot, ouChercher)
+            if ouChercher==None : return None
+        monMC=ouChercher.getChild(MCFils,restreint="oui")
+        if debug : print ('monMC', monMC)
+        return monMC
+
+    #-----------------------------------------------------------#
+    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.getChild(mot,restreint="oui")
+            #print (mot, ouChercher)
+            if ouChercher==None : return None
+        monMC=ouChercher.getChild(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.getChild(mot,restreint="oui")
+            if ouChercher==None : return
+        monMC=ouChercher.getChild(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.getChild(mot,restreint="oui")
+            # Le mot clef n est pas la
+            except : return 0
+        try :
+            monMC=ouChercher.getChild(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 dumpXsd(self, avecEltAbstrait = False):
+    #-----------------------------------------#
+        texteXSD = self.readercata.cata.JdC.dumpXsd(avecEltAbstrait)
+        return texteXSD
+
+    def dumpStructure(self):
+    #----------------------------#
+        texteStructure = self.readercata.cata.JdC.dumpStructure()
+        return texteStructure
+
+    #-------------------------------------#
+    def changeDefautDefMC(self,nomEtape,listeMC,valeurs):
+    #-------------------------------------#
+    # 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,nomEtape)
+        #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,etape,listeMC,valeurs):
+    #------------------------------------------------#
+    # dans le MDD
+        #definitionEtape=getattr(self.jdc.cata[0],nomEtape)
+        #definitionEtape=getattr(self.jdc.cata,nomEtape)
+        print ( 'changeIntoDefMC ',etape,listeMC,valeurs)
+        ouChercher=getattr(self.jdc.cata,etape.nom)
+
+        #if len(listeMC) > 1 :
+        #   for mc in listeMC[0:-1]:
+        #     mcfact=ouChercher.entites[mc]
+        #     ouChercher=mcfact
+        #mcAccas=ouChercher.entites[listeMC[-1]]
+
+        for mc in listeMC :
+            mcAccas=ouChercher.entites[mc]
+            ouChercher=mcAccas
+            if ouChercher == None : return 0
+
+        if hasattr(mcAccas,'into') : oldValeurs=mcAccas.into
+        else : oldValeurs=None
+
+        if oldValeurs==valeurs : return 1
+        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)
+        definitionEtape=getattr(self.jdc.cata,etape)
+        ouChercher=definitionEtape
+        for k in listeAvant :
+            ouChercher=ouChercher.entites[k]
+        MCADetruire=ouChercher.entites[nomDuMC]
+        ouChercher.ordre_mc.remove(nomDuMC)
+        print ('remove de ', nomDuMC)
+        del ouChercher.entites[nomDuMC]
+        del self.dicoNouveauxMC[nomDuMC]
+
+
+    #-------------------------------------------------------------#
+    def ajoutDefinitionMC(self,nomEtape,listeAvant,nomDuMC,typ,**args):
+    #-------------------------------------------------------------#
+    # dans le MDD
+        #definitionEtape=getattr(self.jdc.cata[0],nomEtape)
+        definitionEtape=getattr(self.jdc.cata,nomEtape)
+        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)
+        #print ('ajout de ', nomDuMC)
+        #traceback.print_stack()
+        # ajout CIST sauvegarde
+        if nomDuMC in self.dicoNouveauxMC : del self.dicoNouveauxMC[nomDuMC]
+        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)
+        definitionEtape=getattr(self.jdc.cata,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,listeMC,into,valeurs):
+    #----------------------------------------------------#
+    # 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.getChild(mot,restreint="oui")
+            if ouChercher==None : return
+        MCFils=listeMC[-1]
+        monMC=ouChercher.getChild(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):
+    #-------------------------------------#
+        #if not hasattr(self.readercata.cata[0],'VERSION_CATALOGUE'): return txt
+        if not hasattr(self.readercata.cata,'VERSION_CATALOGUE'): return txt
+        ligneVersion="#VERSION_CATALOGUE:"+self.readercata.cata.VERSION_CATALOGUE+":FIN VERSION_CATALOGUE\n"
+        texte=txt+ligneVersion
+        return texte
+
+    #-------------------------------------#
+    def verifieVersionCataDuJDC(self,text):
+    #-------------------------------------#
+        memeVersion=False
+        indexDeb=text.find("#VERSION_CATALOGUE:")
+        indexFin=text.find(":FIN VERSION_CATALOGUE")
+        if indexDeb < 0 :
+            self.versionCataDuJDC="sans"
+            textJDC=text
+        else :
+            self.versionCataDuJDC=text[indexDeb+19:indexFin]
+            textJDC=text[0:indexDeb]+text[indexFin+23:-1]
+
+        self.versionCata="sans"
+        if hasattr(self.readercata.cata,'VERSION_CATALOGUE'): self.versionCata=self.readercata.cata.VERSION_CATALOGUE
+
+        if self.versionCata==self.versionCataDuJDC : memeVersion=True
+        return memeVersion,textJDC
+
+    #-------------------------------#
+    def traduitCatalogue(self,texte):
+    #-------------------------------#
+        nomTraducteur="traduit"+self.readercata.code+self.versionCataDuJDC+"To"+self.versionCata
+        sys.path.append(os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../Traducteur")))
+        try :
+            traducteur=__import__(nomTraducteur)
+            monTraducteur=traducteur.MonTraducteur(texte)
+            nouveauTexte=monTraducteur.traduit()
+            return nouveauTexte
+        except :
+            return texte
+
+
+# Methodes a resorber
+# il faut mettre a jour les catalogues avec
+# TEXTE_NEW_JDC
+#
+
+    #---------------------------#
+    def _new_CF(self):
+    #---------------------------#
+        texte="CONDUITE_FORCEE();"
+        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
+
+    #---------------------------#
+    def _newZCRACKS(self):
+    #---------------------------#
+        texte="MAILLAGES();REMESHING();"
+        return texte
+
+
+    #---------------------------#
+    def _newJDCCND(self):
+    #---------------------------#
+        extensions=tr('Fichiers Med (*.med);;''Tous les Fichiers (*)')
+
+        #if self.salome == 0 :
+        QMessageBox.information( self,
+                        tr("Fichier Med"),
+                        tr("Veuillez selectionner un fichier Med"))
+        QSfichier = QFileDialog.getOpenFileName(self.appliEficas,
+                          caption='Fichier Med',
+                          filter=extensions)
+        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")
+        texteComm="COMMENTAIRE(u'Cree - fichier : "+self.fichierMED +" - Nom Maillage : "+self.nomMaillage+"');\nPARAMETRES()\n"
+        texteSources=""
+        texteCond=""
+        texteNoCond=""
+        texteVcut=""
+        texteZs=""
+        for groupe in self.listeGroupes :
+            if groupe[0:8]=='CURRENT_':
+                texteSources +=groupe[8:]+"=SOURCE("
+                texteSources +="VecteurDirecteur=(1.0,2.0,3.0,),);\n"
+            if groupe[0:5]=='COND_':    texteCond    +=groupe[5:]+"=CONDUCTEUR();\n"
+            if groupe[0:7]=='NOCOND_':  texteNoCond  +=groupe[7:]+"=NOCOND();\n"
+            if groupe[0:5]=='VCUT_':    texteVcut    +='V_'+groupe[5:]+"=VCUT();\n"
+            if groupe[0:3]=='ZS_':      texteZs      +=groupe[3:]+"=ZS();\n"
+        texte=texteComm+texteSources+texteCond+texteNoCond+texteVcut+texteZs
+        self.newTexteCND=texte
+        self.modified=1
+        return texte
+
+
+if __name__ == "__main__":
+    print ('a faire')