From: pascale.noyret Date: Fri, 27 Mar 2020 16:32:19 +0000 (+0100) Subject: Version du 27 mars X-Git-Tag: V200520bis~74 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=173c9458cfcada25d3013e5c904b71410e8fa4e8;p=tools%2Feficas.git Version du 27 mars --- diff --git a/Efi2Xsd/AccasXsd.py b/Efi2Xsd/AccasXsd.py index 144e9d3a..a0e89553 100755 --- a/Efi2Xsd/AccasXsd.py +++ b/Efi2Xsd/AccasXsd.py @@ -34,6 +34,46 @@ 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 remplaceNomListeParContenu(self, liste1, liste2): + #print ('remplaceNomListeParContenu', liste1, liste2) + listeFinale=[] + for elt1 in liste1 : + for eltListe in liste2: + if eltListe == [] : continue + newListe=deepcopy(elt1) + if eltListe!=[] :newListe+=eltListe + 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 @@ -75,8 +115,8 @@ class X_definition: indice=0 while (indice < len(listePossible)) : objAComparer=listePossible[indice] - print ('je compare', self.nom, 'avec', objAComparer.nom ) - print (self.compare(objAComparer) ) + #print ('je compare', self.nom, 'avec', objAComparer.nom ) + #print (self.compare(objAComparer) ) if self.compare(objAComparer) : return objAComparer.nomDuTypePyxb indice += 1 self.aCreer = True @@ -85,16 +125,9 @@ class X_definition: if (hasattr (self, 'nomXML')) and self.nomXML != None : nomAlter='T_'+self.nomXML+'_'+str(indice) return nomAlter - # def existeDeja(self,nom): - # if nom in cata.dictTypesXSD.keys() : - # self.aCreer = False - # return cata.dictTypesXSD[nom] - # else : - # cata.dictTypesXSD[nom] = self - # return None # ---------------------------------------- -class X_factCompoAmbigu(X_definition): +class X_compoFactoriseAmbigu(X_definition): # ---------------------------------------- def __init__(self,nom,listeDeCreation,pere): @@ -109,21 +142,13 @@ class X_factCompoAmbigu(X_definition): self.mcXSD.append(mc) self.ordre_mc.append(mc.nom) #self.mcXSD=list(deepcopy(self.ordre_mc)) - print ('creation de X_factCompoAmbigu', self.nom, self.ordre_mc) - self.arbrePossibles=[] - for mc in self.mcXSD : - print ('***************** mc', mc, mc.nom) - if not hasattr(mc, 'arbrePossibles') : mc.construitArbrePossibles() - for ligne in mc.arbrePossibles : - if ligne not in self.arbrePossibles : self.arbrePossibles.append(ligne) - - # bien reflechir a l ordre des 2 lignes ci-dessous self.construitEntites(self.mcXSD) - for i in self.entites : - print (i,self.entites[i]) + #for i in self.entites : print (i,self.entites[i]) + #print ('creation de X_compoFactoriseAmbigu', self.nom, self.mcXSD) + self.constructionArbrePossibles() + lesPossibles=deepcopy(self.arbrePossibles) - #self.mcXSD=self.factorise(lesPossibles) self.getNomDuCodeDumpe() self.nomDuTypePyxb = self.definitNomDuTypePyxb() self.texteSimple = '' @@ -131,19 +156,10 @@ class X_factCompoAmbigu(X_definition): self.texteComplexe = debutTypeSubstDsBlocFactorise.format(self.nomDuTypePyxb) # on enleve [] des possibles puisque l elt sera optionnel lesPossibles.remove([]) + #lesPossibles=[['A'] ,['A', 'B'] ,['A', 'B', 'C'] ,['A', 'B', 'C', 'F'] ,['A', 'B', 'F'] ,['A', 'C'] ,['A', 'C', 'F'] ,['A', 'D'] ,['A', 'D', 'F'] ,['A', 'F'] ,['A', 'G'] ,] self.mcXSD=self.factoriseEtCreeDump(lesPossibles,False,nomAppel='Root') 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' @@ -159,6 +175,56 @@ class X_factCompoAmbigu(X_definition): self.construitEntites(mc.mcXSD) + def constructionArbrePossibles(self): + 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 : + for newLigne in self.deploye(ligne): + if newLigne not in self.arbrePossibles : self.arbrePossibles.append(newLigne) + toto=deepcopy(self.arbrePossibles) + toto.sort() + for l in toto : print (l) + print ("______________________________________") + + + def deploye (self, ligne): + toutesLesLignes=[[]] + for mc in ligne : + objMC=self.entites[mc][0] + if objMC.label == 'BLOC' : + toutesLesLignes = deepcopy(self.remplaceNomListeParContenu(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 pass @@ -170,73 +236,27 @@ class X_factCompoAmbigu(X_definition): def nomComplet(self) : print (self, self.nom) -# 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 factoriseEtCreeDump(self, laListe, dejaDansUneSequence=False, indent=2 ,nomAppel=None): - ## nomAPpel ne sert que pour le debug - print ('debut factorise ********', laListe, indent, nomAppel ) maListeRetour=[] aReduire={} if [] in laListe : declencheChoiceAvecSeqVid=True - laListe.remove([]) + while [] in laListe : laListe.remove([]) + min=0 else : declencheChoiceAvecSeqVid=False + min=1 for ligne in laListe : - if aReduire.has_key(ligne[0]) : aReduire[ligne[0]].append(ligne[1:]) - else : aReduire[ligne[0]]=[ligne[1:],] + if aReduire.has_key(ligne[0]) : + 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 : @@ -247,9 +267,11 @@ class X_factCompoAmbigu(X_definition): else : creeChoice=True creeSequence=False - self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1 + # 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 else : - self.texteComplexe += '\t'*indent + debutChoiceDsBloc; indent=indent+1 + self.texteComplexe += '\t'*indent + debutChoiceDsBlocAvecMin.format(min); indent=indent+1 creeChoice=True creeSequence=False @@ -263,14 +285,13 @@ class X_factCompoAmbigu(X_definition): 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 #if doitFermerSequence : indent=indent-1;self.texteComplexe += '\t'*(indent) + finSequenceDsBloc - print ('________ fin factorise________' , laListe) return (maListeRetour) @@ -285,47 +306,6 @@ class X_factCompoAmbigu(X_definition): 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 -# @@ -338,9 +318,7 @@ class X_definitionComposee (X_definition): blocsDejaDumpes=set() #for nom in self.ordre_mc: # mcFils = self.entites[nom] - print ('***************',self.nom) for mcFils in self.mcXSD : - print ('_________mcFls', mcFils,mcFils.nom) if not (isinstance(mcFils, Accas.BLOC)) : mcFils.dumpXsd(dansFactorisation) self.texteComplexe += mcFils.texteElt @@ -348,10 +326,8 @@ class X_definitionComposee (X_definition): texteComplexeVenantDesFils += mcFils.texteComplexe continue else : - print ('_________bloc', mcFils,mcFils.nom) if hasattr(mcFils,'nomXML') and mcFils.nomXML in blocsDejaDumpes: continue if hasattr(mcFils,'nomXML') : blocsDejaDumpes.add(mcFils.nomXML) - print ('_________bloc', mcFils,mcFils.nom) mcFils.dumpXsd(dansFactorisation) self.texteComplexe += mcFils.texteElt self.texteSimple += mcFils.texteSimple @@ -359,7 +335,6 @@ class X_definitionComposee (X_definition): return texteComplexeVenantDesFils def dumpXsd(self,dansFactorisation=False): - print ('------------------------------------------------', self.nom) if PourTraduction : print (self.nom) self.prepareDumpXSD() @@ -404,7 +379,6 @@ class X_definitionComposee (X_definition): return True def prepareDumpXSD(self): - print ('prepareDumpXSD', self.nom) self.tousLesFils=[] self.mcXSD=[] for nomMC in self.ordre_mc: @@ -483,10 +457,13 @@ class X_definitionComposee (X_definition): indexFin=liste[-1][1]+1 nomFin=liste[-1][0].nom nom=nomDebut+'_'+nomFin + listeAFactoriser=[] + for i in range(indexDebut, indexFin) : + listeAFactoriser.append((self.mcXSD[i],i)) newListe=self.mcXSD[0:indexDebut] #print (newListe, newListe.__class__) - monEltFacteur=X_factCompoAmbigu(nom,liste,self) + monEltFacteur=X_compoFactoriseAmbigu(nom,listeAFactoriser,self) newListe.append(monEltFacteur) newListe=newListe+self.mcXSD[indexFin:] self.mcXSD=newListe @@ -510,35 +487,6 @@ class X_definitionComposee (X_definition): if fils in self.tousLesFils : return False return True - def construitArbrePossibles(self): - self.arbrePossibles=[[],] - for child in self.mcXSD : child.construitArbrePossibles() - for child in self.mcXSD : - if child.label != 'BLOC' : - self.arbrePossibles = deepcopy(self.adjoint(self.arbrePossibles, child.arbrePossibles)) - else : - self.arbrePossibles = deepcopy(self.fusionne(self.arbrePossibles, child.arbrePossibles)) - #print ( self.arbrePossibles) - - 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 fusionne(self, liste1, liste2): - listeFinale=[] - for elt1 in liste1 : - for eltListe in liste2: - newListe=deepcopy(elt1) - for elt in eltListe : - if elt not in newListe : newListe.append(elt) - if newListe not in listeFinale : listeFinale.append(newListe) - return listeFinale @@ -591,9 +539,6 @@ class X_PROC (X_definitionComposee): class X_BLOC (X_definitionComposee): #----------------------------------- def dumpXsd(self,dansFactorisation=False): - print ('------------------------------------------------') - print ('dumpXsd de ' , self.nom) - print (self.nomXML) self.tousLesFils=[] self.getNomDuCodeDumpe() @@ -602,7 +547,6 @@ class X_BLOC (X_definitionComposee): self.nomDuTypePyxb = self.definitNomDuTypePyxb() self.texteSimple = "" # on n ajoute pas de type simple - print (self.aCreer) # Pour les blocs le minOccurs vaut 0 et le max 1 if self.aCreer : self.texteComplexe = debutTypeSubst.format(self.nomDuTypePyxb) @@ -623,21 +567,19 @@ class X_BLOC (X_definitionComposee): val1=getattr(self,attr) val2=getattr(autreMC,attr) if val1 != val2 : return False - print ('je passe la 22222222222222222') for defFille in self.entites.keys(): - print (defFille) if defFille not in autreMC.entites.keys() : return False - print (defFille) if not self.entites[defFille].compare(autreMC.entites[defFille]) : return False - print (defFille) return True def construitArbrePossibles(self): - #print ('je passe la pour', self.nom) - X_definitionComposee.construitArbrePossibles(self) - if [] not in self.arbrePossibles : self.arbrePossibles.append([]) - self.sequenceEnXSD=[] - + self.arbrePossibles=[[],] + for child in self.mcXSD : + if not hasattr(child, 'arbrePossibles') : child.construitArbrePossibles() + if child.label != 'BLOC' : + self.arbrePossibles = deepcopy(self.adjoint(self.arbrePossibles, child.arbrePossibles)) + else : + self.arbrePossibles = deepcopy(self.fusionne2Listes(self.arbrePossibles, child.arbrePossibles)) #-------------------------------- @@ -763,7 +705,7 @@ class X_SIMP (X_definition): 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) + #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 @@ -771,7 +713,7 @@ class X_SIMP (X_definition): def traduitMinMax(self): if self.min == 1 and self.max == 1 : return - print ('il faut creer une liste ' , self.nom) + #print ('il faut creer une liste ' , self.nom) def compare(self,autreMC): if self.label != autreMC.label : return False diff --git a/Efi2Xsd/balisesXSD.py b/Efi2Xsd/balisesXSD.py index 63a2f6d0..346ae227 100644 --- a/Efi2Xsd/balisesXSD.py +++ b/Efi2Xsd/balisesXSD.py @@ -44,8 +44,7 @@ finTypeSubst = '\t\t\n\t\n' substDsSequence = '\t\t\t\n' #choiceDsBloc='\t\t\t\n' debutChoiceDsBloc='\n' -finChoiceDsBloc='\n' -debutChoiceDsBloc='\n' +debutChoiceDsBlocAvecMin='\n' finChoiceDsBloc='\n' debSequenceDsBloc='\n' finSequenceDsBloc='\n'