]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
simp meme nom types differents
authorpascale.noyret <pascale.noyret@edf.fr>
Fri, 3 Apr 2020 09:37:52 +0000 (11:37 +0200)
committerpascale.noyret <pascale.noyret@edf.fr>
Fri, 3 Apr 2020 09:37:52 +0000 (11:37 +0200)
Efi2Xsd/AccasXsd.py
Efi2Xsd/balisesXSD.py

index a0e89553632f9fb38d149cea219b34ef3b54e662..679842de91aeefd6452375169e8b2582324bb38a 100755 (executable)
@@ -7,7 +7,8 @@ import sys,os
 import types
 import Accas
 import imp
-from copy import deepcopy
+from copy import deepcopy, copy
+import traceback
 
 
 # CONTEXT est accessible (__init__.py de Noyau)
@@ -100,7 +101,7 @@ class X_definition:
        return texteNom
        
 
-   def definitNomDuTypePyxb(self):
+   def definitNomDuTypePyxb(self,forceACreer=False):
        self.aCreer = True
        cata = CONTEXT.getCurrentCata() 
        nom='T_'+self.nom
@@ -121,8 +122,10 @@ class X_definition:
           indice += 1
        self.aCreer = True
        cata.dictTypesXSD[nom].append(self)
+       if self.nom == 'SimpK' : print (cata.dictTypesXSD)
        nomAlter='T_'+self.nom+'_'+str(indice)
        if (hasattr (self, 'nomXML')) and self.nomXML != None : nomAlter='T_'+self.nomXML+'_'+str(indice)
+       traceback.print_stack()
        return nomAlter
 
 
@@ -244,10 +247,10 @@ class X_compoFactoriseAmbigu(X_definition):
        if [] in laListe : 
           declencheChoiceAvecSeqVid=True
           while [] in laListe : laListe.remove([])
-          min=0
+          #min=0
        else :
           declencheChoiceAvecSeqVid=False
-          min=1
+          #min=1
 
 
        for ligne in laListe :
@@ -268,10 +271,12 @@ class X_compoFactoriseAmbigu(X_definition):
              creeChoice=True
              creeSequence=False
              # pour regler le souci du 1er Niveau
-             if min == 1 : self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
-             else        : self.texteComplexe += '\t'*indent + debutChoiceDsBlocAvecMin.format(min); indent=indent+1
+             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 + debutChoiceDsBlocAvecMin.format(min); indent=indent+1
+          self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1
           creeChoice=True
           creeSequence=False
 
@@ -281,13 +286,13 @@ class X_compoFactoriseAmbigu(X_definition):
               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])
