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 "____________________________", monNom, self.item.wait_co()
136 #print "____________________________", monNom, self.item.wait_assd()
137 # Gestion d'une seule valeur (eventuellement un tuple ou un complexe)
138 if maDefinition.max == 1 :
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_co():
182 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
183 from monWidgetUniqueSDCO import MonWidgetUniqueSDCO
184 widget=MonWidgetUniqueSDCO(self,maDefinition,monNom,monObjet,parentQt,maCommande)
186 from monWidgetSDCOInto import MonWidgetSDCOInto
187 widget=MonWidgetSDCOInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
188 elif self.item.wait_assd():
189 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
190 from monWidgetVide import MonWidgetVide
191 widget=MonWidgetVide(self,maDefinition,monNom,monObjet,parentQt,maCommande)
192 if len(self.item.get_sd_avant_du_bon_type()) < 4 :
193 from monWidgetRadioButton import MonWidgetRadioButtonSD
194 widget=MonWidgetRadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
195 elif len(self.item.get_sd_avant_du_bon_type()) < 7 :
196 from monWidget4a6RadioButton import MonWidget4a6RadioButtonSD
197 widget=MonWidget4a6RadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
199 from monWidgetCB import MonWidgetCBSD
200 widget=MonWidgetCBSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
202 elif self.item.wait_Salome() and self.editor.salome:
204 from monWidgetSimpSalome import MonWidgetSimpSalome
205 widget=MonWidgetSimpSalome(self,maDefinition,monNom,monObjet,parentQt,maCommande)
207 elif self.item.wait_TXM():
208 from monWidgetSimpTxt import MonWidgetSimpTxt
209 widget=MonWidgetSimpTxt(self,maDefinition,monNom,monObjet,parentQt,maCommande)
211 from monWidgetSimpBase import MonWidgetSimpBase
212 widget=MonWidgetSimpBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
216 if maDefinition.into != [] and maDefinition.into != None:
217 if self.item.is_list_SansOrdreNiDoublon():
218 from monWidgetPlusieursInto import MonWidgetPlusieursInto
219 widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
221 from monWidgetPlusieursIntoOrdonne import MonWidgetPlusieursIntoOrdonne
222 widget=MonWidgetPlusieursIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
224 from monWidgetPlusieursBase import MonWidgetPlusieursBase
225 widget=MonWidgetPlusieursBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
230 class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
237 #-----------------------------------------------
239 # Methodes liees aux informations sur le Panel
240 # ou au mot-clef simple
242 #-----------------------------------------------
244 # get_into a priori inutile --> commentee
246 # wait_into a priori inutile --> commentee
255 Cette methode indique si le mot cle simple attend une liste (valeur de retour 1)
256 ou s'il n'en attend pas (valeur de retour 0)
258 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
259 Dans le cas sans validateur, l'information est donnee par l'attribut max
260 de la definition du mot cle.
261 Dans le cas avec validateur, il faut combiner l'information precedente avec
262 celle issue de l'appel de la methode is_list sur le validateur.On utilisera
263 l'operateur ET pour effectuer cette combinaison (AndVal).
266 min,max = self.GetMinMax()
270 # Dans le cas avec validateurs, pour que le mot cle soit considere
271 # comme acceptant une liste, il faut que max soit superieur a 1
272 # ET que la methode is_list du validateur retourne 1. Dans les autres cas
273 # on retournera 0 (n'attend pas de liste)
274 if self.definition.validators :
275 is_a_list= self.definition.validators.is_list() * is_a_list
278 def is_list_SansOrdreNiDoublon(self):
279 if self.definition.homo=="SansOrdreNiDoublon": return 1
284 Cette methode indique si le mot cle simple propose un choix (valeur de retour 1)
285 ou s'il n'en propose pas (valeur de retour 0)
287 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
288 Dans le cas sans validateur, l'information est donnee par l'attribut into
289 de la definition du mot cle.
290 Dans le cas avec validateurs, pour que le mot cle soit considere
291 comme proposant un choix, il faut que into soit present OU
292 que la methode has_into du validateur retourne 1. Dans les autres cas
293 on retournera 0 (ne propose pas de choix)
296 if self.definition.into:
298 elif self.definition.validators :
299 has_an_into= self.definition.validators.has_into()
304 """ Retourne les valeurs min et max de la definition de object """
305 return self.object.get_min_max()
307 def GetMultiplicite(self):
309 Retourne la multiplicite des valeurs affectees a l'objet
310 represente par l'item. Pour le moment retourne invariablement 1.
314 def GetIntervalle(self):
316 Retourne le domaine de valeur attendu par l'objet represente
319 return self.object.getintervalle()
321 def GetListeValeurs(self) :
322 """ Retourne la liste des valeurs de object """
323 valeurs=self.object.get_liste_valeurs()
325 if "R" in self.object.definition.type:
326 clef=self.object.GetNomConcept()
327 if self.appli.dict_reels.has_key(clef):
328 if type(valeurs) == types.TupleType:
331 if self.appli.dict_reels[clef].has_key(val) :
332 valeurs_reelles.append(self.appli.dict_reels[clef][val])
334 valeurs_reelles.append(val)
336 if self.appli.dict_reels[clef].has_key(valeurs):
337 valeurs_reelles=self.appli.dict_reels[clef][valeurs]
338 valeurs=valeurs_reelles
343 def get_liste_possible(self,listeActuelle=[]):
344 if hasattr(self.definition.validators,'into'):
345 valeurspossibles = self.definition.validators.into
347 valeurspossibles = self.get_definition().into
349 #On ne garde que les items valides
351 if type(valeurspossibles) in (types.ListType,types.TupleType) :
354 valeurspossibles=(valeurspossibles,)
355 for item in valeurspossibles:
356 encorevalide=self.valide_item(item)
358 listevalideitem.append(item)
360 #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
362 for item in listevalideitem:
363 encorevalide=self.valide_liste_partielle(item,listeActuelle)
365 listevalideliste.append(item)
366 return listevalideliste
368 def get_liste_param_possible(self):
370 l1,l2=self.jdc.get_parametres_fonctions_avant_etape(self.get_etape())
371 for param in self.object.jdc.params:
372 if param.nom not in l1 : continue
373 encorevalide=self.valide_item(param.valeur)
375 type_param=param.valeur.__class__.__name__
376 for typ in self.definition.type:
378 liste_param.append(param)
379 if typ=='I' and type_param=='int':
380 liste_param.append(param)
381 if typ=='TXM' and type_param=='str':
382 liste_param.append(repr(param))
383 if ('grma' in repr(typ)) and type_param=='str':
384 liste_param.append(param.nom)
387 #--------------------------------------------------
389 # Methodes liees a la validite des valeurs saisies
391 #---------------------------------------------------
393 # valide_liste_partielle
394 # valide_liste_complete
400 def valide_item(self,item):
402 La validation est realisee directement par l'objet
404 return self.object.valide_item(item)
406 def valide_liste_partielle(self,item,listecourante):
407 #On protege la liste en entree en la copiant
408 valeur=listecourante[:]
410 return self.object.valid_valeur_partielle(valeur)
412 def valide_liste_complete (self,valeur):
413 return self.object.valid_valeur(valeur)
415 def valide_val (self,valeur):
416 return self.object.valid_val(valeur)
418 def info_erreur_item(self) :
420 if self.definition.validators :
421 commentaire=self.definition.validators.info_erreur_item()
426 if self.definition.validators :
427 commentaire=self.definition.validators.aide()
430 def info_erreur_liste(self) :
432 if self.definition.validators :
433 commentaire=self.definition.validators.info_erreur_liste()
436 def IsInIntervalle(self,valeur):
438 Retourne 1 si la valeur est dans l'intervalle permis par
439 l'objet represente par l'item.
441 return self.valide_item(valeur)
444 valide=self.object.isvalid()
447 #--------------------------------------------------
451 #---------------------------------------------------
455 # get_sd_avant_du_bon_type
459 def GetIconName(self):
461 return "ast-green-ball"
462 elif self.object.isoblig():
463 return "ast-red-ball"
465 return "ast-yel-ball"
471 Retourne le texte a afficher dans l'arbre representant la valeur de l'objet
474 text= self.object.GetText()
475 if text == None : text=""
479 def set_valeur_co(self,nom_co):
481 Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
483 ret = self.object.set_valeur_co(nom_co)
484 #print "set_valeur_co",ret
487 def get_sd_avant_du_bon_type(self):
489 Retourne la liste des noms des SD présentes avant l'étape qui contient
490 le MCS pointé par self et du type requis par ce MCS
492 a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
495 def get_sd_avant_du_bon_type_pour_type_de_base(self):
496 a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
502 def delete_valeur_co(self,valeur=None):
504 Supprime la valeur du mot cle (de type CO)
505 il faut propager la destruction aux autres etapes
507 if not valeur : valeur=self.object.valeur
508 # XXX faut il vraiment appeler del_sdprod ???
509 #self.object.etape.parent.del_sdprod(valeur)
510 self.object.etape.parent.delete_concept(valeur)
512 #-----------------------------------------------
514 # Methodes liees au type de l objet attendu
516 #-----------------------------------------------
526 Méthode booléenne qui retourne 1 si l'objet pointé par self
527 attend un objet de type ASSD qui n'existe pas encore (type CO()),
530 return self.object.wait_co()
532 def wait_fichier(self):
533 maDefinition=self.object.definition
535 if ('Repertoire' in maDefinition.type[0]) or ('Fichier' in maDefinition.type[0]) :
542 Méthode booléenne qui retourne 1 si l'objet pointé par self
543 attend un objet GEOM, 0 sinon
545 return self.object.wait_geom()
547 def wait_complex(self):
548 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
549 attend un complexe, 0 sinon """
550 if 'C' in self.object.definition.type:
556 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
557 attend un réel, 0 sinon """
558 if 'R' in self.object.definition.type:
564 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
565 attend un réel, 0 sinon """
566 if 'DateHHMMAAAA' in self.object.definition.type:
571 def wait_heure(self):
572 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
573 attend un réel, 0 sinon """
574 if 'HeureHHMMSS' in self.object.definition.type:
581 def wait_tuple(self):
582 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
583 attend un Tuple, 0 sinon """
584 for ss_type in self.object.definition.type:
585 if repr(ss_type).find('Tuple') != -1 :
589 def wait_matrice(self):
590 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
591 attend un Tuple, 0 sinon """
592 for ss_type in self.object.definition.type:
593 if repr(ss_type).find('Matrice') != -1 :
598 """Méthode booléenne qui retourne 1 si l'objet pointé par self
599 attend un objet de type ASSD ou dérivé, 0 sinon """
600 return self.object.wait_assd()
602 def wait_assd_or_type_base(self) :
604 if len(self.object.definition.type) > 1 :
605 if self.wait_reel() :
607 if 'I' in self.object.definition.type :
611 def wait_Salome(self):
612 type = self.object.definition.type[0]
613 if 'grma' in repr(type) : return True
614 if 'grno' in repr(type) : return True
615 if (isinstance(type, types.ClassType) and issubclass(type, SalomeEntry)) : return True
620 Retourne le type de valeur attendu par l'objet représenté par l'item.
622 return self.object.get_type()
624 #-----------------------------------------------------
626 # Methodes liees a l evaluation de la valeur saisie
628 #-----------------------------------------------------
634 def eval_valeur(self,valeur):
635 """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur de self :
636 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
637 - retourne 'valeur' (chaine de caractéres) sinon
639 newvaleur=self.eval_val(valeur)
642 def eval_valeur_BAK(self,valeur):
643 """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur
644 de l'objet pointé par self :
645 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
646 - retourne 'valeur' (chaine de caractéres) sinon
647 - retourne None en cas d invalidite
648 - retourne invalide si 1 des objets du tuple l est
651 if type(valeur) in (types.ListType,types.TupleType) :
654 newvaleur,validiteitem=self.eval_valeur_item(item)
655 valeurretour.append(newvaleur)
656 if validiteitem == 0:
659 valeurretour,validite= self.eval_valeur_item(valeur)
662 return valeurretour,validite
664 def eval_valeur_item(self,valeur):
665 """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
666 - va retourner la valeur de retour et la validite
667 selon le type de l objet attendu
668 - traite les reels et les parametres
670 #print "eval_valeur_item",valeur
671 if valeur==None or valeur == "" :
675 valeurinter = self.traite_reel(valeur)
676 if valeurinter != None :
677 valeurretour,validite= self.object.eval_valeur(valeurinter)
679 valeurretour,validite= self.object.eval_valeur(valeur)
680 elif self.wait_geom():
681 valeurretour,validite = valeur,1
683 valeurretour,validite= self.object.eval_valeur(valeur)
684 #print "eval_valeur_item",valeurretour,validite
687 if type(valeur) == types.StringType and self.object.wait_TXM():
688 essai_valeur="'" + valeur + "'"
689 valeurretour,validite= self.object.eval_valeur(essai_valeur)
691 if hasattr(valeurretour,'__class__'):
692 #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
693 if valeurretour.__class__.__name__ in ('PARAMETRE',):
697 # CCAR : il ne faut pas essayer de creer un concept
698 # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
700 #valeurretour=Accas.CO(valeur)
704 # on est dans le cas ou on a évalué et ou on n'aurait pas du
705 if self.object.wait_TXM() :
706 if type(valeurretour) != types.StringType:
707 valeurretour=str(valeur)
709 return valeurretour,validite
711 def is_CO(self,valeur=None):
713 Indique si valeur est un concept produit de la macro
714 Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
715 Si valeur vaut None on teste la valeur du mot cle
717 # Pour savoir si un concept est un nouveau concept de macro
718 # on regarde s'il est présent dans l'attribut sdprods de l'étape
719 # ou si son nom de classe est CO.
720 # Il faut faire les 2 tests car une macro non valide peut etre
721 # dans un etat pas tres catholique avec des CO pas encore types
722 # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
723 if not valeur:valeur=self.object.valeur
724 if valeur in self.object.etape.sdprods:return 1
725 if type(valeur) is not types.InstanceType:return 0
726 if valeur.__class__.__name__ == 'CO':return 1
729 def is_param(self,valeur) :
730 for param in self.jdc.params:
731 if (repr(param) == valeur):
735 def traite_reel(self,valeur):
737 Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
738 ou de détecter si on fait référence a un concept produit par DEFI_VALEUR
741 valeur = string.strip(valeur)
742 liste_reels = self.get_sd_avant_du_bon_type()
743 if valeur in liste_reels:
745 if len(valeur) >= 3 :
746 if valeur[0:4] == 'EVAL' :
747 # on a trouvé un EVAL --> on retourne directement la valeur
749 if string.find(valeur,'.') == -1 :
750 # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
751 if (self.is_param(valeur)):
754 if string.find(valeur,'e') != -1:
755 # Notation scientifique ?
768 treeitem = SIMPTreeItem