]> SALOME platform Git repositories - tools/eficas.git/blob - Efi2Xsd/MCAccasXsd.py
Salome HOME
Merge V9 dans Master
[tools/eficas.git] / Efi2Xsd / MCAccasXsd.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 import sys,os
4 import traceback
5 #import raw.efficas as efficas
6 import types
7
8 sys.path.insert(0,os.path.abspath(os.path.join(os.getcwd(),'..')))
9
10 import pyxb
11 import pyxb.binding
12 import pyxb.binding.basis
13 #import pyxb.utils.utility
14 #import pyxb.utils.domutils
15
16 class X_OBJECT:
17 # -------------
18
19   def deletePyxbObject(self):
20       print ('----------- deletePyxbObject', self.nom)  
21       return
22       indice = 0
23       trouve = False
24       for i in self.perePyxb.objPyxb.orderedContent(): 
25             if id(self.objPyxb) == id(i._Content__value) : trouve = True ;break
26             indice = indice + 1
27       if not trouve : print ('objet pas trouve')
28       print (self.perePyxb.objPyxb.description)
29       del self.perePyxb.objPyxb.__dict__[self.nom]
30       print (self.perePyxb.objPyxb.__delattr__)
31       #delattr(self.perePyxb.objPyxb,self.nom)
32       # PNPN
33       
34       print ('delattr', self.perePyxb.objPyxb,self.nom)
35       del self.perePyxb.objPyxb.orderedContent()[indice]
36
37
38 class X_MCSIMP(X_OBJECT):
39 # -----------------------
40       
41    def buildObjPyxb(self) :
42       # self.valeur tient compte de la valeur par defaut
43       # utiliser getValeur ? expression numpy
44       if not self.cata or  not self.cata.modeleMetier : return
45       #print ('X_MCSIMP buildObjPyxb', self.nom, self,self.valeur)
46       #if self.nom == 'diameter' : 
47       #    traceback.print_stack()
48       #    print ('****************************************************')
49       # print ('objPyxbDeConstruction', self.objPyxbDeConstruction)
50       #if self.objPyxbDeConstruction == None : print (self.nom, ' pas de pyxb')
51       if self.objPyxbDeConstruction != None :
52         self.objPyxb = self.objPyxbDeConstruction
53         self.maClasseModeleMetier =type(self.objPyxb)
54         #print (self.maClasseModeleMetier)
55         self.objPyxbDeConstruction = None
56       else :
57         self.monNomClasseModeleMetier='T_'+self.nom
58         self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
59         #print (self.maClasseModeleMetier)
60         #print (self.valeur)
61         #print (type(self.valeur))
62         if self.valeur != None : self.objPyxb=self.maClasseModeleMetier(self.valeur)
63         elif self.definition.into != None and 'TXM' in self.definition.type  : self.objPyxb = None
64         else                   : self.objPyxb=self.maClasseModeleMetier(); 
65       self.filsPyxb=None
66       #print ('X_MCSIMP', self.nom, self.objPyxb)
67       #print ('fin X_MCSIMP', self.objPyxb, self.nom,self)
68
69
70    def setValeurObjPyxb(self,newVal):
71        print ('dans setValeurObjPyxb MCSIMP')
72        if not self.cata or  not self.cata.modeleMetier : return
73        #  print (self.nom , ' a pour pere', self.perePyxb, self.perePyxb.nom, self.perePyxb.objPyxb)
74        if newVal != None : nvlObj=self.maClasseModeleMetier(newVal)
75        else              : nvlObj=self.maClasseModeleMetier()
76        self.val=newVal
77        setattr(self.perePyxb.objPyxb,self.nom,nvlObj)
78        print ('setattr', self.perePyxb.objPyxb,self.nom)
79        trouve=False
80        indice=0
81        for i in self.perePyxb.objPyxb.orderedContent(): 
82            if isinstance(i._Content__value, self.maClasseModeleMetier) : 
83               self.perePyxb.objPyxb.orderedContent()[indice]=self.perePyxb.objPyxb.orderedContent()[-1]
84               del(self.perePyxb.objPyxb.orderedContent()[-1])
85               trouve=True
86               break
87            indice+=1
88        if not trouve : print ('Attention souci au changement de valeur de ', self.nom)
89        self.objPyxb=nvlObj
90        print ('iiiiiiiiiiiiiiiiiiiiiiiiiiiiii', nvlObj, id(nvlObj))
91        #for i in self.perePyxb.objPyxb.orderedContent(): 
92        #    print ('ds le for pour i')
93        #    print (i._Content__value)
94        #    print (id(i._Content__value))
95        #    print (type((i._Content__value)))
96        #    if id(i._Content__value) == id(self.objPyxb) : break
97        #    indexOC +=1
98
99        #maValeur = getattr(self.perePyxb.objPyxb, self.nom)
100        #print ('je change', indexOC)
101        #if isinstance(maValeur, pyxb.binding.basis.simpleTypeDefinition):
102        #if 1 :
103        #   print ('jkjkljkljklj')
104        #   setattr(self.perePyxb.objPyxb,self.nom,nvlObj)
105        #   self.perePyxb.objPyxb.orderedContent()[indexOC]=self.perePyxb.objPyxb.orderedContent()[-1]
106        #   del(self.perePyxb.objPyxb.orderedContent()[-1])
107        #print ('apres',self.nom, self.perePyxb.objPyxb.orderedContent())
108        #else :
109        #   index=0
110        #   trouve=False
111        #   try :
112        #     for i in maValeur: 
113        #       if id(i) == id(self.objPyxb) :trouve = True ; break
114        #       index=index+1
115        #     maValeur[index]=nvlObj
116        #     self.perePyxb.objPyxb.orderedContent()[indexOC]._Content__value=nvlObj
117        #   except : pass
118        #   if not trouve : print (self.nom , 'pas trouve')
119
120        #print ('arret programme'); exit()
121
122        #print ('id objPyxb',id(self.objPyxb))
123        #print ('id objPyxb[0]',id(self.objPyxb[0]))
124        #print ('id elt ', id(self.objPyxb._element), self.objPyxb._element, type(self.objPyxb._element), type(self.objPyxb._element()))
125        #print ('        perePyxb _ElementMap')
126        #print (self.perePyxb.objPyxb._ElementMap)
127        #index=0
128        #for i in self.perePyxb.objPyxb._ElementMap.keys() : 
129        #    print (id(i), ' ',  id(self.perePyxb.objPyxb._ElementMap[i]))
130            #print (dir(self.perePyxb.objPyxb._ElementMap[i]))
131        #    print (id(self.perePyxb.objPyxb._ElementMap[i]))
132 #          index=index+1
133        #print ('        objPyxb monBinding id')
134        #monBinding = getattr(self.perePyxb.objPyxb, self.nom)
135        #for i in monBinding : print id(i)
136        #print ('        perePyxb orderedContent')
137        #for i in self.perePyxb.objPyxb.orderedContent(): 
138        #    print id(i._Content__value)
139        #    print (i._Content__value, type(i._Content__value))
140        #print ('        perePyxb orderedContent')
141        #for i in self.perePyxb.objPyxb.content(): print id(i)
142        
143        #print (self.perePyxb.objPyxb.orderedContent())
144        #print (monBinding)
145         
146       
147    def addPyxbObject(self, indiceDsLeContenu):
148       if not self.cata or  not self.cata.modeleMetier : return
149
150       # adherence Accas sur le parent
151       parent=self.parent
152       while (parent.isBLOC() ): parent=parent.parent
153       self.perePyxb=parent
154
155       self.monNomClasseModeleMetier='T_'+self.nom
156       self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
157       nvlObj=self.maClasseModeleMetier() 
158       print ('setattr', self.perePyxb.objPyxb,self.nom)
159       setattr(self.perePyxb.objPyxb,self.nom,nvlObj)
160       tampon=self.perePyxb.objPyxb.orderedContent()[-1]
161       self.objPyxb  = nvlObj
162       indexOC=-1
163       longueur=len(self.perePyxb.objPyxb.orderedContent())
164       for i in reversed(range(longueur)):
165           self.perePyxb.objPyxb.orderedContent()[i]=self.perePyxb.objPyxb.orderedContent()[i-1]
166           if i == indiceDsLeContenu + 1 : break
167       self.perePyxb.objPyxb.orderedContent()[indiceDsLeContenu]=tampon
168
169
170       #for i in self.perePyxb.objPyxb.orderedContent() :
171       #    print (i._Content__value, type(i._Content__value))
172       #print ('----------------')
173
174       #print self.perePyxb.objPyxb.orderedContent()
175       #for i in  self.perePyxb.objPyxb.orderedContent():
176       #     print ('valeur de ', i)
177       #     print (i._Content__value)
178       #     print (type(i._Content__value))
179       #     if isinstance(i._Content__value, self.maClasseModeleMetier) : 
180       #        print dir(i._Content__value)
181       #        self.objPyxb = i._Content__value 
182       #        setattr(self.perePyxb.objPyxb, self.nom, nvlObj)
183       #        self.perePyxb.objPyxb.orderedContent()[indexOC]=self.perePyxb.objPyxb.orderedContent()[-1]
184       #        del(self.perePyxb.objPyxb.orderedContent()[-1])
185       #     indexOC+=1
186       #PNPNPNPNPNPNPNPNP
187
188 class X_MCCOMPO(X_OBJECT) :
189 # -------------------------
190
191    def buildObjPyxb(self,mc_list) :
192       #print ('________________________________________________')
193       #print ('X_MCCOMPO buildObjPyxb', self.nom, self, mc_list)
194       if not self.cata or  not self.cata.modeleMetier : return
195
196       self.listArg=[]
197       for objAccas in mc_list :
198         if objAccas.nature == 'MCBLOC' :
199            self.exploreBLOC(objAccas)
200         elif objAccas.nature == 'MCList' :
201            for fils in objAccas : 
202                fils.perePyxb=self
203                self.listArg.append(fils.objPyxb)
204         else :
205            self.listArg.append(objAccas.objPyxb)
206            objAccas.perePyxb=self
207            print (objAccas.nom ,' a pour pere Pyxb', self, self.nom)
208
209       self.monNomClasseModeleMetier='T_'+self.nom
210       self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
211       if self.objPyxbDeConstruction != None :
212         self.objPyxb = self.objPyxbDeConstruction
213         self.objPyxbDeConstruction = None
214         #print ('je passe dans le if pour ', self.nom, self.objPyxb, self)
215       else :
216         self.objPyxb=self.maClasseModeleMetier(*self.listArg)
217       #print ('Fin __________ ', self.nom, self.objPyxb)
218       #print ('X_MCCOMPO', self.nom, self.objPyxb)
219       #print ('_______________________________________')
220
221    def deletePyxbObject(self):
222       print ('******************************************')
223       print ('je passe ds deletePyxbObject pour ', self, self.nom)
224       print (self.perePyxb)
225       print (dir(self)) 
226       print ('******************************************')
227
228    def exploreBLOC(self,objAccas):
229       laListeSsLesBlocs=[]
230       for fils in objAccas.mcListe:
231         if fils.nature == 'MCBLOC' :
232            self.exploreBLOC(fils)
233         elif fils.nature == 'MCList' :
234            for objFils in fils : 
235                fils.perePyxb=self
236                self.listArg.append(fils.objPyxb)
237                #print (fils.nom ,' a pour pere Pyxb', self, self.nom)
238         else :
239            self.listArg.append(fils.objPyxb)
240            fils.perePyxb=self
241            #print (fils.nom ,' a pour pere Pyxb', self, self.nom)
242           
243    
244
245   
246 class X_MCBLOC (X_MCCOMPO):
247 # --------------------------
248    def buildObjPyxb(self,mc_list):
249       if not self.cata or  not self.cata.modeleMetier : return
250       # mise a none ? le bloc n a pas d existence en pyxb
251       self.perePyxb=None
252       #print ('_______________________________________')
253       #print ('X_MCBLOC buildObjPyxb', self.nom, self, mc_list)
254       # on rattache ses fils au bloc mais leur pere sera ensuite le MCCOMPO qui contient le bloc 
255       # Pas sur d en avoir besoin du filsPyxb
256       self.filsPyxb=[]
257       self.objPyxb=None
258       for objAccas in mc_list :
259          self.filsPyxb.append(objAccas.objPyxb)
260       #print (self.filsPyxb)
261       #print ('Fin ', self.nom, self.objPyxb)
262       #print ('_______________________________________')
263
264         
265        
266
267 class X_MCLIST (X_MCCOMPO):
268 # --------------------------
269  
270    def buildObjPyxb(self,mc_list):
271       #print ('__________________________________________________________________')
272       #print ('X_MCLIST buildObjPyxb traite ds X_MCLIST', self.nom, self)
273       #print ('on ne fait rien pour les MCLISTs, cela sera fait dans chaque MCFACT')
274       #print ('__________________________________________________________________')
275       pass
276
277    # detruire la methode suivante
278    #def build2ObjPyxb(self,mc_list):
279    #   print ('_______________________________________')
280    #   print ('X_MCLIST buildObjPyxb traite ds X_MCLIST', self.nom, self)
281    #   if not self.cata.modeleMetier : return
282    #   self.monNomClasseModeleMetier='T_'+self.nom
283    #   self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
284    #   listArg=[]
285       # MCList est une liste
286    #   for nbDeSequence in self :
287    #      for objAccas in nbDeSequence.mcListe :
288              #print (type (objAccas))
289              #print (objAccas.nom, objAccas.objPyxb, type(objAccas.objPyxb))
290              #print ( type (objAccas.objPyxb) == list )
291              #if type (objAccas.objPyxb) == list :
292                 #print ('ds le if')
293    #             for fils in objAccas.objPyxb : 
294    #                listArg.append(fils.objPyxb)
295    #                fils.perePyxb=self
296                    #print (fils.nom ,' a pour pere Pyxb', self, self.nom)
297    #          else :
298    #              listArg.append(objAccas.objPyxb)
299    #              objAccas.perePyxb=self
300                  #print (objAccas.nom ,' a pour pere Pyxb', self, self.nom)
301              #listArg.append(objAccas.objPyxb)
302              #objAccas.perePyxb=self
303              #print ( objAccas.nom, ' a pour perepyxb ' , objAccas.perePyxb.nom) 
304       
305    #   print ('X_MCLIST', self.nom, self, listArg)
306    #   self.objPyxb=self.maClasseModeleMetier(*listArg)
307    #   print ('fin buildObjPyxb traite ds X_MCLIST', self.nom, self, self.objPyxb)
308    #   print ('_______________________________________')
309
310 class X_MCFACT (X_MCCOMPO):
311 # -------------------------
312 # on gere  au niveau du MCCOMPO
313       pass
314
315
316 class X_JDC (X_MCCOMPO):
317 # ---------------------
318  
319    def  __init__(self):
320       #print ('_______________________________________')
321       #print ('X_JDC buildObjPyxb',  self)
322       if not self.cata or  not self.cata.modeleMetier : return
323       self.monNomClasseModeleMetier=self.code
324       self.maClasseModeleMetier=getattr(self.cata.modeleMetier,self.monNomClasseModeleMetier)
325       self.objPyxb=self.maClasseModeleMetier()
326       pyxb.GlobalValidationConfig._setContentInfluencesGeneration(pyxb.GlobalValidationConfig.ALWAYS)
327       pyxb.GlobalValidationConfig._setInvalidElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION)
328       pyxb.GlobalValidationConfig._setOrphanElementInContent(pyxb.GlobalValidationConfig.RAISE_EXCEPTION)
329       #print ('fin buildObjPyxb _______________________________________')
330
331    def enregistreEtapePyxb(self,etape):
332      # OK seulement si sequence (choice ? ...)
333       if not self.cata.modeleMetier : return
334       print ('enregistreEtapePyxb' , etape)
335       self.objPyxb.append(etape.objPyxb)
336       etape.perePyxb = self
337       #self.toXml()
338
339    def toXml(self):
340       if not self.cata.modeleMetier : return
341       print ('***************',self.objPyxb,'***************',)
342       print ('***************',self.objPyxb.orderedContent(),'***************',)
343       print(self.objPyxb.toDOM().toprettyxml())
344       print(self.objPyxb.toxml())
345       return (self.objPyxb.toDOM().toprettyxml())
346         
347
348    def analyseFromXML(self):
349       print ("je suis ds analyseFromXML -- > appel ds analyse de I_JDC.py")
350       if self.procedure == "" : return
351       self.objPyxb=self.cata.modeleMetier.CreateFromDocument(self.procedure)
352       for objEtape in self.objPyxb.content():
353           objEtape.dictArgs= (self.pyxbToDict(objEtape))
354           objEtape.monNomClasseAccas=objEtape._ExpandedName.localName()
355           objEtape.monNomClasseAccas=objEtape.monNomClasseAccas[2:]
356           objEtape.dictPyxb['objEnPyxb']=objEtape
357           objEtape.dictArgs['dicoPyxbDeConstruction']=objEtape.dictPyxb
358           maClasseAccas=getattr(self.cata,objEtape.monNomClasseAccas)
359           objAccasEtape=maClasseAccas(**(objEtape.dictArgs))
360           # attention objAccasEtape = None normal (cf buildSd)
361  
362           #print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
363           #print (objEtape , type(objEtape))
364           #print (objEtape.dictPyxb)
365           #print (maClasseAccas)
366           #print (objAccasEtape)
367  
368           #print (objEtape.monNomClasseAccas, type(objEtape.monNomClasseAccas))
369           #print (objEtape._ExpandedName, type(objEtape._ExpandedName))
370           #print (objEtape.dictPyxb[u'experience'])
371           #print (objEtape.dictArgs)
372           #print (objEtape.dictPyxb)
373           #print ( 'hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh')
374           #exit()
375       
376
377    def pyxbToDict(self,objAAnalyser):
378     # la transformation de l objAAnalyser en type lu par eficas ne fonctionne pas pour tout
379     # faudrait - il travailler sur les types des objets ?
380     # c est a revoir -> fonction cast a prevoir ds les 2 sens
381     if objAAnalyser is None: return
382     #print ('debut pour ',objAAnalyser)
383     dictArgs = {}
384     if isinstance(objAAnalyser, pyxb.binding.basis.simpleTypeDefinition): 
385        objAAnalyser.dictPyxb=objAAnalyser
386        #print (objAAnalyser.dictPyxb , type(objAAnalyser.dictPyxb))
387        if isinstance(objAAnalyser, pyxb.binding.basis.enumeration_mixin):    return str(objAAnalyser)
388        if isinstance(objAAnalyser, types.StringTypes):  return str(objAAnalyser)
389        if isinstance(objAAnalyser, types.FloatType):  return float(objAAnalyser)
390        if isinstance(objAAnalyser, (types.IntType, types.LongType)):  return int(objAAnalyser)
391        #if isinstance(objAAnalyser, (types.NoneType, types.BooleanType, types.FloatType, types.IntType, types.LongType)):
392        return repr(objAAnalyser)
393        # ou ? return objAAnalyser
394        #if isinstance(objAAnalyser, types.StringTypes): return pyxb.utils.utility.QuotedEscaped(objAAnalyser,)
395        #pour une enum getattr(value dans le type)
396        # return pythonLiteral(ReferenceFacet(facet=value, **kw))
397     objAAnalyser.dictPyxb = {} 
398     for expandedName, elementDeclaration in objAAnalyser._ElementMap.items():
399         objPyxbName  = expandedName.localName()
400         objPyxbValue = getattr(objAAnalyser, objPyxbName)
401         if objPyxbValue == None or objPyxbValue == [] : continue
402         if elementDeclaration.isPlural():
403             dictArgs[objPyxbName] = []
404             #objAAnalyser.dictPyxb[objPyxbName]={} 
405             objAAnalyser.dictPyxb[objPyxbName]=[] 
406             #objAAnalyser.dictPyxb['objEnPyxb']=objAAnalyser
407             for objPyxb in objPyxbValue : 
408                 #print ('-------------',objPyxb)
409                 dictArgs[objPyxbName].append(self.pyxbToDict(objPyxb))
410                 objPyxb.dictPyxb['objEnPyxb'] = objPyxb
411                 objAAnalyser.dictPyxb[objPyxbName].append(objPyxb.dictPyxb)
412         else:
413             dictArgs[objPyxbName] = self.pyxbToDict(getattr(objAAnalyser, objPyxbName))
414             #print ('ajout ds dico de ', objAAnalyser , 'de',  objPyxbName, objPyxbValue)
415             objAAnalyser.dictPyxb[objPyxbName] = objPyxbValue.dictPyxb
416             #print ('ajout ds dico de ', objPyxbValue.dictPyxb, 'de',  objPyxbName)
417             objAAnalyser.dictPyxb['objEnPyxb']=objAAnalyser
418     #print ("***********************************")
419     #print ('pyxbToDict  fin pour ********** ', objAAnalyser)
420     #print ('pyxbToDict ', objAAnalyser, objAAnalyser.dictPyxb)
421     #print ('pyxbToDict  fin pour ********** ', objAAnalyser)
422     #print ("***********************************")
423     #print (dictArgs)
424     #print (dictPyxb)
425     #for i in dictArgs.keys(): print (i, " ", dictArgs[i], " ", type(dictArgs[i]))
426     #print ('fin pour ',objAAnalyser)
427     return dictArgs
428
429    
430 #   def analyseContent(self,objAAnalyser):
431 #       objAAnalyser.dictArgs={}
432 #       for objContenu in objAAnalyser.content():
433 #          #print ('j analyse ', objContenu)
434 #          objContenu.monNomClasseModeleMetier=str(objContenu.__class__).split('.')[-1]
435 #          objContenu.monNomClasseAccas=objContenu.monNomClasseModeleMetier[2:-2]
436 #          #maClasseAccas=classeAccasPere.entites[objContenu.monNomClasseAccas]
437 #          if objContenu._IsSimpleTypeContent():
438 #             print (objContenu.monNomClasseAccas,objContenu.pythonLiteral())
439 #             print (objContenu.monNomClasseAccas,objContenu.xsdLiteral())
440 #             #chaine=objContenu.pythonLiteral().split('(')[1].split(')')[0]
441 #             print (dir(objContenu))
442 #             objAAnalyser.dictArgs[objContenu.monNomClasseAccas]=None
443 #             #objAAnalyser.dictArgs[objContenu.monNomClasseAccas]=objContenu.pythonLiteral()
444 #          else :
445 #             self.analyseContent(objContenu)
446 #             objAAnalyser.dictArgs[objContenu.monNomClasseAccas]=objContenu.dictArgs
447        #print ( '________________')
448        #print (objAAnalyser.monNomClasseAccas)
449        #for i in objAAnalyser.dictArgs : print (i, objAAnalyser.dictArgs[i])
450        #print ( '________________')
451         
452   
453
454 if __name__ == "__main__":
455    print ('a faire')