]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
reindent Efi2Xsd
authorpascale.noyret <pascale.noyret@edf.fr>
Thu, 25 Mar 2021 18:03:44 +0000 (19:03 +0100)
committerpascale.noyret <pascale.noyret@edf.fr>
Thu, 25 Mar 2021 18:03:44 +0000 (19:03 +0100)
Efi2Xsd/AccasXsd.py
Efi2Xsd/MCAccasXML.py
Efi2Xsd/balisesXSD.py

index 33580963d76b5ae8c73b12f0cf71ca61db65221f..99b60287c44604f2eae5b9ea87ca7c939da595d3 100755 (executable)
@@ -34,620 +34,620 @@ 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 debug : print ('definitNomDuTypePyxb', self, self.nom,self.nomComplet())
-       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
+    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 debug : print ('definitNomDuTypePyxb', self, self.nom,self.nomComplet())
+        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=False):
-       #if nom == 'blocFormatFichierMed_blocFormatFichierAll' : debug = True 
-       #   import traceback
-       #   traceback.print_stack()
-       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.ordre_mc=[]
-       for mc in listeDeCreation : 
-           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)
-      
-       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':
+    def __init__(self,nom,listeDeCreation,pere, debug=False):
+        #if nom == 'blocFormatFichierMed_blocFormatFichierAll' : debug = True
+        #   import traceback
+        #   traceback.print_stack()
+        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.ordre_mc=[]
+        for mc in listeDeCreation :
+            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)
+
+        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)
-         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)
-
-   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 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
-
-       for nomMC in aReduire.keys():
-           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 :  print (listeSuivante[0]) ;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 ('ajouteAuxTextes', nomMC, self.nom, self.entites[nomMC])
-       #if debug : 
-       #   traceback.print_stack() 
-       #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 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
-       # PN : attention on dumpe 2 fois
-       self.entites[nomMC][0].dumpXsd(dansFactorisation=True,multiple=True,first=first)
-       if not (isinstance(self.entites[nomMC][0], Accas.SIMP)) : 
-          print ('2 blocs freres ont le meme nom et pas le meme type : pas encore traite')
-          print ('Projection XSD impossible, changez un des ', nomMC)
-          exit()
-       self.texteComplexe += '\t'*(indent) + self.entites[nomMC][0].texteElt
-       nomTypePyxbUnion=self.entites[nomMC][0].nomDuTypePyxb
-       texteSimpleUnion=debutSimpleType.format(nomTypePyxbUnion)
-       texteSimpleUnion+=debutUnion
-       #if len(listePourUnion) == 1 :
-       #PN  29 septembre 20. Est ce que ce if a un sens
-       # si len(listePourUnion==1) on est deja sorti non ?
-       #    mc=self.entites[nomMC][0]
-       #    mc.dumpXsd(dansFactorisation=True,multiple=True,first=first)
-           # inutile - deja fait plus haut
-       #    if mc.aCreer : self.texteComplexeVenantDesFils += mc.texteComplexe
-       #    if mc.aCreer : self.texteSimple   += mc.texteSimple
-       #else :
-       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
-       #print ('self.texteSimple', self.texteSimple)
-   
+
+
+    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)
+
+    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 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
+
+        for nomMC in aReduire.keys():
+            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 ('ajouteAuxTextes', nomMC, self.nom, self.entites[nomMC])
+        #if debug :
+        #   traceback.print_stack()
+        #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 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
+        # PN : attention on dumpe 2 fois
+        self.entites[nomMC][0].dumpXsd(dansFactorisation=True,multiple=True,first=first)
+        if not (isinstance(self.entites[nomMC][0], Accas.SIMP)) :
+            print ('2 blocs freres ont le meme nom et pas le meme type : pas encore traite')
+            print ('Projection XSD impossible, changez un des ', nomMC)
+            exit()
+        self.texteComplexe += '\t'*(indent) + self.entites[nomMC][0].texteElt
+        nomTypePyxbUnion=self.entites[nomMC][0].nomDuTypePyxb
+        texteSimpleUnion=debutSimpleType.format(nomTypePyxbUnion)
+        texteSimpleUnion+=debutUnion
+        #if len(listePourUnion) == 1 :
+        #PN  29 septembre 20. Est ce que ce if a un sens
+        # si len(listePourUnion==1) on est deja sorti non ?
+        #    mc=self.entites[nomMC][0]
+        #    mc.dumpXsd(dansFactorisation=True,multiple=True,first=first)
+            # inutile - deja fait plus haut
+        #    if mc.aCreer : self.texteComplexeVenantDesFils += mc.texteComplexe
+        #    if mc.aCreer : self.texteSimple   += mc.texteSimple
+        #else :
+        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
+        #print ('self.texteSimple', self.texteSimple)
+
 
 
 # ----------------------------------------
 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)