+           if len(listeSuivante) == 1 : self.ajouteAuxTextes(listeSuivante[0],indent)
            else : self.factoriseEtCreeDump(listeSuivante,creeSequence, 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 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
 
@@ -298,15 +303,50 @@ class X_compoFactoriseAmbigu(X_definition):
    def ajouteAuxTextes(self,nomMC,indent) :
        if (indent  > 3) : indent = indent - 3
        else : indent = 0
-       # if len(self.entites[nomMC]]) == 1:
-       if (1 == 1):
+       if len(self.entites[nomMC]) == 1:
            mc=self.entites[nomMC][0]
            mc.dumpXsd(dansFactorisation=True)
            self.texteComplexe += '\t'*(indent) + mc.texteElt
            self.texteComplexeVenantDesFils += mc.texteComplexe
            self.texteSimple   += mc.texteSimple
+           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()
 
        
+       print (self.entites[nomMC][0])
+       resteATraiter=copy(self.entites[nomMC])
+       listePourUnion=[]
+       first=1
+       while resteATraiter != [] :
+          nvlListeATraiter=[]
+          mc=resteATraiter[0]
+          mc.dumpXsd(dansFactorisation=True,multiple=True,first=first)
+          first=first * 0
+          listePourUnion.append(mc)
+          for autre in resteATraiter[1:]:
+             if not (mc.compare(autre)) :  nvlListeATraiter.append(autre)
+          resteATraiter=copy(nvlListeATraiter)
+             
+       # on ajoute le nom de l element
+       self.texteComplexe += '\t'*(indent) + self.entites[nomMC][0].texteElt
+       texteSimpleUnion=debutSimpleType.format(self.entites[nomMC][0].nomDuTypePyxb)
+       texteSimpleUnion+=debutUnion
+       if len(listePourUnion) == 1 :
+           self.texteComplexeVenantDesFils += mc.texteComplexe
+           self.texteSimple   += mc.texteSimple
+       else :
+           self.texteComplexeVenantDesFils += mc.texteComplexe
+           for e in listePourUnion :
+               texteSimpleUnion += '\t'+e.texteSimple
+           texteSimpleUnion += finUnion
+       texteSimpleUnion+=fermeSimpleType
+       self.texteSimple   += texteSimpleUnion
+   
 
 
 # ----------------------------------------
@@ -562,6 +602,7 @@ class X_BLOC (X_definitionComposee):
 
    def compare(self,autreMC):
        if self.label != autreMC.label : return False
+       if self.inUnion == True or autre.inUnion == True : return False
        if hasattr(self,'nomXML') and hasattr(autreMC,'nomXML') and self.nomXML==autreMC.nomXML : return True
        for attr in ( 'condition', 'regles', ):
            val1=getattr(self,attr)
@@ -585,9 +626,11 @@ class X_BLOC (X_definitionComposee):
 #--------------------------------
 class X_SIMP (X_definition):
 #--------------------------------
-   def dumpXsd(self, dansFactorisation=False):
+   def dumpXsd(self, dansFactorisation=False, multiple = False, first=False):
+       print ('_______________' , '*******************', 'je passe la dans dumpXsd SIMP', self.nom, multiple, first)
        if PourTraduction  : print (self.nom)
        self.prepareDumpXSD()
+       if multiple : self.inUnion=True
        #if self.nom == 'Fichier' : import traceback; traceback.print_stack()
        #print ('exploreObjet SIMP')
        self.getNomDuCodeDumpe()
@@ -599,7 +642,13 @@ class X_SIMP (X_definition):
 
        #  --> homonymie on peut utiliser genealogie ?
        self.nomDuTypeDeBase = self.traduitType()
-       self.nomDuTypePyxb   = self.definitNomDuTypePyxb()
+       if not multiple : 
+          self.nomDuTypePyxb   = self.definitNomDuTypePyxb()
+          self.aCreer = True
+       elif first :
+          self.nomDuTypePyxb   = self.definitNomDuTypePyxb(forceACreer=1)
+          self.aCreer = True
+    
        
        # on se sert des listes ou non pour  la gestion des minOccurs /maxOccurs est > 0
        if self.statut =='f' : minOccurs = 0
@@ -609,23 +658,28 @@ class X_SIMP (X_definition):
        # regles Accas
        if (hasattr (self, 'nomXML')) and self.nomXML != None : nomUtil=self.nomXML
        else : nomUtil = self.nom
-       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(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
-          else :
-             if str(self.defaut) == 'True' : txtDefaut = 'true'
-             else : txtDefaut = str(self.defaut)
-             self.texteElt = eltWithDefautDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
-
-       else : self.texteElt = eltDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1)
+       if not multiple : 
+          # pas d elt si on est dans 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(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
+             else :
+                if str(self.defaut) == 'True' : txtDefaut = 'true'
+                else : txtDefaut = str(self.defaut)
+                self.texteElt = eltWithDefautDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1,txtDefaut)
+          else : self.texteElt = eltDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,minOccurs,1)
+       elif first: 
+          # sauf si on est le '1er'  dans un element ambigu 
+          self.texteElt = eltDsSequence.format(nomUtil,self.code,self.nomDuTypePyxb,1,1)
     
        # self.aCreer est mis a jour ds definitNomDuTypePyxb
        if not self.aCreer : return
  
-       self.texteSimple  += debutSimpleType.format(self.nomDuTypePyxb)
+       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
@@ -659,6 +713,7 @@ class X_SIMP (X_definition):
 
 
    def prepareDumpXSD(self):
+       self.inUnion=False
        if self.statut   ==  'f' :
           self.arbrePossibles = (self.nom,[])
        else :
@@ -717,6 +772,7 @@ class X_SIMP (X_definition):
  
    def compare(self,autreMC):
        if self.label != autreMC.label : return False
+       if self.inUnion == True or autreMC.inUnion == True : return False
        listeAComparer = [ 'type', 'defaut', 'min' ,'max' ,'val_min' , 'val_max' ]
        if self.intoXML != None : listeAComparer.append('intoXML')
        else : listeAComparer.append('into')
index 346ae227409963e4e0e2fb851ceb2d4746dc1f62..28efab6dbe933977f4031c1f86747a16ae4004d0 100644 (file)
@@ -6,6 +6,7 @@ texteDebutCataSpecifique='<?xml version="1.0" encoding="UTF-8"?>\n<xs:schema xml
 
 
 debutSimpleType        = '\t<xs:simpleType name="{}">\n'
+debutSimpleTypeSsNom   = '\t<xs:simpleType>\n'
 fermeSimpleType        = '\t</xs:simpleType>\n'
 debutRestrictionBase   = '\t\t<xs:restriction base="{}">\n'
 fermeRestrictionBase   = '\t\t</xs:restriction>\n'
@@ -50,6 +51,9 @@ debSequenceDsBloc='<xs:sequence>\n'
 finSequenceDsBloc='</xs:sequence>\n'
 debutTypeSubstDsBlocFactorise = '\t<xs:group name="{}">\n'
 finTypeSubstDsBlocFactorise = '\t</xs:group>\n'
+debutUnion = '\t\t<xs:union>\n'
+finUnion = '\t\t</xs:union>\n'
+
 
 
 # User OR ASSD