]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
ajout du Dump des Facts frere avec meme nom et disjoint/ cas RN
authorpascale.noyret <pascale.noyret@edf.fr>
Mon, 10 May 2021 16:35:17 +0000 (18:35 +0200)
committerpascale.noyret <pascale.noyret@edf.fr>
Mon, 10 May 2021 16:35:17 +0000 (18:35 +0200)
Efi2Xsd/AccasXsd.py

index f1cc9e7e098bc1c7fe1fbdf9f4186be6b13692ea..eeb242aac70268926ccf51accd28c424a4b98cd1 100755 (executable)
@@ -333,13 +333,14 @@ class X_compoFactoriseAmbigu(X_definition):
         maListeRetour=[]
         aReduire={}
 
+        declencheChoiceAvecSeqVid=False
         if [] in laListe :
-            declencheChoiceAvecSeqVid=True
+        # Comment reperer qu on est en bout
+        # 28 avril PN : j ajoute un choix vide si apres dans la liste
+        # il reste au moins 2 elts. Est-ce bien vrai ?
             while [] in laListe : laListe.remove([])
-            #min=0
-        else :
-            declencheChoiceAvecSeqVid=False
-            #min=1
+            if len(laListe) > 1 : declencheChoiceAvecSeqVid=True
+        
 
 
         for ligne in laListe :
@@ -351,11 +352,14 @@ class X_compoFactoriseAmbigu(X_definition):
                 else : aReduire[ligne[0]]=[ligne[1:],]
 
 
+        if debug : print ('la Liste', laListe, declencheChoiceAvecSeqVid)
+        if debug : print (aReduire)
         if len(aReduire.keys()) == 1 :
             if declencheChoiceAvecSeqVid == False :
                 creeChoice=False
                 creeSequence=True
-                self.texteComplexe += '\t'*(indent) +  debSequenceDsBloc; indent=indent+1
+                if aReduire[ligne[0]] == [[]]: creeSequence=False
+                if creeSequence : self.texteComplexe += '\t'*(indent) +  debSequenceDsBloc; indent=indent+1
             else :
                 creeChoice=True
                 creeSequence=False
@@ -369,7 +373,9 @@ class X_compoFactoriseAmbigu(X_definition):
             creeChoice=True
             creeSequence=False
 
+        if debug : print ('creeSequence', creeSequence, aReduire)
         for nomMC in aReduire.keys():
+            if debug : print (nomMC)
             listeSuivante=aReduire[nomMC]
             if creeChoice and  listeSuivante != [[]] :
                 self.texteComplexe += '\t'*(indent) +  debSequenceDsBloc; indent=indent+1
@@ -397,6 +403,7 @@ class X_compoFactoriseAmbigu(X_definition):
 
     def ajouteAuxTextes(self,nomMC,indent,debug=False) :
         if debug : print ('ajouteAuxTextes', nomMC, self.nom, self.entites[nomMC])
+        debug=False
         #if debug :
         #   traceback.print_stack()
         #for i in self.entites.keys() : print (self.entites[i][0].nom)
@@ -409,6 +416,7 @@ class X_compoFactoriseAmbigu(X_definition):
             nomMC=nomMC[0]
 
         if nomMC == 'Consigne' or nomMC == 'blocConsigne' : return
+        if debug : print (nomMC, 'dans ajoute aux textes', self.entites )
         if len(self.entites[nomMC]) == 1:
             mc=self.entites[nomMC][0]
             mc.dumpXsd(dansFactorisation=True)
@@ -449,12 +457,31 @@ class X_compoFactoriseAmbigu(X_definition):
 
         # 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()
