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.max == 1 :
74 if maDefinition.into != [] and maDefinition.into != None:
75 if len(maDefinition.into) < 4 :
76 from .monWidgetRadioButton import MonWidgetRadioButton
77 widget=MonWidgetRadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
78 elif len(maDefinition.into) < 7 :
79 from .monWidget4a6RadioButton import MonWidget4a6RadioButton
80 widget=MonWidget4a6RadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
82 from .monWidgetCB import MonWidgetCB
83 widget=MonWidgetCB(self,maDefinition,monNom,monObjet,parentQt,maCommande)
85 elif self.item.wait_bool() :
86 from .monWidgetSimpBool import MonWidgetSimpBool
87 widget=MonWidgetSimpBool(self,maDefinition,monNom,monObjet,parentQt,maCommande)
88 elif self.item.wait_fichier():
89 from .monWidgetSimpFichier import MonWidgetSimpFichier
90 widget=MonWidgetSimpFichier(self,maDefinition,monNom,monObjet,parentQt,maCommande)
93 elif self.item.wait_date():
94 from .monWidgetDate import MonWidgetDate
95 widget=MonWidgetDate(self,maDefinition,monNom,monObjet,parentQt,maCommande)
96 elif self.item.wait_heure():
97 from .monWidgetHeure import MonWidgetHeure
98 widget=MonWidgetHeure(self,maDefinition,monNom,monObjet,parentQt,maCommande)
100 elif self.item.wait_tuple() :
101 if self.item.object.definition.type[0].ntuple == 2:
102 from .monWidgetSimpTuple2 import MonWidgetSimpTuple2
103 widget=MonWidgetSimpTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
104 elif self.item.object.definition.type[0].ntuple == 3 :
105 from .monWidgetSimpTuple3 import MonWidgetSimpTuple3
106 widget=MonWidgetSimpTuple3(self,maDefinition,monNom,monObjet,parentQt,maCommande)
108 print ("Pas de Tuple de longueur > 3")
109 print ("Prevenir la maintenance ")
111 elif self.item.wait_complex():
112 from .monWidgetSimpComplexe import MonWidgetSimpComplexe
113 widget=MonWidgetSimpComplexe(self,maDefinition,monNom,monObjet,parentQt,maCommande)
115 elif self.item.wait_co():
116 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
117 from .monWidgetUniqueSDCO import MonWidgetUniqueSDCO
118 widget=MonWidgetUniqueSDCO(self,maDefinition,monNom,monObjet,parentQt,maCommande)
120 from .monWidgetSDCOInto import MonWidgetSDCOInto
121 widget=MonWidgetSDCOInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
122 elif self.item.wait_assd():
123 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
124 from .monWidgetVide import MonWidgetVide
125 widget=MonWidgetVide(self,maDefinition,monNom,monObjet,parentQt,maCommande)
126 if len(self.item.get_sd_avant_du_bon_type()) < 4 :
127 from .monWidgetRadioButton import MonWidgetRadioButtonSD
128 widget=MonWidgetRadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
129 elif len(self.item.get_sd_avant_du_bon_type()) < 7 :
130 from .monWidget4a6RadioButton import MonWidget4a6RadioButtonSD
131 widget=MonWidget4a6RadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
133 from .monWidgetCB import MonWidgetCBSD
134 widget=MonWidgetCBSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
136 elif self.item.wait_Salome() and self.editor.salome:
137 from .monWidgetSimpSalome import MonWidgetSimpSalome
138 widget=MonWidgetSimpSalome(self,maDefinition,monNom,monObjet,parentQt,maCommande)
140 elif self.item.wait_TXM():
141 from .monWidgetSimpTxt import MonWidgetSimpTxt
142 widget=MonWidgetSimpTxt(self,maDefinition,monNom,monObjet,parentQt,maCommande)
144 from .monWidgetSimpBase import MonWidgetSimpBase
145 widget=MonWidgetSimpBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
149 #if maDefinition.into != [] and maDefinition.into != None:
150 # Attention pas fini --> on attend une liste de ASSD avec ordre
151 if self.item.wait_assd() and self.item.is_list_SansOrdreNiDoublon():
152 #if self.item.is_list_Chargement():
153 #from monWidgetPlusieursTuple2AvecChargement import MonWidgetPlusieursTuple2AvecChargement
154 #widget=MonWidgetPlusieursTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
157 from .monWidgetPlusieursInto import MonWidgetPlusieursInto
158 widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
159 elif self.item.wait_assd() :
160 from .monWidgetPlusieursASSDIntoOrdonne import MonWidgetPlusieursASSDIntoOrdonne
161 widget=MonWidgetPlusieursASSDIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
162 elif self.item.wait_tuple() :
163 if self.item.object.definition.type[0].ntuple == 2:
164 from .monWidgetPlusieursTuple2 import MonWidgetPlusieursTuple2
165 widget=MonWidgetPlusieursTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
166 elif self.item.object.definition.type[0].ntuple == 3 :
167 from .monWidgetPlusieursTuple3 import MonWidgetPlusieursTuple3
168 widget=MonWidgetPlusieursTuple3(self,maDefinition,monNom,monObjet,parentQt,maCommande)
170 print ("Pas de Tuple de longueur > 3")
171 print ("Prevenir la maintenance ")
172 elif self.item.has_into():
173 if self.item.is_list_SansOrdreNiDoublon():
175 if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees) :
176 from .monWidgetPlusieursInto import MonWidgetPlusieursInto
177 widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
179 from .monWidgetPlusieursPlie import MonWidgetPlusieursPlie
180 widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
182 # tres vite pour le tag mais devra etre gere dans configuration
183 if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees) :
184 from .monWidgetPlusieursIntoOrdonne import MonWidgetPlusieursIntoOrdonne
185 widget=MonWidgetPlusieursIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
187 from .monWidgetPlusieursPlie import MonWidgetPlusieursPlie
188 widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
191 if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees) :
192 from .monWidgetPlusieursBase import MonWidgetPlusieursBase
193 widget=MonWidgetPlusieursBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
195 from .monWidgetPlusieursPlie import MonWidgetPlusieursPlie
196 widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
202 class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
209 #-----------------------------------------------
211 # Methodes liees aux informations sur le Panel
212 # ou au mot-clef simple
214 #-----------------------------------------------
216 # get_into a priori inutile --> commentee
218 # wait_into a priori inutile --> commentee
227 Cette methode indique si le mot cle simple attend une liste (valeur de retour 1)
228 ou s'il n'en attend pas (valeur de retour 0)
230 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
231 Dans le cas sans validateur, l'information est donnee par l'attribut max
232 de la definition du mot cle.
233 Dans le cas avec validateur, il faut combiner l'information precedente avec
234 celle issue de l'appel de la methode is_list sur le validateur.On utilisera
235 l'operateur ET pour effectuer cette combinaison (AndVal).
238 min,max = self.GetMinMax()
242 # Dans le cas avec validateurs, pour que le mot cle soit considere
243 # comme acceptant une liste, il faut que max soit superieur a 1
244 # ET que la methode is_list du validateur retourne 1. Dans les autres cas
245 # on retournera 0 (n'attend pas de liste)
246 if self.definition.validators :
247 is_a_list= self.definition.validators.is_list() * is_a_list
250 def is_list_SansOrdreNiDoublon(self):
251 if self.definition.homo=="SansOrdreNiDoublon" : return 1
254 def is_list_Chargement(self):
255 if self.definition.docu != "" : return 1
260 Cette methode indique si le mot cle simple propose un choix (valeur de retour 1)
261 ou s'il n'en propose pas (valeur de retour 0)
263 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
264 Dans le cas sans validateur, l'information est donnee par l'attribut into
265 de la definition du mot cle.
266 Dans le cas avec validateurs, pour que le mot cle soit considere
267 comme proposant un choix, il faut que into soit present OU
268 que la methode has_into du validateur retourne 1. Dans les autres cas
269 on retournera 0 (ne propose pas de choix)
272 if self.definition.into:
274 elif self.definition.validators :
275 has_an_into= self.definition.validators.has_into()
280 """ Retourne les valeurs min et max de la definition de object """
281 return self.object.get_min_max()
283 def GetMultiplicite(self):
285 Retourne la multiplicite des valeurs affectees a l'objet
286 represente par l'item. Pour le moment retourne invariablement 1.
290 def GetIntervalle(self):
292 Retourne le domaine de valeur attendu par l'objet represente
295 return self.object.getintervalle()
297 def GetListeValeurs(self) :
298 """ Retourne la liste des valeurs de object """
299 valeurs=self.object.get_liste_valeurs()
301 if "R" in self.object.definition.type:
302 clef=self.object.GetNomConcept()
303 if clef in self.appli.dict_reels:
304 if type(valeurs) == tuple:
307 if val in self.appli.dict_reels[clef]:
308 valeurs_reelles.append(self.appli.dict_reels[clef][val])
310 valeurs_reelles.append(val)
312 if valeurs in self.appli.dict_reels[clef]:
313 valeurs_reelles=self.appli.dict_reels[clef][valeurs]
314 valeurs=valeurs_reelles
319 def get_liste_possible(self,listeActuelle=[]):
320 if hasattr(self.definition.validators,'into'):
321 valeurspossibles = self.definition.validators.into
323 valeurspossibles = self.get_definition().into
325 if listeActuelle==[] : return valeurspossibles
327 #On ne garde que les items valides
329 if type(valeurspossibles) in (list,tuple) :
332 valeurspossibles=(valeurspossibles,)
333 for item in valeurspossibles:
334 encorevalide=self.valide_item(item)
336 listevalideitem.append(item)
338 #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
340 for item in listevalideitem:
341 encorevalide=self.valide_liste_partielle(item,listeActuelle)
343 listevalideliste.append(item)
344 #print listevalideliste
345 return listevalideliste
347 def get_liste_param_possible(self):
349 l1,l2=self.jdc.get_parametres_fonctions_avant_etape(self.get_etape())
350 for param in self.object.jdc.params:
351 if param.nom not in l1 : continue
352 encorevalide=self.valide_item(param.valeur)
354 type_param=param.valeur.__class__.__name__
355 for typ in self.definition.type:
357 liste_param.append(param)
358 if typ=='I' and type_param=='int':
359 liste_param.append(param)
360 if typ=='TXM' and type_param=='str':
361 liste_param.append(repr(param))
362 if ('grma' in repr(typ)) and type_param=='str':
363 liste_param.append(param.nom)
366 #--------------------------------------------------
368 # Methodes liees a la validite des valeurs saisies
370 #---------------------------------------------------
372 # valide_liste_partielle
373 # valide_liste_complete
379 def valide_item(self,item):
381 La validation est realisee directement par l'objet
383 return self.object.valide_item(item)
385 def valide_liste_partielle(self,item,listecourante):
386 #On protege la liste en entree en la copiant
387 valeur=listecourante[:]
389 return self.object.valid_valeur_partielle(valeur)
391 def valide_liste_complete (self,valeur):
392 return self.object.valid_valeur(valeur)
394 def valide_val (self,valeur):
395 return self.object.valid_val(valeur)
397 def info_erreur_item(self) :
399 if self.definition.validators :
400 commentaire=self.definition.validators.info_erreur_item()
405 if self.definition.validators :
406 commentaire=self.definition.validators.aide()
409 def info_erreur_liste(self) :
411 if self.definition.validators :
412 commentaire=self.definition.validators.info_erreur_liste()
415 def IsInIntervalle(self,valeur):
417 Retourne 1 si la valeur est dans l'intervalle permis par
418 l'objet represente par l'item.
420 return self.valide_item(valeur)
423 valide=self.object.isvalid()
426 #--------------------------------------------------
430 #---------------------------------------------------
434 # get_sd_avant_du_bon_type
438 def GetIconName(self):
440 return "ast-green-ball"
441 elif self.object.isoblig():
442 return "ast-red-ball"
444 return "ast-yel-ball"
449 Retourne le texte a afficher dans l'arbre representant la valeur de l'objet
452 text= self.object.GetText()
453 if text == None : text=""
457 def set_valeur_co(self,nom_co):
459 Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
461 ret = self.object.set_valeur_co(nom_co)
462 #print "set_valeur_co",ret
465 def get_sd_avant_du_bon_type(self):
467 Retourne la liste des noms des SD présentes avant l'étape qui contient
468 le MCS pointé par self et du type requis par ce MCS
470 a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
473 def get_sd_avant_du_bon_type_pour_type_de_base(self):
474 a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
480 def delete_valeur_co(self,valeur=None):
482 Supprime la valeur du mot cle (de type CO)
483 il faut propager la destruction aux autres etapes
485 if not valeur : valeur=self.object.valeur
486 # XXX faut il vraiment appeler del_sdprod ???
487 #self.object.etape.parent.del_sdprod(valeur)
488 self.object.etape.parent.delete_concept(valeur)
490 #-----------------------------------------------
492 # Methodes liees au type de l objet attendu
494 #-----------------------------------------------
504 Méthode booléenne qui retourne 1 si l'objet pointé par self
505 attend un objet de type ASSD qui n'existe pas encore (type CO()),
508 return self.object.wait_co()
510 def wait_fichier(self):
511 maDefinition=self.object.definition
513 if ('Repertoire' in maDefinition.type[0]) or ('Fichier' in maDefinition.type[0]) :
520 Méthode booléenne qui retourne 1 si l'objet pointé par self
521 attend un objet GEOM, 0 sinon
523 return self.object.wait_geom()
526 return self.object.wait_TXM()
529 def wait_complex(self):
530 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
531 attend un complexe, 0 sinon """
532 if 'C' in self.object.definition.type:
538 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
539 attend un réel, 0 sinon """
540 if 'R' in self.object.definition.type:
546 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
547 attend un réel, 0 sinon """
548 if 'DateHHMMAAAA' in self.object.definition.type:
553 def wait_heure(self):
554 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
555 attend un réel, 0 sinon """
556 if 'HeureHHMMSS' in self.object.definition.type:
563 def wait_tuple(self):
564 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
565 attend un Tuple, 0 sinon """
566 for ss_type in self.object.definition.type:
567 if repr(ss_type).find('Tuple') != -1 :
571 def wait_matrice(self):
572 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
573 attend un Tuple, 0 sinon """
574 for ss_type in self.object.definition.type:
575 if repr(ss_type).find('Matrice') != -1 :
580 """Méthode booléenne qui retourne 1 si l'objet pointé par self
581 attend un objet de type ASSD ou dérivé, 0 sinon """
582 return self.object.wait_assd()
584 def wait_assd_or_type_base(self) :
586 if len(self.object.definition.type) > 1 :
587 if self.wait_reel() :
589 if 'I' in self.object.definition.type :
593 def wait_Salome(self):
594 monType = self.object.definition.type[0]
595 if 'grma' in repr(monType) : return True
596 if 'grno' in repr(monType) : return True
598 if issubclass(monType, SalomeEntry) : return True
605 Retourne le type de valeur attendu par l'objet représenté par l'item.
607 return self.object.get_type()
609 #-----------------------------------------------------
611 # Methodes liees a l evaluation de la valeur saisie
613 #-----------------------------------------------------
619 def eval_valeur(self,valeur):
620 """ Lance l'interpretation de 'valeur' (chaine de caracteres) comme valeur de self :
621 - retourne l'objet associe si on a pu interpreter (entier, reel, ASSD,...)
622 - retourne 'valeur' (chaine de caracteres) sinon
624 newvaleur=self.eval_val(valeur)
627 def eval_valeur_BAK(self,valeur):
628 """ Lance l'interpretation de 'valeur' (chaine de caractéres) comme valeur
629 de l'objet pointé par self :
630 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
631 - retourne 'valeur' (chaine de caractéres) sinon
632 - retourne None en cas d invalidite
633 - retourne invalide si 1 des objets du tuple l est
636 if type(valeur) in (list,tuple) :
639 newvaleur,validiteitem=self.eval_valeur_item(item)
640 valeurretour.append(newvaleur)
641 if validiteitem == 0:
644 valeurretour,validite= self.eval_valeur_item(valeur)
647 return valeurretour,validite
649 def eval_valeur_item(self,valeur):
650 """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
651 - va retourner la valeur de retour et la validite
652 selon le type de l objet attendu
653 - traite les reels et les parametres
655 #print "eval_valeur_item",valeur
656 if valeur==None or valeur == "" :
660 valeurinter = self.traite_reel(valeur)
661 if valeurinter != None :
662 valeurretour,validite= self.object.eval_valeur(valeurinter)
664 valeurretour,validite= self.object.eval_valeur(valeur)
665 elif self.wait_geom():
666 valeurretour,validite = valeur,1
668 valeurretour,validite= self.object.eval_valeur(valeur)
669 #print "eval_valeur_item",valeurretour,validite
672 if type(valeur) == bytes and self.object.wait_TXM():
673 essai_valeur="'" + valeur + "'"
674 valeurretour,validite= self.object.eval_valeur(essai_valeur)
676 if hasattr(valeurretour,'__class__'):
677 #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
678 if valeurretour.__class__.__name__ in ('PARAMETRE',):
682 # CCAR : il ne faut pas essayer de creer un concept
683 # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
685 #valeurretour=Accas.CO(valeur)
689 # on est dans le cas ou on a évalué et ou on n'aurait pas du
690 if self.object.wait_TXM() :
691 if type(valeurretour) != bytes:
692 valeurretour=str(valeur)
694 return valeurretour,validite
696 def is_CO(self,valeur=None):
698 Indique si valeur est un concept produit de la macro
699 Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
700 Si valeur vaut None on teste la valeur du mot cle
702 # Pour savoir si un concept est un nouveau concept de macro
703 # on regarde s'il est présent dans l'attribut sdprods de l'étape
704 # ou si son nom de classe est CO.
705 # Il faut faire les 2 tests car une macro non valide peut etre
706 # dans un etat pas tres catholique avec des CO pas encore types
707 # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
708 if not valeur:valeur=self.object.valeur
709 if valeur in self.object.etape.sdprods:return 1
710 if type(valeur) is not types.InstanceType:return 0
711 if valeur.__class__.__name__ == 'CO':return 1
714 def is_param(self,valeur) :
715 for param in self.jdc.params:
716 if (repr(param) == valeur):
720 def traite_reel(self,valeur):
722 Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
723 ou de détecter si on fait référence a un concept produit par DEFI_VALEUR
726 valeur = valeur.strip()
727 liste_reels = self.get_sd_avant_du_bon_type()
728 if valeur in liste_reels:
730 if len(valeur) >= 3 :
731 if valeur[0:4] == 'EVAL' :
732 # on a trouvé un EVAL --> on retourne directement la valeur
734 if valeur.find('.') == -1 :
735 # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
736 if (self.is_param(valeur)):
739 if valeur.find('e') != -1:
740 # Notation scientifique ?
753 treeitem = SIMPTreeItem