-       for mcFils in self.mcXSD :
-          if not (isinstance(mcFils, Accas.BLOC)) :
-             mcFils.dumpXsd(dansFactorisation)
-             #print (mcFils.texteSimple)
-             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, multiple = False, first=True):
-       #print ('_________ dumpXsd___________', self.nom)
-       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 self.aCreer :
-          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)
-          self.texteComplexe  = texteComplexeVenantDesFils + self.texteComplexe
-          # 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 ) : self.texteComplexe += finTypeCompo
-       else :
-          self.texteComplexe = ""
-
-       self.texteElt=eltCompoDsSequence.format(self.nom,self.nomDuCodeDumpe,self.nomDuTypePyxb,self.minOccurs,self.maxOccurs)
-       #print (self.texteComplexe)
-       #print ('------------------------------------------------',self.nom)
-
-   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):
-       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
+
+    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)
+        for mcFils in self.mcXSD :
+            if not (isinstance(mcFils, Accas.BLOC)) :
+                mcFils.dumpXsd(dansFactorisation)
+                #print (mcFils.texteSimple)
+                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, multiple = False, first=True):
+        #print ('_________ dumpXsd___________', self.nom)
+        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 self.aCreer :
+            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)
+            self.texteComplexe  = texteComplexeVenantDesFils + self.texteComplexe
+            # 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 ) : self.texteComplexe += finTypeCompo
+        else :
+            self.texteComplexe = ""
+
+        self.texteElt=eltCompoDsSequence.format(self.nom,self.nomDuCodeDumpe,self.nomDuTypePyxb,self.minOccurs,self.maxOccurs)
+        #print (self.texteComplexe)
+        #print ('------------------------------------------------',self.nom)
+
+    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):
+        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
 
 
 
@@ -656,42 +656,42 @@ class X_definitionComposee (X_definition):
 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
-
-   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)
+# 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
+
+    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)
+    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)
 
 
 # ----------------------------------
@@ -702,269 +702,269 @@ class X_PROC (X_definitionComposee):
 #-----------------------------------
 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)
-
-       #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)
+    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)
+
+        #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):
-       #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
-
-       #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')
-          if self.defaut : 
-             if self.max > 1 or self.max == '**' or self.max ==  float('inf') : 
-                # a revoir pour les tuples avec defaut
-                txtDefaut=""
-                for val in self.defaut : txtDefaut+=str(val) +" "
-                self.texteElt = eltWithDefautDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
-             else :
-                if str(self.defaut)   == 'True'  : txtDefaut = 'true'
-                elif str(self.defaut) == 'False' : txtDefaut = 'false'
-                else : txtDefaut = str(self.defaut)
-                self.texteElt = eltWithDefautDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
-          else : self.texteElt = eltDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1)
-       elif first: 
-          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) : 
-          self.isAtypeUserASSD = True
-          cata = CONTEXT.getCurrentCata() 
-          if len(self.type) == 2 and self.type[1]=='createObject' : suffixe = 'C'
-          else : suffixe = 'U'
-          if typeATraduire.__name__+'_'+suffixe not in cata.listeUserASSDDumpes :
-              self.texteSimplePart1 = defUserAssd.format(typeATraduire.__name__, suffixe) 
-              cata.listeUserASSDDumpes.add(typeATraduire.__name__+'_'+suffixe)
-            
-          if cata.definitUserASSD ==False  :
-              cata.definitUserASSD = True
-              cata.texteSimple = cata.texteSimple + defBaseXSDUserAssd
-    
-       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 prepareDumpXSD(self):
-       self.inUnion=False
-       if self.statut   ==  'f' : self.arbrePossibles = (self.nom,[])
-       else                     : self.arbrePossibles = (self.nom,)
-       self.mcXSD=[]
-
-
-
-   def traduitType(self):
-       # il faut traduire le min et le max
-       # il faut ajouter les regles
-       # il faut gerer les types tuple et fichier
-       if hasattr(self.type[0], 'ntuple') : 
-          try :
-             leType=self.validators.typeDesTuples[0]
-             for i in range(self.type[0].ntuple):
-                 if self.validators.typeDesTuples[i] != leType : return ('XXXXXXXX')
-             typeATraduire=leType
-          except : 
-             return ('XXXXXXXX')
-       else : 
-             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,]
+    def dumpXsd(self, dansFactorisation=False, multiple=False, first=False, debug=False):
+        #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
+
+        #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')
+            if self.defaut :
+                if self.max > 1 or self.max == '**' or self.max ==  float('inf') :
+                    # a revoir pour les tuples avec defaut
+                    txtDefaut=""
+                    for val in self.defaut : txtDefaut+=str(val) +" "
+                    self.texteElt = eltWithDefautDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
                 else :
