]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
1er essai de factorisation
authorpascale.noyret <pascale.noyret@edf.fr>
Fri, 20 Mar 2020 13:16:30 +0000 (14:16 +0100)
committerpascale.noyret <pascale.noyret@edf.fr>
Fri, 20 Mar 2020 13:16:30 +0000 (14:16 +0100)
Efi2Xsd/AccasXsd.py
Efi2Xsd/balisesXSD.py

index d932beccc1c25698d997425b8bb0c7b9a069c398..c8cd6c8d2400e9f219175b165f0eb664c7024bb9 100755 (executable)
@@ -76,7 +76,6 @@ class X_definition:
           print (self.compare(objAComparer) )
           if self.compare(objAComparer) : return objAComparer.nomDuTypePyxb
           indice += 1
-       print ('jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj sortie de boucle')
        self.aCreer = True
        cata.dictTypesXSD[nom].append(self)
        nomAlter='T_'+self.nom+'_'+str(indice)
@@ -113,13 +112,34 @@ class X_factCompoAmbigu(X_definition):
           for ligne in mc.arbrePossibles  :
               if ligne not in self.arbrePossibles : self.arbrePossibles.append(ligne)
        
-       self.arbrePossibles.remove([])
        # bien reflechir a l ordre des 2 lignes ci-dessous
        self.construitEntites(self.mcXSD)
        for i in self.entites :
            print (i,self.entites[i])
        lesPossibles=deepcopy(self.arbrePossibles)
-       self.mcXSD=self.factorise(lesPossibles)
+      
+       #self.mcXSD=self.factorise(lesPossibles)
+       self.getNomDuCodeDumpe()
+       self.nomDuTypePyxb = self.definitNomDuTypePyxb()
+       self.texteSimple = ''
+       self.texteComplexeVenantDesFils = ''
+       self.texteComplexe = debutTypeSubstDsBlocFactorise.format(self.nomDuTypePyxb)
+       # on enleve [] des possibles puisque l elt sera optionnel
+       lesPossibles.remove([])
+       self.mcXSD=self.factoriseEtCreeDump(lesPossibles,False)
+       self.texteComplexe += finTypeSubstDsBlocFactorise
+       self.texteComplexe +=self.texteComplexeVenantDesFils
+       print ('_________________________________')
+       print ('texteComplexe')
+       print (self.texteComplexe)
+       print ('_________________________________')
+       print ('texteSimple')
+       print (self.texteSimple)
+       print ('_________________________________')
+       print ('texteComplexeVenantDesFils')
+       print (self.texteComplexeVenantDesFils)
+       print ('_________________________________')
+       self.texteComplexe=self.texteComplexe+self.texteComplexeVenantDesFils
        self.label='BlocAmbigu'
 
    def construitEntites(self, laListe):
@@ -129,95 +149,167 @@ class X_factCompoAmbigu(X_definition):
            self.construitEntites(mc.mcXSD)
            
 
+
    def dumpXsd(self, dansFactorisation=False):
-       self.tousLesFils=[]
-       self.getNomDuCodeDumpe()
-       self.nomDuTypePyxb = self.definitNomDuTypePyxb()
-       self.texteSimple   = "" 
-       # il va falloir faire quelque chose d autre pour
-       # Bloc1, simp1 obligatoire Bloc2
-       # a cause du 0 probablement un booleen
+       # on ne fait rien, tout a ete fait dans le init
        self.texteElt=substDsSequence.format(self.code,self.nomDuTypePyxb,0,1)
-       print ('dump de ', self.nomDuTypePyxb, self.aCreer)
-       self.texteComplexeVenantDesFils = ''
-       self.texteComplexe = debutTypeCompo.format(self.nomDuTypePyxb)
-       self.creeTexteComplexe(self.mcXSD)
-       self.texteComplexe += finTypeCompo
-       print (self.texteComplexe)
-       print ('oooooooo', self.mcXSD)
-       exit()
 
