]> SALOME platform Git repositories - tools/eficas.git/blob - InterfaceTK/compooper.py
Salome HOME
CCAR: merge de la version 1.14 dans la branche principale
[tools/eficas.git] / InterfaceTK / compooper.py
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.
9 #
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.
14 #
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.
18 #
19 #
20 # ======================================================================
21 from Tkinter import *
22 import Pmw
23 import traceback
24 from Editeur import Objecttreeitem
25 import panels
26 import fontes
27
28 class OPERPanel(panels.OngletPanel):
29
30   def init(self):
31     nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
32     nb.pack(fill = 'both', expand = 1)
33     self.nb=nb
34     nb.add('Mocles', tab_text='Nouveau mot-clé')
35     nb.add('Concept', tab_text='Nommer concept')
36     nb.add('Commande', tab_text='Nouvelle Commande')
37     nb.add('Commentaire',tab_text='Paramètre/Commentaire')
38     panneau=Pmw.PanedWidget(nb.page("Mocles"),
39                             orient='horizontal')
40     panneau.add('left',min=0.4,max=0.60,size=0.50)
41     panneau.add('right',min=0.4,max=0.60,size=0.50)
42     panneau.pack(expand=1,fill='both')
43     panneau.setnaturalsize()
44     self.makeCommandePage(nb.page("Commande"))
45     self.makeConceptPage_oper(nb.page("Concept"))
46     self.makeMoclesPage(panneau.pane('left'))
47     self.makeReglesPage(panneau.pane('right'))
48     #self.makeCommentairePage(nb.page("Commentaire"))
49     self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
50     nb.tab('Mocles').focus_set()
51     self.nb.setnaturalsize()
52     self.enlevebind()
53     self.creebind()
54     self.affiche()
55
56   def makeConceptPage_oper(self,page):
57       """ Crée la page de saisie du nom du concept """
58       if self.node.item.is_reentrant():
59           # commande obligatoirement reentrante
60           self.makeConceptPage_reentrant(page)
61       else:
62           # commande non reentrante ou facultativement reentrante
63           self.makeConceptPage(page)
64
65   def makeConceptPage_reentrant(self,page):
66       """ Crée la page de saisie du nom de concept pour un opérateur reentrant
67       cad propose dans la liste des SD utilisées dans la commande celle(s) dont le
68       type est compatible avec celui que retourne l'opérateur """
69       liste_noms_sd = self.node.item.get_noms_sd_oper_reentrant()
70       self.listbox = Pmw.ScrolledListBox(page,
71                                          items=liste_noms_sd,
72                                          labelpos='n',
73                                          label_text="Structure(s) de données à enrichir par l'opérateur courant :",
74                                          listbox_height = 6,
75                                          selectioncommand=self.select_valeur_from_list,
76                                          dblclickcommand=lambda s=self,c=self.execConcept : s.choose_valeur_from_list(c))
77       self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
78       Label(page,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
79       self.valeur_choisie = StringVar()
80       self.label_valeur = Label(page,textvariable=self.valeur_choisie)
81       self.label_valeur.place(relx=0.45,rely=0.6)
82       if len(liste_noms_sd) == 1 :
83           self.valeur_choisie.set(liste_noms_sd[0])
84
85   def select_valeur_from_list(self):
86       try:
87           choix = self.listbox.getcurselection()[0]
88           self.valeur_choisie.set(choix)
89       except:
90           traceback.print_exc()
91           
92
93   def choose_valeur_from_list(self,command):
94       try:
95           choix = self.listbox.getcurselection()[0]
96           self.valeur_choisie.set(choix)
97           apply(command,(),{})
98       except:
99           traceback.print_exc()
100
101 import treewidget
102 class Node(treewidget.Node):
103     def doPaste(self,node_selected):
104         """
105             Déclenche la copie de l'objet item avec pour cible
106             l'objet passé en argument : node_selected
107         """
108         objet_a_copier = self.item.get_copie_objet()
109         child=node_selected.doPaste_Commande(objet_a_copier)
110         return child
111
112     def doPaste_Commande(self,objet_a_copier):
113         """
114           Réalise la copie de l'objet passé en argument qui est nécessairement
115           une commande
116         """
117         parent=self.parent
118         #child = parent.item.append_child(objet_a_copier,self.item.getObject())
119         child = self.append_brother(objet_a_copier,retour='oui')
120         #if child is None:return 0
121         return child
122
123     def doPaste_MCF(self,objet_a_copier):
124         """
125            Réalise la copie de l'objet passé en argument (objet_a_copier)
126            Il s'agit forcément d'un mot clé facteur
127         """
128         child = self.append_child(objet_a_copier,pos='first',retour='oui')
129         return child
130
131
132 class EtapeTreeItem(Objecttreeitem.ObjectTreeItem):
133   """ La classe EtapeTreeItem est un adaptateur des objets ETAPE du noyau
134       Accas. Elle leur permet d'etre affichés comme des noeuds
135       d'un arbre graphique.
136       Cette classe a entre autres deux attributs importants :
137         - _object qui est un pointeur vers l'objet du noyau
138         - object qui pointe vers l'objet auquel sont délégués les
139           appels de méthode et les accès aux attributs
140       Dans le cas d'une ETAPE, _object et object pointent vers le 
141       meme objet.
142   """
143   panel = OPERPanel
144   itemNode=Node
145   
146   def IsExpandable(self):
147       return 1
148
149   def GetIconName(self):
150       """
151       Retourne le nom de l'icône à afficher dans l'arbre
152       Ce nom dépend de la validité de l'objet
153       """
154       if not self.object.isactif():
155          return "ast-white-square"
156       elif self.object.isvalid():
157          return "ast-green-square"
158       else:
159          valid=self.valid_child()
160          valid=valid * self.valid_regles("non")
161          if self.reste_val != {}:
162             valid=0
163          if valid==0  :
164             return "ast-red-square"
165          else :
166             return "ast-yellow-square"
167
168   def GetLabelText(self):
169       """ Retourne 3 valeurs :
170       - le texte à afficher dans le noeud représentant l'item
171       - la fonte dans laquelle afficher ce texte
172       - la couleur du texte
173       """
174       if self.object.isactif():
175         # None --> fonte et couleur par défaut
176         return self.labeltext,None,None
177       else:
178         return self.labeltext,fontes.standard_italique,None
179       
180   def get_objet(self,name) :
181       for v in self.object.mc_liste:
182           if v.nom == name : return v
183       return None
184       
185   def get_type_sd_prod(self):
186       """
187          Retourne le nom du type du concept résultat de l'étape
188       """
189       sd_prod=self.object.get_type_produit()
190       if sd_prod:
191          return sd_prod.__name__
192       else:
193          return ""
194
195   def additem(self,name,pos):
196       #print "compooper.additem",name,pos
197       mcent = self._object.addentite(name,pos)
198       return mcent
199
200   def suppitem(self,item) :
201       # item : item du MOCLE de l'ETAPE à supprimer
202       # item.getObject() = MCSIMP, MCFACT, MCBLOC ou MCList 
203       itemobject=item.getObject()
204       if itemobject.isoblig() :
205           self.appli.affiche_infos('Impossible de supprimer un mot-clé obligatoire ')
206           return 0
207       if self.object.suppentite(itemobject):
208           message = "Mot-clé " + itemobject.nom + " supprimé"
209           self.appli.affiche_infos(message)
210           return 1
211       else :
212           self.appli.affiche_infos('Pb interne : impossible de supprimer ce mot-clé')
213           return 0
214
215   def GetText(self):
216       try:
217           return self.object.get_sdname()
218       except:
219           return ''
220
221   def keys(self):
222       keys=self.object.mc_dict.keys()
223       return keys
224
225   def GetSubList(self):
226       """
227          Reactualise la liste des items fils stockes dans self.sublist
228       """
229       if self.isactif():
230          liste=self.object.mc_liste
231       else:
232          liste=[]
233
234       sublist=[None]*len(liste)
235       # suppression des items lies aux objets disparus
236       for item in self.sublist:
237          old_obj=item.getObject()
238          if old_obj in liste:
239             pos=liste.index(old_obj)
240             sublist[pos]=item
241          else:
242             pass # objets supprimes ignores
243
244       # ajout des items lies aux nouveaux objets
245       pos=0
246       for obj in liste:
247          if sublist[pos] is None:
248             # nouvel objet : on cree un nouvel item
249             def setfunction(value, object=obj):
250                 object.setval(value)
251             item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
252             sublist[pos]=item
253          pos=pos+1
254
255       self.sublist=sublist
256       return self.sublist
257
258   def isvalid(self):
259       return self.object.isvalid()
260
261   def iscopiable(self):
262       """
263       Retourne 1 si l'objet est copiable, 0 sinon
264       """
265       return 1
266
267   def update(self,item):
268       if item.sd and item.sd.nom:
269          self.nomme_sd(item.sd.nom)
270
271   def nomme_sd(self,nom):
272       """ Lance la méthode de nommage de la SD """
273       oldnom=""
274       if self.object.sd != None :
275          oldnom=self.object.sd.nom
276       test,mess= self.object.nomme_sd(nom)
277       if test:self.object.parent.reset_context()
278       if (test and self.appli.dict_reels.has_key(oldnom) ):
279               self.appli.dict_reels[nom]=self.appli.dict_reels[oldnom]
280       return test,mess
281
282   def is_reentrant(self):
283       return self.object.is_reentrant()
284     
285   def get_noms_sd_oper_reentrant(self):
286       return self.object.get_noms_sd_oper_reentrant()
287
288   def get_objet_commentarise(self):
289       """
290           Cette méthode retourne un objet commentarisé
291           représentatif de self.object
292       """
293       # Format de fichier utilisé
294       format=self.appli.format_fichier.get()
295       return self.object.get_objet_commentarise(format)
296
297   def get_objet_commentarise_BAK(self):
298       """
299           Cette méthode retourne un objet commentarisé
300           représentatif de self.object
301       """
302       import generator,string,Accas
303       # Format de fichier utilisé
304       format=self.appli.format_fichier.get()
305       g=generator.plugins[format]()
306       texte_commande = g.gener(self.object,format='beautifie')
307       # Il faut enlever la première ligne vide de texte_commande que 
308       # rajoute le generator
309       rebut,texte_commande = string.split(texte_commande,'\n',1)
310       # on construit l'objet COMMANDE_COMM repésentatif de self mais non 
311       # enregistré dans le jdc
312       commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
313                                              parent=self.object.parent)
314       commande_comment.niveau = self.object.niveau
315       commande_comment.jdc = commande_comment.parent = self.object.jdc
316
317       pos=self.object.parent.etapes.index(self.object)
318       parent=self.object.parent
319       self.object.parent.suppentite(self.object)
320       parent.addentite(commande_comment,pos)
321
322       return commande_comment
323
324   def visu_3D(self,appli,node) :
325       import TroisDPal
326       troisD=TroisDPal.TroisDPilote(node.item,appli,node.parent)
327       troisD.envoievisu()
328
329 import Accas
330 treeitem = EtapeTreeItem
331 objet = Accas.ETAPE    
332