]> SALOME platform Git repositories - tools/eficas.git/commitdiff
Salome HOME
Utilisation d'une autre méthode pour l'insertion des objets PyxB
authorEric Fayolle <eric.fayolle@edf.fr>
Mon, 25 Feb 2019 08:56:06 +0000 (09:56 +0100)
committerEric Fayolle <eric.fayolle@edf.fr>
Mon, 25 Feb 2019 08:56:06 +0000 (09:56 +0100)
Efi2Xsd/AccasXsd.py
Efi2Xsd/MCAccasXsd.py

index db61521f99d5b13c7074c14e4a08dd18c7ed2ac0..07164a99a6f8ed2f7f209f801e459c93c8ef295c 100755 (executable)
@@ -113,7 +113,7 @@ class X_definitionComposee (X_definition):
    # ______________________
    # valable pour PROC et OPER
       self.minOccurs = 0
-      self.maxOccurs = "unbounded"
+      self.maxOccurs = "1"
 
    def compare(self,autreMC):
        if self.label != autreMC.label : return False
@@ -129,6 +129,8 @@ class X_definitionComposee (X_definition):
 # ---------------------------------
 class X_FACT (X_definitionComposee):
 #--------- ------------------------
+#Un FACT avec max=** doit se projeter en XSD sous forme d'une sequence a cardinalite 1 et
+# l'element qui porte la repetition du FACT  
    def traduitMinMax(self):
        if self.max     == '**' or self.max  == float('inf') : self.maxOccurs="unbounded"
        else :                                                 self.maxOccurs = self.max
index d5b6c645f8405917318db6361db88af98044a5eb..68dce819551bd9e63c3ac8db20a83aef4e2dc020 100755 (executable)
@@ -48,7 +48,7 @@ class X_OBJECT:
       if  grandPere : grandPere.reconstruitAvecNvlObj(ancienObjPerePyxb,nvlObjPerePyxb)
       print ('----------- fin delObjPyxb', self.nom)  
       
-  def addObjPyxb(self,indiceDansLeContenu):
+  def addObjPyxbV0(self,indiceDansLeContenu):
       if not self.cata.modeleMetier : return
       #print ('**********************************************')
       #print ('_____________ addObjPyxb ds X_OBJECT', self.nom, indiceDansLeContenu)
@@ -84,6 +84,51 @@ class X_OBJECT:
       #print (self.nom, ' a pour gp ', grandPere)
       if  grandPere : grandPere.reconstruitAvecNvlObj(ancienObjPerePyxb,nvlObjPerePyxb)
 
+  def addObjPyxb(self,indiceDansLeContenu):
+      if not self.cata.modeleMetier : return
+      print ('**********************************************')
+      print ('_____________ addObjPyxb ds X_OBJECT', self.nom, indiceDansLeContenu)
+      # adherence Accas sur le parent
+      parent=self.parent
+      while (parent.isBLOC()): parent=parent.parent
+      self.perePyxb=parent
+      
+      #EF: grandPere et ancienObjPerePyxb sont devenus inutiles
+      # grandPere=self.perePyxb.perePyxb
+      # ancienObjPerePyxb=self.perePyxb.objPyxb
+      # print ('dans le perePyxb', self.perePyxb.nom)
+      # print ('j ai pour orderedContent', self.objPyxb.orderedContent())
+
+      self.objPyxb.objAccas=self
+      
+      # listeArg=[]
+      # indice=0
+      # # a tester
+      # # a affiner si on ajoute en fin 
+      # #print (indiceDansLeContenu)
+      # #print (self.perePyxb.objPyxb.orderedContent())
+      # for i in self.perePyxb.objPyxb.orderedContent(): 
+      #     if indice==indiceDansLeContenu : listeArg.append(self.objPyxb)
+      #     else : listeArg.append(i._Content__value)
+      #     indice=indice+1
+      # #print ('avec', listeArg)
+      # if indiceDansLeContenu == len(self.perePyxb.objPyxb.orderedContent()):
+      #     listeArg.append(self.objPyxb)
+      print('self.cata.modeleMetier.Namespace : ',self.cata.modeleMetier.Namespace)
+      print('self.nom : ',self.nom)
+      elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=self.perePyxb.objPyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
+      #perePyxb est en fait l'objet ACAS père de notre objet PyxB (Il peut être éloigné à cause des BLOCS)
+      self.perePyxb.objPyxb.orderedContent().insert(indiceDansLeContenu,elt)
+      setattr(self.perePyxb.objPyxb,elt.elementDeclaration._ElementDeclaration__key,self.objPyxb)
+      #print ('avec', listeArg)
+
+      #EF: J'imagine que la ligne suivante sert a demander au père de se reconstruire avec la liste des args
+      #nvlObjPerePyxb=self.perePyxb.maClasseModeleMetier(*listeArg)
+      #self.perePyxb.objPyxb=nvlObjPerePyxb
+      #self.perePyxb.objPyxb.objAccas=ancienObjPerePyxb.objAccas
+      #print (self.nom, ' a pour gp ', grandPere)
+      #if  grandPere : grandPere.reconstruitAvecNvlObj(ancienObjPerePyxb,nvlObjPerePyxb)
+
   def reconstruitAvecNvlObj(self, ancienObj,nvlObj):
       if not self.cata.modeleMetier : return
       print ('reconstruitAvecNvlObj pour', self, self.nom, ancienObj,nvlObj)