-                    cata.dictTypesASSDorUserASSDCrees[typeATraduire.__name__].append(self)
-                if issubclass(typeATraduire, Accas.UserASSD) : return typeATraduire.__name__+'_C'
+                    if str(self.defaut)   == 'True'  : txtDefaut = 'true'
+                    elif str(self.defaut) == 'False' : txtDefaut = 'false'
+                    else : txtDefaut = str(self.defaut)
+                    self.texteElt = eltWithDefautDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
+            else : self.texteElt = eltDsSequence.format(self.nom,self.code,self.nomDuTypePyxb,minOccurs,1)
+        elif first:
+            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) :
+            self.isAtypeUserASSD = True
+            cata = CONTEXT.getCurrentCata()
+            if len(self.type) == 2 and self.type[1]=='createObject' : suffixe = 'C'
+            else : suffixe = 'U'
+            if typeATraduire.__name__+'_'+suffixe not in cata.listeUserASSDDumpes :
+                self.texteSimplePart1 = defUserAssd.format(typeATraduire.__name__, suffixe)
+                cata.listeUserASSDDumpes.add(typeATraduire.__name__+'_'+suffixe)
+
+            if cata.definitUserASSD ==False  :
+                cata.definitUserASSD = True
+                cata.texteSimple = cata.texteSimple + defBaseXSDUserAssd
+
+
+        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 prepareDumpXSD(self):
+        self.inUnion=False
+        if self.statut   ==  'f' : self.arbrePossibles = (self.nom,[])
+        else                     : self.arbrePossibles = (self.nom,)
+        self.mcXSD=[]
+
+
+
+    def traduitType(self):
+        # il faut traduire le min et le max
+        # il faut ajouter les regles
+        # il faut gerer les types tuple et fichier
+        if hasattr(self.type[0], 'ntuple') :
+            try :
+                leType=self.validators.typeDesTuples[0]
+                for i in range(self.type[0].ntuple):
+                    if self.validators.typeDesTuples[i] != leType : return ('XXXXXXXX')
+                typeATraduire=leType
+            except :
+                return ('XXXXXXXX')
+        else :
+            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'
-
-             # 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)
+            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)
 
 
 #-----------------
@@ -972,7 +972,7 @@ class X_JDC_CATA :
 #-----------------
 
     def dumpXsd(self, avecEltAbstrait,  debug = True):
-        cata = CONTEXT.getCurrentCata() 
+        cata = CONTEXT.getCurrentCata()
         if debug : print ('avecEltAbstrait   -------------------', avecEltAbstrait)
 
         if debug : print ('self.importedBy -------------------', self.importedBy)
@@ -980,19 +980,19 @@ class X_JDC_CATA :
 
         self.texteSimple   = ""
         self.texteComplexe = ""
-        self.texteCata     = ""  
+        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
+            self.nomDuCodeDumpe = self.code
+            self.implement      = self.code
+            self.nomDuXsdPere   = self.code
         else :
-           self.implement,self.nomDuXsdPere=self.implement.split(':')
-           self.nomDuCodeDumpe = self.implement
+            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)
@@ -1002,12 +1002,12 @@ class X_JDC_CATA :
         self.dumpLesCommandes()
 
         if self.implement == self.code :