-   def creeTexteComplexe(self,laListe):
-       if (len(laListe))==1:
-          print ('creeTexteComplexe', laListe,' ____________________')
-          # on a une sequence
-          self.texteComplexe += debutTypeCompoSeq
-          eltSequence = laListe[0]
-          index=0
-          while (type(eltSequence[index]) != types.ListType ):
-                nomFils=eltSequence[index]
-                index=index+1
-                print (self.entites[nomFils])
-                # if len(self.entites[nomFils]) == 1:
-                # il faut verifier le type normalement
-                # et creer le texteSimple du fils en fonction 
-                if 1 == 1 :
-                   mcFils=self.entites[nomFils][0]
-                   mcFils.dumpXsd(dansFactorisation=True)
-                   self.texteComplexe += mcFils.texteElt
-                   self.texteSimple   += mcFils.texteSimple
-          reste=eltSequence[index:][0]
-          if reste != [] :self.creeTexteComplexe(reste)
-          #self.texteComplexeVenantDesFils += self.CreeTexteComplexeVenantDesFils(dansFactorisation)
-          # PN ou doit on le faire ? 
-          #self.texteComplexe  = texteComplexeVenantDesFils + self.texteComplexe
-          self.texteComplexe += finTypeCompoSeq
-       else : 
-          # on a un choix
-          eltChoix = laListe
-          print (eltChoix)
-          self.texteComplexe += choiceDsBloc
-          print ('traitement de', eltChoix)
-          for l in eltChoix :
-            if l != [] : self.creeTexteComplexe(l)
-            ##for nom in l :
-              # if len(self.entites[nomFils]) == 1:
-              # il faut verifier le type normalement
-              # et creer le texteSimple du fils en fonction
-            #  if 1 == 1 :
-            #     mcFils=self.entites[nom][0]
-            #     mcFils.dumpXsd(dansFactorisation=True)
-            #     self.texteComplexe += mcFils.texteElt
-            #     self.texteSimple   += mcFils.texteSimple
-          #reste=laListe[1:][0]
-          self.texteComplexe += finChoiceDsBloc
-          #if reste != [] :self.creeTexteComplexe(reste)
-       
+
+#   def creeTexteComplexe(self,laListe):
+#       if (len(laListe))==1:
+#          print ('creeTexteComplexe', laListe,' ____________________')
+#          # on a une sequence
+#          self.texteComplexe += debutTypeCompoSeq
+#          eltSequence = laListe[0]
+#          print ( 'eltSequence', eltSequence)
+#          index=0
+#          while (type(eltSequence[index]) != types.ListType ):
+#          #while (type(eltSequence[index]) == types.StringType ):
+#                nomFils=eltSequence[index]
+#                index=index+1
+#                print ('ds while')
+#                print (nomFils, index)
+#                print (self.entites[nomFils])
+#                # if len(self.entites[nomFils]) == 1:
+#                # il faut verifier le type normalement
+#                # et creer le texteSimple du fils en fonction 
+#                if 1 == 1 :
+#                   mcFils=self.entites[nomFils][0]
+#                   mcFils.dumpXsd(dansFactorisation=True)
+#                   self.texteComplexe += mcFils.texteElt
+#                   self.texteSimple   += mcFils.texteSimple
+#          reste=eltSequence[index:][0]
+#          if reste != [] :self.creeTexteComplexe(reste)
+#          #self.texteComplexeVenantDesFils += self.CreeTexteComplexeVenantDesFils(dansFactorisation)
+#          # PN ou doit on le faire ? 
+#          #self.texteComplexe  = texteComplexeVenantDesFils + self.texteComplexe
+#          self.texteComplexe += finTypeCompoSeq
+#       else : 
+#          # on a un choix
+#          eltChoix = laListe
+#          print (eltChoix)
+#          self.texteComplexe += choiceDsBloc
+#          print ('traitement de', eltChoix)
+#          for l in eltChoix :
+#            if l != [] : self.creeTexteComplexe(l)
+#            ##for nom in l :
+#              # if len(self.entites[nomFils]) == 1:
+#              # il faut verifier le type normalement
+#              # et creer le texteSimple du fils en fonction
+#            #  if 1 == 1 :
+#            #     mcFils=self.entites[nom][0]
+#            #     mcFils.dumpXsd(dansFactorisation=True)
+#            #     self.texteComplexe += mcFils.texteElt
+#            #     self.texteSimple   += mcFils.texteSimple
+#          #reste=laListe[1:][0]
+#          self.texteComplexe += finChoiceDsBloc
+#          #if reste != [] :self.creeTexteComplexe(reste)
+#       
        
-   def factorise(self, laListe):
+   def factoriseEtCreeDump(self, laListe, dejaDansUneSequence=False, indent=2):
+       print ('debut factorise ********', laListe, indent)
        maListeRetour=[]
        aReduire={}
+
+       if [] in laListe : 
+          declencheChoiceAvecSeqVid=True
+          laListe.remove([])
+       else :
+          declencheChoiceAvecSeqVid=False
+
        for ligne in laListe :
-          if ligne == [] : continue
-          #print ('je traite', ligne)
+          #print (ligne)
           if aReduire.has_key(ligne[0]) : aReduire[ligne[0]].append(ligne[1:])
           else : aReduire[ligne[0]]=[ligne[1:],]