@@ -167,9 +212,9 @@ class X_MCSIMP(X_OBJECT):
       print ('addObjPyxb : ajout de ', self.nom, 'en ', indiceDsLeContenu)
 
       # adherence Accas sur le parent
-      parent=self.parent
-      while (parent.isBLOC() ): parent=parent.parent
-      self.perePyxb=parent
+      parent=self.parent
+      while (parent.isBLOC() ): parent=parent.parent
+      self.perePyxb=parent
       #print ('dans le perePyxb', self.perePyxb.nom)
       #print (dir(self.perePyxb))
 
@@ -177,22 +222,25 @@ class X_MCSIMP(X_OBJECT):
       self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
       #nvlObj=self.maClasseModeleMetier() 
       #nvlObj=self.maClasseModeleMetier(_validate_constraints=False)
-      if self.valeur != None : nvlObj=self.maClasseModeleMetier(self.valeur)
-      else                   : nvlObj=self.maClasseModeleMetier(_validate_constraints=False); 
+      if self.valeur != None : self.objPyxb=self.maClasseModeleMetier(self.valeur)
+      else                   : self.objPyxb=self.maClasseModeleMetier(_validate_constraints=False); 
       #print (self.perePyxb.objPyxb.orderedContent())
       #for i in (self.perePyxb.objPyxb.orderedContent()): print i._Content__value;print (type(i._Content__value))
-      setattr(self.perePyxb.objPyxb,self.nom,nvlObj)
-      tampon=self.perePyxb.objPyxb.orderedContent()[-1]
-      self.objPyxb  = nvlObj
-      self.objPyxb.objAccas=self
-      indexOC=-1
-      longueur=len(self.perePyxb.objPyxb.orderedContent())
-      #print (self.perePyxb.objPyxb.orderedContent())
-      #print (self.perePyxb.nom)
-      for i in reversed(range(longueur)):
-          self.perePyxb.objPyxb.orderedContent()[i]=self.perePyxb.objPyxb.orderedContent()[i-1]
-          if i == indiceDsLeContenu + 1 : break
-      self.perePyxb.objPyxb.orderedContent()[indiceDsLeContenu]=tampon
+
+      X_OBJECT.addObjPyxb(self, indiceDsLeContenu)
+      
+      # setattr(self.perePyxb.objPyxb,self.nom,nvlObj)
+      # tampon=self.perePyxb.objPyxb.orderedContent()[-1]
+      # self.objPyxb  = nvlObj
+      # self.objPyxb.objAccas=self
+      # indexOC=-1
+      # longueur=len(self.perePyxb.objPyxb.orderedContent())
+      # #print (self.perePyxb.objPyxb.orderedContent())
+      # #print (self.perePyxb.nom)
+      # for i in reversed(range(longueur)):
+      #     self.perePyxb.objPyxb.orderedContent()[i]=self.perePyxb.objPyxb.orderedContent()[i-1]
+      #     if i == indiceDsLeContenu + 1 : break
+      # self.perePyxb.objPyxb.orderedContent()[indiceDsLeContenu]=tampon
 
 
 
