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
122 # Attention l ordre des if est important
123 # Attention il faut gerer les blocs et les facteurs
124 # a gerer comme dans composimp
125 # Gerer les matrices --> Actuellement pas dans ce type de panneau
127 #print "____________________________", self.item.wait_tuple()
128 # Gestion d'une seule valeur (eventuellement un tuple ou un complexe)
129 if maDefinition.max == 1 :
131 # Listes de valeur discretes
132 if maDefinition.into != [] and maDefinition.into != None:
133 if len(maDefinition.into) < 4 :
134 from monWidgetRadioButton import MonWidgetRadioButton
135 widget=MonWidgetRadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
136 elif len(maDefinition.into) < 7 :
137 from monWidget4a6RadioButton import MonWidget4a6RadioButton
138 widget=MonWidget4a6RadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
140 from monWidgetCB import MonWidgetCB
141 widget=MonWidgetCB(self,maDefinition,monNom,monObjet,parentQt,maCommande)
143 elif self.item.wait_bool() :
144 from monWidgetSimpBool import MonWidgetSimpBool
145 widget=MonWidgetSimpBool(self,maDefinition,monNom,monObjet,parentQt,maCommande)
146 elif self.item.wait_fichier():
147 from monWidgetSimpFichier import MonWidgetSimpFichier
148 widget=MonWidgetSimpFichier(self,maDefinition,monNom,monObjet,parentQt,maCommande)
151 elif self.item.wait_date():
152 from monWidgetDate import MonWidgetDate
153 widget=MonWidgetDate(self,maDefinition,monNom,monObjet,parentQt,maCommande)
154 elif self.item.wait_heure():
155 from monWidgetHeure import MonWidgetHeure
156 widget=MonWidgetHeure(self,maDefinition,monNom,monObjet,parentQt,maCommande)
158 elif self.item.wait_tuple() :
159 if self.item.object.definition.type[0].ntuple == 2:
160 from monWidgetSimpTuple2 import MonWidgetSimpTuple2
161 widget=MonWidgetSimpTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
162 elif self.item.object.definition.type[0].ntuple == 3 :
163 from monWidgetSimpTuple3 import MonWidgetSimpTuple3
164 widget=MonWidgetSimpTuple3(self,maDefinition,monNom,monObjet,parentQt,maCommande)
166 print "Pas de Tuple de longueur > 3"
167 print "Prevenir la maintenance "
169 elif self.item.wait_complex():
170 from monWidgetSimpComplexe import MonWidgetSimpComplexe
171 widget=MonWidgetSimpComplexe(self,maDefinition,monNom,monObjet,parentQt,maCommande)
173 elif self.item.wait_assd():
174 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
175 from monWidgetVide import MonWidgetVide
176 widget=MonWidgetVide(self,maDefinition,monNom,monObjet,parentQt,maCommande)
177 if len(self.item.get_sd_avant_du_bon_type()) < 4 :
178 from monWidgetRadioButton import MonWidgetRadioButtonSD
179 widget=MonWidgetRadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
180 elif len(self.item.get_sd_avant_du_bon_type()) < 7 :
181 from monWidget4a6RadioButton import MonWidget4a6RadioButtonSD
182 widget=MonWidget4a6RadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
184 from monWidgetCB import MonWidgetCBSD
185 widget=MonWidgetCBSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
187 elif self.item.wait_Salome() and self.editor.salome:
189 from monWidgetSimpSalome import MonWidgetSimpSalome
190 widget=MonWidgetSimpSalome(self,maDefinition,monNom,monObjet,parentQt,maCommande)
192 elif self.item.wait_TXM():
193 from monWidgetSimpTxt import MonWidgetSimpTxt
194 widget=MonWidgetSimpTxt(self,maDefinition,monNom,monObjet,parentQt,maCommande)
196 from monWidgetSimpBase import MonWidgetSimpBase
197 widget=MonWidgetSimpBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
201 if maDefinition.into != [] and maDefinition.into != None:
202 if self.item.is_list_SansOrdreNiDoublon():
203 from monWidgetPlusieursInto import MonWidgetPlusieursInto
204 widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
206 from monWidgetPlusieursIntoOrdonne import MonWidgetPlusieursIntoOrdonne
207 widget=MonWidgetPlusieursIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
209 from monWidgetPlusieursBase import MonWidgetPlusieursBase
210 widget=MonWidgetPlusieursBase(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
269 Cette methode indique si le mot cle simple propose un choix (valeur de retour 1)
270 ou s'il n'en propose pas (valeur de retour 0)
272 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
273 Dans le cas sans validateur, l'information est donnee par l'attribut into
274 de la definition du mot cle.
275 Dans le cas avec validateurs, pour que le mot cle soit considere
276 comme proposant un choix, il faut que into soit present OU
277 que la methode has_into du validateur retourne 1. Dans les autres cas
278 on retournera 0 (ne propose pas de choix)
281 if self.definition.into:
283 elif self.definition.validators :
284 has_an_into= self.definition.validators.has_into()
289 """ Retourne les valeurs min et max de la definition de object """
290 return self.object.get_min_max()
292 def GetMultiplicite(self):
294 Retourne la multiplicite des valeurs affectees a l'objet
295 represente par l'item. Pour le moment retourne invariablement 1.
299 def GetIntervalle(self):
301 Retourne le domaine de valeur attendu par l'objet represente
304 return self.object.getintervalle()
306 def GetListeValeurs(self) :
307 """ Retourne la liste des valeurs de object """
308 valeurs=self.object.get_liste_valeurs()
310 if "R" in self.object.definition.type:
311 clef=self.object.GetNomConcept()
312 if self.appli.dict_reels.has_key(clef):
313 if type(valeurs) == types.TupleType:
316 if self.appli.dict_reels[clef].has_key(val) :
317 valeurs_reelles.append(self.appli.dict_reels[clef][val])
319 valeurs_reelles.append(val)
321 if self.appli.dict_reels[clef].has_key(valeurs):
322 valeurs_reelles=self.appli.dict_reels[clef][valeurs]
323 valeurs=valeurs_reelles
328 def get_liste_possible(self,listeActuelle=[]):
329 if hasattr(self.definition.validators,'into'):
330 valeurspossibles = self.definition.validators.into
332 valeurspossibles = self.get_definition().into
334 #On ne garde que les items valides
336 if type(valeurspossibles) in (types.ListType,types.TupleType) :
339 valeurspossibles=(valeurspossibles,)
340 for item in valeurspossibles:
341 encorevalide=self.valide_item(item)
343 listevalideitem.append(item)
345 #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
347 for item in listevalideitem:
348 encorevalide=self.valide_liste_partielle(item,listeActuelle)
350 listevalideliste.append(item)
351 return listevalideliste
353 def get_liste_param_possible(self):
355 l1,l2=self.jdc.get_parametres_fonctions_avant_etape(self.get_etape())
356 for param in self.object.jdc.params:
357 if param.nom not in l1 : continue
358 encorevalide=self.valide_item(param.valeur)
360 type_param=param.valeur.__class__.__name__
361 for typ in self.definition.type:
363 liste_param.append(param)
364 if typ=='I' and type_param=='int':
365 liste_param.append(param)
366 if typ=='TXM' and type_param=='str':
367 liste_param.append(repr(param))
368 if ('grma' in repr(typ)) and type_param=='str':
369 liste_param.append(param.nom)
372 #--------------------------------------------------
374 # Methodes liees a la validite des valeurs saisies
376 #---------------------------------------------------
378 # valide_liste_partielle
379 # valide_liste_complete
385 def valide_item(self,item):
387 La validation est realisee directement par l'objet
389 return self.object.valide_item(item)
391 def valide_liste_partielle(self,item,listecourante):
392 #On protege la liste en entree en la copiant
393 valeur=listecourante[:]
395 return self.object.valid_valeur_partielle(valeur)
397 def valide_liste_complete (self,valeur):
398 return self.object.valid_valeur(valeur)
400 def valide_val (self,valeur):
401 return self.object.valid_val(valeur)
403 def info_erreur_item(self) :
405 if self.definition.validators :
406 commentaire=self.definition.validators.info_erreur_item()
411 if self.definition.validators :
412 commentaire=self.definition.validators.aide()
415 def info_erreur_liste(self) :
417 if self.definition.validators :
418 commentaire=self.definition.validators.info_erreur_liste()
421 def IsInIntervalle(self,valeur):
423 Retourne 1 si la valeur est dans l'intervalle permis par
424 l'objet represente par l'item.
426 return self.valide_item(valeur)
429 valide=self.object.isvalid()
432 #--------------------------------------------------
436 #---------------------------------------------------
440 # get_sd_avant_du_bon_type
444 def GetIconName(self):
446 return "ast-green-ball"
447 elif self.object.isoblig():
448 return "ast-red-ball"
450 return "ast-yel-ball"
456 Retourne le texte a afficher dans l'arbre representant la valeur de l'objet
459 text= self.object.GetText()
460 if text == None : text=""
464 def set_valeur_co(self,nom_co):
466 Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
468 ret = self.object.set_valeur_co(nom_co)
469 #print "set_valeur_co",ret
472 def get_sd_avant_du_bon_type(self):
474 Retourne la liste des noms des SD présentes avant l'étape qui contient
475 le MCS pointé par self et du type requis par ce MCS
477 a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
480 def get_sd_avant_du_bon_type_pour_type_de_base(self):
481 a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
487 def delete_valeur_co(self,valeur=None):
489 Supprime la valeur du mot cle (de type CO)
490 il faut propager la destruction aux autres etapes
492 if not valeur : valeur=self.object.valeur
493 # XXX faut il vraiment appeler del_sdprod ???
494 #self.object.etape.parent.del_sdprod(valeur)
495 self.object.etape.parent.delete_concept(valeur)
497 #-----------------------------------------------
499 # Methodes liees au type de l objet attendu
501 #-----------------------------------------------
511 Méthode booléenne qui retourne 1 si l'objet pointé par self
512 attend un objet de type ASSD qui n'existe pas encore (type CO()),
515 return self.object.wait_co()
517 def wait_fichier(self):
518 maDefinition=self.object.definition
520 if ('Repertoire' in maDefinition.type[0]) or ('Fichier' in maDefinition.type[0]) :
527 Méthode booléenne qui retourne 1 si l'objet pointé par self
528 attend un objet GEOM, 0 sinon
530 return self.object.wait_geom()
532 def wait_complex(self):
533 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
534 attend un complexe, 0 sinon """
535 if 'C' in self.object.definition.type:
541 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
542 attend un réel, 0 sinon """
543 if 'R' 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 'DateHHMMAAAA' in self.object.definition.type:
556 def wait_heure(self):
557 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
558 attend un réel, 0 sinon """
559 if 'HeureHHMMSS' in self.object.definition.type:
566 def wait_tuple(self):
567 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
568 attend un Tuple, 0 sinon """
569 for ss_type in self.object.definition.type:
570 if repr(ss_type).find('Tuple') != -1 :
574 def wait_matrice(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('Matrice') != -1 :
583 """Méthode booléenne qui retourne 1 si l'objet pointé par self
584 attend un objet de type ASSD ou dérivé, 0 sinon """
585 return self.object.wait_assd()
587 def wait_assd_or_type_base(self) :
589 if len(self.object.definition.type) > 1 :
590 if self.wait_reel() :
592 if 'I' in self.object.definition.type :
596 def wait_Salome(self):
597 type = self.object.definition.type[0]
598 if 'grma' in repr(type) : return True
599 if 'grno' in repr(type) : return True
600 if (isinstance(type, types.ClassType) and issubclass(type, 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'interprétation de 'valeur' (chaine de caractéres) comme valeur de self :
621 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
622 - retourne 'valeur' (chaine de caractéres) sinon
624 newvaleur=self.eval_val(valeur)
627 def eval_valeur_BAK(self,valeur):
628 """ Lance l'interprétation 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 (types.ListType,types.TupleType) :
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) == types.StringType 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) != types.StringType:
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 = string.strip(valeur)
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 string.find(valeur,'.') == -1 :
735 # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
736 if (self.is_param(valeur)):
739 if string.find(valeur,'e') != -1:
740 # Notation scientifique ?
753 treeitem = SIMPTreeItem