Salome HOME
*** empty log message ***
[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       raise "OBSOLETE"
250       if self.isactif():
251          liste=self.object.mc_liste
252       else:
253          liste=[]
254
255       sublist=[]
256       isublist=iter(self.sublist)
257       iliste=iter(liste)
258
259       while(1):
260          old_obj=obj=None
261          for item in isublist:
262             old_obj=item.getObject()
263             if old_obj in liste:break
264
265          for obj in iliste:
266             if obj is old_obj:break
267             # nouvel objet : on cree un nouvel item
268             def setfunction(value, object=obj):
269                 object.setval(value)
270             it = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
271             sublist.append(it)
272
273          if old_obj is None and obj is None:break
274          if old_obj is obj:
275             sublist.append(item)
276
277       self.sublist=sublist
278       return self.sublist
279
280   def isvalid(self):
281       return self.object.isvalid()
282
283   def iscopiable(self):
284       """
285       Retourne 1 si l'objet est copiable, 0 sinon
286       """
287       return 1
288
289   def update(self,item):
290       if item.sd and item.sd.nom:
291          self.nomme_sd(item.sd.nom)
292
293   def nomme_sd(self,nom):
294       """ Lance la méthode de nommage de la SD """
295       oldnom=""
296       if self.object.sd != None :
297          oldnom=self.object.sd.nom
298       test,mess= self.object.nomme_sd(nom)
299       if test:self.object.parent.reset_context()
300       if (test and self.appli.dict_reels.has_key(oldnom) ):
301               self.appli.dict_reels[nom]=self.appli.dict_reels[oldnom]
302       return test,mess
303
304   def is_reentrant(self):
305       return self.object.is_reentrant()
306     
307   def get_noms_sd_oper_reentrant(self):
308       return self.object.get_noms_sd_oper_reentrant()
309
310   def get_objet_commentarise(self):
311       """
312           Cette méthode retourne un objet commentarisé
313           représentatif de self.object
314       """
315       import generator,string,Accas
316       # Format de fichier utilisé
317       format=self.appli.format_fichier.get()
318       g=generator.plugins[format]()
319       texte_commande = g.gener(self.object,format='beautifie')
320       # Il faut enlever la première ligne vide de texte_commande que 
321       # rajoute le generator
322       rebut,texte_commande = string.split(texte_commande,'\n',1)
323       # on construit l'objet COMMANDE_COMM repésentatif de self mais non 
324       # enregistré dans le jdc
325       commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
326                                              parent=self.object.parent)
327       commande_comment.niveau = self.object.niveau
328       commande_comment.jdc = commande_comment.parent = self.object.jdc
329
330       pos=self.object.parent.etapes.index(self.object)
331       self.object.parent.suppentite(self.object)
332       self.object.parent.addentite(commande_comment,pos)
333
334       return commande_comment
335
336   def additem_BAK(self,name,pos):
337       raise "OBSOLETE"
338       mcent=self.addentite(name,pos)
339
340       self.expandable=1
341       if mcent == 0 :
342           # on ne peut ajouter l'élément de nom name
343           return 0
344       def setfunction(value, object=mcent):
345           object.setval(value)
346       item = self.make_objecttreeitem(self.appli,mcent.nom + " : ", mcent, setfunction)
347       return item
348
349   def GetSubList_BAK(self):
350       raise "OBSOLETE"
351       sublist=[]
352       for obj in self.object.mc_liste:
353         def setfunction(value, object=obj):
354           object.setval(value)
355         item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
356         sublist.append(item)
357       return sublist
358
359   def verif_condition_bloc_BAK(self):
360       raise "OBSOLETE"
361       return self.object.verif_condition_bloc()
362
363   def replace_child_BAK(self,old_item,new_item):
364      """
365      Remplace old_item.getObject() par new_item.getObject() dans 
366      les fils de self.object
367      """
368      raise "OBSOLETE"
369      old_itemobject=old_item.getObject()
370      index = self.object.mc_liste.index(old_itemobject)
371      self.object.init_modif()
372      self.object.mc_liste.remove(old_itemobject)
373      self.object.mc_liste.insert(index,new_item.getObject())
374      self.object.fin_modif()
375      
376 import Accas
377 treeitem = EtapeTreeItem
378 objet = Accas.ETAPE    
379