From 2b5e5b35132634dff195fb38381f4d1836febba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matheus=20M=C3=BCller?= Date: Wed, 19 Oct 2011 15:37:45 -0200 Subject: [PATCH] Draggable rectangles, com problemas na remocao de pontos e adicao progressiva (!!!) --- drag_rectangle2.py | 168 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 drag_rectangle2.py diff --git a/drag_rectangle2.py b/drag_rectangle2.py new file mode 100644 index 0000000..5a80c4f --- /dev/null +++ b/drag_rectangle2.py @@ -0,0 +1,168 @@ +# draggable rectangle with the animation blit techniques; see +# http://www.scipy.org/Cookbook/Matplotlib/Animations +import numpy as np +import matplotlib.pyplot as plt +from scipy.interpolate import interp1d +from scipy import interpolate +from pylab import * +import Tkinter as tk + +listay = list() +drs = [] +fig = plt.figure() +ax = fig.add_subplot(111) +recursivecontrol = 0 + +####################################################################################################### +# Add square + +def add_square(x): + global listay, drs, ax + rect = ax.bar(x, 0.03, width=0.5) + for rec in rect: + dr = DraggableRectangle(rec) + dr.connect() + drs.append(dr) + listay.append(dr.rect.xy[1]) + ylim([0,1]) + xlim([0,20]) + +def remove_square(): + global listay, drs + listay.pop() + drs.pop() + print listay, drs + +####################################################################################################### + + +class DraggableRectangle: + lock = None # only one can be animated at a time + def __init__(self, rect): + self.rect = rect + self.press = None + self.background = None + self.rect.set_y(0.1) + + def connect(self): + 'connect to all the events we need' + self.cidpress = self.rect.figure.canvas.mpl_connect( + 'button_press_event', self.on_press) + self.cidrelease = self.rect.figure.canvas.mpl_connect( + 'button_release_event', self.on_release) + self.cidmotion = self.rect.figure.canvas.mpl_connect( + 'motion_notify_event', self.on_motion) + self.cida = self.rect.figure.canvas.mpl_connect( + 'key_release_event', self.on_a) + self.cidr = self.rect.figure.canvas.mpl_connect( + 'key_release_event', self.on_r) + + def on_a(self, event): + if event.key=='a': + if not event.inaxes: return + add_square(float(event.xdata)) + print event.xdata + + +# NAO FUNCIONA (DELETA TUDO) + def on_r(self, event): + if event.key=='r': + if not event.inaxes: return + remove_square() + + def on_press(self, event): + global drs, recursivecontrol + k = 0 + 'on button press we will see if the mouse is over us and store some data' + if event.inaxes != self.rect.axes: return + if DraggableRectangle.lock is not None: return + contains, attrd = self.rect.contains(event) + if not contains: return + + +# if recursivecontrol == 1: + # recursivecontrol = 0 + # return 1 + # for rec in drs: + # if recursivecontrol == 0: + # recursivecontrol = 1 + # k = k + rec.on_press(event) + # if k == (len(drs)): + +# recursivecontrol = 0 + # return 1 + + + #print 'event contains', self.rect.xy + x0, y0 = self.rect.xy + self.press = x0, y0, event.xdata, event.ydata + DraggableRectangle.lock = self + + # draw everything but the selected rectangle and store the pixel buffer + canvas = self.rect.figure.canvas + axes = self.rect.axes + self.rect.set_animated(True) + canvas.draw() + self.background = canvas.copy_from_bbox(self.rect.axes.bbox) + + # now redraw just the rectangle + axes.draw_artist(self.rect) + + # and blit just the redrawn area + canvas.blit(axes.bbox) + + def on_motion(self, event): + 'on motion we will move the rect if the mouse is over us' + if DraggableRectangle.lock is not self: return + if event.inaxes != self.rect.axes: return + x0, y0, xpress, ypress = self.press + dx = event.xdata - xpress + dy = event.ydata - ypress + self.rect.set_x(x0+dx) + self.rect.set_y(y0+dy) + + canvas = self.rect.figure.canvas + axes = self.rect.axes + # restore the background region + canvas.restore_region(self.background) + + # redraw just the current rectangle + axes.draw_artist(self.rect) + + # blit just the redrawn area + canvas.blit(axes.bbox) + + def on_release(self, event): + 'on release we reset the press data' + if DraggableRectangle.lock is not self: + return + + self.press = None + DraggableRectangle.lock = None + + # turn off the rect animation property and reset the background + self.rect.set_animated(False) + self.background = None + + # redraw the full figure + self.rect.figure.canvas.draw() + + for i in range(len(listay)): + listay[i] = drs[i].rect.xy + + print listay + + def disconnect(self): + 'disconnect all the stored connection ids' + self.rect.figure.canvas.mpl_disconnect(self.cidpress) + self.rect.figure.canvas.mpl_disconnect(self.cidrelease) + self.rect.figure.canvas.mpl_disconnect(self.cidmotion) + self.rect.figure.canvas.mpl_disconnect(self.cida) + self.rect.figure.canvas.mpl_disconnect(self.cidr) + +add_square(2) + +plt.show() + + + -- 2.22.0