1 # -*- coding: utf-8 -*-
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 import string,types,os
23 from copy import copy,deepcopy
28 from Editeur import Objecttreeitem
30 from Noyau.N_CR import justify_text
31 from Accas import SalomeEntry
33 class Node(browser.JDCNode,typeNode.PopUpMenuNodeMinimal):
38 # Attention l ordre des if est important
40 if self.item.wait_matrice ():
41 from monMatricePanel import MonMatricePanel
43 # l'objet prend sa (ses) valeur(s) dans un ensemble discret de valeurs
44 elif self.item.has_into():
45 if self.item.is_list() :
46 from monPlusieursIntoPanel import MonPlusieursIntoPanel
47 klass = MonPlusieursIntoPanel
49 from monUniqueIntoPanel import MonUniqueIntoPanel
50 klass = MonUniqueIntoPanel
52 # l'objet prend une ou des valeurs a priori quelconques
54 # on attend une liste de valeurs
55 if self.item.is_list() :
56 # on attend une liste de SD
57 if self.item.wait_tuple() :
58 from monFonctionPanel import MonFonctionPanel
59 klass = MonFonctionPanel
60 elif self.item.wait_assd():
61 from monPlusieursASSDPanel import MonPlusieursASSDPanel
62 klass = MonPlusieursASSDPanel
64 # on attend une liste de valeurs de types debase (entiers, réels,...)
65 from monPlusieursBasePanel import MonPlusieursBasePanel
66 klass = MonPlusieursBasePanel
67 # on n'attend qu'une seule valeur
69 # on attend une SD ou un objet de la classe CO (qui n'existe pas encore)
70 if self.item.wait_co():
71 if len(self.item.get_sd_avant_du_bon_type()) != 0 :
72 from monUniqueSDCOIntoPanel import MonUniqueSDCOIntoPanel
73 klass = MonUniqueSDCOIntoPanel
75 from monUniqueSDCOPanel import MonUniqueSDCOPanel
76 klass = MonUniqueSDCOPanel
79 elif self.item.wait_assd():
80 if 'R' in self.item.GetType():
81 from monUniqueASSDPanel import MonUniqueASSDReelPanel
82 klass = MonUniqueASSDReelPanel
84 from monUniqueASSDPanel import MonUniqueASSDPanel
85 klass = MonUniqueASSDPanel
87 # on attend une valeur d'un type de base (entier,reel,...)
89 # on attend un complexe
90 if self.item.wait_complex():
91 from monUniqueCompPanel import MonUniqueCompPanel
92 klass = MonUniqueCompPanel
93 elif self.item.wait_bool() :
94 from monUniqueBoolPanel import MonUniqueBoolPanel
95 klass = MonUniqueBoolPanel
97 from monUniqueBasePanel import MonUniqueBasePanel
98 klass = MonUniqueBasePanel
100 # cas particulier des fonctions
101 genea = self.item.get_genealogie()
102 if "VALE" in genea or "VALE_C" in genea:
103 if "DEFI_FONCTION" in genea :
104 from monFonctionPanel import MonFonctionPanel
105 klass = MonFonctionPanel
109 return klass( self, self.editor )
112 def createPopUpMenu(self):
113 typeNode.PopUpMenuNodeMinimal.createPopUpMenu(self)
116 def getPanelGroupe(self,parentQt,commande):
117 maDefinition=self.item.get_definition()
118 monObjet=self.item.object
123 if monObjet.isInformation():
124 from monWidgetInfo import MonWidgetInfo
125 widget=MonWidgetInfo(self,maDefinition,monNom,monObjet,parentQt,maCommande)
130 # Attention l ordre des if est important
131 # Attention il faut gerer les blocs et les facteurs
132 # a gerer comme dans composimp
133 # Gerer les matrices --> Actuellement pas dans ce type de panneau
135 #print "____________________________", self.item.wait_tuple()
136 # Gestion d'une seule valeur (eventuellement un tuple ou un complexe)
137 if maDefinition.max == 1 :
139 # Listes de valeur discretes
140 if maDefinition.into != [] and maDefinition.into != None:
141 if len(maDefinition.into) < 4 :
142 from monWidgetRadioButton import MonWidgetRadioButton
143 widget=MonWidgetRadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
144 elif len(maDefinition.into) < 7 :
145 from monWidget4a6RadioButton import MonWidget4a6RadioButton
146 widget=MonWidget4a6RadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
148 from monWidgetCB import MonWidgetCB
149 widget=MonWidgetCB(self,maDefinition,monNom,monObjet,parentQt,maCommande)
151 elif self.item.wait_bool() :
152 from monWidgetSimpBool import MonWidgetSimpBool
153 widget=MonWidgetSimpBool(self,maDefinition,monNom,monObjet,parentQt,maCommande)
154 elif self.item.wait_fichier():
155 from monWidgetSimpFichier import MonWidgetSimpFichier
156 widget=MonWidgetSimpFichier(self,maDefinition,monNom,monObjet,parentQt,maCommande)
159 elif self.item.wait_date():
160 from monWidgetDate import MonWidgetDate
161 widget=MonWidgetDate(self,maDefinition,monNom,monObjet,parentQt,maCommande)
162 elif self.item.wait_heure():
163 from monWidgetHeure import MonWidgetHeure
164 widget=MonWidgetHeure(self,maDefinition,monNom,monObjet,parentQt,maCommande)
166 elif self.item.wait_tuple() :
167 if self.item.object.definition.type[0].ntuple == 2:
168 from monWidgetSimpTuple2 import MonWidgetSimpTuple2
169 widget=MonWidgetSimpTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
170 elif self.item.object.definition.type[0].ntuple == 3 :
171 from monWidgetSimpTuple3 import MonWidgetSimpTuple3
172 widget=MonWidgetSimpTuple3(self,maDefinition,monNom,monObjet,parentQt,maCommande)
174 print "Pas de Tuple de longueur > 3"
175 print "Prevenir la maintenance "
177 elif self.item.wait_complex():
178 from monWidgetSimpComplexe import MonWidgetSimpComplexe
179 widget=MonWidgetSimpComplexe(self,maDefinition,monNom,monObjet,parentQt,maCommande)
181 elif self.item.wait_assd():
182 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
183 from monWidgetVide import MonWidgetVide
184 widget=MonWidgetVide(self,maDefinition,monNom,monObjet,parentQt,maCommande)
185 if len(self.item.get_sd_avant_du_bon_type()) < 4 :
186 from monWidgetRadioButton import MonWidgetRadioButtonSD
187 widget=MonWidgetRadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
188 elif len(self.item.get_sd_avant_du_bon_type()) < 7 :
189 from monWidget4a6RadioButton import MonWidget4a6RadioButtonSD
190 widget=MonWidget4a6RadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
192 from monWidgetCB import MonWidgetCBSD
193 widget=MonWidgetCBSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
195 elif self.item.wait_Salome() and self.editor.salome:
197 from monWidgetSimpSalome import MonWidgetSimpSalome
198 widget=MonWidgetSimpSalome(self,maDefinition,monNom,monObjet,parentQt,maCommande)
200 elif self.item.wait_TXM():
201 from monWidgetSimpTxt import MonWidgetSimpTxt
202 widget=MonWidgetSimpTxt(self,maDefinition,monNom,monObjet,parentQt,maCommande)
204 from monWidgetSimpBase import MonWidgetSimpBase
205 widget=MonWidgetSimpBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
209 if maDefinition.into != [] and maDefinition.into != None:
210 if self.item.is_list_SansOrdreNiDoublon():
211 from monWidgetPlusieursInto import MonWidgetPlusieursInto
212 widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
214 from monWidgetPlusieursIntoOrdonne import MonWidgetPlusieursIntoOrdonne
215 widget=MonWidgetPlusieursIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
217 from monWidgetPlusieursBase import MonWidgetPlusieursBase
218 widget=MonWidgetPlusieursBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
223 class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
230 #-----------------------------------------------
232 # Methodes liees aux informations sur le Panel
233 # ou au mot-clef simple
235 #-----------------------------------------------
237 # get_into a priori inutile --> commentee
239 # wait_into a priori inutile --> commentee
248 Cette methode indique si le mot cle simple attend une liste (valeur de retour 1)
249 ou s'il n'en attend pas (valeur de retour 0)
251 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
252 Dans le cas sans validateur, l'information est donnee par l'attribut max
253 de la definition du mot cle.
254 Dans le cas avec validateur, il faut combiner l'information precedente avec
255 celle issue de l'appel de la methode is_list sur le validateur.On utilisera
256 l'operateur ET pour effectuer cette combinaison (AndVal).
259 min,max = self.GetMinMax()
263 # Dans le cas avec validateurs, pour que le mot cle soit considere
264 # comme acceptant une liste, il faut que max soit superieur a 1
265 # ET que la methode is_list du validateur retourne 1. Dans les autres cas
266 # on retournera 0 (n'attend pas de liste)
267 if self.definition.validators :
268 is_a_list= self.definition.validators.is_list() * is_a_list
271 def is_list_SansOrdreNiDoublon(self):
272 if self.definition.homo=="SansOrdreNiDoublon": return 1
277 Cette methode indique si le mot cle simple propose un choix (valeur de retour 1)
278 ou s'il n'en propose pas (valeur de retour 0)
280 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
281 Dans le cas sans validateur, l'information est donnee par l'attribut into
282 de la definition du mot cle.
283 Dans le cas avec validateurs, pour que le mot cle soit considere
284 comme proposant un choix, il faut que into soit present OU
285 que la methode has_into du validateur retourne 1. Dans les autres cas
286 on retournera 0 (ne propose pas de choix)
289 if self.definition.into:
291 elif self.definition.validators :
292 has_an_into= self.definition.validators.has_into()
297 """ Retourne les valeurs min et max de la definition de object """
298 return self.object.get_min_max()
300 def GetMultiplicite(self):
302 Retourne la multiplicite des valeurs affectees a l'objet
303 represente par l'item. Pour le moment retourne invariablement 1.
307 def GetIntervalle(self):
309 Retourne le domaine de valeur attendu par l'objet represente
312 return self.object.getintervalle()
314 def GetListeValeurs(self) :
315 """ Retourne la liste des valeurs de object """
316 valeurs=self.object.get_liste_valeurs()
318 if "R" in self.object.definition.type:
319 clef=self.object.GetNomConcept()
320 if self.appli.dict_reels.has_key(clef):
321 if type(valeurs) == types.TupleType:
324 if self.appli.dict_reels[clef].has_key(val) :
325 valeurs_reelles.append(self.appli.dict_reels[clef][val])
327 valeurs_reelles.append(val)
329 if self.appli.dict_reels[clef].has_key(valeurs):
330 valeurs_reelles=self.appli.dict_reels[clef][valeurs]
331 valeurs=valeurs_reelles
336 def get_liste_possible(self,listeActuelle=[]):
337 if hasattr(self.definition.validators,'into'):
338 valeurspossibles = self.definition.validators.into
340 valeurspossibles = self.get_definition().into
342 #On ne garde que les items valides
344 if type(valeurspossibles) in (types.ListType,types.TupleType) :
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 return listevalideliste
361 def get_liste_param_possible(self):
363 l1,l2=self.jdc.get_parametres_fonctions_avant_etape(self.get_etape())
364 for param in self.object.jdc.params:
365 if param.nom not in l1 : continue
366 encorevalide=self.valide_item(param.valeur)
368 type_param=param.valeur.__class__.__name__
369 for typ in self.definition.type:
371 liste_param.append(param)
372 if typ=='I' and type_param=='int':
373 liste_param.append(param)
374 if typ=='TXM' and type_param=='str':
375 liste_param.append(repr(param))
376 if ('grma' in repr(typ)) and type_param=='str':
377 liste_param.append(param.nom)
380 #--------------------------------------------------
382 # Methodes liees a la validite des valeurs saisies
384 #---------------------------------------------------
386 # valide_liste_partielle
387 # valide_liste_complete
393 def valide_item(self,item):
395 La validation est realisee directement par l'objet
397 return self.object.valide_item(item)
399 def valide_liste_partielle(self,item,listecourante):
400 #On protege la liste en entree en la copiant
401 valeur=listecourante[:]
403 return self.object.valid_valeur_partielle(valeur)
405 def valide_liste_complete (self,valeur):
406 return self.object.valid_valeur(valeur)
408 def valide_val (self,valeur):
409 return self.object.valid_val(valeur)
411 def info_erreur_item(self) :
413 if self.definition.validators :
414 commentaire=self.definition.validators.info_erreur_item()
419 if self.definition.validators :
420 commentaire=self.definition.validators.aide()
423 def info_erreur_liste(self) :
425 if self.definition.validators :
426 commentaire=self.definition.validators.info_erreur_liste()
429 def IsInIntervalle(self,valeur):
431 Retourne 1 si la valeur est dans l'intervalle permis par
432 l'objet represente par l'item.
434 return self.valide_item(valeur)
437 valide=self.object.isvalid()
440 #--------------------------------------------------
444 #---------------------------------------------------
448 # get_sd_avant_du_bon_type
452 def GetIconName(self):
454 return "ast-green-ball"
455 elif self.object.isoblig():
456 return "ast-red-ball"
458 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()
540 def wait_complex(self):
541 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
542 attend un complexe, 0 sinon """
543 if 'C' in self.object.definition.type:
549 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
550 attend un réel, 0 sinon """
551 if 'R' in self.object.definition.type:
557 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
558 attend un réel, 0 sinon """
559 if 'DateHHMMAAAA' in self.object.definition.type:
564 def wait_heure(self):
565 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
566 attend un réel, 0 sinon """
567 if 'HeureHHMMSS' in self.object.definition.type:
574 def wait_tuple(self):
575 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
576 attend un Tuple, 0 sinon """
577 for ss_type in self.object.definition.type:
578 if repr(ss_type).find('Tuple') != -1 :
582 def wait_matrice(self):
583 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
584 attend un Tuple, 0 sinon """
585 for ss_type in self.object.definition.type:
586 if repr(ss_type).find('Matrice') != -1 :
591 """Méthode booléenne qui retourne 1 si l'objet pointé par self
592 attend un objet de type ASSD ou dérivé, 0 sinon """
593 return self.object.wait_assd()
595 def wait_assd_or_type_base(self) :
597 if len(self.object.definition.type) > 1 :
598 if self.wait_reel() :
600 if 'I' in self.object.definition.type :
604 def wait_Salome(self):
605 type = self.object.definition.type[0]
606 if 'grma' in repr(type) : return True
607 if 'grno' in repr(type) : return True
608 if (isinstance(type, types.ClassType) and issubclass(type, SalomeEntry)) : return True
613 Retourne le type de valeur attendu par l'objet représenté par l'item.
615 return self.object.get_type()
617 #-----------------------------------------------------
619 # Methodes liees a l evaluation de la valeur saisie
621 #-----------------------------------------------------
627 def eval_valeur(self,valeur):
628 """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur de self :
629 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
630 - retourne 'valeur' (chaine de caractéres) sinon
632 newvaleur=self.eval_val(valeur)
635 def eval_valeur_BAK(self,valeur):
636 """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur
637 de l'objet pointé par self :
638 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
639 - retourne 'valeur' (chaine de caractéres) sinon
640 - retourne None en cas d invalidite
641 - retourne invalide si 1 des objets du tuple l est
644 if type(valeur) in (types.ListType,types.TupleType) :
647 newvaleur,validiteitem=self.eval_valeur_item(item)
648 valeurretour.append(newvaleur)
649 if validiteitem == 0:
652 valeurretour,validite= self.eval_valeur_item(valeur)
655 return valeurretour,validite
657 def eval_valeur_item(self,valeur):
658 """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
659 - va retourner la valeur de retour et la validite
660 selon le type de l objet attendu
661 - traite les reels et les parametres
663 #print "eval_valeur_item",valeur
664 if valeur==None or valeur == "" :
668 valeurinter = self.traite_reel(valeur)
669 if valeurinter != None :
670 valeurretour,validite= self.object.eval_valeur(valeurinter)
672 valeurretour,validite= self.object.eval_valeur(valeur)
673 elif self.wait_geom():
674 valeurretour,validite = valeur,1
676 valeurretour,validite= self.object.eval_valeur(valeur)
677 #print "eval_valeur_item",valeurretour,validite
680 if type(valeur) == types.StringType and self.object.wait_TXM():
681 essai_valeur="'" + valeur + "'"
682 valeurretour,validite= self.object.eval_valeur(essai_valeur)
684 if hasattr(valeurretour,'__class__'):
685 #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
686 if valeurretour.__class__.__name__ in ('PARAMETRE',):
690 # CCAR : il ne faut pas essayer de creer un concept
691 # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
693 #valeurretour=Accas.CO(valeur)
697 # on est dans le cas ou on a évalué et ou on n'aurait pas du
698 if self.object.wait_TXM() :
699 if type(valeurretour) != types.StringType:
700 valeurretour=str(valeur)
702 return valeurretour,validite
704 def is_CO(self,valeur=None):
706 Indique si valeur est un concept produit de la macro
707 Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
708 Si valeur vaut None on teste la valeur du mot cle
710 # Pour savoir si un concept est un nouveau concept de macro
711 # on regarde s'il est présent dans l'attribut sdprods de l'étape
712 # ou si son nom de classe est CO.
713 # Il faut faire les 2 tests car une macro non valide peut etre
714 # dans un etat pas tres catholique avec des CO pas encore types
715 # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
716 if not valeur:valeur=self.object.valeur
717 if valeur in self.object.etape.sdprods:return 1
718 if type(valeur) is not types.InstanceType:return 0
719 if valeur.__class__.__name__ == 'CO':return 1
722 def is_param(self,valeur) :
723 for param in self.jdc.params:
724 if (repr(param) == valeur):
728 def traite_reel(self,valeur):
730 Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
731 ou de détecter si on fait référence a un concept produit par DEFI_VALEUR
734 valeur = string.strip(valeur)
735 liste_reels = self.get_sd_avant_du_bon_type()
736 if valeur in liste_reels:
738 if len(valeur) >= 3 :
739 if valeur[0:4] == 'EVAL' :
740 # on a trouvé un EVAL --> on retourne directement la valeur
742 if string.find(valeur,'.') == -1 :
743 # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
744 if (self.is_param(valeur)):
747 if string.find(valeur,'e') != -1:
748 # Notation scientifique ?
761 treeitem = SIMPTreeItem