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.intoExe != None :
78 # monInto = maDefinition.intoExe(self.item)
79 # maDefinition.into = monInto
80 # from Noyau.N_VALIDATOR import IntoProtocol
81 # monObjet.intoProto = IntoProtocol("into", into=maDefinition.into, val_min=maDefinition.val_min, val_max=maDefinition.val_max)
84 if maDefinition.max == 1 :
87 if maDefinition.into != [] and maDefinition.into != None:
89 from .monWidgetRadioButton import MonWidgetRadioButton
90 widget=MonWidgetRadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
91 elif len(monInto) < 7 :
92 from .monWidget4a6RadioButton import MonWidget4a6RadioButton
93 widget=MonWidget4a6RadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
95 from .monWidgetCB import MonWidgetCB
96 widget=MonWidgetCB(self,maDefinition,monNom,monObjet,parentQt,maCommande)
98 elif self.item.wait_bool() :
99 from .monWidgetSimpBool import MonWidgetSimpBool
100 widget=MonWidgetSimpBool(self,maDefinition,monNom,monObjet,parentQt,maCommande)
101 elif self.item.wait_fichier():
102 from .monWidgetSimpFichier import MonWidgetSimpFichier
103 widget=MonWidgetSimpFichier(self,maDefinition,monNom,monObjet,parentQt,maCommande)
106 elif self.item.wait_date():
107 from .monWidgetDate import MonWidgetDate
108 widget=MonWidgetDate(self,maDefinition,monNom,monObjet,parentQt,maCommande)
109 elif self.item.wait_heure():
110 from .monWidgetHeure import MonWidgetHeure
111 widget=MonWidgetHeure(self,maDefinition,monNom,monObjet,parentQt,maCommande)
113 elif self.item.wait_tuple() :
114 if self.item.object.definition.type[0].ntuple == 2:
115 from .monWidgetSimpTuple2 import MonWidgetSimpTuple2
116 widget=MonWidgetSimpTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
117 elif self.item.object.definition.type[0].ntuple == 3 :
118 from .monWidgetSimpTuple3 import MonWidgetSimpTuple3
119 widget=MonWidgetSimpTuple3(self,maDefinition,monNom,monObjet,parentQt,maCommande)
121 print ("Pas de Tuple de longueur > 3")
122 print ("Prevenir la maintenance ")
124 elif self.item.wait_complex():
125 from .monWidgetSimpComplexe import MonWidgetSimpComplexe
126 widget=MonWidgetSimpComplexe(self,maDefinition,monNom,monObjet,parentQt,maCommande)
128 elif self.item.wait_co():
129 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
130 from .monWidgetUniqueSDCO import MonWidgetUniqueSDCO
131 widget=MonWidgetUniqueSDCO(self,maDefinition,monNom,monObjet,parentQt,maCommande)
133 from .monWidgetSDCOInto import MonWidgetSDCOInto
134 widget=MonWidgetSDCOInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
135 elif self.item.wait_assd():
136 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
137 from .monWidgetVide import MonWidgetVide
138 widget=MonWidgetVide(self,maDefinition,monNom,monObjet,parentQt,maCommande)
139 if len(self.item.get_sd_avant_du_bon_type()) < 4 :
140 from .monWidgetRadioButton import MonWidgetRadioButtonSD
141 widget=MonWidgetRadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
142 elif len(self.item.get_sd_avant_du_bon_type()) < 7 :
143 from .monWidget4a6RadioButton import MonWidget4a6RadioButtonSD
144 widget=MonWidget4a6RadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
146 from .monWidgetCB import MonWidgetCBSD
147 widget=MonWidgetCBSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
149 elif self.item.wait_Salome() and self.editor.salome:
150 from .monWidgetSimpSalome import MonWidgetSimpSalome
151 widget=MonWidgetSimpSalome(self,maDefinition,monNom,monObjet,parentQt,maCommande)
153 elif self.item.wait_TXM():
154 from .monWidgetSimpTxt import MonWidgetSimpTxt
155 widget=MonWidgetSimpTxt(self,maDefinition,monNom,monObjet,parentQt,maCommande)
157 from .monWidgetSimpBase import MonWidgetSimpBase
158 widget=MonWidgetSimpBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
162 #if maDefinition.into != [] and maDefinition.into != None:
163 # Attention pas fini --> on attend une liste de ASSD avec ordre
164 if self.item.wait_assd() and self.item.is_list_SansOrdreNiDoublon():
165 #if self.item.is_list_Chargement():
166 #from monWidgetPlusieursTuple2AvecChargement import MonWidgetPlusieursTuple2AvecChargement
167 #widget=MonWidgetPlusieursTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
170 from .monWidgetPlusieursInto import MonWidgetPlusieursInto
171 widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
172 elif self.item.wait_assd() :
173 from .monWidgetPlusieursASSDIntoOrdonne import MonWidgetPlusieursASSDIntoOrdonne
174 widget=MonWidgetPlusieursASSDIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
175 elif self.item.wait_tuple() :
176 if self.item.object.definition.type[0].ntuple == 2:
177 from .monWidgetPlusieursTuple2 import MonWidgetPlusieursTuple2
178 widget=MonWidgetPlusieursTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
179 elif self.item.object.definition.type[0].ntuple == 3 :
180 from .monWidgetPlusieursTuple3 import MonWidgetPlusieursTuple3
181 widget=MonWidgetPlusieursTuple3(self,maDefinition,monNom,monObjet,parentQt,maCommande)
183 print ("Pas de Tuple de longueur > 3")
184 print ("Prevenir la maintenance ")
185 elif self.item.has_into():
186 if self.item.is_list_SansOrdreNiDoublon():
188 if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees) :
189 from .monWidgetPlusieursInto import MonWidgetPlusieursInto
190 widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
192 from .monWidgetPlusieursPlie import MonWidgetPlusieursPlie
193 widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
195 # tres vite pour le tag mais devra etre gere dans configuration
196 if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees) :
197 from .monWidgetPlusieursIntoOrdonne import MonWidgetPlusieursIntoOrdonne
198 widget=MonWidgetPlusieursIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
200 from .monWidgetPlusieursPlie import MonWidgetPlusieursPlie
201 widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
204 if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees) :
205 from .monWidgetPlusieursBase import MonWidgetPlusieursBase
206 widget=MonWidgetPlusieursBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
208 from .monWidgetPlusieursPlie import MonWidgetPlusieursPlie
209 widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
215 class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
222 #-----------------------------------------------
224 # Methodes liees aux informations sur le Panel
225 # ou au mot-clef simple
227 #-----------------------------------------------
229 # get_into a priori inutile --> commentee
231 # wait_into a priori inutile --> commentee
240 Cette methode indique si le mot cle simple attend une liste (valeur de retour 1)
241 ou s'il n'en attend pas (valeur de retour 0)
243 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
244 Dans le cas sans validateur, l'information est donnee par l'attribut max
245 de la definition du mot cle.
246 Dans le cas avec validateur, il faut combiner l'information precedente avec
247 celle issue de l'appel de la methode is_list sur le validateur.On utilisera
248 l'operateur ET pour effectuer cette combinaison (AndVal).
251 min,max = self.GetMinMax()
255 # Dans le cas avec validateurs, pour que le mot cle soit considere
256 # comme acceptant une liste, il faut que max soit superieur a 1
257 # ET que la methode is_list du validateur retourne 1. Dans les autres cas
258 # on retournera 0 (n'attend pas de liste)
259 if self.definition.validators :
260 is_a_list= self.definition.validators.is_list() * is_a_list
263 def is_list_SansOrdreNiDoublon(self):
264 if self.definition.homo=="SansOrdreNiDoublon" : return 1
267 def is_list_Chargement(self):
268 if self.definition.docu != "" : return 1
273 Cette methode indique si le mot cle simple propose un choix (valeur de retour 1)
274 ou s'il n'en propose pas (valeur de retour 0)
276 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
277 Dans le cas sans validateur, l'information est donnee par l'attribut into
278 de la definition du mot cle.
279 Dans le cas avec validateurs, pour que le mot cle soit considere
280 comme proposant un choix, il faut que into soit present OU
281 que la methode has_into du validateur retourne 1. Dans les autres cas
282 on retournera 0 (ne propose pas de choix)
285 if self.definition.into:
287 elif self.definition.validators :
288 has_an_into= self.definition.validators.has_into()
293 """ Retourne les valeurs min et max de la definition de object """
294 return self.object.get_min_max()
296 def GetMultiplicite(self):
298 Retourne la multiplicite des valeurs affectees a l'objet
299 represente par l'item. Pour le moment retourne invariablement 1.
303 def GetIntervalle(self):
305 Retourne le domaine de valeur attendu par l'objet represente
308 return self.object.getintervalle()
310 def GetListeValeurs(self) :
311 """ Retourne la liste des valeurs de object """
312 valeurs=self.object.get_liste_valeurs()
314 if "R" in self.object.definition.type:
315 clef=self.object.GetNomConcept()
316 if clef in self.appli.dict_reels:
317 if type(valeurs) == tuple:
320 if val in self.appli.dict_reels[clef]:
321 valeurs_reelles.append(self.appli.dict_reels[clef][val])
323 valeurs_reelles.append(val)
325 if valeurs in self.appli.dict_reels[clef]:
326 valeurs_reelles=self.appli.dict_reels[clef][valeurs]
327 valeurs=valeurs_reelles
332 def get_liste_possible(self,listeActuelle=[]):
333 if hasattr(self.definition.validators,'into'):
334 valeurspossibles = self.definition.validators.into
336 valeurspossibles = self.get_definition().into
338 if listeActuelle==[] : return valeurspossibles
340 #On ne garde que les items valides
342 if type(valeurspossibles) in (list,tuple) :
345 valeurspossibles=(valeurspossibles,)
346 for item in valeurspossibles:
347 encorevalide=self.valide_item(item)
349 listevalideitem.append(item)
351 #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
353 for item in listevalideitem:
354 encorevalide=self.valide_liste_partielle(item,listeActuelle)
356 listevalideliste.append(item)
357 #print listevalideliste
358 return listevalideliste
360 def get_liste_param_possible(self):
362 l1,l2=self.jdc.get_parametres_fonctions_avant_etape(self.get_etape())
363 for param in self.object.jdc.params:
364 if param.nom not in l1 : continue
365 encorevalide=self.valide_item(param.valeur)
367 type_param=param.valeur.__class__.__name__
368 for typ in self.definition.type:
370 liste_param.append(param)
371 if typ=='I' and type_param=='int':
372 liste_param.append(param)
373 if typ=='TXM' and type_param=='str':
374 liste_param.append(repr(param))
375 if ('grma' in repr(typ)) and type_param=='str':
376 liste_param.append(param.nom)
379 #--------------------------------------------------
381 # Methodes liees a la validite des valeurs saisies
383 #---------------------------------------------------
385 # valide_liste_partielle
386 # valide_liste_complete
392 def valide_item(self,item):
394 La validation est realisee directement par l'objet
396 return self.object.valide_item(item)
398 def valide_liste_partielle(self,item,listecourante):
399 #On protege la liste en entree en la copiant
400 valeur=listecourante[:]
402 return self.object.valid_valeur_partielle(valeur)
404 def valide_liste_complete (self,valeur):
405 return self.object.valid_valeur(valeur)
407 def valide_val (self,valeur):
408 return self.object.valid_val(valeur)
410 def info_erreur_item(self) :
412 if self.definition.validators :
413 commentaire=self.definition.validators.info_erreur_item()
418 if self.definition.validators :
419 commentaire=self.definition.validators.aide()
422 def info_erreur_liste(self) :
424 if self.definition.validators :
425 commentaire=self.definition.validators.info_erreur_liste()
428 def IsInIntervalle(self,valeur):
430 Retourne 1 si la valeur est dans l'intervalle permis par
431 l'objet represente par l'item.
433 return self.valide_item(valeur)
436 valide=self.object.isvalid()
439 #--------------------------------------------------
443 #---------------------------------------------------
447 # get_sd_avant_du_bon_type
451 def GetIconName(self):
453 return "ast-green-ball"
454 elif self.object.isoblig():
455 return "ast-red-ball"
457 return "ast-yel-ball"
462 Retourne le texte a afficher dans l'arbre representant la valeur de l'objet
465 text= self.object.GetText()
466 if text == None : text=""
470 def set_valeur_co(self,nom_co):
472 Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
474 ret = self.object.set_valeur_co(nom_co)
475 #print "set_valeur_co",ret
478 def get_sd_avant_du_bon_type(self):
480 Retourne la liste des noms des SD présentes avant l'étape qui contient
481 le MCS pointé par self et du type requis par ce MCS
483 a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
486 def get_sd_avant_du_bon_type_pour_type_de_base(self):
487 a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
493 def delete_valeur_co(self,valeur=None):
495 Supprime la valeur du mot cle (de type CO)
496 il faut propager la destruction aux autres etapes
498 if not valeur : valeur=self.object.valeur
499 # XXX faut il vraiment appeler del_sdprod ???
500 #self.object.etape.parent.del_sdprod(valeur)
501 self.object.etape.parent.delete_concept(valeur)
503 #-----------------------------------------------
505 # Methodes liees au type de l objet attendu
507 #-----------------------------------------------
517 Méthode booléenne qui retourne 1 si l'objet pointé par self
518 attend un objet de type ASSD qui n'existe pas encore (type CO()),
521 return self.object.wait_co()
523 def wait_fichier(self):
524 maDefinition=self.object.definition
526 if ('Repertoire' in maDefinition.type[0]) or ('Fichier' in maDefinition.type[0]) :
533 Méthode booléenne qui retourne 1 si l'objet pointé par self
534 attend un objet GEOM, 0 sinon
536 return self.object.wait_geom()
539 return self.object.wait_TXM()
542 def wait_complex(self):
543 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
544 attend un complexe, 0 sinon """
545 if 'C' in self.object.definition.type:
551 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
552 attend un réel, 0 sinon """
553 if 'R' in self.object.definition.type:
559 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
560 attend un réel, 0 sinon """
561 if 'DateHHMMAAAA' in self.object.definition.type:
566 def wait_heure(self):
567 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
568 attend un réel, 0 sinon """
569 if 'HeureHHMMSS' in self.object.definition.type:
576 def wait_tuple(self):
577 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
578 attend un Tuple, 0 sinon """
579 for ss_type in self.object.definition.type:
580 if repr(ss_type).find('Tuple') != -1 :
584 def wait_matrice(self):
585 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
586 attend un Tuple, 0 sinon """
587 for ss_type in self.object.definition.type:
588 if repr(ss_type).find('Matrice') != -1 :
593 """Méthode booléenne qui retourne 1 si l'objet pointé par self
594 attend un objet de type ASSD ou dérivé, 0 sinon """
595 return self.object.wait_assd()
597 def wait_assd_or_type_base(self) :
599 if len(self.object.definition.type) > 1 :
600 if self.wait_reel() :
602 if 'I' in self.object.definition.type :
606 def wait_Salome(self):
607 monType = self.object.definition.type[0]
608 if 'grma' in repr(monType) : return True
609 if 'grno' in repr(monType) : return True
611 if issubclass(monType, SalomeEntry) : return True
618 Retourne le type de valeur attendu par l'objet représenté par l'item.
620 return self.object.get_type()
622 #-----------------------------------------------------
624 # Methodes liees a l evaluation de la valeur saisie
626 #-----------------------------------------------------
632 def eval_valeur(self,valeur):
633 """ Lance l'interpretation de 'valeur' (chaine de caracteres) comme valeur de self :
634 - retourne l'objet associe si on a pu interpreter (entier, reel, ASSD,...)
635 - retourne 'valeur' (chaine de caracteres) sinon
637 newvaleur=self.eval_val(valeur)
640 def eval_valeur_BAK(self,valeur):
641 """ Lance l'interpretation de 'valeur' (chaine de caractéres) comme valeur
642 de l'objet pointé par self :
643 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
644 - retourne 'valeur' (chaine de caractéres) sinon
645 - retourne None en cas d invalidite
646 - retourne invalide si 1 des objets du tuple l est
649 if type(valeur) in (list,tuple) :
652 newvaleur,validiteitem=self.eval_valeur_item(item)
653 valeurretour.append(newvaleur)
654 if validiteitem == 0:
657 valeurretour,validite= self.eval_valeur_item(valeur)
660 return valeurretour,validite
662 def eval_valeur_item(self,valeur):
663 """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
664 - va retourner la valeur de retour et la validite
665 selon le type de l objet attendu
666 - traite les reels et les parametres
668 #print "eval_valeur_item",valeur
669 if valeur==None or valeur == "" :
673 valeurinter = self.traite_reel(valeur)
674 if valeurinter != None :
675 valeurretour,validite= self.object.eval_valeur(valeurinter)
677 valeurretour,validite= self.object.eval_valeur(valeur)
678 elif self.wait_geom():
679 valeurretour,validite = valeur,1
681 valeurretour,validite= self.object.eval_valeur(valeur)
682 #print "eval_valeur_item",valeurretour,validite
685 if type(valeur) == bytes and self.object.wait_TXM():
686 essai_valeur="'" + valeur + "'"
687 valeurretour,validite= self.object.eval_valeur(essai_valeur)
689 if hasattr(valeurretour,'__class__'):
690 #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
691 if valeurretour.__class__.__name__ in ('PARAMETRE',):
695 # CCAR : il ne faut pas essayer de creer un concept
696 # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
698 #valeurretour=Accas.CO(valeur)
702 # on est dans le cas ou on a évalué et ou on n'aurait pas du
703 if self.object.wait_TXM() :
704 if type(valeurretour) != bytes:
705 valeurretour=str(valeur)
707 return valeurretour,validite
709 def is_CO(self,valeur=None):
711 Indique si valeur est un concept produit de la macro
712 Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
713 Si valeur vaut None on teste la valeur du mot cle
715 # Pour savoir si un concept est un nouveau concept de macro
716 # on regarde s'il est présent dans l'attribut sdprods de l'étape
717 # ou si son nom de classe est CO.
718 # Il faut faire les 2 tests car une macro non valide peut etre
719 # dans un etat pas tres catholique avec des CO pas encore types
720 # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
721 if not valeur:valeur=self.object.valeur
722 if valeur in self.object.etape.sdprods:return 1
723 if type(valeur) is not types.InstanceType:return 0
724 if valeur.__class__.__name__ == 'CO':return 1
727 def is_param(self,valeur) :
728 for param in self.jdc.params:
729 if (repr(param) == valeur):
733 def traite_reel(self,valeur):
735 Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
736 ou de détecter si on fait référence a un concept produit par DEFI_VALEUR
739 valeur = valeur.strip()
740 liste_reels = self.get_sd_avant_du_bon_type()
741 if valeur in liste_reels:
743 if len(valeur) >= 3 :
744 if valeur[0:4] == 'EVAL' :
745 # on a trouvé un EVAL --> on retourne directement la valeur
747 if valeur.find('.') == -1 :
748 # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
749 if (self.is_param(valeur)):
752 if valeur.find('e') != -1:
753 # Notation scientifique ?
766 treeitem = SIMPTreeItem