+            sontTousDisjoint=True
+            index=1
+            if debug : print ('on cherche si ils sont disjoints : ',self.entites[nomMC])
+            for mc in self.entites[nomMC] :
+                if debug : print ('compare mc' , mc, ' avec :')
+                for mcFrere in self.entites[nomMC][index:]:
+                    ok = mc.isDisjoint(mcFrere) 
+                    if not ok : 
+                       sontTousDisjoint=False
+                       break
+                if not(sontTousDisjoint) : break 
+                index+=1
+            if not sontTousDisjoint: 
+               print ('2 blocs freres ont le meme nom et ne sont pas disjoints : pas encore traite')
+               print ('Projection XSD impossible, changez un des ', nomMC)
+               exit()
+            self.fusionneDsUnChoix(nomMC,indent)
+            if debug : print ('self.nom', self.nom)
+            if debug : print ('self.texteComplexe' , self.texteComplexe)
+            if debug : print ('self.texteSimple' , self.texteSimple)
+            if debug : print ('self.texteElt' , self.texteElt)
+            return
         
+        self.entites[nomMC][0].dumpXsd(dansFactorisation=True,multiple=True,first=first)
         texteDocUnion='\n'
         i=1
         for mc in self.entites[nomMC]:
@@ -493,6 +520,59 @@ class X_compoFactoriseAmbigu(X_definition):
         self.texteSimple   += texteSimplePart1 + texteSimpleUnion
         #print ('self.texteSimple', self.texteSimple)
 
+    def fusionneDsUnChoix(self, nomMC,indent, debug=False):
+        if debug : print ('_________________________________', self.nom, self, nomMC,indent)
+        if debug : print (self.texteComplexe)
+        texteDocUnion='\n'
+        texteComplexe=''
+        texteComplexeVenantDesFils=''
+        texteSimple=''
+        mcRef= self.entites[nomMC][0]
+        # max = 1 : a priori les choix sont exclusifs
+        if (hasattr (mcRef, 'aDejaEteDumpe')) : 
+          if debug : print ("je passe la NORMALEMENT car j ai deja ete dumpe")
+          return
+        leNomDuTypePyxb  = mcRef.definitNomDuTypePyxb(forceACreer=True)
+        if debug : print ('nomMC', nomMC)
+        for mc in self.entites[nomMC]:
+            if debug : print ('------------', mc)
+            # on laisse dansFactorisation a False car ce n est pas comme une fusion de bloc 
+            mc.texteComplexe = ''
+            mc.texteSimple = ''
+            mc.texteElt = ''
+            mc.dumpXsd(dansFactorisationDeFusion=True)
+            if debug : print ('texteSimple\n', mc.texteSimple, '\n fin\n')
+            if debug : print ('texteComplexeVenantDesFils\n',mc.texteComplexeVenantDesFils, '\n fin\n')
+            if debug : print ('texteComplexe\n', mc.texteComplexe, '\n fin\n')
+            if mc.ang != ''   : texteDocUnion += str(i) + '- ' + mc.ang + ' or \n'; i=i+1
+            elif mc .fr != '' : texteDocUnion += str(i) + '- ' + mc.fr  + ' ou \n'; i=i+1
+            texteComplexe += mc.texteComplexe
+            texteComplexeVenantDesFils += mc.texteComplexeVenantDesFils 
+            texteSimple += mc.texteSimple
+
+        if debug : print ('______________________________')
+        if debug : print ('textecomplexeVenantDesFils : \n' ,texteComplexeVenantDesFils )
+        if debug : print ('______________________________')
+        if debug : print ('______________________________')
+        if debug : print ('textecomplexe : \n' ,texteComplexe )
+        if debug : print ('______________________________')
+        self.entites[nomMC][0].aDejaEteDumpe=True 
+
+        self.texteElt = eltCompoDsSequence.format(nomMC, self.nomDuCodeDumpe,mcRef.nomDuTypePyxb,1,1)
+        self.texteDuFact = debutTypeCompo.format(self.entites[nomMC][0].nomDuTypePyxb)
+        self.texteDuFact += debutChoiceDsBloc
+        self.texteDuFact += texteComplexe 
+        self.texteDuFact += finChoiceDsBloc
+        self.texteDuFact += finTypeCompo
+        self.texteSimple   += texteSimple
+        self.texteComplexeVenantDesFils   += texteComplexeVenantDesFils
+        self.texteComplexeVenantDesFils   += self.texteDuFact 
+        self.texteComplexe += self.texteElt 
+        if debug : print ('______________________________')
+        if debug : print ('texteSimple : \n' ,self.texteSimple )
+        if debug : print ('______________________________')
+        self.entites[nomMC][0].aDejaEteDumpe=True 
+
 
 
 # ----------------------------------------