-          #print ('clef = ', ligne[0], ' ', aReduire[ligne[0]])
-       for clef in aReduire:
-           if len(aReduire[clef])==1 :
-              if aReduire[clef] != [[]]: maListeRetour.append([clef,]+aReduire[clef])
-              else : maListeRetour.append([clef,])
-           else :
-              nvlElt=[clef,]
-              #print ('je sors', nvlElt)
-              nvlElt.append(self.factorise(aReduire[clef]))
-              maListeRetour.append(nvlElt)
-       #print ('maListeRetour ',self.nom, maListeRetour)
-       #print ('________ fin factorise________' , laListe)
-       #print ('_________________________')
-       return maListeRetour
+          #print (aReduire)
 
        
+       if len(aReduire.keys()) == 1 :
+          creeSequence=True
+          if declencheChoiceAvecSeqVid == False : 
+             creeChoice=False
+          else :
+             creeChoice=True
+          if dejaDansUneSequence : creeSequence = False
+       else :                         
+          creeChoice=True
+          creeSequence=False
+          self.texteComplexe += '\t'*indent + debutChoiceDsBloc
+          indent += 1
+
+       print ('creeChoice ', creeChoice, 'creeSequence', creeSequence)
+
+       for nomMC in aReduire.keys():
+           if creeSequence : self.texteComplexe += '\t'*(indent) + debSequenceDsBloc; indent=indent+1
+           self.ajouteAuxTextes(nomMC,indent)
+           listeSuivante=aReduire[nomMC]
+           if listeSuivante == [[]] : continue # Est-ce toujours vrai ? 
+           if len(listeSuivante) == 1 : self.ajouteAuxTextes(listeSuivante[0])
+           else : self.factoriseEtCreeDump(listeSuivante,creeSequence, indent+int(creeSequence))
+           if creeSequence :   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
+
+       print ('________ fin factorise________' , laListe)
+       return (maListeRetour)
+       
+       
+   def ajouteAuxTextes(self,nomMC,indent) :
+       if (indent  > 3) : indent = indent - 3
+       else : indent = 0
+       # if len(self.entites[nomMC]]) == 1:
+       if (1 == 1):
+           mc=self.entites[nomMC][0]
+           mc.dumpXsd(dansFactorisation=True)
+           self.texteComplexe += '\t'*(indent) + mc.texteElt
+           self.texteComplexeVenantDesFils += mc.texteComplexe
+           self.texteSimple   += mc.texteSimple
+
+ #  def verifieDisjoint(self, laListe):
+#   # != a un premier dans les communs car laListe n est pas composee de la 
+#   # meme maniere dans les 2 cas
+#   # ici on a juste des noms et on se moque du caractere optionnel
+#   # tout le monde est obligatoire
+#       print ('verifieDisjoint', laListe)
+#       mesPremiers=set()
+#       for listeDeNoms in laListe :
+#           if listeDeNoms == [] : continue
+#           if listeDeNoms[0] in mesPremiers : return False
+#       return True
+#
+#
+#
+#   def factorise(self, laListe):
+#       print ('debut factorise ********', laListe)
+#       suiteOptionnelle=False
+#       maListeRetour=[]
+#       aReduire={}
+#       for ligne in laListe :
+#          if ligne == [] : 
+#             suiteOptionnelle=True
+#             continue # PN : faire qqchose pour transmettre le car optionnel
+#          print ('je traite', ligne)
+#          if aReduire.has_key(ligne[0]) : aReduire[ligne[0]].append(ligne[1:])
+#          else : aReduire[ligne[0]]=[ligne[1:],]
+#          print ('clef = ', ligne[0], ' ', aReduire[ligne[0]])
+#       for clef in aReduire:
+#           if len(aReduire[clef])==1 :
+#              if aReduire[clef] != [[]]: maListeRetour.append([clef,]+aReduire[clef])
+#              else : maListeRetour.append([clef,])
+#           else :
+#              nvlElt=[clef,]
+#              #print ('je sors', nvlElt)
+#              nvlElt.append(self.factorise(aReduire[clef]))
+#              maListeRetour.append(nvlElt)
+#       print ('maListeRetour ',laListe, maListeRetour, suiteOptionnelle)
+#       print ('________ fin factorise________' , laListe)
+#       print ('_________________________')
+#       return maListeRetour
+#
+       
 
 
 # ----------------------------------------
index 5f310273f8db1ffd3676876922e8b0ad53141083..63a2f6d03b223aed2d441d1840d9e36d04f6bd65 100644 (file)
@@ -42,8 +42,15 @@ eltCompoDsSequenceInExtension = '\t\t\t<xs:element name="{}" type="{}:{}"/>\n'
 debutTypeSubst = '\t<xs:group name="{}">   \n\t\t<xs:sequence>\n'
 finTypeSubst   = '\t\t</xs:sequence>\n\t</xs:group>\n'
 substDsSequence = '\t\t\t<xs:group ref="{}:{}"  minOccurs="{}" maxOccurs="{}"/>\n'
-choiceDsBloc='\t\t\t<xs:choice>\n'
-finChoiceDsBloc='\t\t\t</xs:choice>\n'
+#choiceDsBloc='\t\t\t<xs:choice minOccurs={}>\n'
+debutChoiceDsBloc='<xs:choice>\n'
+finChoiceDsBloc='</xs:choice>\n'
+debutChoiceDsBloc='<xs:choice>\n'
+finChoiceDsBloc='</xs:choice>\n'
+debSequenceDsBloc='<xs:sequence>\n'
+finSequenceDsBloc='</xs:sequence>\n'
+debutTypeSubstDsBlocFactorise = '\t<xs:group name="{}">\n'
+finTypeSubstDsBlocFactorise = '\t</xs:group>\n'
 
 
 # User OR ASSD