Salome HOME
CCAR: modifications pour :
[tools/eficas.git] / Editeur / compomacro.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 # Modules Python
22 import os,sys,string
23 import types
24 import Tkinter
25 import Pmw
26 import traceback
27
28 # Modules Eficas
29 import Objecttreeitem
30 import panels
31 import fontes
32 import compooper
33 import convert
34 from widgets import askopenfilename
35 from widgets import Fenetre,FenetreYesNo
36 from widgets import showinfo,showerror
37
38 #
39 __version__="$Name:  $"
40 __Id__="$Id: compomacro.py,v 1.18 2005/04/18 14:21:08 eficas Exp $"
41 #
42
43 class MACROPanel(panels.OngletPanel):
44   def init(self):
45     nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
46     nb.pack(fill = 'both', expand = 1)
47     self.nb=nb
48     nb.add('Mocles', tab_text='Ajouter mots-clés')
49     typsd=self.node.item.object.get_type_produit()
50     ficini = self.node.item.wait_fichier_init()
51     if typsd != None:
52       nb.add('Concept', tab_text='Nommer concept')
53     if ficini == 1:
54       nb.add('Fichierinit',tab_text = 'Fichier %s' %self.node.item.get_nom())
55     nb.add('Commande', tab_text='Nouvelle Commande')
56     nb.add('Commentaire',tab_text='Paramètre/Commentaire')
57     panneau=Pmw.PanedWidget(nb.page("Mocles"),
58                             orient='horizontal')
59     panneau.add('left',min=0.4,max=0.6,size=0.5)
60     panneau.add('right',min=0.4,max=0.6,size=0.5)
61     panneau.pack(expand=1,fill='both')
62     self.makeCommandePage(nb.page("Commande"))
63     if typsd != None:
64       self.makeConceptPage(nb.page("Concept"))
65     if ficini == 1 :
66       self.makeFichierPage(nb.page('Fichierinit'))
67     self.makeMoclesPage(panneau.pane('left'))
68     self.makeReglesPage(panneau.pane('right'))
69     self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
70     nb.tab('Mocles').focus_set()
71     nb.setnaturalsize()
72     self.affiche()
73
74   def makeFichierPage(self,page):
75     """
76     Affiche la page d'onglet correspondant au changement du fichier
77     dont a besoin la macro
78     """
79     titre = Tkinter.Label(page,text="La commande %s requiert un fichier " %self.node.item.get_nom())
80     titre.place(relx=0.5,rely=0.3,anchor='center')
81     Tkinter.Label(page,text="Fichier :").place(relx=0.1,rely=0.5,relwidth=0.2)
82     self.entry = Tkinter.Entry(page,relief='sunken',bg='white')
83     self.entry.place(relx=0.35,rely=0.5,relwidth=0.55)
84     Tkinter.Button(page,text='Valider',command = self.change_fichier_init).place(relx=0.3,rely=0.8)
85     Tkinter.Button(page,text='Browse',command = self.browse_fichier_init).place(relx=0.5,rely=0.8)
86     Tkinter.Button(page,text='Annuler',command = self.annule_fichier_init).place(relx=0.7,rely=0.8)
87     if hasattr(self.node.item.object,'fichier_ini'):
88       if self.node.item.object.fichier_ini :
89         self.entry.insert(0,self.node.item.object.fichier_ini)
90     self.entry.focus()
91
92   def convert_file(self,file):
93      """
94          Methode pour convertir le fichier file dans le format courant
95      """
96      format=self.parent.appli.format_fichier.get()
97      if convert.plugins.has_key(format):
98          # Le convertisseur existe on l'utilise
99          p=convert.plugins[format]()
100          p.readfile(file)
101          text=p.convert('execnoparseur')
102          if not p.cr.estvide():
103             self.parent.appli.affiche_infos("Erreur à la conversion")
104             Fenetre(self,
105                     titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
106                     texte = str(p.cr))
107             return None
108          return text
109      else:
110          # Il n'existe pas c'est une erreur
111          self.parent.appli.affiche_infos("Type de fichier non reconnu")
112          showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
113          return None
114
115   def change_fichier_init(self,event=None):
116     """ 
117         Effectue le changement de fichier d'initialisation s'il est valide 
118     """
119     new_fic = self.entry.get()
120     if not os.path.isfile(new_fic) :
121       showinfo("Fichier introuvable","Le fichier que vous avez saisi\n"+
122                "n'est pas un nom de fichier valide !")
123       self.parent.appli.affiche_infos("Fichier introuvable")
124       return
125     # On convertit le fichier
126     text=self.convert_file(new_fic)
127     # Si probleme a la lecture-conversion on arrete le traitement
128     if not text:
129        return
130
131     try:
132       self.node.item.object.change_fichier_init(new_fic,text)
133       self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
134     except:
135       # Erreurs lors de l'evaluation de text dans un JDC auxiliaire
136       self.parent.appli.affiche_infos("Fichier invalide")
137       l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
138       f=FenetreYesNo(self.parent.appli,titre="Fichier invalide : voulez vous retablir l ancien fichier ?",
139                              texte="Erreur dans l'interprétation du nouveau fichier ...\n\n"+string.join(l),
140                              yes="Retablir",no="Changer")
141       f.wait()
142       reponse=f.result
143       if reponse:
144          # On retablit l'ancien fichier
145          self.entry.delete(0,Tkinter.END)
146          self.node.item.object.restore_fichier_init()
147          self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré")
148          fic=self.node.item.object.fichier_ini
149          if fic:
150              self.entry.insert(0,fic)
151       else:
152          self.node.item.object.force_fichier_init()
153          self.parent.appli.affiche_infos("Fichier invalide ... Nouveau fichier mémorisé")
154
155   def annule_fichier_init(self,event=None):
156     """ Restaure dans self.entry le nom de fichier_init"""
157     self.entry.delete(0,Tkinter.END)
158     self.entry.insert(0,self.node.item.object.fichier_ini)
159
160   def browse_fichier_init(self,event=None):
161     """ 
162          Propose à l'utilisateur une Bsf et retourne le fichier 
163          sélectionné dans self.entry 
164     """
165     file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
166     if file :
167       self.entry.delete(0,Tkinter.END)
168       self.entry.insert(0,file)
169     
170     
171 class MACROTreeItem(compooper.EtapeTreeItem):
172   """ Cette classe hérite d'une grande partie des comportements
173       de la classe compooper.EtapeTreeItem
174   """
175   panel=MACROPanel
176
177 class INCLUDETreeItem(MACROTreeItem):
178   rmenu_specs=[("View","makeView"),
179                ("Edit","makeEdit"),
180               ]
181
182   def __init__(self,appli, labeltext, object, setfunction):
183     MACROTreeItem.__init__(self,appli, labeltext, object, setfunction)
184
185   def iscopiable(self):
186       """
187       Retourne 1 si l'objet est copiable, 0 sinon
188       """
189       return 0
190
191   def makeEdit(self,appli,node):
192     #print "makeEdit",self.object,self.object.nom
193     #print "makeEdit",self.object.jdc_aux,self.object.jdc_aux.nom
194     #print "makeEdit",self.object.jdc_aux.context_ini
195     self.parent_node=node
196     # On cree un nouvel onglet dans le bureau
197     appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
198                              label_onglet=None,
199                              JDCDISPLAY=macrodisplay.MACRODISPLAY)
200     self.myjdc=appli.bureau.JDCDisplay_courant
201     self.myjdc.fichier=self.object.fichier_ini
202
203   def makeView(self,appli,node):
204     nom=self.object.nom
205     if hasattr(self.object,'fichier_ini'):
206        if self.object.fichier_ini is None:
207           nom=nom+' '+"Fichier non défini"
208        else:
209           nom=nom+' '+self.object.fichier_ini
210     macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
211
212 class POURSUITETreeItem(INCLUDETreeItem): pass
213
214 class INCLUDE_MATERIAUTreeItem(INCLUDETreeItem):
215   rmenu_specs=[("View","makeView"),
216               ]
217   def iscopiable(self):
218       """
219       Retourne 1 si l'objet est copiable, 0 sinon
220       """
221       return 1
222
223
224 def treeitem(appli, labeltext, object, setfunction=None):
225    """ Factory qui retourne l'item adapté au type de macro : 
226        INCLUDE, POURSUITE, MACRO
227    """
228    if object.nom == "INCLUDE_MATERIAU":
229       return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
230    elif object.nom == "INCLUDE":
231       return INCLUDETreeItem(appli, labeltext, object, setfunction)
232    elif object.nom == "POURSUITE":
233       return POURSUITETreeItem(appli, labeltext, object, setfunction)
234    else:
235       return MACROTreeItem(appli, labeltext, object, setfunction)
236
237 import Accas
238 objet=Accas.MACRO_ETAPE
239     
240 import macrodisplay