@@ -283,17 +331,17 @@ class X_MCBLOC (X_MCCOMPO):
       rangDeLObjet=indiceDsLeContenu
       for obj in self.mcListe:
           obj.addObjPyxb( rangDeLObjet)
-          rangDeLObjet=rangDeLObjet+1
+          rangDeLObjet=rangDeLObjet+obj.longueurDsArbre()
        
 
 class X_MCLIST (X_MCCOMPO):
 # --------------------------
  
-   def buildObjPyxb(self,mc_list):
+  def buildObjPyxb(self,mc_list):
       #print ('X_MCLIST buildObjPyxb ne fait rien', self.nom, self, mc_list)
       pass
-
-   def addObjPyxb(self,indiceDansLeContenu):
+    
+  def addObjPyxb(self,indiceDansLeContenu):
       #traceback.print_stack()
       print ('X_MCLIST addObjPyxb ne fait rien', self.nom)
       pass
@@ -303,9 +351,45 @@ class X_MCLIST (X_MCCOMPO):
 class X_MCFACT (X_MCCOMPO):
 # -------------------------
 # on gere  au niveau du MCCOMPO
-      pass
 
 
+  def addObjPyxb(self,indiceDansLeContenu):
+    if not self.cata.modeleMetier : return
+    print ('**********************************************')
+    print ('_____________ addObjPyxb ds X_MCLIST', self.nom, indiceDansLeContenu)
+    # adherence Accas sur le parent
+    #perePyxb est en fait l'objet ACCAS père de notre objet PyxB (Il peut être éloigné à cause des BLOCS)
+    parentNonBloc=self.parent
+    while (parentNonBloc.isBLOC()): parentNonBloc=parentNonBloc.parent
+    self.perePyxb=parentNonBloc
+    objPerePyxb=self.perePyxb.objPyxb     
+
+    self.objPyxb.objAccas=self
+      
+    # print('self.cata.modeleMetier.Namespace : ',self.cata.modeleMetier.Namespace)
+    # print('self.nom : ',self.nom)
+    
+    listeObjets=self.parent.getChild(self.nom,restreint='oui')
+    nbObjsPresents=len(listeObjets)
+    # nbObjsPresents == 1 nous indique qu'il n'y avait pas d'objet avec notre 'nom' dans le père
+
+    #Il y a une symetrie entre le contenu de l'orderedContent pour l'objet plural et la liste maintenue pas pyxb pour l'attribut et la mcListe ACCAS
+    elt=pyxb.binding.basis.ElementContent(self.objPyxb, instance=objPerePyxb, tag=pyxb.namespace.ExpandedName(self.cata.modeleMetier.Namespace, self.nom))
+    objPerePyxb.orderedContent().insert(indiceDansLeContenu,elt)
+
+    if (elt.elementDeclaration.isPlural()):
+      if  (nbObjsPresents == 1):
+      #vérifier que lorsque l'élément est optionnel il existe une liste vide ??
+      # setattr(objPerePyxb,elt.elementDeclaration._ElementDeclaration__key,self.objPyxb,)
+        ouAjouter=0
+      else:
+        ouAjouter=listeObjets.getIndex(self)
+      liste=getattr(objPerePyxb,elt.elementDeclaration._ElementDeclaration__key)
+      liste.insert(ouAjouter,self.objPyxb)
+    else:
+      setattr(objPerePyxb,elt.elementDeclaration._ElementDeclaration__key,self.objPyxb)
+      
+
 class X_JDC (X_MCCOMPO):
 # ---------------------
  
@@ -328,6 +412,8 @@ class X_JDC (X_MCCOMPO):
       print ( 'hhhhhhhhhhhhhhh enregistreEtapePyxb hhhhhhhhhhhhhhhhhhhhhhhhh')
       print ('enregistre ds ',self, etape.nom, 'indice = ', indice)
       if not self.cata.modeleMetier : return
+      import traceback
+      traceback.print_stack()
       self.objPyxb.append(etape.objPyxb)
       etape.perePyxb=self
       #print (self.objPyxb.orderedContent())
@@ -345,7 +431,7 @@ class X_JDC (X_MCCOMPO):
       #except pyxb.ValidationError as e:
       #   print(e.details())
 
-   def toXml(self):
+   def toXml(self,fichier=None):
       if not self.cata.modeleMetier : return
       print ('***************',self.objPyxb,'***************',)
       print ('***************',self,'***************',)