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(), self.get_into(None)
60 # l'objet attend un shell
61 from shellpanel import SHELLPanel
62 self.panel = SHELLPanel
64 # l'objet prend sa (ses) valeur(s) dans un ensemble discret de valeurs
66 from plusieursintopanel import PLUSIEURS_INTO_Panel
67 self.panel = PLUSIEURS_INTO_Panel
69 from uniqueintopanel import UNIQUE_INTO_Panel
70 self.panel = UNIQUE_INTO_Panel
72 # l'objet prend une ou des valeurs à priori quelconques
74 # on attend une liste de valeurs mais de quel type ?
76 # on attend une liste de SD
77 from plusieursassdpanel import PLUSIEURS_ASSD_Panel
78 self.panel = PLUSIEURS_ASSD_Panel
80 # on attend une liste de valeurs de types debase (entiers, réels,...)
81 from plusieursbasepanel import PLUSIEURS_BASE_Panel
82 self.panel = PLUSIEURS_BASE_Panel
84 # on n'attend qu'une seule valeur mais de quel type ?
86 # on attend une SD ou un objet de la classe CO (qui n'existe pas encore)
87 from uniquesdcopanel import UNIQUE_SDCO_Panel
88 self.panel = UNIQUE_SDCO_Panel
89 elif self.wait_assd():
91 from uniqueassdpanel import UNIQUE_ASSD_Panel
92 from uniqueassdpanel import UNIQUE_ASSD_Panel_Reel
93 if 'R' in self.GetType():
94 self.panel = UNIQUE_ASSD_Panel_Reel
96 self.panel = UNIQUE_ASSD_Panel
98 # on attend une valeur d'un type de base (entier,réel,...)
99 if self.wait_complex():
100 # on attend un complexe
101 from uniquecomppanel import UNIQUE_COMP_Panel
102 self.panel = UNIQUE_COMP_Panel
104 # on attend un entier, un réel ou une string
105 from uniquebasepanel import UNIQUE_BASE_Panel
106 self.panel = UNIQUE_BASE_Panel
107 # cas particulier des fonctions
108 genea = self.get_genealogie()
109 if "VALE" in genea or "VALE_C" in genea:
110 if "DEFI_FONCTION" in genea :
111 from fonctionpanel import FONCTION_Panel
112 self.panel=FONCTION_Panel
113 #---------------------------------------------------------
114 # PN ajout pour lancement de Salome
115 #---------------------------------------------------------
116 if self.appli.salome != 0 :
119 self.clef_fonction="SALOME"
120 for i in range(0,len( genea )) :
121 self.clef_fonction=self.clef_fonction+"_"+ genea[i]
123 self.select_noeud_maille=0
124 if (self.clef_fonction.find("GROUP_NO") != -1) :
125 if (self.clef_fonction.find("_GROUP_NO") == -1 ):
126 self.select_noeud_maille=1
127 if (self.clef_fonction.find("GROUP_MA") != -1) :
128 if (self.clef_fonction.find("_GROUP_MA") == -1 ):
129 self.select_noeud_maille=1
131 recherche=panelsSalome.dict_classes_salome[self.panel]
132 if hasattr(recherche,self.clef_fonction):
134 if self.select_noeud_maille==1 :
138 #-----------------------------------------------
140 # Methodes liees aux informations sur le Panel
141 # ou au mot-clef simple
143 #-----------------------------------------------
145 # get_into a priori inutile --> commentee
147 # wait_into a priori inutile --> commentee
156 Cette méthode indique si le mot cle simple attend une liste (valeur de retour 1)
157 ou s'il n'en attend pas (valeur de retour 0)
159 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
160 Dans le cas sans validateur, l'information est donnée par l'attribut max
161 de la definition du mot cle.
162 Dans le cas avec validateur, il faut combiner l'information précédente avec
163 celle issue de l'appel de la méthode is_list sur le validateur.On utilisera
164 l'operateur ET pour effectuer cette combinaison (AndVal).
167 min,max = self.GetMinMax()
171 # Dans le cas avec validateurs, pour que le mot cle soit considéré
172 # comme acceptant une liste, il faut que max soit supérieur a 1
173 # ET que la méthode is_list du validateur retourne 1. Dans les autres cas
174 # on retournera 0 (n'attend pas de liste)
175 if self.definition.validators :
176 is_a_list= self.definition.validators.is_list() * is_a_list
179 #def get_into(self,liste_courante=None):
181 # Cette méthode retourne la liste de choix proposée par le mot cle. Si le mot cle ne propose
182 # pas de liste de choix, la méthode retourne None.
183 # L'argument d'entrée liste_courante, s'il est différent de None, donne la liste des choix déjà
184 # effectués par l'utilisateur. Dans ce cas, la méthode get_into doit calculer la liste des choix
185 # en en tenant compte.
186 # Cette méthode part du principe que la relation entre into du mot clé et les validateurs est
187 # une relation de type ET (AndVal).
189 # if not self.object.definition.validators :
190 # return self.object.definition.into
192 # return self.object.definition.validators.get_into(liste_courante,self.definition.into)
196 Cette méthode indique si le mot cle simple propose un choix (valeur de retour 1)
197 ou s'il n'en propose pas (valeur de retour 0)
199 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
200 Dans le cas sans validateur, l'information est donnée par l'attribut into
201 de la definition du mot cle.
202 Dans le cas avec validateurs, pour que le mot cle soit considéré
203 comme proposant un choix, il faut que into soit présent OU
204 que la méthode has_into du validateur retourne 1. Dans les autres cas
205 on retournera 0 (ne propose pas de choix)
208 if self.definition.into:
210 elif self.definition.validators :
211 has_an_into= self.definition.validators.has_into()
214 # def wait_into(self):
215 # """ Méthode booléenne qui retourne 1 si l'objet pointé par self
216 # prend ses valeurs dans un ensemble discret (into), 0 sinon """
217 # if self.object.definition.into != None :
223 """ Retourne les valeurs min et max de la définition de object """
224 return self.object.get_min_max()
226 def GetMultiplicite(self):
228 Retourne la multiplicité des valeurs affectées à l'objet
229 représenté par l'item. Pour le moment retourne invariablement 1.
233 def GetIntervalle(self):
235 Retourne le domaine de valeur attendu par l'objet représenté
238 return self.object.getintervalle()
240 def GetListeValeurs(self) :
241 """ Retourne la liste des valeurs de object """
242 valeurs=self.object.get_liste_valeurs()
244 if "R" in self.object.definition.type:
245 clef=self.object.GetNomConcept()
246 if self.appli.dict_reels.has_key(clef):
247 if type(valeurs) == types.TupleType:
250 if self.appli.dict_reels[clef].has_key(val) :
251 valeurs_reelles.append(self.appli.dict_reels[clef][val])
253 valeurs_reelles.append(val)
255 if self.appli.dict_reels[clef].has_key(valeurs):
256 valeurs_reelles=self.appli.dict_reels[clef][valeurs]
257 valeurs=valeurs_reelles
262 def get_liste_possible(self,listeActuelle=[]):
263 if hasattr(self.definition.validators,'into'):
264 self.get_definition().into=self.definition.validators.into
265 valeurspossibles = self.get_definition().into
266 # CCAR : Ne serait-il pas preferable d'appeler get_into ?
267 #valeurspossibles=self.get_into(listeActuelle)
270 for item in valeurspossibles:
271 encorevalide=self.valide_item(item)
273 listevalideitem.append(item)
274 # on ne verifie pas la liste des choix si max = 1
275 # (sinon cela enleve tous les choix possibles)
276 min,max=self.GetMinMax()
279 for item in listevalideitem:
281 for item2 in listeActuelle : listetravail.append(item2)
282 encorevalide=self.valide_liste_partielle(item,listetravail)
284 listevalideliste.append(item)
286 listevalideliste=listevalideitem
287 return listevalideliste
289 def get_liste_param_possible(self):
292 for param in self.object.jdc.params:
293 encorevalide=self.valide_item(param.valeur)
295 type_param=param.valeur.__class__.__name__
296 for typ in self.definition.type:
298 liste_param.append(param)
299 if typ=='I' and type_param=='int':
300 liste_param.append(param)
301 if typ=='TXM' and type_param=='str':
302 liste_param.append(repr(param))
305 #--------------------------------------------------
307 # Methodes liees a la validite des valeurs saisies
309 #---------------------------------------------------
311 # valide_liste_partielle
312 # valide_liste_complete
318 def valide_item(self,item):
320 On fait un try except pour les erreurs de type (exple
321 on rentre 1 pour une chaine de caracteres
324 if self.definition.validators :
326 valide=self.definition.validators.verif_item(item)
331 def valide_liste_partielle(self,item,listecourante):
334 valeur = tuple(valeur)
335 return self.object.valid_valeur_partielle(valeur)
337 def valide_liste_partielle_BAK(self,item,listecourante):
338 valeuravant=self.object.valeur
341 valeur = tuple(valeur)
342 retour=self.object.set_valeur(valeur)
344 if self.object.isvalid():
346 elif self.definition.validators :
347 validite=self.definition.validators.valide_liste_partielle(valeur)
350 min,max=self.GetMinMax()
351 if len(valeur) < min :
353 retour=self.object.set_valeur(valeuravant)
356 def valide_liste_complete (self,valeur):
357 return self.object.valid_valeur(valeur)
359 def valide_liste_complete_BAK (self,valeur):
360 valeuravant=self.object.valeur
361 retour=self.object.set_valeur(valeur)
363 if self.object.isvalid():
365 retour=self.object.set_valeur(valeuravant)
368 def info_erreur_item(self) :
370 if self.definition.validators :
371 commentaire=self.definition.validators.info_erreur_item()
376 if self.definition.validators :
377 commentaire=self.definition.validators.aide()
380 def info_erreur_liste(self) :
382 if self.definition.validators :
383 commentaire=self.definition.validators.info_erreur_liste()
386 def IsInIntervalle(self,valeur):
388 Retourne 1 si la valeur est dans l'intervalle permis par
389 l'objet représenté par l'item.
391 return self.object.isinintervalle(valeur)
394 valide=self.object.isvalid()
397 #--------------------------------------------------
401 #---------------------------------------------------
402 # SetText a priori inutilisee --> commentee
405 # getval a priori inutilisee --> commentee
407 # get_sd_avant_du_bon_type
408 # verif a priori inutilisee --> commentee
411 #def SetText(self, text):
414 # self.object.setval(value)
418 def GetIconName(self):
420 return "ast-green-ball"
421 elif self.object.isoblig():
422 return "ast-red-ball"
424 return "ast-yel-ball"
429 Retourne le texte à afficher dans l'arbre représentant la valeur de l'objet
432 text= self.object.GetText()
436 # return self.object.getval()
438 def set_valeur_co(self,nom_co):
440 Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
442 ret = self.object.set_valeur_co(nom_co)
443 #print "set_valeur_co",ret
446 def get_sd_avant_du_bon_type(self):
448 Retourne la liste des noms des SD présentes avant l'étape qui contient
449 le MCS pointé par self et du type requis par ce MCS
451 a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
457 def delete_valeur_co(self,valeur=None):
459 Supprime la valeur du mot cle (de type CO)
460 il faut propager la destruction aux autres etapes
462 if not valeur : valeur=self.object.valeur
463 # XXX faut il vraiment appeler del_sdprod ???
464 #self.object.etape.parent.del_sdprod(valeur)
465 self.object.etape.parent.delete_concept(valeur)
467 #-----------------------------------------------
469 # Methodes liees au type de l objet attendu
471 #-----------------------------------------------
482 Méthode booléenne qui retourne 1 si l'objet pointé par self
483 attend un objet de type ASSD qui n'existe pas encore (type CO()),
486 return self.object.wait_co()
490 Méthode booléenne qui retourne 1 si l'objet pointé par self
491 attend un objet GEOM, 0 sinon
493 return self.object.wait_geom()
495 def wait_complex(self):
496 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
497 attend un complexe, 0 sinon """
498 if 'C' in self.object.definition.type:
504 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
505 attend un réel, 0 sinon """
506 if 'R' in self.object.definition.type:
511 def wait_shell(self):
512 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
513 attend un shell, 0 sinon """
514 if 'shell' in self.object.definition.type:
520 """Méthode booléenne qui retourne 1 si l'objet pointé par self
521 attend un objet de type ASSD ou dérivé, 0 sinon """
522 return self.object.wait_assd()
526 Retourne le type de valeur attendu par l'objet représenté par l'item.
528 return self.object.get_type()
530 #-----------------------------------------------------
532 # Methodes liees a l evaluation de la valeur saisie
534 #-----------------------------------------------------
540 def eval_valeur(self,valeur):
541 """ Lance l'interprétation de 'valeur' (chaîne de caractères) comme valeur
542 de l'objet pointé par self :
543 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
544 - retourne 'valeur' (chaîne de caractères) sinon
545 - retourne None en cas d invalidite
546 - retourne invalide si 1 des objets du tuple l est
549 if type(valeur) in (types.ListType,types.TupleType) :
552 newvaleur,validiteitem=self.eval_valeur_item(item)
553 valeurretour.append(newvaleur)
554 if validiteitem == 0:
557 valeurretour,validite= self.eval_valeur_item(valeur)
560 return valeurretour,validite
562 def eval_valeur_item(self,valeur):
563 """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
564 - va retourner la valeur de retour et la validite
565 selon le type de l objet attendu
566 - traite les reels et les parametres
568 #print "eval_valeur_item",valeur
569 if valeur==None or valeur == "" :
573 valeurinter = self.traite_reel(valeur)
574 valeurretour,validite= self.object.eval_valeur(valeurinter)
575 elif self.wait_geom():
576 valeurretour,validite = valeur,1
578 valeurretour,validite= self.object.eval_valeur(valeur)
579 #print "eval_valeur_item",valeurretour,validite
582 if type(valeur) == types.StringType and self.object.wait_TXM():
583 essai_valeur="'" + valeur + "'"
584 valeurretour,validite= self.object.eval_valeur(essai_valeur)
586 if hasattr(valeurretour,'__class__'):
587 #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
588 if valeurretour.__class__.__name__ in ('PARAMETRE',):
592 # CCAR : il ne faut pas essayer de creer un concept
593 # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
595 #valeurretour=Accas.CO(valeur)
599 # on est dans le cas où on a évalué et où on n'aurait pas du
600 if self.object.wait_TXM() :
601 if type(valeurretour) != types.StringType:
602 valeurretour=str(valeur)
604 return valeurretour,validite
606 def is_CO(self,valeur=None):
608 Indique si valeur est un concept produit de la macro
609 Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
610 Si valeur vaut None on teste la valeur du mot cle
612 # Pour savoir si un concept est un nouveau concept de macro
613 # on regarde s'il est présent dans l'attribut sdprods de l'étape
614 # ou si son nom de classe est CO.
615 # Il faut faire les 2 tests car une macro non valide peut etre
616 # dans un etat pas tres catholique avec des CO pas encore types
617 # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
618 if not valeur:valeur=self.object.valeur
619 if valeur in self.object.etape.sdprods:return 1
620 if type(valeur) is not types.InstanceType:return 0
621 if valeur.__class__.__name__ == 'CO':return 1
624 def is_param(self,valeur) :
625 for param in self.jdc.params:
626 if (repr(param) == valeur):
630 def traite_reel(self,valeur):
632 Cette fonction a pour but de rajouter le '.' en fin de chaîne pour un réel
633 ou de détecter si on fait référence à un concept produit par DEFI_VALEUR
636 valeur = string.strip(valeur)
637 liste_reels = self.get_sd_avant_du_bon_type()
638 if valeur in liste_reels:
640 if len(valeur) >= 3 :
641 if valeur[0:4] == 'EVAL' :
642 # on a trouvé un EVAL --> on retourne directement la valeur
644 if string.find(valeur,'.') == -1 :
645 # aucun '.' n'a été trouvé dans valeur --> on en rajoute un à la fin
646 if (self.is_param(valeur)):
649 if string.find(valeur,'e') != -1:
650 # Notation scientifique ?
663 treeitem = SIMPTreeItem