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 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 # Gestion des matrices
134 if self.item.wait_matrice ():
135 from monWidgetMatrice import MonWidgetMatrice
136 widget=MonWidgetMatrice(self,maDefinition,monNom,monObjet,parentQt,maCommande)
140 #print "____________________________", monNom, self.item.wait_co()
141 #print "____________________________", monNom, self.item.wait_assd()
142 # Gestion d'une seule valeur (eventuellement un tuple ou un complexe)
143 if maDefinition.max == 1 :
145 if maDefinition.into != [] and maDefinition.into != None:
146 if len(maDefinition.into) < 4 :
147 from monWidgetRadioButton import MonWidgetRadioButton
148 widget=MonWidgetRadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
149 elif len(maDefinition.into) < 7 :
150 from monWidget4a6RadioButton import MonWidget4a6RadioButton
151 widget=MonWidget4a6RadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
153 from monWidgetCB import MonWidgetCB
154 widget=MonWidgetCB(self,maDefinition,monNom,monObjet,parentQt,maCommande)
156 elif self.item.wait_bool() :
157 from monWidgetSimpBool import MonWidgetSimpBool
158 widget=MonWidgetSimpBool(self,maDefinition,monNom,monObjet,parentQt,maCommande)
159 elif self.item.wait_fichier():
160 from monWidgetSimpFichier import MonWidgetSimpFichier
161 widget=MonWidgetSimpFichier(self,maDefinition,monNom,monObjet,parentQt,maCommande)
164 elif self.item.wait_date():
165 from monWidgetDate import MonWidgetDate
166 widget=MonWidgetDate(self,maDefinition,monNom,monObjet,parentQt,maCommande)
167 elif self.item.wait_heure():
168 from monWidgetHeure import MonWidgetHeure
169 widget=MonWidgetHeure(self,maDefinition,monNom,monObjet,parentQt,maCommande)
171 elif self.item.wait_tuple() :
172 if self.item.object.definition.type[0].ntuple == 2:
173 from monWidgetSimpTuple2 import MonWidgetSimpTuple2
174 widget=MonWidgetSimpTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
175 elif self.item.object.definition.type[0].ntuple == 3 :
176 from monWidgetSimpTuple3 import MonWidgetSimpTuple3
177 widget=MonWidgetSimpTuple3(self,maDefinition,monNom,monObjet,parentQt,maCommande)
179 print "Pas de Tuple de longueur > 3"
180 print "Prevenir la maintenance "
182 elif self.item.wait_complex():
183 from monWidgetSimpComplexe import MonWidgetSimpComplexe
184 widget=MonWidgetSimpComplexe(self,maDefinition,monNom,monObjet,parentQt,maCommande)
186 elif self.item.wait_co():
187 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
188 from monWidgetUniqueSDCO import MonWidgetUniqueSDCO
189 widget=MonWidgetUniqueSDCO(self,maDefinition,monNom,monObjet,parentQt,maCommande)
191 from monWidgetSDCOInto import MonWidgetSDCOInto
192 widget=MonWidgetSDCOInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
193 elif self.item.wait_assd():
194 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
195 from monWidgetVide import MonWidgetVide
196 widget=MonWidgetVide(self,maDefinition,monNom,monObjet,parentQt,maCommande)
197 if len(self.item.get_sd_avant_du_bon_type()) < 4 :
198 from monWidgetRadioButton import MonWidgetRadioButtonSD
199 widget=MonWidgetRadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
200 elif len(self.item.get_sd_avant_du_bon_type()) < 7 :
201 from monWidget4a6RadioButton import MonWidget4a6RadioButtonSD
202 widget=MonWidget4a6RadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
204 from monWidgetCB import MonWidgetCBSD
205 widget=MonWidgetCBSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
207 elif self.item.wait_Salome() and self.editor.salome:
209 from monWidgetSimpSalome import MonWidgetSimpSalome
210 widget=MonWidgetSimpSalome(self,maDefinition,monNom,monObjet,parentQt,maCommande)
212 elif self.item.wait_TXM():
213 from monWidgetSimpTxt import MonWidgetSimpTxt
214 widget=MonWidgetSimpTxt(self,maDefinition,monNom,monObjet,parentQt,maCommande)
216 from monWidgetSimpBase import MonWidgetSimpBase
217 widget=MonWidgetSimpBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
221 if maDefinition.into != [] and maDefinition.into != None:
222 if self.item.is_list_SansOrdreNiDoublon():
223 from monWidgetPlusieursInto import MonWidgetPlusieursInto
224 widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
226 from monWidgetPlusieursIntoOrdonne import MonWidgetPlusieursIntoOrdonne
227 widget=MonWidgetPlusieursIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
229 from monWidgetPlusieursBase import MonWidgetPlusieursBase
230 widget=MonWidgetPlusieursBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
235 class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
242 #-----------------------------------------------
244 # Methodes liees aux informations sur le Panel
245 # ou au mot-clef simple
247 #-----------------------------------------------
249 # get_into a priori inutile --> commentee
251 # wait_into a priori inutile --> commentee
260 Cette methode indique si le mot cle simple attend une liste (valeur de retour 1)
261 ou s'il n'en attend 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 max
265 de la definition du mot cle.
266 Dans le cas avec validateur, il faut combiner l'information precedente avec
267 celle issue de l'appel de la methode is_list sur le validateur.On utilisera
268 l'operateur ET pour effectuer cette combinaison (AndVal).
271 min,max = self.GetMinMax()
275 # Dans le cas avec validateurs, pour que le mot cle soit considere
276 # comme acceptant une liste, il faut que max soit superieur a 1
277 # ET que la methode is_list du validateur retourne 1. Dans les autres cas
278 # on retournera 0 (n'attend pas de liste)
279 if self.definition.validators :
280 is_a_list= self.definition.validators.is_list() * is_a_list
283 def is_list_SansOrdreNiDoublon(self):
284 if self.definition.homo=="SansOrdreNiDoublon": return 1
289 Cette methode indique si le mot cle simple propose un choix (valeur de retour 1)
290 ou s'il n'en propose pas (valeur de retour 0)
292 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
293 Dans le cas sans validateur, l'information est donnee par l'attribut into
294 de la definition du mot cle.
295 Dans le cas avec validateurs, pour que le mot cle soit considere
296 comme proposant un choix, il faut que into soit present OU
297 que la methode has_into du validateur retourne 1. Dans les autres cas
298 on retournera 0 (ne propose pas de choix)
301 if self.definition.into:
303 elif self.definition.validators :
304 has_an_into= self.definition.validators.has_into()
309 """ Retourne les valeurs min et max de la definition de object """
310 return self.object.get_min_max()
312 def GetMultiplicite(self):
314 Retourne la multiplicite des valeurs affectees a l'objet
315 represente par l'item. Pour le moment retourne invariablement 1.
319 def GetIntervalle(self):
321 Retourne le domaine de valeur attendu par l'objet represente
324 return self.object.getintervalle()
326 def GetListeValeurs(self) :
327 """ Retourne la liste des valeurs de object """
328 valeurs=self.object.get_liste_valeurs()
330 if "R" in self.object.definition.type:
331 clef=self.object.GetNomConcept()
332 if self.appli.dict_reels.has_key(clef):
333 if type(valeurs) == types.TupleType:
336 if self.appli.dict_reels[clef].has_key(val) :
337 valeurs_reelles.append(self.appli.dict_reels[clef][val])
339 valeurs_reelles.append(val)
341 if self.appli.dict_reels[clef].has_key(valeurs):
342 valeurs_reelles=self.appli.dict_reels[clef][valeurs]
343 valeurs=valeurs_reelles
348 def get_liste_possible(self,listeActuelle=[]):
349 if hasattr(self.definition.validators,'into'):
350 valeurspossibles = self.definition.validators.into
352 valeurspossibles = self.get_definition().into
354 #On ne garde que les items valides
356 if type(valeurspossibles) in (types.ListType,types.TupleType) :
359 valeurspossibles=(valeurspossibles,)
360 for item in valeurspossibles:
361 encorevalide=self.valide_item(item)
363 listevalideitem.append(item)
365 #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
367 for item in listevalideitem:
368 encorevalide=self.valide_liste_partielle(item,listeActuelle)
370 listevalideliste.append(item)
371 return listevalideliste
373 def get_liste_param_possible(self):
375 l1,l2=self.jdc.get_parametres_fonctions_avant_etape(self.get_etape())
376 for param in self.object.jdc.params:
377 if param.nom not in l1 : continue
378 encorevalide=self.valide_item(param.valeur)
380 type_param=param.valeur.__class__.__name__
381 for typ in self.definition.type:
383 liste_param.append(param)
384 if typ=='I' and type_param=='int':
385 liste_param.append(param)
386 if typ=='TXM' and type_param=='str':
387 liste_param.append(repr(param))
388 if ('grma' in repr(typ)) and type_param=='str':
389 liste_param.append(param.nom)
392 #--------------------------------------------------
394 # Methodes liees a la validite des valeurs saisies
396 #---------------------------------------------------
398 # valide_liste_partielle
399 # valide_liste_complete
405 def valide_item(self,item):
407 La validation est realisee directement par l'objet
409 return self.object.valide_item(item)
411 def valide_liste_partielle(self,item,listecourante):
412 #On protege la liste en entree en la copiant
413 valeur=listecourante[:]
415 return self.object.valid_valeur_partielle(valeur)
417 def valide_liste_complete (self,valeur):
418 return self.object.valid_valeur(valeur)
420 def valide_val (self,valeur):
421 return self.object.valid_val(valeur)
423 def info_erreur_item(self) :
425 if self.definition.validators :
426 commentaire=self.definition.validators.info_erreur_item()
431 if self.definition.validators :
432 commentaire=self.definition.validators.aide()
435 def info_erreur_liste(self) :
437 if self.definition.validators :
438 commentaire=self.definition.validators.info_erreur_liste()
441 def IsInIntervalle(self,valeur):
443 Retourne 1 si la valeur est dans l'intervalle permis par
444 l'objet represente par l'item.
446 return self.valide_item(valeur)
449 valide=self.object.isvalid()
452 #--------------------------------------------------
456 #---------------------------------------------------
460 # get_sd_avant_du_bon_type
464 def GetIconName(self):
466 return "ast-green-ball"
467 elif self.object.isoblig():
468 return "ast-red-ball"
470 return "ast-yel-ball"
476 Retourne le texte a afficher dans l'arbre representant la valeur de l'objet
479 text= self.object.GetText()
480 if text == None : text=""
484 def set_valeur_co(self,nom_co):
486 Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
488 ret = self.object.set_valeur_co(nom_co)
489 #print "set_valeur_co",ret
492 def get_sd_avant_du_bon_type(self):
494 Retourne la liste des noms des SD présentes avant l'étape qui contient
495 le MCS pointé par self et du type requis par ce MCS
497 a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
500 def get_sd_avant_du_bon_type_pour_type_de_base(self):
501 a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
507 def delete_valeur_co(self,valeur=None):
509 Supprime la valeur du mot cle (de type CO)
510 il faut propager la destruction aux autres etapes
512 if not valeur : valeur=self.object.valeur
513 # XXX faut il vraiment appeler del_sdprod ???
514 #self.object.etape.parent.del_sdprod(valeur)
515 self.object.etape.parent.delete_concept(valeur)
517 #-----------------------------------------------
519 # Methodes liees au type de l objet attendu
521 #-----------------------------------------------
531 Méthode booléenne qui retourne 1 si l'objet pointé par self
532 attend un objet de type ASSD qui n'existe pas encore (type CO()),
535 return self.object.wait_co()
537 def wait_fichier(self):
538 maDefinition=self.object.definition
540 if ('Repertoire' in maDefinition.type[0]) or ('Fichier' in maDefinition.type[0]) :
547 Méthode booléenne qui retourne 1 si l'objet pointé par self
548 attend un objet GEOM, 0 sinon
550 return self.object.wait_geom()
552 def wait_complex(self):
553 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
554 attend un complexe, 0 sinon """
555 if 'C' in self.object.definition.type:
561 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
562 attend un réel, 0 sinon """
563 if 'R' in self.object.definition.type:
569 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
570 attend un réel, 0 sinon """
571 if 'DateHHMMAAAA' in self.object.definition.type:
576 def wait_heure(self):
577 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
578 attend un réel, 0 sinon """
579 if 'HeureHHMMSS' in self.object.definition.type:
586 def wait_tuple(self):
587 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
588 attend un Tuple, 0 sinon """
589 for ss_type in self.object.definition.type:
590 if repr(ss_type).find('Tuple') != -1 :
594 def wait_matrice(self):
595 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
596 attend un Tuple, 0 sinon """
597 for ss_type in self.object.definition.type:
598 if repr(ss_type).find('Matrice') != -1 :
603 """Méthode booléenne qui retourne 1 si l'objet pointé par self
604 attend un objet de type ASSD ou dérivé, 0 sinon """
605 return self.object.wait_assd()
607 def wait_assd_or_type_base(self) :
609 if len(self.object.definition.type) > 1 :
610 if self.wait_reel() :
612 if 'I' in self.object.definition.type :
616 def wait_Salome(self):
617 type = self.object.definition.type[0]
618 if 'grma' in repr(type) : return True
619 if 'grno' in repr(type) : return True
620 if (isinstance(type, types.ClassType) and issubclass(type, SalomeEntry)) : return True
625 Retourne le type de valeur attendu par l'objet représenté par l'item.
627 return self.object.get_type()
629 #-----------------------------------------------------
631 # Methodes liees a l evaluation de la valeur saisie
633 #-----------------------------------------------------
639 def eval_valeur(self,valeur):
640 """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur de self :
641 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
642 - retourne 'valeur' (chaine de caractéres) sinon
644 newvaleur=self.eval_val(valeur)
647 def eval_valeur_BAK(self,valeur):
648 """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur
649 de l'objet pointé par self :
650 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
651 - retourne 'valeur' (chaine de caractéres) sinon
652 - retourne None en cas d invalidite
653 - retourne invalide si 1 des objets du tuple l est
656 if type(valeur) in (types.ListType,types.TupleType) :
659 newvaleur,validiteitem=self.eval_valeur_item(item)
660 valeurretour.append(newvaleur)
661 if validiteitem == 0:
664 valeurretour,validite= self.eval_valeur_item(valeur)
667 return valeurretour,validite
669 def eval_valeur_item(self,valeur):
670 """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
671 - va retourner la valeur de retour et la validite
672 selon le type de l objet attendu
673 - traite les reels et les parametres
675 #print "eval_valeur_item",valeur
676 if valeur==None or valeur == "" :
680 valeurinter = self.traite_reel(valeur)
681 if valeurinter != None :
682 valeurretour,validite= self.object.eval_valeur(valeurinter)
684 valeurretour,validite= self.object.eval_valeur(valeur)
685 elif self.wait_geom():
686 valeurretour,validite = valeur,1
688 valeurretour,validite= self.object.eval_valeur(valeur)
689 #print "eval_valeur_item",valeurretour,validite
692 if type(valeur) == types.StringType and self.object.wait_TXM():
693 essai_valeur="'" + valeur + "'"
694 valeurretour,validite= self.object.eval_valeur(essai_valeur)
696 if hasattr(valeurretour,'__class__'):
697 #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
698 if valeurretour.__class__.__name__ in ('PARAMETRE',):
702 # CCAR : il ne faut pas essayer de creer un concept
703 # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
705 #valeurretour=Accas.CO(valeur)
709 # on est dans le cas ou on a évalué et ou on n'aurait pas du
710 if self.object.wait_TXM() :
711 if type(valeurretour) != types.StringType:
712 valeurretour=str(valeur)
714 return valeurretour,validite
716 def is_CO(self,valeur=None):
718 Indique si valeur est un concept produit de la macro
719 Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
720 Si valeur vaut None on teste la valeur du mot cle
722 # Pour savoir si un concept est un nouveau concept de macro
723 # on regarde s'il est présent dans l'attribut sdprods de l'étape
724 # ou si son nom de classe est CO.
725 # Il faut faire les 2 tests car une macro non valide peut etre
726 # dans un etat pas tres catholique avec des CO pas encore types
727 # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
728 if not valeur:valeur=self.object.valeur
729 if valeur in self.object.etape.sdprods:return 1
730 if type(valeur) is not types.InstanceType:return 0
731 if valeur.__class__.__name__ == 'CO':return 1
734 def is_param(self,valeur) :
735 for param in self.jdc.params:
736 if (repr(param) == valeur):
740 def traite_reel(self,valeur):
742 Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
743 ou de détecter si on fait référence a un concept produit par DEFI_VALEUR
746 valeur = string.strip(valeur)
747 liste_reels = self.get_sd_avant_du_bon_type()
748 if valeur in liste_reels:
750 if len(valeur) >= 3 :
751 if valeur[0:4] == 'EVAL' :
752 # on a trouvé un EVAL --> on retourne directement la valeur
754 if string.find(valeur,'.') == -1 :
755 # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
756 if (self.is_param(valeur)):
759 if string.find(valeur,'e') != -1:
760 # Notation scientifique ?
773 treeitem = SIMPTreeItem