-           self.texteCata += eltAbstraitCataPPal.format(self.code)
-           self.texteCata += eltCataPPal.format(self.code,self.code,self.code)
+            self.texteCata += eltAbstraitCataPPal.format(self.code)
+            self.texteCata += eltCataPPal.format(self.code,self.code,self.code)
         else :
-           self.texteCata += eltAbstraitCataFils.format(self.implement,self.nomDuXsdPere,self.nomDuXsdPere)
-           self.texteCata += eltCataFils.format(self.implement,self.nomDuXsdPere,self.nomDuXsdPere,self.nomDuXsdPere)
-           self.texteInclusion += includeCata.format(self.nomDuXsdPere)
+            self.texteCata += eltAbstraitCataFils.format(self.implement,self.nomDuXsdPere,self.nomDuXsdPere)
+            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 :
@@ -1019,7 +1019,7 @@ class X_JDC_CATA :
 
 
 
-        #for codeHeritant in self.importedBy: 
+        #for codeHeritant in self.importedBy:
         #    self.texteCata += eltCodeSpecDsCata.format(codeHeritant)
         #    self.texteTypeAbstrait += eltAbstrait.format(codeHeritant,codeHeritant,self.code,codeHeritant)
 
@@ -1032,11 +1032,11 @@ class X_JDC_CATA :
         #   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)
+            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)
+            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
@@ -1045,51 +1045,51 @@ class X_JDC_CATA :
         #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) 
+        # 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]: 
+            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]: 
+            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]
+                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) 
+                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 ) 
+        # 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() ) 
+            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 != '' : 
+        #if texteKeyRef != '' :
         #   self.texteXSD = self.texteXSD[0:-3]+'>\n'
         #   self.texteXSD += texteKeyRef
-        #   self.texteXSD += fermeEltCata 
+        #   self.texteXSD += fermeEltCata
 
 
 
         #if not PourTraduction : print (self.texteXSD)
-                   
+
         import pprint
         #pprint.pprint (cata.dictTypesXSDJumeaux)
         #for k in cata.dictTypesXSDJumeaux:
@@ -1103,31 +1103,31 @@ class X_JDC_CATA :
 
         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()) :
+            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]
+                        indexMC=indexMC+1
+                    dico[k][txtNomComplet]=definition.nomDuTypePyxb
+            if dico[k]== {} or (not different) : del dico[k]
         import pprint
         #pprint.pprint(dico)
         if dico != {} : self.texteXSD += texteAnnotation.format(self.nomDuCodeDumpe,str(dico))
-  
+
         #import pprint
         #if (not PourTraduction) and  (dico != {}) : pprint.pprint(dico)
         print ('__________________________ decommenter pour le texteXSD________________________')
@@ -1136,51 +1136,51 @@ class X_JDC_CATA :
         self.texteXSD += texteFin
         return self.texteXSD
 
-   
+
     def dumpLesCommandes(self):
-        cata = CONTEXT.getCurrentCata() 
+        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
+            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):
+            if i not in dir(newModule):
                 allClassToDump.append(importCataSource.__dict__[i])
-         
+
 
         self.texteSimple = ''
         self.texteComplexe = ''
@@ -1189,7 +1189,7 @@ class X_JDC_CATA :
             c.nomDuCodeDumpe=self.nomDuCodeDumpe
             c.code=self.implement
             c.dumpXsd()
-            
+
             self.texteSimple   += c.texteSimple
             self.texteComplexe += c.texteComplexe
             #c.texteElt=eltCompoDsSequenceInExtension.format(c.nom,self.code,c.nomDuTypePyxb)
index 68f7339a1a5bee76731e45f85a9d47ba1aa746fb..820e763f085bf8cf34aeac08d8edafc710f1851c 100755 (executable)
@@ -4,18 +4,18 @@ import sys,os
 import inspect
 import traceback
 def trace():
-  traceback.print_stack()
+    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
+    import pyxb
+    import pyxb.binding
+    import pyxb.binding.basis
+    #import pyxb.utils.utility
+    #import pyxb.utils.domutils
 except : pass
 
 from Accas import A_ASSD
@@ -23,553 +23,546 @@ from Accas import A_ASSD
 class X_OBJECT:
 # -------------
 
-  def delObjPyxb(self, debug=True):
-      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)
+    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
 
