-#@ MODIF N_MCSIMP Noyau DATE 22/02/2005 AUTEUR DURAND C.DURAND
# -*- coding: iso-8859-1 -*-
-# CONFIGURATION MANAGEMENT OF EDF VERSION
-# ======================================================================
-# COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
-# THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
-# IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
-# THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
-# (AT YOUR OPTION) ANY LATER VERSION.
+# Copyright (C) 2007-2013 EDF R&D
#
-# THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
-# WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
-# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
-# GENERAL PUBLIC LICENSE FOR MORE DETAILS.
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
-# YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
-# ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
-# 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
-#
-#
-# ======================================================================
-"""
+"""
Ce module contient la classe MCSIMP qui sert à controler la valeur
d'un mot-clé simple par rapport à sa définition portée par un objet
de type ENTITE
"""
-import types
from copy import copy
-from Noyau.N_ASSD import ASSD,assd
+from Noyau.N_ASSD import ASSD
from Noyau.N_CO import CO
import N_OBJECT
+from N_CONVERT import ConversionFactory
+from N_types import force_list, is_sequence
class MCSIMP(N_OBJECT.OBJECT):
"""
self.nom=nom
self.val = val
self.parent = parent
+ self.convProto = ConversionFactory('type', typ=self.definition.type)
self.valeur = self.GETVAL(self.val)
if parent :
self.jdc = self.parent.jdc
self.jdc = None
self.niveau = None
self.etape = None
-
+
def GETVAL(self,val):
- """
+ """
Retourne la valeur effective du mot-clé en fonction
de la valeur donnée. Defaut si val == None
"""
if (val is None and hasattr(self.definition,'defaut')) :
- return self.definition.defaut
- else:
- return val
+ val = self.definition.defaut
+ if self.convProto:
+ val = self.convProto.convert(val)
+ return val
def get_valeur(self):
"""
Retourne la "valeur" d'un mot-clé simple.
- Cette valeur est utilisée lors de la création d'un contexte
+ Cette valeur est utilisée lors de la création d'un contexte
d'évaluation d'expressions à l'aide d'un interpréteur Python
"""
- return self.valeur
+ v = self.valeur
+ # Si singleton et max=1, on retourne la valeur.
+ # Si une valeur simple et max='**', on retourne un singleton.
+ # (si liste de longueur > 1 et max=1, on sera arrêté plus tard)
+ # Pour accepter les numpy.array, on remplace : "type(v) not in (list, tuple)"
+ # par "not has_attr(v, '__iter__')".
+ if v is None:
+ pass
+ elif is_sequence(v) and len(v) == 1 and self.definition.max == 1:
+ v = v[0]
+ elif not is_sequence(v) and self.definition.max != 1:
+ v = (v, )
+ # traitement particulier pour les complexes ('RI', r, i)
+ if 'C' in self.definition.type and self.definition.max != 1 \
+ and v[0] in ('RI', 'MP'):
+ v = (v, )
+ return v
def get_val(self):
"""
objet = self.makeobjet()
# il faut copier les listes et les tuples mais pas les autres valeurs
# possibles (réel,SD,...)
- if type(self.valeur) in (types.ListType,types.TupleType):
+ if type(self.valeur) in (list, tuple):
objet.valeur = copy(self.valeur)
else:
objet.valeur = self.valeur
self.etape=parent.etape
def get_sd_utilisees(self):
- """
+ """
Retourne une liste qui contient la ou les SD utilisée par self si c'est le cas
ou alors une liste vide
"""
l=[]
- if type(self.valeur) == types.InstanceType:
- #XXX Est ce différent de isinstance(self.valeur,ASSD) ??
- if issubclass(self.valeur.__class__,ASSD) : l.append(self.valeur)
- elif type(self.valeur) in (types.TupleType,types.ListType):
+ if isinstance(self.valeur, ASSD):
+ l.append(self.valeur)
+ elif type(self.valeur) in (list, tuple):
for val in self.valeur :
- if type(val) == types.InstanceType:
- if issubclass(val.__class__,ASSD) : l.append(val)
+ if isinstance(val, ASSD):
+ l.append(val)
return l
def get_sd_mcs_utilisees(self):
- """
+ """
Retourne la ou les SD utilisée par self sous forme d'un dictionnaire :
- . Si aucune sd n'est utilisée, le dictionnaire est vide.
- . Sinon, la clé du dictionnaire est le mot-clé simple ; la valeur est
- la liste des sd attenante.
- Exemple : { 'VALE_F': [ <Cata.cata.para_sensi instance at 0x9419854>,
- <Cata.cata.para_sensi instance at 0x941a204> ] }
+ - Si aucune sd n'est utilisée, le dictionnaire est vide.
+ - Sinon, la clé du dictionnaire est le mot-clé simple ; la valeur est
+ la liste des sd attenante.
+
+ Exemple ::
+ { 'VALE_F': [ <Cata.cata.fonction_sdaster instance at 0x9419854>,
+ <Cata.cata.fonction_sdaster instance at 0x941a204> ] }
"""
l=self.get_sd_utilisees()
dico = {}
Cette methode retourne l'objet MCSIMP self s'il a le concept co
comme valeur.
"""
- lval=self.valeur
- if type(self.valeur) not in (types.TupleType,types.ListType):
- lval=(self.valeur,)
- if co in lval:return [self,]
+ if co in force_list(self.valeur):
+ return [self,]
return []
def get_all_co(self):
Cette methode retourne la liste de tous les concepts co
associés au mot cle simple
"""
- lval=self.valeur
- if type(self.valeur) not in (types.TupleType,types.ListType):
- lval=(self.valeur,)
- l=[]
- for c in lval:
- if isinstance(c,CO) or hasattr(c,"_etape"):l.append(c)
- return l
+ return [co for co in force_list(self.valeur) \
+ if isinstance(co, CO) and co.is_typco()]