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_co():
175 from monWidgetSimpASSD import MonWidgetSimpASSD
176 widget=MonWidgetSimpASSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
178 elif self.item.wait_Salome() and self.editor.salome:
180 from monWidgetSimpSalome import MonWidgetSimpSalome
181 widget=MonWidgetSimpSalome(self,maDefinition,monNom,monObjet,parentQt,maCommande)
183 elif self.item.wait_TXM():
184 from monWidgetSimpTxt import MonWidgetSimpTxt
185 widget=MonWidgetSimpTxt(self,maDefinition,monNom,monObjet,parentQt,maCommande)
187 from monWidgetSimpBase import MonWidgetSimpBase
188 widget=MonWidgetSimpBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
192 if maDefinition.into != [] and maDefinition.into != None:
193 if self.item.is_list_SansOrdreNiDoublon():
194 from monWidgetPlusieursInto import MonWidgetPlusieursInto
195 widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
197 from monWidgetPlusieursIntoOrdonne import MonWidgetPlusieursIntoOrdonne
198 widget=MonWidgetPlusieursIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
200 from monWidgetPlusieursBase import MonWidgetPlusieursBase
201 widget=MonWidgetPlusieursBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
206 class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
213 #-----------------------------------------------
215 # Methodes liees aux informations sur le Panel
216 # ou au mot-clef simple
218 #-----------------------------------------------
220 # get_into a priori inutile --> commentee
222 # wait_into a priori inutile --> commentee
231 Cette methode indique si le mot cle simple attend une liste (valeur de retour 1)
232 ou s'il n'en attend pas (valeur de retour 0)
234 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
235 Dans le cas sans validateur, l'information est donnee par l'attribut max
236 de la definition du mot cle.
237 Dans le cas avec validateur, il faut combiner l'information precedente avec
238 celle issue de l'appel de la methode is_list sur le validateur.On utilisera
239 l'operateur ET pour effectuer cette combinaison (AndVal).
242 min,max = self.GetMinMax()
246 # Dans le cas avec validateurs, pour que le mot cle soit considere
247 # comme acceptant une liste, il faut que max soit superieur a 1
248 # ET que la methode is_list du validateur retourne 1. Dans les autres cas
249 # on retournera 0 (n'attend pas de liste)
250 if self.definition.validators :
251 is_a_list= self.definition.validators.is_list() * is_a_list
254 def is_list_SansOrdreNiDoublon(self):
255 if self.definition.homo=="SansOrdreNiDoublon": 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 self.appli.dict_reels.has_key(clef):
304 if type(valeurs) == types.TupleType:
307 if self.appli.dict_reels[clef].has_key(val) :
308 valeurs_reelles.append(self.appli.dict_reels[clef][val])
310 valeurs_reelles.append(val)
312 if self.appli.dict_reels[clef].has_key(valeurs):
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 #On ne garde que les items valides
327 if type(valeurspossibles) in (types.ListType,types.TupleType) :
330 valeurspossibles=(valeurspossibles,)
331 for item in valeurspossibles:
332 encorevalide=self.valide_item(item)
334 listevalideitem.append(item)
336 #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
338 for item in listevalideitem:
339 encorevalide=self.valide_liste_partielle(item,listeActuelle)
341 listevalideliste.append(item)
342 return listevalideliste
344 def get_liste_param_possible(self):
346 l1,l2=self.jdc.get_parametres_fonctions_avant_etape(self.get_etape())
347 for param in self.object.jdc.params:
348 if param.nom not in l1 : continue
349 encorevalide=self.valide_item(param.valeur)
351 type_param=param.valeur.__class__.__name__
352 for typ in self.definition.type:
354 liste_param.append(param)
355 if typ=='I' and type_param=='int':
356 liste_param.append(param)
357 if typ=='TXM' and type_param=='str':
358 liste_param.append(repr(param))
359 if ('grma' in repr(typ)) and type_param=='str':
360 liste_param.append(param.nom)
363 #--------------------------------------------------
365 # Methodes liees a la validite des valeurs saisies
367 #---------------------------------------------------
369 # valide_liste_partielle
370 # valide_liste_complete
376 def valide_item(self,item):
378 La validation est realisee directement par l'objet
380 return self.object.valide_item(item)
382 def valide_liste_partielle(self,item,listecourante):
383 #On protege la liste en entree en la copiant
384 valeur=listecourante[:]
386 return self.object.valid_valeur_partielle(valeur)
388 def valide_liste_complete (self,valeur):
389 return self.object.valid_valeur(valeur)
391 def valide_val (self,valeur):
392 return self.object.valid_val(valeur)
394 def info_erreur_item(self) :
396 if self.definition.validators :
397 commentaire=self.definition.validators.info_erreur_item()
402 if self.definition.validators :
403 commentaire=self.definition.validators.aide()
406 def info_erreur_liste(self) :
408 if self.definition.validators :
409 commentaire=self.definition.validators.info_erreur_liste()
412 def IsInIntervalle(self,valeur):
414 Retourne 1 si la valeur est dans l'intervalle permis par
415 l'objet represente par l'item.
417 return self.valide_item(valeur)
420 valide=self.object.isvalid()
423 #--------------------------------------------------
427 #---------------------------------------------------
431 # get_sd_avant_du_bon_type
435 def GetIconName(self):
437 return "ast-green-ball"
438 elif self.object.isoblig():
439 return "ast-red-ball"
441 return "ast-yel-ball"
447 Retourne le texte a afficher dans l'arbre representant la valeur de l'objet
450 text= self.object.GetText()
451 if text == None : text=""
455 def set_valeur_co(self,nom_co):
457 Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
459 ret = self.object.set_valeur_co(nom_co)
460 #print "set_valeur_co",ret
463 def get_sd_avant_du_bon_type(self):
465 Retourne la liste des noms des SD présentes avant l'étape qui contient
466 le MCS pointé par self et du type requis par ce MCS
468 a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
471 def get_sd_avant_du_bon_type_pour_type_de_base(self):
472 a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
478 def delete_valeur_co(self,valeur=None):
480 Supprime la valeur du mot cle (de type CO)
481 il faut propager la destruction aux autres etapes
483 if not valeur : valeur=self.object.valeur
484 # XXX faut il vraiment appeler del_sdprod ???
485 #self.object.etape.parent.del_sdprod(valeur)
486 self.object.etape.parent.delete_concept(valeur)
488 #-----------------------------------------------
490 # Methodes liees au type de l objet attendu
492 #-----------------------------------------------
502 Méthode booléenne qui retourne 1 si l'objet pointé par self
503 attend un objet de type ASSD qui n'existe pas encore (type CO()),
506 return self.object.wait_co()
508 def wait_fichier(self):
509 maDefinition=self.object.definition
511 if ('Repertoire' in maDefinition.type[0]) or ('Fichier' in maDefinition.type[0]) :
518 Méthode booléenne qui retourne 1 si l'objet pointé par self
519 attend un objet GEOM, 0 sinon
521 return self.object.wait_geom()
523 def wait_complex(self):
524 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
525 attend un complexe, 0 sinon """
526 if 'C' in self.object.definition.type:
532 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
533 attend un réel, 0 sinon """
534 if 'R' in self.object.definition.type:
540 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
541 attend un réel, 0 sinon """
542 if 'DateHHMMAAAA' in self.object.definition.type:
547 def wait_heure(self):
548 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
549 attend un réel, 0 sinon """
550 if 'HeureHHMMSS' in self.object.definition.type:
557 def wait_tuple(self):
558 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
559 attend un Tuple, 0 sinon """
560 for ss_type in self.object.definition.type:
561 if repr(ss_type).find('Tuple') != -1 :
565 def wait_matrice(self):
566 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
567 attend un Tuple, 0 sinon """
568 for ss_type in self.object.definition.type:
569 if repr(ss_type).find('Matrice') != -1 :
574 """Méthode booléenne qui retourne 1 si l'objet pointé par self
575 attend un objet de type ASSD ou dérivé, 0 sinon """
576 return self.object.wait_assd()
578 def wait_assd_or_type_base(self) :
580 if len(self.object.definition.type) > 1 :
581 if self.wait_reel() :
583 if 'I' in self.object.definition.type :
587 def wait_Salome(self):
588 type = self.object.definition.type[0]
589 if 'grma' in repr(type) : return True
590 if 'grno' in repr(type) : return True
591 if (isinstance(type, types.ClassType) and issubclass(type, SalomeEntry)) : return True
596 Retourne le type de valeur attendu par l'objet représenté par l'item.
598 return self.object.get_type()
600 #-----------------------------------------------------
602 # Methodes liees a l evaluation de la valeur saisie
604 #-----------------------------------------------------
610 def eval_valeur(self,valeur):
611 """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur de self :
612 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
613 - retourne 'valeur' (chaine de caractéres) sinon
615 newvaleur=self.eval_val(valeur)
618 def eval_valeur_BAK(self,valeur):
619 """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur
620 de l'objet pointé par self :
621 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
622 - retourne 'valeur' (chaine de caractéres) sinon
623 - retourne None en cas d invalidite
624 - retourne invalide si 1 des objets du tuple l est
627 if type(valeur) in (types.ListType,types.TupleType) :
630 newvaleur,validiteitem=self.eval_valeur_item(item)
631 valeurretour.append(newvaleur)
632 if validiteitem == 0:
635 valeurretour,validite= self.eval_valeur_item(valeur)
638 return valeurretour,validite
640 def eval_valeur_item(self,valeur):
641 """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
642 - va retourner la valeur de retour et la validite
643 selon le type de l objet attendu
644 - traite les reels et les parametres
646 #print "eval_valeur_item",valeur
647 if valeur==None or valeur == "" :
651 valeurinter = self.traite_reel(valeur)
652 if valeurinter != None :
653 valeurretour,validite= self.object.eval_valeur(valeurinter)
655 valeurretour,validite= self.object.eval_valeur(valeur)
656 elif self.wait_geom():
657 valeurretour,validite = valeur,1
659 valeurretour,validite= self.object.eval_valeur(valeur)
660 #print "eval_valeur_item",valeurretour,validite
663 if type(valeur) == types.StringType and self.object.wait_TXM():
664 essai_valeur="'" + valeur + "'"
665 valeurretour,validite= self.object.eval_valeur(essai_valeur)
667 if hasattr(valeurretour,'__class__'):
668 #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
669 if valeurretour.__class__.__name__ in ('PARAMETRE',):
673 # CCAR : il ne faut pas essayer de creer un concept
674 # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
676 #valeurretour=Accas.CO(valeur)
680 # on est dans le cas ou on a évalué et ou on n'aurait pas du
681 if self.object.wait_TXM() :
682 if type(valeurretour) != types.StringType:
683 valeurretour=str(valeur)
685 return valeurretour,validite
687 def is_CO(self,valeur=None):
689 Indique si valeur est un concept produit de la macro
690 Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
691 Si valeur vaut None on teste la valeur du mot cle
693 # Pour savoir si un concept est un nouveau concept de macro
694 # on regarde s'il est présent dans l'attribut sdprods de l'étape
695 # ou si son nom de classe est CO.
696 # Il faut faire les 2 tests car une macro non valide peut etre
697 # dans un etat pas tres catholique avec des CO pas encore types
698 # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
699 if not valeur:valeur=self.object.valeur
700 if valeur in self.object.etape.sdprods:return 1
701 if type(valeur) is not types.InstanceType:return 0
702 if valeur.__class__.__name__ == 'CO':return 1
705 def is_param(self,valeur) :
706 for param in self.jdc.params:
707 if (repr(param) == valeur):
711 def traite_reel(self,valeur):
713 Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
714 ou de détecter si on fait référence a un concept produit par DEFI_VALEUR
717 valeur = string.strip(valeur)
718 liste_reels = self.get_sd_avant_du_bon_type()
719 if valeur in liste_reels:
721 if len(valeur) >= 3 :
722 if valeur[0:4] == 'EVAL' :
723 # on a trouvé un EVAL --> on retourne directement la valeur
725 if string.find(valeur,'.') == -1 :
726 # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
727 if (self.is_param(valeur)):
730 if string.find(valeur,'e') != -1:
731 # Notation scientifique ?
744 treeitem = SIMPTreeItem