2 # Copyright (C) 2007-2021 EDF R&D
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 Ce module contient la classe MCSIMP qui sert à controler la valeur
23 d'un mot-clé simple par rapport à sa définition portée par un objet
27 from __future__ import absolute_import
30 from Noyau.N_ASSD import ASSD
31 from Noyau.N_CO import CO
32 from . import N_OBJECT
33 from .N_CONVERT import ConversionFactory
34 from .N_types import forceList, isSequence
37 class MCSIMP(N_OBJECT.OBJECT):
43 def __init__(self, val, definition, nom, parent,objPyxbDeConstruction):
47 - val : valeur du mot clé simple
54 - valeur : valeur du mot-clé simple en tenant compte de la valeur par défaut
57 #print (self, val, definition, nom, parent)
58 self.definition = definition
62 self.objPyxbDeConstruction = objPyxbDeConstruction
64 self.jdc = self.parent.jdc
65 if self.jdc : self.cata = self.jdc.cata
66 else : self.cata = None
67 self.niveau = self.parent.niveau
68 self.etape = self.parent.etape
70 # Le mot cle simple a été créé sans parent
72 print ('je suis dans le else sans parent du build')
78 if self.definition.creeDesObjets :
79 self.convProto = ConversionFactory('UserASSD', self.definition.creeDesObjetsDeType)
81 self.convProto = ConversionFactory('type', typ=self.definition.type)
82 self.valeur = self.getValeurEffective(self.val)
83 if self.definition.utiliseUneReference :
84 if self.valeur != None:
85 if not type(self.valeur) in (list, tuple): self.valeur.ajoutUtilisePar(self)
87 #PNPN --> chgt pour Vimmp
88 for v in self.valeur :
89 try : v.ajoutUtilisePar(self)
90 except : print ('il y a un souci ici', self.nom, self.valeur)
92 self.listeNomsObjsCrees = []
94 def getValeurEffective(self, val):
96 Retourne la valeur effective du mot-clé en fonction
97 de la valeur donnée. Defaut si val == None
99 if (val is None and hasattr(self.definition, 'defaut')): val = self.definition.defaut
100 if self.jdc != None and val in list(self.jdc.sdsDict.keys()): return self.jdc.sdsDict[val]
101 # dans le cas de lecture de .comm, il est possible que l objet est deja ete cree
102 # peut-etre devrait on aussi verifier que val est de type string ?
103 if self.definition.creeDesObjets :
104 # isinstance(val, self.definition.creeDesObjetsDeType) ne fonctionne pas car il y a un avec cata devant et l autre non
106 if (not(val.__class__.__name__ == self.definition.creeDesObjetsDeType.__name__)) :
107 val=self.convProto.convert(val)
109 if val.nom=='sansNom' :
110 for leNom,laVariable in self.jdc.g_context.items():
111 if id(laVariable)== id(val) and (leNom != 'sansNom'):
112 val.initialiseNom(leNom)
113 if val.parent== None : val.initialiseParent(self)
116 val = self.convProto.convert(val)
119 def creeUserASSDetSetValeur(self, val):
122 if nomVal in self.jdc.sdsDict.keys():
123 if isinstance(self.jdc.sdsDict[nomVal],self.definition.creeDesObjetsDeType): return (0, 'concept deja reference')
124 else : return (0, 'concept d un autre type existe deja')
126 objVal = self.convProto.convert(nomVal)
127 objVal.initialiseNom(nomVal)
128 if objVal.parent== None : objVal.initialiseParent(self)
130 while p in self.parent :
131 print ('mise a jour de ',p)
132 if hasattr(p, 'listeDesReferencesCrees') : p.listeDesReferencesCrees.append(objVal)
133 else : p.listeDesReferencesCrees=(objVal,)
135 return (self.setValeur(objVal), 'reference creee')
137 def creeUserASSD(self, val):
140 if nomVal in self.jdc.sdsDict.keys():
141 if isinstance(self.jdc.sdsDict[nomVal],self.definition.creeDesObjetsDeType): return (0,None, 'concept deja reference')
142 else : return (0, None, 'concept d un autre type existe deja')
144 objVal = self.convProto.convert(nomVal)
145 objVal.initialiseNom(nomVal)
146 return (1, objVal, 'reference creee')
148 def rattacheUserASSD(self, objASSD):
149 if objASSD.parent== None : objASSD.initialiseParent(self)
151 while p in self.parent :
152 if hasattr(p, 'listeDesReferencesCrees') : p.listeDesReferencesCrees.append(objASSD)
153 else : p.listeDesReferencesCrees=(objASSD,)
159 Retourne la "valeur" d'un mot-clé simple.
160 Cette valeur est utilisée lors de la création d'un contexte
161 d'évaluation d'expressions à l'aide d'un interpréteur Python
164 # Si singleton et max=1, on retourne la valeur.
165 # Si une valeur simple et max='**', on retourne un singleton.
166 # (si liste de longueur > 1 et max=1, on sera arrêté plus tard)
167 # Pour accepter les numpy.array, on remplace : "type(v) not in (list, tuple)"
168 # par "not has_attr(v, '__iter__')".
171 elif isSequence(v) and len(v) == 1 and self.definition.max == 1:
173 elif not isSequence(v) and self.definition.max != 1:
175 # traitement particulier pour les complexes ('RI', r, i)
176 if 'C' in self.definition.type and self.definition.max != 1 and v != None and v[0] in ('RI', 'MP'):
182 Une autre méthode qui retourne une "autre" valeur du mot clé simple.
183 Elle est utilisée par la méthode getMocle
187 def accept(self, visitor):
189 Cette methode permet de parcourir l'arborescence des objets
190 en utilisant le pattern VISITEUR
192 visitor.visitMCSIMP(self)
195 """ Retourne une copie de self """
196 objet = self.makeobjet()
197 # il faut copier les listes et les tuples mais pas les autres valeurs
198 # possibles (réel,SD,...)
199 if type(self.valeur) in (list, tuple):
200 objet.valeur = copy(self.valeur)
202 objet.valeur = self.valeur
203 objet.val = objet.valeur
207 return self.definition(val=None, nom=self.nom, parent=self.parent)
209 def reparent(self, parent):
211 Cette methode sert a reinitialiser la parente de l'objet
214 self.jdc = parent.jdc
215 self.etape = parent.etape
217 def getSd_utilisees(self):
219 Retourne une liste qui contient la ou les SD utilisée par self si c'est le cas
220 ou alors une liste vide
223 if isinstance(self.valeur, ASSD):
224 l.append(self.valeur)
225 elif type(self.valeur) in (list, tuple):
226 for val in self.valeur:
227 if isinstance(val, ASSD):
231 def getSd_mcs_utilisees(self):
233 Retourne la ou les SD utilisée par self sous forme d'un dictionnaire :
234 - Si aucune sd n'est utilisée, le dictionnaire est vide.
235 - Sinon, la clé du dictionnaire est le mot-clé simple ; la valeur est
236 la liste des sd attenante.
239 { 'VALE_F': [ <Cata.cata.fonction_sdaster instance at 0x9419854>,
240 <Cata.cata.fonction_sdaster instance at 0x941a204> ] }
242 l = self.getSd_utilisees()
249 def getMcsWithCo(self, co):
251 Cette methode retourne l'objet MCSIMP self s'il a le concept co
254 if co in forceList(self.valeur):
260 Cette methode retourne la liste de tous les concepts co
261 associés au mot cle simple
263 return [co for co in forceList(self.valeur)
264 if isinstance(co, CO) and co.isTypCO()]
267 if hasattr(self, 'val') and hasattr(self.val, 'supprime') :self.val.supprime()
268 N_OBJECT.OBJECT.supprime(self)