-      
-
-  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 ('indiceDsLeConten',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())))
-      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=False) :
-      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
+
+    def buildObjPyxb(self, debug=False) :
+        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.objPyxb.objAccas=self
+            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 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 :
+                        self.objPyxb=self.maClasseModeleMetier(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=False):
+        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
-        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')
-              print ('self.maClasseModeleMetierFactory', self.maClasseModeleMetierFactory)
-        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 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 : 
-                 self.objPyxb=self.maClasseModeleMetier(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
-      debug=1
-      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=False):
-       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())
-
-        
-      
+        if debug : print ('fin du setValeurObjPyxb pour ', self.nom, self.perePyxb.objPyxb.orderedContent())
+
+
+
 
 class X_MCCOMPO(X_OBJECT) :
 # -------------------------
-# 
-   def buildObjPyxb(self,mc_list, debug=True) :
-      if not self.cata or not self.cata.modeleMetier : return
-     
-      if debug : print ('X_MCCOMPO', self.nom)
-      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 
-           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]
-      print ('monNomClasseModeleMetier', self.monNomClasseModeleMetier)
-      self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
-      
-      # PN : Ne doit-on pas tester avant
-      if self.objPyxbDeConstruction != None :
-        print ('avec objPyxbDeConstruction', self.objPyxbDeConstruction)
-        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 debug :
-          print ('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 __________ ordered content')
-        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 (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]
-        if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb,self.listArg,newOrderedContent,self.objPyxb.orderedContent())
-      #self.objPyxb.objAccas=self
-      if debug : print ('fin buildObjetPyxb _______________________________________')
-      # assert(self.objPyxb.validateBinding())
-
-
-   def exploreBLOC(self,objAccas,debug=True):
-      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)
+#
+    def buildObjPyxb(self,mc_list, debug=False) :
+        if not self.cata or not self.cata.modeleMetier : return
+
+        if debug : print ('X_MCCOMPO', self.nom)
+        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
+                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 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)
-      print (self.listArg)
-      if debug : print ('fin  ds exploreBLOC', objAccas .nom)
-          
-   
-
-  
+            if debug : print (self.listArg)
+            if debug : print (self.maClasseModeleMetier)
+            # self.objPyxb=self.maClasseModeleMetier(*self.listArg)
+            self.objPyxb=self.maClasseModeleMetier(**self.dicoArg)
+            if debug :
+                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 __________ ordered content')
+            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 (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]
+            if debug : print ('X_MCCOMPO', self, self.nom, self.objPyxb,self.listArg,newOrderedContent,self.objPyxb.orderedContent())
+        #self.objPyxb.objAccas=self
+        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 --------------------------')
+    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 --------------------------')
+
+    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
+    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
+    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):
-      print ('ds to XML')
-      if not self.cata or not self.cata.modeleMetier : return
-      print (' to xml ***************',self.objPyxb,'***************',)
-      print (' to xml ***************',self,'***************',)
-      print (' to xml ***************',self.objPyxb.orderedContent(),'***************',)
-      print(self.objPyxb.toDOM().toprettyxml())
-      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")
-      print (self.procedure)
-      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=False):
-    # la transformation de l objAAnalyser en type lu par eficas ne fonctionne pas pour tout
-    # faudrait - il travailler sur les types des objets ?
-    # c est a revoir -> fonction cast a prevoir ds les 2 sens
-    if objAAnalyser is None: return
-    if debug : print ('debut pour_____________________________ ',objAAnalyser)
-    dictArgs = {}
-    # traitement SIMP
-    # ---------------
-    if isinstance(objAAnalyser, pyxb.binding.basis.simpleTypeDefinition): 
-       if debug : print ('je suis un MCSimple')
-       # traitement scalaire
-       objAAnalyser.dictPyxb=objAAnalyser
-       if not (isinstance(objAAnalyser,pyxb.binding.basis.STD_list)):
-          # print ('je suis un scalaire')
-          #try :  # python 3
-          if isinstance(objAAnalyser,self.cata.modeleMetier.AccasUserAssd):
-             import inspect
-             laClassePyxbUserAssd=inspect.getmro(objAAnalyser.__class__)[1]
-             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)
-          #except : # python 2
-          #if isinstance(objAAnalyser, types.StringTypes):  return str(objAAnalyser)
-          #if isinstance(objAAnalyser, types.FloatType):  return float(objAAnalyser)
-          #if isinstance(objAAnalyser, (types.IntType, types.LongType)):  return int(objAAnalyser)
-          #print ('________ fin pour ', objAAnalyser, 'retour', repr(objAAnalyser))
-          return objAAnalyser
-       else :
-          #print ('je suis une liste')
-          laListe=[]
-          for obj in objAAnalyser :
-              if 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):
-        
+
+    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=False):
+        # la transformation de l objAAnalyser en type lu par eficas ne fonctionne pas pour tout
+        # faudrait - il travailler sur les types des objets ?
+        # c est a revoir -> fonction cast a prevoir ds les 2 sens
+        if objAAnalyser is None: return
+        if debug : print ('debut pour_____________________________ ',objAAnalyser)
+        dictArgs = {}
+        # traitement SIMP
+        # ---------------
+        if isinstance(objAAnalyser, pyxb.binding.basis.simpleTypeDefinition):
+            if debug : print ('je suis un MCSimple')
+            # traitement scalaire
+            objAAnalyser.dictPyxb=objAAnalyser
+            if not (isinstance(objAAnalyser,pyxb.binding.basis.STD_list)):
+            # print ('je suis un scalaire')
+            #try :  # python 3
+                if isinstance(objAAnalyser,self.cata.modeleMetier.AccasUserAssd):
+                    import inspect
+                    laClassePyxbUserAssd=inspect.getmro(objAAnalyser.__class__)[1]
+                    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)
+                #except : # python 2
+                #if isinstance(objAAnalyser, types.StringTypes):  return str(objAAnalyser)
+                #if isinstance(objAAnalyser, types.FloatType):  return float(objAAnalyser)
+                #if isinstance(objAAnalyser, (types.IntType, types.LongType)):  return int(objAAnalyser)
+                #print ('________ fin pour ', objAAnalyser, 'retour', repr(objAAnalyser))
+                return objAAnalyser
+            else :
+                #print ('je suis une liste')
+                laListe=[]
+                for obj in objAAnalyser :
+                    if 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):
+
         nomClasseAccasUserAssd=laClassePyxbUserAssd.__name__[:-2]
         enCreation=False
         if laClassePyxbUserAssd.__name__[-2:]== '_C' : enCreation = True
         elif laClassePyxbUserAssd.__name__[-2:] != '_U' : print ('pb avec', laClassePyxbUserAssd); exit()
         laClasseAccas=getattr(self.cata,nomClasseAccasUserAssd)
