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