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()
511 def wait_complex(self):
512 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
513 attend un complexe, 0 sinon """
514 if 'C' in self.object.definition.type:
520 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
521 attend un réel, 0 sinon """
522 if 'R' in self.object.definition.type:
528 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
529 attend un réel, 0 sinon """
530 if 'DateHHMMAAAA' in self.object.definition.type:
535 def wait_heure(self):
536 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
537 attend un réel, 0 sinon """
538 if 'HeureHHMMSS' in self.object.definition.type:
545 def wait_tuple(self):
546 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
547 attend un Tuple, 0 sinon """
548 for ss_type in self.object.definition.type:
549 if repr(ss_type).find('Tuple') != -1 :
553 def wait_matrice(self):
554 """ Méthode booléenne qui retourne 1 si l'objet pointé par self
555 attend un Tuple, 0 sinon """
556 for ss_type in self.object.definition.type:
557 if repr(ss_type).find('Matrice') != -1 :
562 """Méthode booléenne qui retourne 1 si l'objet pointé par self
563 attend un objet de type ASSD ou dérivé, 0 sinon """
564 return self.object.wait_assd()
566 def wait_assd_or_type_base(self) :
568 if len(self.object.definition.type) > 1 :
569 if self.wait_reel() :
571 if 'I' in self.object.definition.type :
575 def wait_Salome(self):
576 type = self.object.definition.type[0]
577 if 'grma' in repr(type) : return True
578 if 'grno' in repr(type) : return True
579 if (isinstance(type, types.ClassType) and issubclass(type, SalomeEntry)) : return True
584 Retourne le type de valeur attendu par l'objet représenté par l'item.
586 return self.object.get_type()
588 #-----------------------------------------------------
590 # Methodes liees a l evaluation de la valeur saisie
592 #-----------------------------------------------------
598 def eval_valeur(self,valeur):
599 """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur de self :
600 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
601 - retourne 'valeur' (chaine de caractéres) sinon
603 newvaleur=self.eval_val(valeur)
606 def eval_valeur_BAK(self,valeur):
607 """ Lance l'interprétation de 'valeur' (chaine de caractéres) comme valeur
608 de l'objet pointé par self :
609 - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
610 - retourne 'valeur' (chaine de caractéres) sinon
611 - retourne None en cas d invalidite
612 - retourne invalide si 1 des objets du tuple l est
615 if type(valeur) in (types.ListType,types.TupleType) :
618 newvaleur,validiteitem=self.eval_valeur_item(item)
619 valeurretour.append(newvaleur)
620 if validiteitem == 0:
623 valeurretour,validite= self.eval_valeur_item(valeur)
626 return valeurretour,validite
628 def eval_valeur_item(self,valeur):
629 """ Lance l'interprétation de 'valeur' qui doit ne pas etre un tuple
630 - va retourner la valeur de retour et la validite
631 selon le type de l objet attendu
632 - traite les reels et les parametres
634 #print "eval_valeur_item",valeur
635 if valeur==None or valeur == "" :
639 valeurinter = self.traite_reel(valeur)
640 if valeurinter != None :
641 valeurretour,validite= self.object.eval_valeur(valeurinter)
643 valeurretour,validite= self.object.eval_valeur(valeur)
644 elif self.wait_geom():
645 valeurretour,validite = valeur,1
647 valeurretour,validite= self.object.eval_valeur(valeur)
648 #print "eval_valeur_item",valeurretour,validite
651 if type(valeur) == types.StringType and self.object.wait_TXM():
652 essai_valeur="'" + valeur + "'"
653 valeurretour,validite= self.object.eval_valeur(essai_valeur)
655 if hasattr(valeurretour,'__class__'):
656 #if valeurretour.__class__.__name__ in ('PARAMETRE','PARAMETRE_EVAL'):
657 if valeurretour.__class__.__name__ in ('PARAMETRE',):
661 # CCAR : il ne faut pas essayer de creer un concept
662 # il faut simplement en chercher un existant ce qui a du etre fait par self.object.eval_valeur(valeur)
664 #valeurretour=Accas.CO(valeur)
668 # on est dans le cas ou on a évalué et ou on n'aurait pas du
669 if self.object.wait_TXM() :
670 if type(valeurretour) != types.StringType:
671 valeurretour=str(valeur)
673 return valeurretour,validite
675 def is_CO(self,valeur=None):
677 Indique si valeur est un concept produit de la macro
678 Cette méthode n'a de sens que pour un MCSIMP d'une MACRO
679 Si valeur vaut None on teste la valeur du mot cle
681 # Pour savoir si un concept est un nouveau concept de macro
682 # on regarde s'il est présent dans l'attribut sdprods de l'étape
683 # ou si son nom de classe est CO.
684 # Il faut faire les 2 tests car une macro non valide peut etre
685 # dans un etat pas tres catholique avec des CO pas encore types
686 # et donc pas dans sdprods (resultat d'une exception dans type_sdprod)
687 if not valeur:valeur=self.object.valeur
688 if valeur in self.object.etape.sdprods:return 1
689 if type(valeur) is not types.InstanceType:return 0
690 if valeur.__class__.__name__ == 'CO':return 1
693 def is_param(self,valeur) :
694 for param in self.jdc.params:
695 if (repr(param) == valeur):
699 def traite_reel(self,valeur):
701 Cette fonction a pour but de rajouter le '.' en fin de chaine pour un réel
702 ou de détecter si on fait référence a un concept produit par DEFI_VALEUR
705 valeur = string.strip(valeur)
706 liste_reels = self.get_sd_avant_du_bon_type()
707 if valeur in liste_reels:
709 if len(valeur) >= 3 :
710 if valeur[0:4] == 'EVAL' :
711 # on a trouvé un EVAL --> on retourne directement la valeur
713 if string.find(valeur,'.') == -1 :
714 # aucun '.' n'a été trouvé dans valeur --> on en rajoute un a la fin
715 if (self.is_param(valeur)):
718 if string.find(valeur,'e') != -1:
719 # Notation scientifique ?
732 treeitem = SIMPTreeItem