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):
35 def createPopUpMenu(self):
36 typeNode.PopUpMenuNodeMinimal.createPopUpMenu(self)
39 def getPanelGroupe(self,parentQt,maCommande):
40 maDefinition=self.item.get_definition()
41 monObjet=self.item.object
45 if monObjet.isInformation():
46 from monWidgetInfo import MonWidgetInfo
47 widget=MonWidgetInfo(self,maDefinition,monNom,monObjet,parentQt,maCommande)
52 # Attention l ordre des if est important
53 # Attention il faut gerer les blocs et les facteurs
54 # a gerer comme dans composimp
55 # Gestion des matrices
56 if self.item.wait_matrice ():
57 from monWidgetMatrice import MonWidgetMatrice
58 widget=MonWidgetMatrice(self,maDefinition,monNom,monObjet,parentQt,maCommande)
62 #print "____________________________", monNom, self.item.wait_co()
63 #print "____________________________", monNom, self.item.wait_assd()
64 # Gestion d'une seule valeur (eventuellement un tuple ou un complexe)
65 if maDefinition.max == 1 :
68 if maDefinition.into != [] and maDefinition.into != None:
69 if len(maDefinition.into) < 4 :
70 from monWidgetRadioButton import MonWidgetRadioButton
71 widget=MonWidgetRadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
72 elif len(maDefinition.into) < 7 :
73 from monWidget4a6RadioButton import MonWidget4a6RadioButton
74 widget=MonWidget4a6RadioButton(self,maDefinition,monNom,monObjet,parentQt,maCommande)
76 from monWidgetCB import MonWidgetCB
77 widget=MonWidgetCB(self,maDefinition,monNom,monObjet,parentQt,maCommande)
79 elif self.item.wait_bool() :
80 from monWidgetSimpBool import MonWidgetSimpBool
81 widget=MonWidgetSimpBool(self,maDefinition,monNom,monObjet,parentQt,maCommande)
82 elif self.item.wait_fichier():
83 from monWidgetSimpFichier import MonWidgetSimpFichier
84 widget=MonWidgetSimpFichier(self,maDefinition,monNom,monObjet,parentQt,maCommande)
87 elif self.item.wait_date():
88 from monWidgetDate import MonWidgetDate
89 widget=MonWidgetDate(self,maDefinition,monNom,monObjet,parentQt,maCommande)
90 elif self.item.wait_heure():
91 from monWidgetHeure import MonWidgetHeure
92 widget=MonWidgetHeure(self,maDefinition,monNom,monObjet,parentQt,maCommande)
94 elif self.item.wait_tuple() :
95 if self.item.object.definition.type[0].ntuple == 2:
96 from monWidgetSimpTuple2 import MonWidgetSimpTuple2
97 widget=MonWidgetSimpTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
98 elif self.item.object.definition.type[0].ntuple == 3 :
99 from monWidgetSimpTuple3 import MonWidgetSimpTuple3
100 widget=MonWidgetSimpTuple3(self,maDefinition,monNom,monObjet,parentQt,maCommande)
102 print "Pas de Tuple de longueur > 3"
103 print "Prevenir la maintenance "
105 elif self.item.wait_complex():
106 from monWidgetSimpComplexe import MonWidgetSimpComplexe
107 widget=MonWidgetSimpComplexe(self,maDefinition,monNom,monObjet,parentQt,maCommande)
109 elif self.item.wait_co():
110 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
111 from monWidgetUniqueSDCO import MonWidgetUniqueSDCO
112 widget=MonWidgetUniqueSDCO(self,maDefinition,monNom,monObjet,parentQt,maCommande)
114 from monWidgetSDCOInto import MonWidgetSDCOInto
115 widget=MonWidgetSDCOInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
116 elif self.item.wait_assd():
117 if len(self.item.get_sd_avant_du_bon_type()) == 0 :
118 from monWidgetVide import MonWidgetVide
119 widget=MonWidgetVide(self,maDefinition,monNom,monObjet,parentQt,maCommande)
120 if len(self.item.get_sd_avant_du_bon_type()) < 4 :
121 from monWidgetRadioButton import MonWidgetRadioButtonSD
122 widget=MonWidgetRadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
123 elif len(self.item.get_sd_avant_du_bon_type()) < 7 :
124 from monWidget4a6RadioButton import MonWidget4a6RadioButtonSD
125 widget=MonWidget4a6RadioButtonSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
127 from monWidgetCB import MonWidgetCBSD
128 widget=MonWidgetCBSD(self,maDefinition,monNom,monObjet,parentQt,maCommande)
130 elif self.item.wait_Salome() and self.editor.salome:
132 from monWidgetSimpSalome import MonWidgetSimpSalome
133 widget=MonWidgetSimpSalome(self,maDefinition,monNom,monObjet,parentQt,maCommande)
135 elif self.item.wait_TXM():
136 from monWidgetSimpTxt import MonWidgetSimpTxt
137 widget=MonWidgetSimpTxt(self,maDefinition,monNom,monObjet,parentQt,maCommande)
139 from monWidgetSimpBase import MonWidgetSimpBase
140 widget=MonWidgetSimpBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
144 #if maDefinition.into != [] and maDefinition.into != None:
145 # Attention pas fini --> on attend une liste de ASSD avec ordre
146 if self.item.wait_assd() and self.item.is_list_SansOrdreNiDoublon():
148 from monWidgetPlusieursInto import MonWidgetPlusieursInto
149 widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
150 elif self.item.wait_assd() :
151 from monWidgetPlusieursASSDIntoOrdonne import MonWidgetPlusieursASSDIntoOrdonne
152 widget=MonWidgetPlusieursASSDIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
153 elif self.item.wait_tuple() :
154 if self.item.object.definition.type[0].ntuple == 2:
156 from monWidgetPlusieursTuple2 import MonWidgetPlusieursTuple2
157 widget=MonWidgetPlusieursTuple2(self,maDefinition,monNom,monObjet,parentQt,maCommande)
158 elif self.item.object.definition.type[0].ntuple == 3 :
160 from monWidgetPlusieursTuple3 import MonWidgetPlusieursTuple3
161 widget=MonWidgetPlusieursTuple3(self,maDefinition,monNom,monObjet,parentQt,maCommande)
163 print "Pas de Tuple de longueur > 3"
164 print "Prevenir la maintenance "
165 elif self.item.has_into():
166 if self.item.is_list_SansOrdreNiDoublon():
168 from monWidgetPlusieursInto import MonWidgetPlusieursInto
169 widget=MonWidgetPlusieursInto(self,maDefinition,monNom,monObjet,parentQt,maCommande)
172 # tres vite pour le tag mais devra etre gere dans configuration
173 if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees) :
174 from monWidgetPlusieursIntoOrdonne import MonWidgetPlusieursIntoOrdonne
175 widget=MonWidgetPlusieursIntoOrdonne(self,maDefinition,monNom,monObjet,parentQt,maCommande)
177 from monWidgetPlusieursPlie import MonWidgetPlusieursPlie
178 widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
181 if self.item in self.editor.listeDesListesOuvertes or not(self.editor.afficheListesPliees) :
182 from monWidgetPlusieursBase import MonWidgetPlusieursBase
183 widget=MonWidgetPlusieursBase(self,maDefinition,monNom,monObjet,parentQt,maCommande)
185 from monWidgetPlusieursPlie import MonWidgetPlusieursPlie
186 widget=MonWidgetPlusieursPlie(self,maDefinition,monNom,monObjet,parentQt,maCommande)
192 class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
199 #-----------------------------------------------
201 # Methodes liees aux informations sur le Panel
202 # ou au mot-clef simple
204 #-----------------------------------------------
206 # get_into a priori inutile --> commentee
208 # wait_into a priori inutile --> commentee
217 Cette methode indique si le mot cle simple attend une liste (valeur de retour 1)
218 ou s'il n'en attend pas (valeur de retour 0)
220 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
221 Dans le cas sans validateur, l'information est donnee par l'attribut max
222 de la definition du mot cle.
223 Dans le cas avec validateur, il faut combiner l'information precedente avec
224 celle issue de l'appel de la methode is_list sur le validateur.On utilisera
225 l'operateur ET pour effectuer cette combinaison (AndVal).
228 min,max = self.GetMinMax()
232 # Dans le cas avec validateurs, pour que le mot cle soit considere
233 # comme acceptant une liste, il faut que max soit superieur a 1
234 # ET que la methode is_list du validateur retourne 1. Dans les autres cas
235 # on retournera 0 (n'attend pas de liste)
236 if self.definition.validators :
237 is_a_list= self.definition.validators.is_list() * is_a_list
240 def is_list_SansOrdreNiDoublon(self):
241 if self.definition.homo=="SansOrdreNiDoublon": return 1
246 Cette methode indique si le mot cle simple propose un choix (valeur de retour 1)
247 ou s'il n'en propose pas (valeur de retour 0)
249 Deux cas principaux peuvent se presenter : avec validateurs ou bien sans.
250 Dans le cas sans validateur, l'information est donnee par l'attribut into
251 de la definition du mot cle.
252 Dans le cas avec validateurs, pour que le mot cle soit considere
253 comme proposant un choix, il faut que into soit present OU
254 que la methode has_into du validateur retourne 1. Dans les autres cas
255 on retournera 0 (ne propose pas de choix)
258 if self.definition.into:
260 elif self.definition.validators :
261 has_an_into= self.definition.validators.has_into()
266 """ Retourne les valeurs min et max de la definition de object """
267 return self.object.get_min_max()
269 def GetMultiplicite(self):
271 Retourne la multiplicite des valeurs affectees a l'objet
272 represente par l'item. Pour le moment retourne invariablement 1.
276 def GetIntervalle(self):
278 Retourne le domaine de valeur attendu par l'objet represente
281 return self.object.getintervalle()
283 def GetListeValeurs(self) :
284 """ Retourne la liste des valeurs de object """
285 valeurs=self.object.get_liste_valeurs()
287 if "R" in self.object.definition.type:
288 clef=self.object.GetNomConcept()
289 if self.appli.dict_reels.has_key(clef):
290 if type(valeurs) == types.TupleType:
293 if self.appli.dict_reels[clef].has_key(val) :
294 valeurs_reelles.append(self.appli.dict_reels[clef][val])
296 valeurs_reelles.append(val)
298 if self.appli.dict_reels[clef].has_key(valeurs):
299 valeurs_reelles=self.appli.dict_reels[clef][valeurs]
300 valeurs=valeurs_reelles
305 def get_liste_possible(self,listeActuelle=[]):
306 if hasattr(self.definition.validators,'into'):
307 valeurspossibles = self.definition.validators.into
309 valeurspossibles = self.get_definition().into
311 if listeActuelle==[] : return valeurspossibles
313 #On ne garde que les items valides
315 if type(valeurspossibles) in (types.ListType,types.TupleType) :
318 valeurspossibles=(valeurspossibles,)
319 for item in valeurspossibles:
320 encorevalide=self.valide_item(item)
322 listevalideitem.append(item)
324 #on ne garde que les choix possibles qui passent le test de valide_liste_partielle
326 for item in listevalideitem:
327 encorevalide=self.valide_liste_partielle(item,listeActuelle)
329 listevalideliste.append(item)
330 return listevalideliste
332 def get_liste_param_possible(self):
334 l1,l2=self.jdc.get_parametres_fonctions_avant_etape(self.get_etape())
335 for param in self.object.jdc.params:
336 if param.nom not in l1 : continue
337 encorevalide=self.valide_item(param.valeur)
339 type_param=param.valeur.__class__.__name__
340 for typ in self.definition.type:
342 liste_param.append(param)
343 if typ=='I' and type_param=='int':
344 liste_param.append(param)
345 if typ=='TXM' and type_param=='str':
346 liste_param.append(repr(param))
347 if ('grma' in repr(typ)) and type_param=='str':
348 liste_param.append(param.nom)
351 #--------------------------------------------------
353 # Methodes liees a la validite des valeurs saisies
355 #---------------------------------------------------
357 # valide_liste_partielle
358 # valide_liste_complete
364 def valide_item(self,item):
366 La validation est realisee directement par l'objet
368 return self.object.valide_item(item)
370 def valide_liste_partielle(self,item,listecourante):
371 #On protege la liste en entree en la copiant
372 valeur=listecourante[:]
374 return self.object.valid_valeur_partielle(valeur)
376 def valide_liste_complete (self,valeur):
377 return self.object.valid_valeur(valeur)
379 def valide_val (self,valeur):
380 return self.object.valid_val(valeur)
382 def info_erreur_item(self) :
384 if self.definition.validators :
385 commentaire=self.definition.validators.info_erreur_item()
390 if self.definition.validators :
391 commentaire=self.definition.validators.aide()
394 def info_erreur_liste(self) :
396 if self.definition.validators :
397 commentaire=self.definition.validators.info_erreur_liste()
400 def IsInIntervalle(self,valeur):
402 Retourne 1 si la valeur est dans l'intervalle permis par
403 l'objet represente par l'item.
405 return self.valide_item(valeur)
408 valide=self.object.isvalid()
411 #--------------------------------------------------
415 #---------------------------------------------------
419 # get_sd_avant_du_bon_type
423 def GetIconName(self):
425 return "ast-green-ball"
426 elif self.object.isoblig():
427 return "ast-red-ball"
429 return "ast-yel-ball"
435 Retourne le texte a afficher dans l'arbre representant la valeur de l'objet
438 text= self.object.GetText()
439 if text == None : text=""
443 def set_valeur_co(self,nom_co):
445 Affecte au MCS pointé par self l'objet de type CO et de nom nom_co
447 ret = self.object.set_valeur_co(nom_co)
448 #print "set_valeur_co",ret
451 def get_sd_avant_du_bon_type(self):
453 Retourne la liste des noms des SD présentes avant l'étape qui contient
454 le MCS pointé par self et du type requis par ce MCS
456 a=self.object.etape.parent.get_sd_avant_du_bon_type(self.object.etape,self.object.definition.type)
459 def get_sd_avant_du_bon_type_pour_type_de_base(self):
460 a=self.object.jdc.get_sd_avant_du_bon_type_pour_type_de_base(self.object.etape,"LASSD")
466 def delete_valeur_co(self,valeur=None):
468 Supprime la valeur du mot cle (de type CO)
469 il faut propager la destruction aux autres etapes
471 if not valeur : valeur=self.object.valeur
472 # XXX faut il vraiment appeler del_sdprod ???
473 #self.object.etape.parent.del_sdprod(valeur)
474 self.object.etape.parent.delete_concept(valeur)
476 #-----------------------------------------------
478 # Methodes liees au type de l objet attendu
480 #-----------------------------------------------
490 Méthode booléenne qui retourne 1 si l'objet pointé par self
491 attend un objet de type ASSD qui n'existe pas encore (type CO()),
494 return self.object.wait_co()
496 def wait_fichier(self):
497 maDefinition=self.object.definition
499 if ('Repertoire' in maDefinition.type[0]) or ('Fichier' in maDefinition.type[0]) :
506 Méthode booléenne qui retourne 1 si l'objet pointé par self
507 attend un objet GEOM, 0 sinon
509 return self.object.wait_geom()
512 return self.object.wait_TXM()
515 def wait_complex(self):
516 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
517 attend un complexe, 0 sinon """
518 if 'C' in self.object.definition.type:
524 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
525 attend un réel, 0 sinon """
526 if 'R' 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 'DateHHMMAAAA' in self.object.definition.type:
539 def wait_heure(self):
540 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
541 attend un réel, 0 sinon """
542 if 'HeureHHMMSS' in self.object.definition.type:
549 def wait_tuple(self):
550 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
551 attend un Tuple, 0 sinon """
552 for ss_type in self.object.definition.type:
553 if repr(ss_type).find('Tuple') != -1 :
557 def wait_matrice(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('Matrice') != -1 :
566 """Méthode booléenne qui retourne 1 si l'objet pointé par self
567 attend un objet de type ASSD ou dérivé, 0 sinon """
568 return self.object.wait_assd()
570 def wait_assd_or_type_base(self) :
572 if len(self.object.definition.type) > 1 :
573 if self.wait_reel() :
575 if 'I' in self.object.definition.type :
579 def wait_Salome(self):
580 type = self.object.definition.type[0]
581 if 'grma' in repr(type) : return True
582 if 'grno' in repr(type) : return True
583 if (isinstance(type, types.ClassType) and issubclass(type, SalomeEntry)) : return True
588 Retourne le type de valeur attendu par l'objet représenté par l'item.
590 return self.object.get_type()
592 #-----------------------------------------------------
594 # Methodes liees a l evaluation de la valeur saisie
596 #-----------------------------------------------------
602 def eval_valeur(self,valeur):
603 """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur de self :
604 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
605 - retourne 'valeur' (chaine de caractéres) sinon
607 newvaleur=self.eval_val(valeur)
610 def eval_valeur_BAK(self,valeur):
611 """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur
612 de l'objet pointé par self :
613 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
614 - retourne 'valeur' (chaine de caractéres) sinon
615 - retourne None en cas d invalidite
616 - retourne invalide si 1 des objets du tuple l est
619 if type(valeur) in (types.ListType,types.TupleType) :
622 newvaleur,validiteitem=self.eval_valeur_item(item)
623 valeurretour.append(newvaleur)
624 if validiteitem == 0:
627 valeurretour,validite= self.eval_valeur_item(valeur)
630 return valeurretour,validite
632 def eval_valeur_item(self,valeur):
633 """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
634 - va retourner la valeur de retour et la validite
635 selon le type de l objet attendu
636 - traite les reels et les parametres
638 #print "eval_valeur_item",valeur
639 if valeur==None or valeur == "" :
643 valeurinter = self.traite_reel(valeur)
644 if valeurinter != None :
645 valeurretour,validite= self.object.eval_valeur(valeurinter)
647 valeurretour,validite= self.object.eval_valeur(valeur)
648 elif self.wait_geom():
649 valeurretour,validite = valeur,1
651 valeurretour,validite= self.object.eval_valeur(valeur)
652 #print "eval_valeur_item",valeurretour,validite
655 if type(valeur) == types.StringType and self.object.wait_TXM():
656 essai_valeur="'" + valeur + "'"
657 valeurretour,validite= self.object.eval_valeur(essai_valeur)
659 if hasattr(valeurretour,'__class__'):
660 #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
661 if valeurretour.__class__.__name__ in ('PARAMETRE',):
665 # CCAR : il ne faut pas essayer de creer un concept
666 # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
668 #valeurretour=Accas.CO(valeur)
672 # on est dans le cas ou on a évalué et ou on n'aurait pas du
673 if self.object.wait_TXM() :
674 if type(valeurretour) != types.StringType:
675 valeurretour=str(valeur)
677 return valeurretour,validite
679 def is_CO(self,valeur=None):
681 Indique si valeur est un concept produit de la macro
682 Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
683 Si valeur vaut None on teste la valeur du mot cle
685 # Pour savoir si un concept est un nouveau concept de macro
686 # on regarde s'il est présent dans l'attribut sdprods de l'étape
687 # ou si son nom de classe est CO.
688 # Il faut faire les 2 tests car une macro non valide peut etre
689 # dans un etat pas tres catholique avec des CO pas encore types
690 # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
691 if not valeur:valeur=self.object.valeur
692 if valeur in self.object.etape.sdprods:return 1
693 if type(valeur) is not types.InstanceType:return 0
694 if valeur.__class__.__name__ == 'CO':return 1
697 def is_param(self,valeur) :
698 for param in self.jdc.params:
699 if (repr(param) == valeur):
703 def traite_reel(self,valeur):
705 Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
706 ou de détecter si on fait référence a un concept produit par DEFI_VALEUR
709 valeur = string.strip(valeur)
710 liste_reels = self.get_sd_avant_du_bon_type()
711 if valeur in liste_reels:
713 if len(valeur) >= 3 :
714 if valeur[0:4] == 'EVAL' :
715 # on a trouvé un EVAL --> on retourne directement la valeur
717 if string.find(valeur,'.') == -1 :
718 # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
719 if (self.is_param(valeur)):
722 if string.find(valeur,'e') != -1:
723 # Notation scientifique ?
736 treeitem = SIMPTreeItem