Salome HOME
bug de CBChecked a True
[tools/eficas.git] / InterfaceQT4 / composimp.py
1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2013   EDF R&D
3 #
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.
8 #
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.
13 #
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
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 # Modules Python
21 import string,types,os
22
23 from copy import copy,deepcopy
24 import traceback
25 import typeNode
26
27 # Modules Eficas
28 from Editeur import Objecttreeitem
29 import browser
30 from Noyau.N_CR   import justify_text
31 from Accas        import SalomeEntry
32     
33 class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):    
34
35     def createPopUpMenu(self):
36         typeNode.PopUpMenuNodeMinimal.createPopUpMenu(self)
37
38
39     def getPanelGroupe(self,parentQt,maCommande):
40         maDefinition=self.item.get_definition()
41         monObjet=self.item.object
42         monNom=self.item.nom
43
44         # label informatif 
45         if monObjet.isInformation():
46           from monWidgetInfo import MonWidgetInfo
47           widget=MonWidgetInfo(self,maDefinition,monNom,monObjet,parentQt,maCommande)
48           self.widget=widget
49           return widget
50
51
52       # Attention l ordre des if est important
53       # Attention il faut gerer les blocs et les facteurs 
54       # a gerer comme dans composimp
55       # Gestion des matrices
56         if self.item.wait_matrice ():
57           from monWidgetMatrice import MonWidgetMatrice
58           widget=MonWidgetMatrice(self,maDefinition,monNom,monObjet,parentQt,maCommande)
59           self.widget=widget
60           return widget
61
62         #print "____________________________", monNom, self.item.wait_co() 
63         #print "____________________________", monNom, self.item.wait_assd() 
64         # Gestion d'une seule valeur (eventuellement un tuple ou un complexe)
65         if maDefinition.max == 1 :
66
67         # A verifier
68           if maDefinition.into != [] and maDefinition.into != None:
69             if len(maDefinition.into) < 4 :
70               from monWidgetRadioButton import MonWidgetRadioButton
71               widget=MonWidgetRadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
72             elif len(maDefinition.into) < 7 :
73               from monWidget4a6RadioButton import MonWidget4a6RadioButton
74               widget=MonWidget4a6RadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
75             else :
76               from monWidgetCB import MonWidgetCB
77               widget=MonWidgetCB(self,maDefinition,monNom,monObjet,parentQt,maCommande)
78
79           elif self.item.wait_bool() :
80             from monWidgetSimpBool import MonWidgetSimpBool
81             widget=MonWidgetSimpBool(self,maDefinition,monNom,monObjet,parentQt,maCommande)
82           elif self.item.wait_fichier():
83             from monWidgetSimpFichier import MonWidgetSimpFichier
84             widget=MonWidgetSimpFichier(self,maDefinition,monNom,monObjet,parentQt,maCommande)
85
86           # PNPNPN - a faire
87           elif self.item.wait_date():
88             from monWidgetDate import MonWidgetDate
89             widget=MonWidgetDate(self,maDefinition,monNom,monObjet,parentQt,maCommande)
90           elif self.item.wait_heure():
91             from monWidgetHeure import MonWidgetHeure
92             widget=MonWidgetHeure(self,maDefinition,monNom,monObjet,parentQt,maCommande)
93
94           elif self.item.wait_tuple() :
95             if self.item.object.definition.type[0].ntuple == 2:
96                from monWidgetSimpTuple2 import MonWidgetSimpTuple2
97                widget=MonWidgetSimpTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
98             elif self.item.object.definition.type[0].ntuple == 3 :
99                from monWidgetSimpTuple3 import MonWidgetSimpTuple3
100                widget=MonWidgetSimpTuple3(self,maDefinition,monNom,monObjet,parentQt,maCommande)
101             else :
102                print "Pas de Tuple de longueur > 3"
103                print "Prevenir la maintenance "
104
105           elif self.item.wait_complex():
106             from monWidgetSimpComplexe import MonWidgetSimpComplexe
107             widget=MonWidgetSimpComplexe(self,maDefinition,monNom,monObjet,parentQt,maCommande)
108
109           elif self.item.wait_co():
110             if len(self.item.get_sd_avant_du_bon_type()) == 0 :
111                from monWidgetUniqueSDCO import MonWidgetUniqueSDCO
112                widget=MonWidgetUniqueSDCO(self,maDefinition,monNom,monObjet,parentQt,maCommande)
113             else :      
114                from monWidgetSDCOInto import MonWidgetSDCOInto
115                widget=MonWidgetSDCOInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
116           elif self.item.wait_assd():
117             if len(self.item.get_sd_avant_du_bon_type()) == 0 :
118                from monWidgetVide import MonWidgetVide
119                widget=MonWidgetVide(self,maDefinition,monNom,monObjet,parentQt,maCommande)
120             if len(self.item.get_sd_avant_du_bon_type()) < 4 :
121               from monWidgetRadioButton import MonWidgetRadioButtonSD
122               widget=MonWidgetRadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
123             elif len(self.item.get_sd_avant_du_bon_type()) < 7 :
124               from monWidget4a6RadioButton import MonWidget4a6RadioButtonSD
125               widget=MonWidget4a6RadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
126             else :
127               from monWidgetCB import MonWidgetCBSD
128               widget=MonWidgetCBSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
129           
130           elif  self.item.wait_Salome() and self.editor.salome:
131           # Pas fait
132             from monWidgetSimpSalome import MonWidgetSimpSalome
133             widget=MonWidgetSimpSalome(self,maDefinition,monNom,monObjet,parentQt,maCommande)
134
135           elif self.item.wait_TXM():
136             from monWidgetSimpTxt import MonWidgetSimpTxt
137             widget=MonWidgetSimpTxt(self,maDefinition,monNom,monObjet,parentQt,maCommande)
138           else :
139             from monWidgetSimpBase import MonWidgetSimpBase
140             widget=MonWidgetSimpBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
141
142         # Gestion des listes
143         else :
144           #if maDefinition.into != [] and maDefinition.into != None:
145           # Attention pas fini --> on attend une liste de ASSD avec ordre
146           if self.item.wait_assd() and self.item.is_list_SansOrdreNiDoublon():
147                #if self.item.is_list_Chargement():
148                 #from monWidgetPlusieursTuple2AvecChargement import MonWidgetPlusieursTuple2AvecChargement
149                 #widget=MonWidgetPlusieursTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
150                 # pass
151                #else :
152                from monWidgetPlusieursInto import MonWidgetPlusieursInto
153                widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
154           elif self.item.wait_assd() :
155                from monWidgetPlusieursASSDIntoOrdonne import MonWidgetPlusieursASSDIntoOrdonne
156                widget=MonWidgetPlusieursASSDIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
157           elif self.item.wait_tuple() :
158             if self.item.object.definition.type[0].ntuple == 2:
159                from monWidgetPlusieursTuple2 import MonWidgetPlusieursTuple2
160                widget=MonWidgetPlusieursTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
161             elif self.item.object.definition.type[0].ntuple == 3 :
162                from monWidgetPlusieursTuple3 import MonWidgetPlusieursTuple3
163                widget=MonWidgetPlusieursTuple3(self,maDefinition,monNom,monObjet,parentQt,maCommande)
164             else :
165                print "Pas de Tuple de longueur > 3"
166                print "Prevenir la maintenance "
167           elif self.item.has_into():
168             if self.item.is_list_SansOrdreNiDoublon():
169                #print (self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees)  )
170                #print ( not(self.editor.afficheListesPliees)  )
171                #print (self.editor.afficheListesPliees)  
172                
173                if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees) : 
174                   from monWidgetPlusieursInto import MonWidgetPlusieursInto
175                   widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
176                else :
177                   from monWidgetPlusieursPlie import MonWidgetPlusieursPlie
178                   widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
179             else :
180 # tres vite pour le tag mais devra etre gere dans configuration
181                if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees) : 
182                   from monWidgetPlusieursIntoOrdonne import MonWidgetPlusieursIntoOrdonne
183                   widget=MonWidgetPlusieursIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
184                else :
185                   from monWidgetPlusieursPlie import MonWidgetPlusieursPlie
186                   widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
187           else :
188             #print 8
189             if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees)  : 
190                from monWidgetPlusieursBase import MonWidgetPlusieursBase
191                widget=MonWidgetPlusieursBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
192             else :
193                from monWidgetPlusieursPlie import MonWidgetPlusieursPlie
194                widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
195
196         self.widget=widget
197         return widget
198          
199     
200 class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
201   itemNode=Node
202
203   def init(self) :
204       self.expandable = 0
205   
206
207   #-----------------------------------------------
208   #
209   # Methodes liees aux informations sur le Panel
210   # ou au mot-clef simple
211   #
212   #-----------------------------------------------
213   # is_list
214   # get_into                a priori inutile --> commentee
215   # has_into
216   # wait_into                a priori inutile --> commentee
217   # GetMinMax
218   # GetMultiplicite
219   # GetIntervalle
220   # GetListeValeurs
221   # get_liste_possible
222
223   def is_list(self):
224       """
225           Cette methode indique si le mot cle simple attend une liste (valeur de retour 1)
226           ou s'il n'en attend pas (valeur de retour 0)
227
228           Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
229           Dans le cas sans validateur, l'information est donnee par l'attribut max
230           de la definition du mot cle.
231           Dans le cas avec validateur, il faut combiner l'information precedente avec
232           celle issue de l'appel de la methode is_list sur le validateur.On utilisera
233           l'operateur ET pour effectuer cette combinaison (AndVal).
234       """
235       is_a_list=0
236       min,max = self.GetMinMax()
237       assert (min <= max)
238       if max > 1 :
239                 is_a_list=1
240       # Dans le cas avec validateurs, pour que le mot cle soit considere
241       # comme acceptant une liste, il faut que max soit superieur a 1
242       # ET que la methode is_list du validateur retourne 1. Dans les autres cas
243       # on retournera 0 (n'attend pas de liste)
244       if self.definition.validators :
245          is_a_list= self.definition.validators.is_list() * is_a_list
246       return is_a_list 
247
248   def is_list_SansOrdreNiDoublon(self):
249       if self.definition.homo=="SansOrdreNiDoublon" : return 1
250       return 0 
251
252   def is_list_Chargement(self):
253       if  self.definition.docu != "" :  return 1
254       return 0 
255
256   def has_into(self):
257       """
258           Cette methode indique si le mot cle simple propose un choix (valeur de retour 1)
259           ou s'il n'en propose pas (valeur de retour 0)
260
261           Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
262           Dans le cas sans validateur, l'information est donnee par l'attribut into
263           de la definition du mot cle.
264           Dans le cas avec validateurs, pour que le mot cle soit considere
265           comme proposant un choix, il faut que into soit present OU
266           que la methode has_into du validateur retourne 1. Dans les autres cas
267           on retournera 0 (ne propose pas de choix)
268       """
269       has_an_into=0
270       if self.definition.into:
271                has_an_into=1
272       elif self.definition.validators :
273          has_an_into= self.definition.validators.has_into()
274       return has_an_into
275
276
277   def GetMinMax(self):
278       """ Retourne les valeurs min et max de la definition de object """
279       return self.object.get_min_max()
280
281   def GetMultiplicite(self):
282       """ A preciser.
283           Retourne la multiplicite des valeurs affectees a l'objet
284           represente par l'item. Pour le moment retourne invariablement 1.
285       """
286       return 1
287
288   def GetIntervalle(self):
289       """ 
290            Retourne le domaine de valeur attendu par l'objet represente 
291            par l'item.
292       """
293       return self.object.getintervalle()
294
295   def GetListeValeurs(self) :
296       """ Retourne la liste des valeurs de object """
297       valeurs=self.object.get_liste_valeurs()
298       try :
299         if "R" in self.object.definition.type:
300            clef=self.object.GetNomConcept()
301            if self.appli.dict_reels.has_key(clef):
302               if type(valeurs) == types.TupleType:
303                  valeurs_reelles=[]
304                  for val in valeurs :
305                     if self.appli.dict_reels[clef].has_key(val) : 
306                        valeurs_reelles.append(self.appli.dict_reels[clef][val])
307                     else :
308                        valeurs_reelles.append(val)
309               else :
310                  if self.appli.dict_reels[clef].has_key(valeurs):
311                     valeurs_reelles=self.appli.dict_reels[clef][valeurs]
312               valeurs=valeurs_reelles
313       except :
314         pass
315       return valeurs
316     
317   def get_liste_possible(self,listeActuelle=[]):
318       if hasattr(self.definition.validators,'into'):
319          valeurspossibles = self.definition.validators.into 
320       else:
321          valeurspossibles = self.get_definition().into
322
323       if listeActuelle==[] : return valeurspossibles
324
325       #On ne garde que les items valides
326       listevalideitem=[]
327       if type(valeurspossibles) in (types.ListType,types.TupleType) :
328          pass
329       else :
330          valeurspossibles=(valeurspossibles,)
331       for item in valeurspossibles:
332           encorevalide=self.valide_item(item)
333           if encorevalide :
334              listevalideitem.append(item)
335
336       #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
337       listevalideliste=[]
338       for item in listevalideitem:
339           encorevalide=self.valide_liste_partielle(item,listeActuelle)
340           if encorevalide :
341               listevalideliste.append(item)
342       #print listevalideliste
343       return listevalideliste
344
345   def get_liste_param_possible(self):
346       liste_param=[]
347       l1,l2=self.jdc.get_parametres_fonctions_avant_etape(self.get_etape())
348       for param in self.object.jdc.params:
349           if param.nom not in l1 : continue
350           encorevalide=self.valide_item(param.valeur)
351           if encorevalide:
352              type_param=param.valeur.__class__.__name__
353              for typ in self.definition.type:
354                  if typ=='R':
355                      liste_param.append(param)
356                  if typ=='I' and type_param=='int':
357                      liste_param.append(param)
358                  if typ=='TXM' and type_param=='str':
359                      liste_param.append(repr(param))
360                  if ('grma' in repr(typ)) and type_param=='str':
361                      liste_param.append(param.nom)
362       return liste_param
363
364   #--------------------------------------------------
365   #
366   # Methodes liees a la validite des valeurs saisies
367   #
368   #---------------------------------------------------
369   # valide_item
370   # valide_liste_partielle
371   # valide_liste_complete
372   # info_erreur_item
373   # info_erreur_liste
374   # IsInIntervalle
375   # isvalid
376
377   def valide_item(self,item):
378       """
379         La validation est realisee directement par l'objet
380       """
381       return self.object.valide_item(item)
382      
383   def valide_liste_partielle(self,item,listecourante):
384       #On protege la liste en entree en la copiant
385       valeur=listecourante[:]
386       valeur.append(item)
387       return self.object.valid_valeur_partielle(valeur)
388
389   def valide_liste_complete (self,valeur):
390       return self.object.valid_valeur(valeur)
391
392   def valide_val (self,valeur):
393       return self.object.valid_val(valeur)
394
395   def info_erreur_item(self) :
396       commentaire=""
397       if self.definition.validators :
398          commentaire=self.definition.validators.info_erreur_item()
399       return commentaire
400       
401   def aide(self) :
402       commentaire=""
403       if self.definition.validators :
404          commentaire=self.definition.validators.aide()
405       return commentaire
406
407   def info_erreur_liste(self) :
408       commentaire=""
409       if self.definition.validators :
410          commentaire=self.definition.validators.info_erreur_liste()
411       return commentaire
412
413   def IsInIntervalle(self,valeur):
414       """ 
415           Retourne 1 si la valeur est dans l'intervalle permis par
416           l'objet represente par l'item.
417       """
418       return self.valide_item(valeur)
419
420   def isvalid(self):
421     valide=self.object.isvalid()
422     return valide
423
424   #--------------------------------------------------
425   #
426   # Autres ...
427   #
428   #---------------------------------------------------
429   # GetIconName
430   # GetText
431   # set_valeur_co
432   # get_sd_avant_du_bon_type
433   # delete_valeur_co
434
435
436   def GetIconName(self):
437     if self.isvalid():
438       return "ast-green-ball"
439     elif self.object.isoblig():
440       return "ast-red-ball"
441     else:
442       return "ast-yel-ball"
443
444   def GetText(self):
445     """
446     Classe SIMPTreeItem
447     Retourne le texte a afficher dans l'arbre representant la valeur de l'objet
448     pointe par self 
449     """
450     text= self.object.GetText()
451     if text == None : text=""
452     return text
453     
454
455   def set_valeur_co(self,nom_co):
456       """
457       Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
458       """
459       ret = self.object.set_valeur_co(nom_co)
460       #print "set_valeur_co",ret
461       return ret
462       
463   def get_sd_avant_du_bon_type(self):
464       """
465       Retourne la liste des noms des SD présentes avant l'étape qui contient
466       le MCS pointé par self et du type requis par ce MCS
467       """
468       a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
469       return a
470
471   def get_sd_avant_du_bon_type_pour_type_de_base(self):
472       a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
473       return a
474
475
476
477
478   def delete_valeur_co(self,valeur=None):
479       """
480            Supprime la valeur du mot cle (de type CO)
481            il faut propager la destruction aux autres etapes
482       """
483       if not valeur : valeur=self.object.valeur
484       # XXX faut il vraiment appeler del_sdprod ???
485       #self.object.etape.parent.del_sdprod(valeur)
486       self.object.etape.parent.delete_concept(valeur)
487
488   #-----------------------------------------------
489   #
490   # Methodes liees au type de l objet attendu
491   #
492   #-----------------------------------------------
493   # wait_co 
494   # wait_geom
495   # wait_complex
496   # wait_reel
497   # wait_assd
498   # GetType
499
500   def wait_co(self):
501       """
502       Méthode booléenne qui retourne 1 si l'objet pointé par self
503       attend un objet de type ASSD qui n'existe pas encore (type CO()),
504       0 sinon
505       """
506       return self.object.wait_co()
507
508   def wait_fichier(self):
509       maDefinition=self.object.definition
510       try : 
511         if ('Repertoire' in maDefinition.type[0]) or ('Fichier' in maDefinition.type[0]) :
512            return 1
513       except :
514            return 0
515
516   def wait_geom(self):
517       """
518       Méthode booléenne qui retourne 1 si l'objet pointé par self
519       attend un objet GEOM, 0 sinon
520       """
521       return self.object.wait_geom()
522
523   def wait_TXM(self):
524      return self.object.wait_TXM()
525
526     
527   def wait_complex(self):
528       """ Méthode booléenne qui retourne 1 si l'objet pointé par self
529       attend un complexe, 0 sinon """
530       if 'C' in self.object.definition.type:
531           return 1
532       else:
533           return 0
534
535   def wait_reel(self):
536       """ Méthode booléenne qui retourne 1 si l'objet pointé par self
537       attend un réel, 0 sinon """
538       if 'R' in self.object.definition.type:
539           return 1
540       else:
541           return 0
542
543   def wait_date(self):
544       """ Méthode booléenne qui retourne 1 si l'objet pointé par self
545       attend un réel, 0 sinon """
546       if 'DateHHMMAAAA' in self.object.definition.type:
547           return 1
548       else:
549           return 0
550         
551   def wait_heure(self):
552       """ Méthode booléenne qui retourne 1 si l'objet pointé par self
553       attend un réel, 0 sinon """
554       if 'HeureHHMMSS' in self.object.definition.type:
555           return 1
556       else:
557           return 0
558         
559         
560         
561   def wait_tuple(self):
562       """ Méthode booléenne qui retourne 1 si l'objet pointé par self
563       attend un Tuple, 0 sinon """
564       for ss_type in self.object.definition.type:
565           if repr(ss_type).find('Tuple') != -1 :
566              return 1
567       return 0
568
569   def wait_matrice(self):
570       """ Méthode booléenne qui retourne 1 si l'objet pointé par self
571       attend un Tuple, 0 sinon """
572       for ss_type in self.object.definition.type:
573           if repr(ss_type).find('Matrice') != -1 :
574              return 1
575       return 0
576
577   def wait_assd(self):
578       """Méthode booléenne qui retourne 1 si l'objet pointé par self
579       attend un objet de type ASSD ou dérivé, 0 sinon """
580       return self.object.wait_assd()
581     
582   def wait_assd_or_type_base(self) :
583       boo=0
584       if len(self.object.definition.type) > 1 :
585          if self.wait_reel() :
586             boo = 1
587          if 'I' in self.object.definition.type :
588             boo = 1
589       return boo
590
591   def wait_Salome(self):
592       type = self.object.definition.type[0]
593       if 'grma' in repr(type) : return True
594       if 'grno' in repr(type) : return True
595       if (isinstance(type, types.ClassType) and issubclass(type, SalomeEntry)) : return True
596       return False
597    
598   def GetType(self):
599       """ 
600           Retourne le type de valeur attendu par l'objet représenté par l'item.
601       """
602       return self.object.get_type()
603
604   #-----------------------------------------------------
605   #
606   # Methodes liees  a l evaluation de la valeur saisie
607   #
608   #-----------------------------------------------------
609   # eval_valeur
610   # eval_valeur_item
611   # is_CO
612   # traite_reel
613
614   def eval_valeur(self,valeur):
615       """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur de self :
616              - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
617              - retourne 'valeur' (chaine de caractéres) sinon
618       """
619       newvaleur=self.eval_val(valeur)
620       return newvaleur,1
621
622   def eval_valeur_BAK(self,valeur):
623       """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur
624       de l'objet pointé par self :
625         - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
626         - retourne 'valeur' (chaine de caractéres) sinon
627         - retourne None en cas d invalidite
628         - retourne invalide si 1 des objets du tuple l est
629       """
630       validite=1
631       if type(valeur) in (types.ListType,types.TupleType) :
632          valeurretour=[]
633          for item in valeur :
634              newvaleur,validiteitem=self.eval_valeur_item(item)
635              valeurretour.append(newvaleur)
636              if validiteitem == 0:
637                 validite=0
638       else :
639          valeurretour,validite= self.eval_valeur_item(valeur)
640       if validite == 0 :
641          valeurretour = None
642       return valeurretour,validite
643
644   def eval_valeur_item(self,valeur):
645       """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple 
646           - va retourner la valeur de retour et la validite
647             selon le type de l objet attendu
648           - traite les reels et les parametres 
649       """ 
650       #print "eval_valeur_item",valeur
651       if valeur==None or valeur == "" :
652          return None,0
653       validite=1
654       if self.wait_reel():
655              valeurinter = self.traite_reel(valeur)
656              if valeurinter != None :
657                 valeurretour,validite= self.object.eval_valeur(valeurinter)
658              else:
659                 valeurretour,validite= self.object.eval_valeur(valeur)
660       elif self.wait_geom():
661              valeurretour,validite = valeur,1
662       else :
663              valeurretour,validite= self.object.eval_valeur(valeur)
664       #print "eval_valeur_item",valeurretour,validite
665
666       if validite == 0:
667          if type(valeur) == types.StringType and self.object.wait_TXM():
668             essai_valeur="'" + valeur + "'"
669             valeurretour,validite= self.object.eval_valeur(essai_valeur)
670
671       if hasattr(valeurretour,'__class__'):
672          #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
673          if valeurretour.__class__.__name__ in ('PARAMETRE',):
674             validite=1
675
676       #if self.wait_co():
677          # CCAR : il ne faut pas essayer de creer un concept
678          # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
679          #try:
680             #valeurretour=Accas.CO(valeur)
681          #except:
682             #valeurretour=None
683             #validite=0
684       # on est dans le cas ou on a évalué et ou on n'aurait pas du
685       if self.object.wait_TXM() :
686           if type(valeurretour) != types.StringType:
687              valeurretour=str(valeur)
688              validite=1
689       return valeurretour,validite
690       
691   def is_CO(self,valeur=None):
692       """
693          Indique si valeur est un concept produit de la macro
694          Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
695          Si valeur vaut None on teste la valeur du mot cle
696       """
697       # Pour savoir si un concept est un nouveau concept de macro
698       # on regarde s'il est présent dans l'attribut sdprods de l'étape
699       # ou si son nom de classe est CO.
700       # Il faut faire les 2 tests car une macro non valide peut etre
701       # dans un etat pas tres catholique avec des CO pas encore types
702       # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
703       if not valeur:valeur=self.object.valeur
704       if valeur in self.object.etape.sdprods:return 1
705       if type(valeur) is not types.InstanceType:return 0
706       if valeur.__class__.__name__ == 'CO':return 1
707       return 0
708
709   def is_param(self,valeur) :
710       for param in self.jdc.params:
711           if (repr(param) == valeur):
712              return 1
713       return 0
714
715   def traite_reel(self,valeur):
716       """
717       Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
718       ou de détecter si on fait référence a un concept produit par DEFI_VALEUR
719       ou un EVAL ...
720       """
721       valeur = string.strip(valeur)
722       liste_reels = self.get_sd_avant_du_bon_type()
723       if valeur in liste_reels:
724           return valeur
725       if len(valeur) >= 3 :
726           if valeur[0:4] == 'EVAL' :
727               # on a trouvé un EVAL --> on retourne directement la valeur
728               return valeur
729       if string.find(valeur,'.') == -1 :
730           # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
731           if (self.is_param(valeur)):
732               return valeur
733           else:
734               if string.find(valeur,'e') != -1:
735                  # Notation scientifique ?
736                  try :
737                     r=eval(valeur)
738                     return valeur
739                  except :
740                     return None
741               else :
742                  return valeur+'.'
743       else:
744           return valeur
745         
746
747 import Accas
748 treeitem = SIMPTreeItem
749 objet = Accas.MCSIMP
750