-        if not(enCreation): 
-             if str(objAAnalyser) in self.g_context.keys():return self.g_context[str(objAAnalyser)]
-             else :
+        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 : 
+            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
-   
+            obj=laClasseAccas()
+            self.g_context[str(objAAnalyser)]=obj
+            return obj
+
 #   def analyseContent(self,objAAnalyser):
 #       objAAnalyser.dictArgs={}
 #       for objContenu in objAAnalyser.content():
@@ -587,12 +580,12 @@ class X_JDC (X_MCCOMPO):
 #          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 ( '________________')
-        
-  
+            #print ( '________________')
+            #print (objAAnalyser.monNomClasseAccas)
+            #for i in objAAnalyser.dictArgs : print (i, objAAnalyser.dictArgs[i])
+            #print ( '________________')
+
+
 
 if __name__ == "__main__":
-   print ('a faire')
+    print ('a faire')
index 6cbd9c652c390f6cdd53e3d08f92a17066217e6d..12387b09a669de12235e1b1a7638e804d683f8cc 100644 (file)
@@ -45,7 +45,7 @@ finTypeCompo        = '\t</xs:complexType>\n'
 eltCompoDsSequence  = '\t\t\t<xs:element name="{}" type="{}:{}" minOccurs="{}" maxOccurs="{}"/>\n'
 #eltCompoDsSequenceInExtension = '\t\t\t<xs:element name="{}" type="{}:{}"/>\n'
 
-# ETAPE 
+# ETAPE
 eltEtape = '\t<xs:element name="{}" type="{}:{}" substitutionGroup="step_{}"/>\n'
 
 # BLOC
@@ -102,4 +102,3 @@ eltCata = '\t<xs:element name="{}" type="{}:T_{}"/>\n\t\t<xs:complexType name="T
 
 if __name__ == '__main__' :
     print ('ne fait rien')
-