]> SALOME platform Git repositories - tools/eficas.git/blob - Editeur/compooper.py
Salome HOME
CCAR: corrections diverses dans le cas d'insertion d'un include avec concepts de
[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       test,mess= self.object.nomme_sd(nom)
296       if test:self.object.parent.reset_context()
297       return test,mess
298
299   def is_reentrant(self):
300       return self.object.is_reentrant()
301     
302   def get_noms_sd_oper_reentrant(self):
303       return self.object.get_noms_sd_oper_reentrant()
304
305   def get_objet_commentarise(self):
306       """
307           Cette méthode retourne un objet commentarisé
308           représentatif de self.object
309       """
310       import generator,string,Accas
311       # Format de fichier utilisé
312       format=self.appli.format_fichier.get()
313       g=generator.plugins[format]()
314       texte_commande = g.gener(self.object,format='beautifie')
315       # Il faut enlever la première ligne vide de texte_commande que 
316       # rajoute le generator
317       rebut,texte_commande = string.split(texte_commande,'\n',1)
318       # on construit l'objet COMMANDE_COMM repésentatif de self mais non 
319       # enregistré dans le jdc
320       commande_comment = Accas.COMMANDE_COMM(texte=texte_commande,reg='non',
321                                              parent=self.object.parent)
322       commande_comment.niveau = self.object.niveau
323       commande_comment.jdc = commande_comment.parent = self.object.jdc
324
325       pos=self.object.parent.etapes.index(self.object)
326       self.object.parent.suppentite(self.object)
327       self.object.parent.addentite(commande_comment,pos)
328
329       return commande_comment
330
331   def additem_BAK(self,name,pos):
332       raise "OBSOLETE"
333       mcent=self.addentite(name,pos)
334
335       self.expandable=1
336       if mcent == 0 :
337           # on ne peut ajouter l'élément de nom name
338           return 0
339       def setfunction(value, object=mcent):
340           object.setval(value)
341       item = self.make_objecttreeitem(self.appli,mcent.nom + " : ", mcent, setfunction)
342       return item
343
344   def GetSubList_BAK(self):
345       raise "OBSOLETE"
346       sublist=[]
347       for obj in self.object.mc_liste:
348         def setfunction(value, object=obj):
349           object.setval(value)
350         item = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
351         sublist.append(item)
352       return sublist
353
354   def verif_condition_bloc_BAK(self):
355       raise "OBSOLETE"
356       return self.object.verif_condition_bloc()
357
358   def replace_child_BAK(self,old_item,new_item):
359      """
360      Remplace old_item.getObject() par new_item.getObject() dans 
361      les fils de self.object
362      """
363      raise "OBSOLETE"
364      old_itemobject=old_item.getObject()
365      index = self.object.mc_liste.index(old_itemobject)
366      self.object.init_modif()
367      self.object.mc_liste.remove(old_itemobject)
368      self.object.mc_liste.insert(index,new_item.getObject())
369      self.object.fin_modif()
370      
371 import Accas
372 treeitem = EtapeTreeItem
373 objet = Accas.ETAPE    
374