From 4786d8aef6ef2ccba9c6bfc28a0a29200a0dbba2 Mon Sep 17 00:00:00 2001 From: "pascale.noyret" Date: Mon, 10 May 2021 18:35:17 +0200 Subject: [PATCH] ajout du Dump des Facts frere avec meme nom et disjoint/ cas RN --- Efi2Xsd/AccasXsd.py | 126 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 108 insertions(+), 18 deletions(-) diff --git a/Efi2Xsd/AccasXsd.py b/Efi2Xsd/AccasXsd.py index f1cc9e7e..eeb242aa 100755 --- a/Efi2Xsd/AccasXsd.py +++ b/Efi2Xsd/AccasXsd.py @@ -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 : -- 2.39.2