1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2013 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
21 from __future__ import absolute_import
22 from __future__ import print_function
24 from builtins import str
29 from copy import copy,deepcopy
31 from . import typeNode
34 from Editeur import Objecttreeitem
36 from Noyau.N_CR import justify_text
37 from Accas import SalomeEntry
39 class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):
41 def createPopUpMenu(self):
42 typeNode.PopUpMenuNodeMinimal.createPopUpMenu(self)
45 def getPanelGroupe(self,parentQt,maCommande):
46 maDefinition=self.item.get_definition()
47 monObjet=self.item.object
51 if monObjet.isInformation():
52 from .monWidgetInfo import MonWidgetInfo
53 widget=MonWidgetInfo(self,maDefinition,monNom,monObjet,parentQt,maCommande)
58 # Attention l ordre des if est important
59 # Attention il faut gerer les blocs et les facteurs
60 # a gerer comme dans composimp
61 # Gestion des matrices
62 if self.item.wait_matrice ():
63 from .monWidgetMatrice import MonWidgetMatrice
64 widget=MonWidgetMatrice(self,maDefinition,monNom,monObjet,parentQt,maCommande)
68 #print "____________________________", monNom, self.item.wait_co()
69 #print "____________________________", monNom, self.item.wait_assd()
70 # Gestion d'une seule valeur (eventuellement un tuple ou un complexe)
71 if maDefinition.into != [] and maDefinition.into != None:
72 if type(maDefinition.into) ==types.FunctionType : monInto=maDefinition.into()
73 else : monInto = maDefinition.into
76 if maDefinition.max == 1 :
79 if maDefinition.into != [] and maDefinition.into != None:
81 from .monWidgetRadioButton import MonWidgetRadioButton
82 widget=MonWidgetRadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
83 elif len(monInto) < 7 :
84 from .monWidget4a6RadioButton import MonWidget4a6RadioButton
85 widget=MonWidget4a6RadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
87 from .monWidgetCB import MonWidgetCB
88 widget=MonWidgetCB(self,maDefinition,monNom,monObjet,parentQt,maCommande)
90 elif self.item.wait_bool() :
91 from .monWidgetSimpBool import MonWidgetSimpBool
92 widget=MonWidgetSimpBool(self,maDefinition,monNom,monObjet,parentQt,maCommande)
93 elif self.item.wait_fichier():
94 from .monWidgetSimpFichier import MonWidgetSimpFichier
95 widget=MonWidgetSimpFichier(self,maDefinition,monNom,monObjet,parentQt,maCommande)
98 elif self.item.wait_date():
99 from .monWidgetDate import MonWidgetDate
100 widget=MonWidgetDate(self,maDefinition,monNom,monObjet,parentQt,maCommande)
101 elif self.item.wait_heure():
102 from .monWidgetHeure import MonWidgetHeure
103 widget=MonWidgetHeure(self,maDefinition,monNom,monObjet,parentQt,maCommande)
105 elif self.item.wait_tuple() :
106 if self.item.object.definition.type[0].ntuple == 2:
107 from .monWidgetSimpTuple2 import MonWidgetSimpTuple2
108 widget=MonWidgetSimpTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
109 elif self.item.object.definition.type[0].ntuple == 3 :
110 from .monWidgetSimpTuple3 import MonWidgetSimpTuple3
111 widget=MonWidgetSimpTuple3(self,maDefinition,monNom,monObjet,parentQt,maCommande)
113 print ("Pas de Tuple de longueur > 3")
114 print ("Prevenir la maintenance ")
116 elif self.item.wait_complex():
117 from .monWidgetSimpComplexe import MonWidgetSimpComplexe
118 widget=MonWidgetSimpComplexe(self,maDefinition,monNom,monObjet,parentQt,maCommande)
120 elif self.item.wait_co():
121 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
122 from .monWidgetUniqueSDCO import MonWidgetUniqueSDCO
123 widget=MonWidgetUniqueSDCO(self,maDefinition,monNom,monObjet,parentQt,maCommande)
125 from .monWidgetSDCOInto import MonWidgetSDCOInto
126 widget=MonWidgetSDCOInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
127 elif self.item.wait_assd():
128 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
129 from .monWidgetVide import MonWidgetVide
130 widget=MonWidgetVide(self,maDefinition,monNom,monObjet,parentQt,maCommande)
131 elif len(self.item.get_sd_avant_du_bon_type()) < 4 :
132 from .monWidgetRadioButton import MonWidgetRadioButtonSD
133 widget=MonWidgetRadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
134 elif len(self.item.get_sd_avant_du_bon_type()) < 7 :
135 from .monWidget4a6RadioButton import MonWidget4a6RadioButtonSD
136 widget=MonWidget4a6RadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
138 from .monWidgetCB import MonWidgetCBSD
139 widget=MonWidgetCBSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
141 elif self.item.wait_Salome() and self.editor.salome:
142 from .monWidgetSimpSalome import MonWidgetSimpSalome
143 widget=MonWidgetSimpSalome(self,maDefinition,monNom,monObjet,parentQt,maCommande)
145 elif self.item.wait_TXM():
146 from .monWidgetSimpTxt import MonWidgetSimpTxt
147 widget=MonWidgetSimpTxt(self,maDefinition,monNom,monObjet,parentQt,maCommande)
149 from .monWidgetSimpBase import MonWidgetSimpBase
150 widget=MonWidgetSimpBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
154 #if maDefinition.into != [] and maDefinition.into != None:
155 # Attention pas fini --> on attend une liste de ASSD avec ordre
156 if self.item.wait_assd() and self.item.is_list_SansOrdreNiDoublon():
157 #if self.item.is_list_Chargement():
158 #from monWidgetPlusieursTuple2AvecChargement import MonWidgetPlusieursTuple2AvecChargement
159 #widget=MonWidgetPlusieursTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
162 listeAAfficher = self.item.get_sd_avant_du_bon_type()
163 if len(listeAAfficher) == 0:
164 from .monWidgetVide import MonWidgetVide
165 widget = MonWidgetVide(self,maDefinition,monNom,monObjet,parentQt,maCommande)
167 from .monWidgetPlusieursInto import MonWidgetPlusieursInto
168 widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
169 elif self.item.wait_assd() :
170 listeAAfficher = self.item.get_sd_avant_du_bon_type()
171 if len(listeAAfficher) == 0:
172 from .monWidgetVide import MonWidgetVide
173 widget = MonWidgetVide(self,maDefinition,monNom,monObjet,parentQt,maCommande)
175 from .monWidgetPlusieursASSDIntoOrdonne import MonWidgetPlusieursASSDIntoOrdonne
176 widget=MonWidgetPlusieursASSDIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
177 elif self.item.wait_tuple() :
178 if self.item.object.definition.type[0].ntuple == 2:
179 from .monWidgetPlusieursTuple2 import MonWidgetPlusieursTuple2
180 widget=MonWidgetPlusieursTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
181 elif self.item.object.definition.type[0].ntuple == 3 :
182 from .monWidgetPlusieursTuple3 import MonWidgetPlusieursTuple3
183 widget=MonWidgetPlusieursTuple3(self,maDefinition,monNom,monObjet,parentQt,maCommande)
185 print ("Pas de Tuple de longueur > 3")
186 print ("Prevenir la maintenance ")
187 elif self.item.has_into():
188 if self.item.is_list_SansOrdreNiDoublon():
190 if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees) :
191 from .monWidgetPlusieursInto import MonWidgetPlusieursInto
192 widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
194 from .monWidgetPlusieursPlie import MonWidgetPlusieursPlie
195 widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
197 # tres vite pour le tag mais devra etre gere dans configuration
198 if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees) :
199 from .monWidgetPlusieursIntoOrdonne import MonWidgetPlusieursIntoOrdonne
200 widget=MonWidgetPlusieursIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
202 from .monWidgetPlusieursPlie import MonWidgetPlusieursPlie
203 widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
206 if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees) :
207 from .monWidgetPlusieursBase import MonWidgetPlusieursBase
208 widget=MonWidgetPlusieursBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
210 from .monWidgetPlusieursPlie import MonWidgetPlusieursPlie
211 widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
217 class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
224 #-----------------------------------------------
226 # Methodes liees aux informations sur le Panel
227 # ou au mot-clef simple
229 #-----------------------------------------------
231 # get_into a priori inutile --> commentee
233 # wait_into a priori inutile --> commentee
242 Cette methode indique si le mot cle simple attend une liste (valeur de retour 1)
243 ou s'il n'en attend pas (valeur de retour 0)
245 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
246 Dans le cas sans validateur, l'information est donnee par l'attribut max
247 de la definition du mot cle.
248 Dans le cas avec validateur, il faut combiner l'information precedente avec
249 celle issue de l'appel de la methode is_list sur le validateur.On utilisera
250 l'operateur ET pour effectuer cette combinaison (AndVal).
253 min,max = self.GetMinMax()
257 # Dans le cas avec validateurs, pour que le mot cle soit considere
258 # comme acceptant une liste, il faut que max soit superieur a 1
259 # ET que la methode is_list du validateur retourne 1. Dans les autres cas
260 # on retournera 0 (n'attend pas de liste)
261 if self.definition.validators :
262 is_a_list= self.definition.validators.is_list() * is_a_list
265 def is_list_SansOrdreNiDoublon(self):
266 if self.definition.homo=="SansOrdreNiDoublon" : return 1
269 def is_list_Chargement(self):
270 if self.definition.docu != "" : return 1
275 Cette methode indique si le mot cle simple propose un choix (valeur de retour 1)
276 ou s'il n'en propose pas (valeur de retour 0)
278 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
279 Dans le cas sans validateur, l'information est donnee par l'attribut into
280 de la definition du mot cle.
281 Dans le cas avec validateurs, pour que le mot cle soit considere
282 comme proposant un choix, il faut que into soit present OU
283 que la methode has_into du validateur retourne 1. Dans les autres cas
284 on retournera 0 (ne propose pas de choix)
287 if self.definition.into:
289 elif self.definition.validators :
290 has_an_into= self.definition.validators.has_into()
295 """ Retourne les valeurs min et max de la definition de object """
296 return self.object.get_min_max()
298 def GetMultiplicite(self):
300 Retourne la multiplicite des valeurs affectees a l'objet
301 represente par l'item. Pour le moment retourne invariablement 1.
305 def GetIntervalle(self):
307 Retourne le domaine de valeur attendu par l'objet represente
310 return self.object.getintervalle()
312 def GetListeValeurs(self) :
313 """ Retourne la liste des valeurs de object """
314 valeurs=self.object.get_liste_valeurs()
316 if "R" in self.object.definition.type:
317 clef=self.object.GetNomConcept()
318 if clef in self.appli.dict_reels:
319 if type(valeurs) == tuple:
322 if val in self.appli.dict_reels[clef]:
323 valeurs_reelles.append(self.appli.dict_reels[clef][val])
325 valeurs_reelles.append(val)
327 if valeurs in self.appli.dict_reels[clef]:
328 valeurs_reelles=self.appli.dict_reels[clef][valeurs]
329 valeurs=valeurs_reelles
334 def get_liste_possible(self,listeActuelle=[]):
335 if hasattr(self.definition.validators,'into'):
336 valeurspossibles = self.definition.validators.into
338 valeurspossibles = self.get_definition().into
340 if listeActuelle==[] : return valeurspossibles
342 #On ne garde que les items valides
344 if type(valeurspossibles) in (list,tuple) :
347 valeurspossibles=(valeurspossibles,)
348 for item in valeurspossibles:
349 encorevalide=self.valide_item(item)
351 listevalideitem.append(item)
353 #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
355 for item in listevalideitem:
356 encorevalide=self.valide_liste_partielle(item,listeActuelle)
358 listevalideliste.append(item)
359 #print listevalideliste
360 return listevalideliste
362 def get_liste_param_possible(self):
364 l1,l2=self.jdc.get_parametres_fonctions_avant_etape(self.get_etape())
365 for param in self.object.jdc.params:
366 if param.nom not in l1 : continue
367 encorevalide=self.valide_item(param.valeur)
369 type_param=param.valeur.__class__.__name__
370 for typ in self.definition.type:
372 liste_param.append(param)
373 if typ=='I' and type_param=='int':
374 liste_param.append(param)
375 if typ=='TXM' and type_param=='str':
376 liste_param.append(repr(param))
377 if ('grma' in repr(typ)) and type_param=='str':
378 liste_param.append(param.nom)
381 #--------------------------------------------------
383 # Methodes liees a la validite des valeurs saisies
385 #---------------------------------------------------
387 # valide_liste_partielle
388 # valide_liste_complete
394 def valide_item(self,item):
396 La validation est realisee directement par l'objet
398 return self.object.valide_item(item)
400 def valide_liste_partielle(self,item,listecourante):
401 #On protege la liste en entree en la copiant
402 valeur=listecourante[:]
404 return self.object.valid_valeur_partielle(valeur)
406 def valide_liste_complete (self,valeur):
407 return self.object.valid_valeur(valeur)
409 def valide_val (self,valeur):
410 return self.object.valid_val(valeur)
412 def info_erreur_item(self) :
414 if self.definition.validators :
415 commentaire=self.definition.validators.info_erreur_item()
420 if self.definition.validators :
421 commentaire=self.definition.validators.aide()
424 def info_erreur_liste(self) :
426 if self.definition.validators :
427 commentaire=self.definition.validators.info_erreur_liste()
430 def IsInIntervalle(self,valeur):
432 Retourne 1 si la valeur est dans l'intervalle permis par
433 l'objet represente par l'item.
435 return self.valide_item(valeur)
438 valide=self.object.isvalid()
441 #--------------------------------------------------
445 #---------------------------------------------------
449 # get_sd_avant_du_bon_type
453 def GetIconName(self):
455 return "ast-green-ball"
456 elif self.object.isoblig():
457 return "ast-red-ball"
459 return "ast-yel-ball"
464 Retourne le texte a afficher dans l'arbre representant la valeur de l'objet
467 text= self.object.GetText()
468 if text == None : text=""
472 def set_valeur_co(self,nom_co):
474 Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
476 ret = self.object.set_valeur_co(nom_co)
477 #print "set_valeur_co",ret
480 def get_sd_avant_du_bon_type(self):
482 Retourne la liste des noms des SD présentes avant l'étape qui contient
483 le MCS pointé par self et du type requis par ce MCS
485 a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
488 def get_sd_avant_du_bon_type_pour_type_de_base(self):
489 a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
495 def delete_valeur_co(self,valeur=None):
497 Supprime la valeur du mot cle (de type CO)
498 il faut propager la destruction aux autres etapes
500 if not valeur : valeur=self.object.valeur
501 # XXX faut il vraiment appeler del_sdprod ???
502 #self.object.etape.parent.del_sdprod(valeur)
503 self.object.etape.parent.delete_concept(valeur)
505 #-----------------------------------------------
507 # Methodes liees au type de l objet attendu
509 #-----------------------------------------------
519 Méthode booléenne qui retourne 1 si l'objet pointé par self
520 attend un objet de type ASSD qui n'existe pas encore (type CO()),
523 return self.object.wait_co()
525 def wait_fichier(self):
526 maDefinition=self.object.definition
528 if ('Repertoire' in maDefinition.type[0]) or ('Fichier' in maDefinition.type[0]) :
535 Méthode booléenne qui retourne 1 si l'objet pointé par self
536 attend un objet GEOM, 0 sinon
538 return self.object.wait_geom()
541 return self.object.wait_TXM()
544 def wait_complex(self):
545 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
546 attend un complexe, 0 sinon """
547 if 'C' in self.object.definition.type:
553 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
554 attend un réel, 0 sinon """
555 if 'R' in self.object.definition.type:
561 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
562 attend un réel, 0 sinon """
563 if 'DateHHMMAAAA' in self.object.definition.type:
568 def wait_heure(self):
569 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
570 attend un réel, 0 sinon """
571 if 'HeureHHMMSS' in self.object.definition.type:
578 def wait_tuple(self):
579 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
580 attend un Tuple, 0 sinon """
581 for ss_type in self.object.definition.type:
582 if repr(ss_type).find('Tuple') != -1 :
586 def wait_matrice(self):
587 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
588 attend un Tuple, 0 sinon """
589 for ss_type in self.object.definition.type:
590 if repr(ss_type).find('Matrice') != -1 :
595 """Méthode booléenne qui retourne 1 si l'objet pointé par self
596 attend un objet de type ASSD ou dérivé, 0 sinon """
597 return self.object.wait_assd()
599 def wait_assd_or_type_base(self) :
601 if len(self.object.definition.type) > 1 :
602 if self.wait_reel() :
604 if 'I' in self.object.definition.type :
608 def wait_Salome(self):
609 monType = self.object.definition.type[0]
610 if 'grma' in repr(monType) : return True
611 if 'grno' in repr(monType) : return True
613 if issubclass(monType, SalomeEntry) : return True
620 Retourne le type de valeur attendu par l'objet représenté par l'item.
622 return self.object.get_type()
624 #-----------------------------------------------------
626 # Methodes liees a l evaluation de la valeur saisie
628 #-----------------------------------------------------
634 def eval_valeur(self,valeur):
635 """ Lance l'interpretation de 'valeur' (chaine de caracteres) comme valeur de self :
636 - retourne l'objet associe si on a pu interpreter (entier, reel, ASSD,...)
637 - retourne 'valeur' (chaine de caracteres) sinon
639 newvaleur=self.eval_val(valeur)
642 def eval_valeur_BAK(self,valeur):
643 """ Lance l'interpretation de 'valeur' (chaine de caractéres) comme valeur
644 de l'objet pointé par self :
645 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
646 - retourne 'valeur' (chaine de caractéres) sinon
647 - retourne None en cas d invalidite
648 - retourne invalide si 1 des objets du tuple l est
651 if type(valeur) in (list,tuple) :
654 newvaleur,validiteitem=self.eval_valeur_item(item)
655 valeurretour.append(newvaleur)
656 if validiteitem == 0:
659 valeurretour,validite= self.eval_valeur_item(valeur)
662 return valeurretour,validite
664 def eval_valeur_item(self,valeur):
665 """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
666 - va retourner la valeur de retour et la validite
667 selon le type de l objet attendu
668 - traite les reels et les parametres
670 #print "eval_valeur_item",valeur
671 if valeur==None or valeur == "" :
675 valeurinter = self.traite_reel(valeur)
676 if valeurinter != None :
677 valeurretour,validite= self.object.eval_valeur(valeurinter)
679 valeurretour,validite= self.object.eval_valeur(valeur)
680 elif self.wait_geom():
681 valeurretour,validite = valeur,1
683 valeurretour,validite= self.object.eval_valeur(valeur)
684 #print "eval_valeur_item",valeurretour,validite
687 if type(valeur) == bytes and self.object.wait_TXM():
688 essai_valeur="'" + valeur + "'"
689 valeurretour,validite= self.object.eval_valeur(essai_valeur)
691 if hasattr(valeurretour,'__class__'):
692 #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
693 if valeurretour.__class__.__name__ in ('PARAMETRE',):
697 # CCAR : il ne faut pas essayer de creer un concept
698 # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
700 #valeurretour=Accas.CO(valeur)
704 # on est dans le cas ou on a évalué et ou on n'aurait pas du
705 if self.object.wait_TXM() :
706 if type(valeurretour) != bytes:
707 valeurretour=str(valeur)
709 return valeurretour,validite
711 def is_CO(self,valeur=None):
713 Indique si valeur est un concept produit de la macro
714 Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
715 Si valeur vaut None on teste la valeur du mot cle
717 # Pour savoir si un concept est un nouveau concept de macro
718 # on regarde s'il est présent dans l'attribut sdprods de l'étape
719 # ou si son nom de classe est CO.
720 # Il faut faire les 2 tests car une macro non valide peut etre
721 # dans un etat pas tres catholique avec des CO pas encore types
722 # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
723 if not valeur:valeur=self.object.valeur
724 if valeur in self.object.etape.sdprods:return 1
725 if type(valeur) is not types.InstanceType:return 0
726 if valeur.__class__.__name__ == 'CO':return 1
729 def is_param(self,valeur) :
730 for param in self.jdc.params:
731 if (repr(param) == valeur):
735 def traite_reel(self,valeur):
737 Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
738 ou de détecter si on fait référence a un concept produit par DEFI_VALEUR
741 valeur = valeur.strip()
742 liste_reels = self.get_sd_avant_du_bon_type()
743 if valeur in liste_reels:
745 if len(valeur) >= 3 :
746 if valeur[0:4] == 'EVAL' :
747 # on a trouvé un EVAL --> on retourne directement la valeur
749 if valeur.find('.') == -1 :
750 # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
751 if (self.is_param(valeur)):
754 if valeur.find('e') != -1:
755 # Notation scientifique ?
768 treeitem = SIMPTreeItem