@@ -505,10 +585,13 @@ class X_definitionComposee (X_definition):
         #for nom in self.ordre_mc:
         #  mcFils = self.entites[nom]
         if debug : print ('creeTexteComplexeVenantDesFils', self.nom)
+        if self.nom == 'LeProc' : debug = True
         for mcFils in self.mcXSD :
+            #print (mcFils,mcFils.nom)
+            if mcFils.nom == 'B1_B2' :debug=True 
+            else : debug=False
             if not (isinstance(mcFils, Accas.BLOC)) :
                 mcFils.dumpXsd(dansFactorisation)
-                #print (mcFils.texteSimple)
                 self.texteComplexe += mcFils.texteElt
                 if mcFils.aCreer : self.texteSimple   += mcFils.texteSimple
                 if mcFils.aCreer : texteComplexeVenantDesFils += mcFils.texteComplexe
@@ -521,8 +604,7 @@ class X_definitionComposee (X_definition):
                 if mcFils.aCreer : texteComplexeVenantDesFils += mcFils.texteComplexe
         return texteComplexeVenantDesFils
 
-    def dumpXsd(self, dansFactorisation=False, multiple = False, first=True):
-        #print ('_________ dumpXsd___________', self.nom)
+    def dumpXsd(self, dansFactorisation=False, dansFactorisationDeFusion = False, multiple = False, first=True, debug=False):
         if PourTraduction  : print (self.nom)
         # le prepareDump est appele sur les fils
         if not (self.dejaPrepareDump) : self.prepareDumpXSD()
@@ -536,17 +618,22 @@ class X_definitionComposee (X_definition):
         self.traduitMinMax()
         # pour accepter les PROC et ...
         #
-        if self.aCreer :
-            self.texteComplexe = debutTypeCompo.format(self.nomDuTypePyxb)
+        if debug : print ('dumpXsd', self.nom, self.aCreer)
+        if self.aCreer or dansFactorisationDeFusion:
+            if not dansFactorisationDeFusion : self.texteComplexe = debutTypeCompo.format(self.nomDuTypePyxb)
             if isinstance(self,X_OPER) or isinstance(self,X_PROC) :
                 self.texteComplexe += debutTypeCompoEtape.format(self.code)
             self.texteComplexe += debutTypeCompoSeq
-            texteComplexeVenantDesFils=self.creeTexteComplexeVenantDesFils(dansFactorisation)
-            self.texteComplexe  = texteComplexeVenantDesFils + self.texteComplexe
+            texteComplexeVenantDesFils= self.creeTexteComplexeVenantDesFils(dansFactorisation)
+            if not dansFactorisationDeFusion : 
+               self.texteComplexe  = texteComplexeVenantDesFils + self.texteComplexe
+               self.texteComplexeVenantDesFils  = ''
+            else : 
+               self.texteComplexeVenantDesFils  = texteComplexeVenantDesFils 
             # la fin de l oper est traitee dans le dumpXSD de X_OPER
             if not isinstance(self,X_OPER ) : self.texteComplexe += finTypeCompoSeq
             if isinstance(self,X_PROC)      : self.texteComplexe += finTypeCompoEtape
-            if not isinstance(self,X_OPER ) : self.texteComplexe += finTypeCompo
+            if not isinstance(self,X_OPER ) and not dansFactorisationDeFusion: self.texteComplexe += finTypeCompo
         else :
             self.texteComplexe = ""
 
@@ -631,6 +718,9 @@ class X_definitionComposee (X_definition):
         return False
 
     def besoinDeFactoriserTrivial(self,laListe):
+        # tout faux
+        # a revoir
+        return True
         besoin=False
         lesPremiers=set()
         for mcBloc in laListe  :