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