1 # -*- coding: utf-8 -*-
2 # CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
20 # ======================================================================
22 import string,types,os
25 from copy import copy,deepcopy
33 from widgets import ListeChoix
34 from widgets import FenetreDeSelection
36 from Noyau.N_CR import justify_text
37 from utils import substract_list
40 class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
41 from newsimppanel import newSIMPPanel
49 def affect_panel(self):
51 Cette méthode attribue le panel à l'objet pointé par self en fonction de la
52 nature de la valeur demandée pour cet objet
54 from uniquepanel import UNIQUE_Panel
55 from plusieurspanel import PLUSIEURS_Panel
57 #print "affect_panel : ",self.nom,self.is_list(),self.has_into()
58 # Attention l ordre des if est important
61 # l'objet attend un shell
62 from shellpanel import SHELLPanel
63 self.panel = SHELLPanel
65 # l'objet prend sa (ses) valeur(s) dans un ensemble discret de valeurs
67 from plusieursintopanel import PLUSIEURS_INTO_Panel
68 self.panel = PLUSIEURS_INTO_Panel
70 from uniqueintopanel import UNIQUE_INTO_Panel
71 self.panel = UNIQUE_INTO_Panel
73 # l'objet prend une ou des valeurs à priori quelconques
75 # on attend une liste de valeurs mais de quel type ?
77 # on attend une liste de SD
78 from plusieursassdpanel import PLUSIEURS_ASSD_Panel
79 self.panel = PLUSIEURS_ASSD_Panel
81 # on attend une liste de valeurs de types debase (entiers, réels,...)
82 #from plusieursbasepanel import PLUSIEURS_BASE_OR_UNELISTE_Panel
83 #self.panel = PLUSIEURS_BASE_OR_UNELISTE_Panel
84 from plusieursbasepanel import PLUSIEURS_BASE_Panel
85 self.panel = PLUSIEURS_BASE_Panel
87 # on n'attend qu'une seule valeur mais de quel type ?
89 # on attend une SD ou un objet de la classe CO (qui n'existe pas encore)
90 from uniquesdcopanel import UNIQUE_SDCO_Panel
91 self.panel = UNIQUE_SDCO_Panel
92 elif self.wait_assd():
94 from uniqueassdpanel import UNIQUE_ASSD_Panel
95 from uniqueassdpanel import UNIQUE_ASSD_Panel_Reel
96 if 'R' in self.GetType():
97 self.panel = UNIQUE_ASSD_Panel_Reel
99 self.panel = UNIQUE_ASSD_Panel
101 # on attend une valeur d'un type de base (entier,réel,...)
102 if self.wait_complex():
103 # on attend un complexe
104 from uniquecomppanel import UNIQUE_COMP_Panel
105 self.panel = UNIQUE_COMP_Panel
107 # on attend un entier, un réel ou une string
108 from uniquebasepanel import UNIQUE_BASE_Panel
109 self.panel = UNIQUE_BASE_Panel
110 # cas particulier des fonctions
111 genea = self.get_genealogie()
112 if "VALE" in genea or "VALE_C" in genea:
113 if "DEFI_FONCTION" in genea :
114 from fonctionpanel import FONCTION_Panel
115 self.panel=FONCTION_Panel
116 #---------------------------------------------------------
117 # PN ajout pour lancement de Salome
118 #---------------------------------------------------------
119 if hasattr( self.appli, 'salome' ):
122 self.select_noeud_maille=0
123 self.clef_fonction="SALOME"
124 for i in range(0,len( genea )) :
125 self.clef_fonction=self.clef_fonction+"_"+ genea[i]
126 #if genea[i] == "GROUP_NO" or genea[i] == "GROUP_MA":
127 if "GROUP_NO" in genea[len(genea)-1] or "GROUP_MA" in genea[len(genea)-1]:
128 self.select_noeud_maille=1
130 recherche=panelsSalome.dict_classes_salome[self.panel]
131 if hasattr(recherche,self.clef_fonction):
133 if self.select_noeud_maille==1 :
137 #-----------------------------------------------
139 # Methodes liees aux informations sur le Panel
140 # ou au mot-clef simple
142 #-----------------------------------------------
144 # get_into a priori inutile --> commentee
146 # wait_into a priori inutile --> commentee
155 Cette méthode indique si le mot cle simple attend une liste (valeur de retour 1)
156 ou s'il n'en attend pas (valeur de retour 0)
158 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
159 Dans le cas sans validateur, l'information est donnée par l'attribut max
160 de la definition du mot cle.
161 Dans le cas avec validateur, il faut combiner l'information précédente avec
162 celle issue de l'appel de la méthode is_list sur le validateur.On utilisera
163 l'operateur ET pour effectuer cette combinaison (AndVal).
166 min,max = self.GetMinMax()
170 # Dans le cas avec validateurs, pour que le mot cle soit considéré
171 # comme acceptant une liste, il faut que max soit supérieur a 1
172 # ET que la méthode is_list du validateur retourne 1. Dans les autres cas
173 # on retournera 0 (n'attend pas de liste)
174 if self.definition.validators :
175 is_a_list= self.definition.validators.is_list() * is_a_list
178 #def get_into(self,liste_courante=None):
180 # Cette méthode retourne la liste de choix proposée par le mot cle. Si le mot cle ne propose
181 # pas de liste de choix, la méthode retourne None.
182 # L'argument d'entrée liste_courante, s'il est différent de None, donne la liste des choix déjà
183 # effectués par l'utilisateur. Dans ce cas, la méthode get_into doit calculer la liste des choix
184 # en en tenant compte.
185 # Cette méthode part du principe que la relation entre into du mot clé et les validateurs est
186 # une relation de type ET (AndVal).
188 # if not self.object.definition.validators :
189 # return self.object.definition.into
191 # return self.object.definition.validators.get_into(liste_courante,self.definition.into)
195 Cette méthode indique si le mot cle simple propose un choix (valeur de retour 1)
196 ou s'il n'en propose pas (valeur de retour 0)
198 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
199 Dans le cas sans validateur, l'information est donnée par l'attribut into
200 de la definition du mot cle.
201 Dans le cas avec validateurs, pour que le mot cle soit considéré
202 comme proposant un choix, il faut que into soit présent OU
203 que la méthode has_into du validateur retourne 1. Dans les autres cas
204 on retournera 0 (ne propose pas de choix)
207 if self.definition.into:
209 elif self.definition.validators :
210 has_an_into= self.definition.validators.has_into()
213 # def wait_into(self):
214 # """ Méthode booléenne qui retourne 1 si l'objet pointé par self
215 # prend ses valeurs dans un ensemble discret (into), 0 sinon """
216 # if self.object.definition.into != None :
222 """ Retourne les valeurs min et max de la définition de object """
223 return self.object.get_min_max()
225 def GetMultiplicite(self):
227 Retourne la multiplicité des valeurs affectées à l'objet
228 représenté par l'item. Pour le moment retourne invariablement 1.
232 def GetIntervalle(self):
234 Retourne le domaine de valeur attendu par l'objet représenté
237 return self.object.getintervalle()
239 def GetListeValeurs(self) :
240 """ Retourne la liste des valeurs de object """
241 valeurs=self.object.get_liste_valeurs()
243 if "R" in self.object.definition.type:
244 clef=self.object.GetNomConcept()
245 if self.appli.dict_reels.has_key(clef):
246 if type(valeurs) == types.TupleType:
249 if self.appli.dict_reels[clef].has_key(val) :
250 valeurs_reelles.append(self.appli.dict_reels[clef][val])
252 valeurs_reelles.append(val)
254 if self.appli.dict_reels[clef].has_key(valeurs):
255 valeurs_reelles=self.appli.dict_reels[clef][valeurs]
256 valeurs=valeurs_reelles
261 def get_liste_possible(self,listeActuelle=[]):
262 if hasattr(self.definition.validators,'into'):
263 valeurspossibles = self.definition.validators.into
265 valeurspossibles = self.get_definition().into
267 #On ne garde que les items valides
269 for item in valeurspossibles:
270 encorevalide=self.valide_item(item)
272 listevalideitem.append(item)
274 #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
276 for item in listevalideitem:
277 encorevalide=self.valide_liste_partielle(item,listeActuelle)
279 listevalideliste.append(item)
280 return listevalideliste
282 def get_liste_param_possible(self):
284 for param in self.object.jdc.params:
285 encorevalide=self.valide_item(param.valeur)
287 type_param=param.valeur.__class__.__name__
288 for typ in self.definition.type:
290 liste_param.append(param)
291 if typ=='I' and type_param=='int':
292 liste_param.append(param)
293 if typ=='TXM' and type_param=='str':
294 liste_param.append(repr(param))
297 #--------------------------------------------------
299 # Methodes liees a la validite des valeurs saisies
301 #---------------------------------------------------
303 # valide_liste_partielle
304 # valide_liste_complete
310 def valide_item(self,item):
312 La validation est réalisée directement par l'objet
314 return self.object.valide_item(item)
316 def valide_liste_partielle(self,item,listecourante):
317 #On protege la liste en entree en la copiant
318 valeur=listecourante[:]
320 return self.object.valid_valeur_partielle(valeur)
322 def valide_liste_complete (self,valeur):
323 return self.object.valid_valeur(valeur)
325 def valide_val (self,valeur):
326 return self.object.valid_val(valeur)
328 def info_erreur_item(self) :
330 if self.definition.validators :
331 commentaire=self.definition.validators.info_erreur_item()
336 if self.definition.validators :
337 commentaire=self.definition.validators.aide()
340 def info_erreur_liste(self) :
342 if self.definition.validators :
343 commentaire=self.definition.validators.info_erreur_liste()
346 def IsInIntervalle(self,valeur):
348 Retourne 1 si la valeur est dans l'intervalle permis par
349 l'objet représenté par l'item.
351 return self.valide_item(valeur)
354 valide=self.object.isvalid()
357 #--------------------------------------------------
361 #---------------------------------------------------
362 # SetText a priori inutilisee --> commentee
365 # getval a priori inutilisee --> commentee
367 # get_sd_avant_du_bon_type
368 # verif a priori inutilisee --> commentee
371 #def SetText(self, text):
374 # self.object.setval(value)
378 def GetIconName(self):
380 return "ast-green-ball"
381 elif self.object.isoblig():
382 return "ast-red-ball"
384 return "ast-yel-ball"
389 Retourne le texte à afficher dans l'arbre représentant la valeur de l'objet
392 text= self.object.GetText()
396 # return self.object.getval()
398 def set_valeur_co(self,nom_co):
400 Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
402 ret = self.object.set_valeur_co(nom_co)
403 #print "set_valeur_co",ret
406 def get_sd_avant_du_bon_type(self):
408 Retourne la liste des noms des SD présentes avant l'étape qui contient
409 le MCS pointé par self et du type requis par ce MCS
411 a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
414 def get_sd_avant_du_bon_type_pour_type_de_base(self):
415 a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
423 def delete_valeur_co(self,valeur=None):
425 Supprime la valeur du mot cle (de type CO)
426 il faut propager la destruction aux autres etapes
428 if not valeur : valeur=self.object.valeur
429 # XXX faut il vraiment appeler del_sdprod ???
430 #self.object.etape.parent.del_sdprod(valeur)
431 self.object.etape.parent.delete_concept(valeur)
433 #-----------------------------------------------
435 # Methodes liees au type de l objet attendu
437 #-----------------------------------------------
448 Méthode booléenne qui retourne 1 si l'objet pointé par self
449 attend un objet de type ASSD qui n'existe pas encore (type CO()),
452 return self.object.wait_co()
456 Méthode booléenne qui retourne 1 si l'objet pointé par self
457 attend un objet GEOM, 0 sinon
459 return self.object.wait_geom()
461 def wait_complex(self):
462 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
463 attend un complexe, 0 sinon """
464 if 'C' in self.object.definition.type:
470 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
471 attend un réel, 0 sinon """
472 if 'R' in self.object.definition.type:
477 def wait_shell(self):
478 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
479 attend un shell, 0 sinon """
480 if 'shell' in self.object.definition.type:
486 """Méthode booléenne qui retourne 1 si l'objet pointé par self
487 attend un objet de type ASSD ou dérivé, 0 sinon """
488 return self.object.wait_assd()
490 def wait_assd_or_type_base(self) :
492 if len(self.object.definition.type) > 1 :
493 if self.wait_reel() :
495 if 'I' in self.object.definition.type :
502 Retourne le type de valeur attendu par l'objet représenté par l'item.
504 return self.object.get_type()
506 #-----------------------------------------------------
508 # Methodes liees a l evaluation de la valeur saisie
510 #-----------------------------------------------------
516 def eval_valeur(self,valeur):
517 """ Lance l'interprétation de 'valeur' (chaîne de caractères) comme valeur de self :
518 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
519 - retourne 'valeur' (chaîne de caractères) sinon
521 newvaleur=self.eval_val(valeur)
524 def eval_valeur_BAK(self,valeur):
525 """ Lance l'interprétation de 'valeur' (chaîne de caractères) comme valeur
526 de l'objet pointé par self :
527 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
528 - retourne 'valeur' (chaîne de caractères) sinon
529 - retourne None en cas d invalidite
530 - retourne invalide si 1 des objets du tuple l est
533 if type(valeur) in (types.ListType,types.TupleType) :
536 newvaleur,validiteitem=self.eval_valeur_item(item)
537 valeurretour.append(newvaleur)
538 if validiteitem == 0:
541 valeurretour,validite= self.eval_valeur_item(valeur)
544 return valeurretour,validite
546 def eval_valeur_item(self,valeur):
547 """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
548 - va retourner la valeur de retour et la validite
549 selon le type de l objet attendu
550 - traite les reels et les parametres
552 #print "eval_valeur_item",valeur
553 if valeur==None or valeur == "" :
557 valeurinter = self.traite_reel(valeur)
558 if valeurinter != None :
559 valeurretour,validite= self.object.eval_valeur(valeurinter)
561 valeurretour,validite= self.object.eval_valeur(valeur)
562 elif self.wait_geom():
563 valeurretour,validite = valeur,1
565 valeurretour,validite= self.object.eval_valeur(valeur)
566 #print "eval_valeur_item",valeurretour,validite
569 if type(valeur) == types.StringType and self.object.wait_TXM():
570 essai_valeur="'" + valeur + "'"
571 valeurretour,validite= self.object.eval_valeur(essai_valeur)
573 if hasattr(valeurretour,'__class__'):
574 #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
575 if valeurretour.__class__.__name__ in ('PARAMETRE',):
579 # CCAR : il ne faut pas essayer de creer un concept
580 # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
582 #valeurretour=Accas.CO(valeur)
586 # on est dans le cas où on a évalué et où on n'aurait pas du
587 if self.object.wait_TXM() :
588 if type(valeurretour) != types.StringType:
589 valeurretour=str(valeur)
591 return valeurretour,validite
593 def is_CO(self,valeur=None):
595 Indique si valeur est un concept produit de la macro
596 Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
597 Si valeur vaut None on teste la valeur du mot cle
599 # Pour savoir si un concept est un nouveau concept de macro
600 # on regarde s'il est présent dans l'attribut sdprods de l'étape
601 # ou si son nom de classe est CO.
602 # Il faut faire les 2 tests car une macro non valide peut etre
603 # dans un etat pas tres catholique avec des CO pas encore types
604 # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
605 if not valeur:valeur=self.object.valeur
606 if valeur in self.object.etape.sdprods:return 1
607 if type(valeur) is not types.InstanceType:return 0
608 if valeur.__class__.__name__ == 'CO':return 1
611 def is_param(self,valeur) :
612 for param in self.jdc.params:
613 if (repr(param) == valeur):
617 def traite_reel(self,valeur):
619 Cette fonction a pour but de rajouter le '.' en fin de chaîne pour un réel
620 ou de détecter si on fait référence à un concept produit par DEFI_VALEUR
623 valeur = string.strip(valeur)
624 liste_reels = self.get_sd_avant_du_bon_type()
625 if valeur in liste_reels:
627 if len(valeur) >= 3 :
628 if valeur[0:4] == 'EVAL' :
629 # on a trouvé un EVAL --> on retourne directement la valeur
631 if string.find(valeur,'.') == -1 :
632 # aucun '.' n'a été trouvé dans valeur --> on en rajoute un à la fin
633 if (self.is_param(valeur)):
636 if string.find(valeur,'e') != -1:
637 # Notation scientifique ?
650 treeitem = SIMPTreeItem