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