Add text class.
[mpl_properties.git] / mpl-properties.py
blob54e19fe256747354ef0430cace631d404cdd2b22
1 import pylab as P
2 import pygtk
3 pygtk.require('2.0')
4 import gtk
5 import gobject
7 def print_fig_prop(fig):
8 for ind_ax, ax in enumerate(P.figure(fig).axes):
9 print "*** Axe %d ***"%ind_ax
10 print "Xmin : %g"%ax.get_xlim()[0]
11 print "Xmax : %g"%ax.get_xlim()[1]
12 print "Ymin : %g"%ax.get_ylim()[0]
13 print "Ymax : %g"%ax.get_ylim()[1]
14 print "Fontsize (X) : %g"%ax.get_xticklabels()[0].get_fontsize()
15 print "Fontsize (Y) : %g"%ax.get_yticklabels()[0].get_fontsize()
16 print "Title : " + ax.title.get_text()
17 print "Title fontsize : %g"%ax.title.get_fontsize()
18 print "X label : " + ax.xaxis.get_label().get_text()
19 print "X label fontsize : %g"%ax.xaxis.get_label().get_fontsize()
20 print "Y label : " + ax.yaxis.get_label().get_text()
21 print "Y label fontsize : %g"%ax.yaxis.get_label().get_fontsize()
23 for ind_line, line in enumerate(ax.lines):
24 print " *** Line %d ***"%ind_line
25 print " Style : " + line.get_linestyle()
26 print " Marker : " + line.get_marker()
27 print " Line Width : %.1f"%line.get_linewidth()
28 print " Color : " + line.get_color()
29 for ind_im, im in enumerate(ax.images):
30 print " *** Image %d ***"%ind_im
31 print " Colormap : " + im.cmap.name
32 print " Interpolation : " + im.get_interpolation()
33 print " Extent : [%g, %g, %g, %g]"%(im.get_extent()[0],im.get_extent()[1],im.get_extent()[2],im.get_extent()[3], )
35 class properties:
37 def row_activated(self, treeview):
38 model, iter = treeview.get_selection().get_selected()
39 type = model.get_value(iter, 1)
40 self.type_selected = type
41 obj = model.get_value(iter,2)
42 self.selected = model.get_value(iter,2)
43 self.fig = model.get_value(iter, 3)
44 if type == 'line':
45 self.display_line(obj)
46 elif type == 'axe':
47 self.display_axe(obj)
48 elif type == 'image':
49 self.display_image(obj)
50 elif type == 'figure':
51 self.display_figure(obj)
53 def get_value(self, obj, name):
54 if name == 'linestyle':
55 return obj.get_linestyle()
56 elif name == 'marker':
57 return obj.get_marker()
58 elif name == 'linewidth':
59 return obj.get_linewidth()
60 elif name == 'linecolor':
61 return obj.get_color()
62 elif name == 'xmin':
63 return obj.get_xlim()[0]
64 elif name == 'xmax':
65 return obj.get_xlim()[1]
66 elif name == 'ymin':
67 return obj.get_ylim()[0]
68 elif name == 'ymax':
69 return obj.get_ylim()[1]
70 elif name == 'title':
71 return obj.title.get_text()
72 elif name == 'titlefontsize':
73 return obj.title.get_fontsize()
74 elif name == 'xlabel':
75 return obj.xaxis.get_label().get_text()
76 elif name == 'ylabel':
77 return obj.yaxis.get_label().get_text()
78 elif name == 'xfontsize':
79 return obj.xaxis.get_ticklabels()[0].get_fontsize()
80 elif name == 'yfontsize':
81 return obj.yaxis.get_ticklabels()[0].get_fontsize()
82 elif name == 'xlabelfontsize':
83 return obj.xaxis.get_label().get_fontsize()
84 elif name == 'ylabelfontsize':
85 return obj.yaxis.get_label().get_fontsize()
86 elif name == 'figwidth':
87 return obj.window.get_size()[0]
88 elif name == 'figheight':
89 return obj.window.get_size()[1]
90 elif name == 'xpos':
91 return obj.get_position()[0]
92 elif name == 'ypos':
93 return obj.get_position()[1]
94 elif name == 'width':
95 return obj.get_position()[2]
96 elif name == 'height':
97 return obj.get_position()[3]
98 elif name == 'xbegin':
99 return obj.get_extent()[0]
100 elif name == 'xend':
101 return obj.get_extent()[1]
102 elif name == 'ybegin':
103 return obj.get_extent()[2]
104 elif name == 'yend':
105 return obj.get_extent()[3]
106 elif name == 'cmap':
107 return obj.cmap.name
108 elif name == 'interp':
109 return obj.get_interpolation()
110 elif name == 'label':
111 return obj.get_label()
112 elif name == 'textx':
113 return obj.get_position()[0]
114 elif name == 'texty':
115 return obj.get_position()[1]
116 elif name == 'text':
117 return obj.get_text()
121 def set_value(self, obj, name, value):
122 if name == 'linestyle':
123 obj.set_linestyle(value)
124 elif name == 'marker':
125 obj.set_marker(value)
126 elif name == 'linewidth':
127 obj.set_linewidth(float(value))
128 elif name == 'linecolor':
129 obj.set_color(value)
130 elif name == 'xmin' or name == 'xmax':
131 obj.set_xlim([float(self.param['xmin'].get_text()), float(self.param['xmax'].get_text())])
132 elif name == 'ymin' or name == 'ymax':
133 obj.set_ylim([float(self.param['ymin'].get_text()), float(self.param['ymax'].get_text())])
134 elif name == 'title':
135 obj.title.set_text(value)
136 elif name == 'titlefontsize':
137 obj.title.set_fontsize(float(value))
138 elif name == 'xlabel':
139 obj.xaxis.get_label().set_text(value)
140 elif name == 'ylabel':
141 obj.yaxis.get_label().set_text(value)
142 elif name == 'xfontsize':
143 for tick in obj.xaxis.get_ticklabels():
144 tick.set_fontsize(float(value))
145 elif name == 'yfontsize':
146 for tick in obj.yaxis.get_ticklabels():
147 tick.set_fontsize(float(value))
148 elif name == 'xlabelfontsize':
149 obj.xaxis.get_label().set_fontsize(float(value))
150 elif name == 'ylabelfontsize':
151 obj.yaxis.get_label().set_fontsize(float(value))
152 elif name == 'figwidth' or name == 'figheight':
153 obj.resize(int(self.param['figwidth'].get_text()),int(self.param['figheight'].get_text()) )
154 elif name == 'xpos' or name =='ypos' or name == 'width' or name == 'height':
155 a = float(self.param['xpos'].get_text())
156 b = float(self.param['ypos'].get_text())
157 c = float(self.param['width'].get_text())
158 d = float(self.param['height'].get_text())
159 obj.set_position([a,b,c,d])
160 elif name == 'cmap':
161 obj.set_cmap(getattr(P.cm, value))
162 elif name == 'interp':
163 obj.set_interpolation(value)
164 elif name == 'label':
165 obj.set_label(value)
166 elif name == 'textx':
167 obj.set_x(float(value))
168 elif name == 'texty':
169 obj.set_y(float(value))
170 elif name == 'text':
171 obj.set_text(value)
173 def remove(self, widget):
174 self.paramtable.remove(widget)
176 def add_param(self, widget, name, title, obj):
177 tmp = gtk.HBox()
178 tmp.show()
180 tmp2 = gtk.Label(title)
181 tmp2.show()
182 tmp.pack_start(tmp2)
184 default = self.get_value(obj, name)
185 if default == None:
186 default=''
187 self.param[name] = gtk.Entry(20)
188 self.param[name].set_text(str(default))
189 self.param[name].connect("activate", self.apply)
190 self.param[name].show()
191 tmp.pack_start(self.param[name])
193 widget.pack_start(tmp, False)
195 def display_line(self, line):
196 self.paramtable.foreach(self.remove)
197 self.param.clear()
198 for name in self.param_lines_order:
199 self.add_param(self.paramtable, name, self.param_lines[name], line)
201 def display_axe(self, ax):
202 self.paramtable.foreach(self.remove)
203 self.param.clear()
204 for name in self.param_axe_order:
205 self.add_param(self.paramtable, name, self.param_axe[name], ax)
207 def display_figure(self, figure):
208 self.paramtable.foreach(self.remove)
209 self.param.clear()
210 for name, title in self.param_figure.items():
211 self.add_param(self.paramtable, name, title, figure)
212 def display_text(self, text):
213 self.paramtable.foreach(self.remove)
214 self.param.clear()
215 for name, title in self.param_text_order:
216 self.add_param(self.paramtable, name, title, text)
218 def display_image(self, im):
219 self.paramtable.foreach(self.remove)
220 self.param.clear()
221 for name in self.param_image_order:
222 self.add_param(self.paramtable, name, self.param_image[name], im)
224 def apply(self, widget):
225 obj = self.selected
226 for name, button in self.param.items():
227 value = button.get_text()
228 self.set_value(obj, name, value)
229 P.figure(self.fig)
230 P.draw()
231 self.row_activated(self.treeview)
233 def delete(self, widget):
234 model, iter = self.treeview.get_selection().get_selected()
235 if self.type_selected=='axe':
236 P.delaxes(self.selected)
237 P.figure(self.fig)
238 P.draw()
239 elif self.type_selected=='figure':
240 P.close(self.fig)
241 elif self.type_selected=='line':
242 axe = model.get_value(model.iter_parent(iter), 2)
243 del axe.lines[model.get_value(iter, 4)]
244 P.figure(self.fig)
245 P.draw()
246 elif self.type_selected=='image':
247 axe = model.get_value(model.iter_parent(iter), 2)
248 del axe.images[model.get_value(iter, 4)]
249 P.figure(self.fig)
250 P.draw()
251 elif self.type_selected=='text':
252 axe = model.get_value(model.iter_parent(iter), 2)
253 del axe.texts[model.get_value(iter, 4)]
254 P.figure(self.fig)
255 P.draw()
256 self.treestore.remove(iter)
257 self.paramtable.foreach(self.remove)
258 self.param.clear()
260 def update(self, widget):
261 self.window.destroy()
262 fig_prop()
264 def copy(self, widget):
265 model, iter = self.treeview.get_selection().get_selected()
266 if self.type_selected=='line':
267 print line
269 def __init__(self):
270 self.selected=None
271 self.param={}
272 self.param_names = {'label': 'Label',
273 'linestyle': 'Line style',
274 'marker': 'Marker',
275 'linewidth': 'Line Width',
276 'linecolor': 'Line Color',
277 'cmap': 'Colormap',
278 'interp': 'Interpolation',
279 'label': 'Label',
280 'xpos': 'X position',
281 'ypos': 'Y position',
282 'width': 'Width',
283 'height': 'Height',
284 'xmin': 'X min',
285 'xmax': 'X max',
286 'ymin': 'Y min',
287 'ymax': 'Y max',
288 'title': 'Title',
289 'titlefontsize': 'Title fontsize',
290 'xlabel': 'X label',
291 'ylabel': 'Y label',
292 'xlabelfontsize': 'Fontsize (X label)',
293 'ylabelfontsize': 'Fontsize (Y label)',
294 'xfontsize': 'Fontsize (X ticks)',
295 'yfontsize': 'Fontsize (Y ticks)',
296 'figwidth': 'Width',
297 'figheight': 'Height',
298 'textx': 'X position',
299 'texty': 'Y position',
300 'text': 'Text'}
302 self.param_lines_order = ['label', 'linestyle', 'linecolor', 'linewidth', 'marker']
303 self.param_image_order = ['label', 'cmap', 'interp']
304 self.param_axe_order = ['xpos', 'ypos', 'width', 'height',
305 'xmin', 'xmax', 'ymin', 'ymax',
306 'title', 'titlefontsize',
307 'xlabel', 'xlabelfontsize',
308 'ylabel', 'ylabelfontsize',
309 'xfontsize', 'yfontsize']
310 self.param_figure_order = ['figwidth', 'figheight']
311 self.param_text_order = ['textx', 'texty', 'text']
314 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
315 self.window.set_title('Graphics properties')
316 self.window.set_default_size(300, 400)
317 vbox = gtk.VBox()
318 hbox = gtk.HBox()
319 self.paramtable = gtk.VBox()
320 self.paramtable.show()
321 self.treestore = gtk.TreeStore(gobject.TYPE_STRING, str, object, int, int)
322 self.treeview = gtk.TreeView(self.treestore)
323 self.treeview.set_headers_visible(False)
324 renderer = gtk.CellRendererText()
325 column = gtk.TreeViewColumn('Object ID', renderer, text=0)
326 self.treeview.append_column(column)
327 for figure in P.matplotlib._pylab_helpers.Gcf.get_all_fig_managers():
328 fig = figure.num
329 iter_fig = self.treestore.append(None, ['Figure %d'%fig, 'figure' ,figure, fig, fig])
330 for ind_ax, ax in enumerate(P.figure(fig).axes):
331 iter_ax = self.treestore.append(iter_fig, ['Axe %d'%ind_ax, 'axe' ,ax, fig, ind_ax])
332 for ind_line, line in enumerate(ax.lines):
333 iter = self.treestore.append(iter_ax, ['Line %d'%ind_line, 'line', line, fig, ind_line])
334 for ind_im, im in enumerate(ax.images):
335 iter = self.treestore.append(iter_ax, ['Image %d'%ind_im, 'image',im, fig, ind_im])
336 for ind_text, text in enumerate(ax.texts):
337 iter = self.treestore.append(iter_ax, ['Text %d'%ind_text, 'text', text, fig, ind_text])
339 try:
340 self.fig=fig
341 except:
342 return
343 self.treeview.connect("cursor-changed", self.row_activated)
344 scroll = gtk.ScrolledWindow()
345 scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
346 scroll.add(self.treeview)
347 scroll.show()
348 hbox.pack_start(scroll)
350 viewport = gtk.Viewport()
351 viewport.add(self.paramtable)
352 viewport.show()
353 scroll = gtk.ScrolledWindow()
354 scroll.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
355 scroll.add(viewport)
356 scroll.show()
357 hbox.pack_start(scroll)
359 bottom=gtk.HBox()
360 button = gtk.Button('Update')
361 button.connect("clicked", self.update)
362 button.show()
363 bottom.pack_start(button)
364 button = gtk.Button('Copy')
365 button.connect("clicked", self.copy)
366 button.show()
367 bottom.pack_start(button)
368 button = gtk.Button('Delete')
369 button.connect("clicked", self.delete)
370 button.show()
371 bottom.pack_start(button)
372 bottom.show()
373 button = gtk.Button('Apply')
374 button.connect("clicked", self.apply)
375 button.show()
376 bottom.pack_start(button)
377 bottom.show()
379 vbox.pack_start(hbox)
380 vbox.pack_start(bottom, False)
381 self.window.add(vbox)
382 self.treeview.show()
383 hbox.show()
384 vbox.show()
385 self.window.show()
386 gtk.main()