Revision: 5311
http://matplotlib.svn.sourceforge.net/matplotlib/?rev=5311&view=rev
Author: jdh2358
Date: 2008-05-29 14:37:55 -0700 (Thu, 29 May 2008)
Log Message:
-----------
added path editor
Modified Paths:
--------------
trunk/matplotlib/examples/api/path_patch_demo.py
Added Paths:
-----------
trunk/matplotlib/examples/event_handling/path_editor.py
Modified: trunk/matplotlib/examples/api/path_patch_demo.py
===================================================================
--- trunk/matplotlib/examples/api/path_patch_demo.py 2008-05-29 21:12:59 UTC
(rev 5310)
+++ trunk/matplotlib/examples/api/path_patch_demo.py 2008-05-29 21:37:55 UTC
(rev 5311)
@@ -5,6 +5,9 @@
Path = mpath.Path
+fig = plt.figure()
+ax = fig.add_subplot(111)
+
pathdata = [
(Path.MOVETO, (0, 0)),
(Path.CURVE4, (-1, 0)),
@@ -19,13 +22,10 @@
codes, verts = zip(*pathdata)
path = mpath.Path(verts, codes)
-
patch = mpatches.PathPatch(path, facecolor='green', edgecolor='yellow',
alpha=0.5)
-
-fig = plt.figure()
-ax = fig.add_subplot(111)
ax.add_patch(patch)
+
ax.set_xlim(-5,5)
ax.set_ylim(-5,5)
Added: trunk/matplotlib/examples/event_handling/path_editor.py
===================================================================
--- trunk/matplotlib/examples/event_handling/path_editor.py
(rev 0)
+++ trunk/matplotlib/examples/event_handling/path_editor.py 2008-05-29
21:37:55 UTC (rev 5311)
@@ -0,0 +1,145 @@
+import numpy as np
+import matplotlib.path as mpath
+import matplotlib.patches as mpatches
+import matplotlib.pyplot as plt
+import matplotlib.mlab as mlab
+
+Path = mpath.Path
+
+fig = plt.figure()
+ax = fig.add_subplot(111)
+
+pathdata = [
+ (Path.MOVETO, (0, 0)),
+ (Path.CURVE4, (-1, 0.1)),
+ (Path.CURVE4, (-1, 0.9)),
+ (Path.CURVE4, (0, 1)),
+ (Path.LINETO, (2, 1)),
+ (Path.CURVE4, (3, 0.9)),
+ (Path.CURVE4, (3, 0.1)),
+ (Path.CURVE4, (2, 0)),
+ (Path.CLOSEPOLY, (0, 0)),
+ ]
+
+codes, verts = zip(*pathdata)
+path = mpath.Path(verts, codes)
+patch = mpatches.PathPatch(path, facecolor='green', edgecolor='yellow',
alpha=0.5)
+ax.add_patch(patch)
+
+
+class PathInteractor:
+ """
+ An path editor.
+
+ Key-bindings
+
+ 't' toggle vertex markers on and off. When vertex markers are on,
+ you can move them, delete them
+
+
+ """
+
+ showverts = True
+ epsilon = 5 # max pixel distance to count as a vertex hit
+
+ def __init__(self, pathpatch):
+
+ self.ax = pathpatch.axes
+ canvas = self.ax.figure.canvas
+ self.pathpatch = pathpatch
+ self.pathpatch.set_animated(True)
+
+ x, y = zip(*self.pathpatch.get_path().vertices)
+
+ self.line, = ax.plot(x,y,marker='o', markerfacecolor='r',
animated=True)
+
+ self._ind = None # the active vert
+
+ canvas.mpl_connect('draw_event', self.draw_callback)
+ canvas.mpl_connect('button_press_event', self.button_press_callback)
+ canvas.mpl_connect('key_press_event', self.key_press_callback)
+ canvas.mpl_connect('button_release_event',
self.button_release_callback)
+ canvas.mpl_connect('motion_notify_event', self.motion_notify_callback)
+ self.canvas = canvas
+
+
+ def draw_callback(self, event):
+ self.background = self.canvas.copy_from_bbox(self.ax.bbox)
+ self.ax.draw_artist(self.pathpatch)
+ self.ax.draw_artist(self.line)
+ self.canvas.blit(self.ax.bbox)
+
+ def pathpatch_changed(self, pathpatch):
+ 'this method is called whenever the pathpatchgon object is called'
+ # only copy the artist props to the line (except visibility)
+ vis = self.line.get_visible()
+ Artist.update_from(self.line, pathpatch)
+ self.line.set_visible(vis) # don't use the pathpatch visibility state
+
+
+ def get_ind_under_point(self, event):
+ 'get the index of the vertex under point if within epsilon tolerance'
+
+ # display coords
+ xy = np.asarray(self.pathpatch.get_path().vertices)
+ xyt = self.pathpatch.get_transform().transform(xy)
+ xt, yt = xyt[:, 0], xyt[:, 1]
+ d = np.sqrt((xt-event.x)**2 + (yt-event.y)**2)
+ ind = d.argmin()
+
+ if d[ind]>=self.epsilon:
+ ind = None
+
+ return ind
+
+ def button_press_callback(self, event):
+ 'whenever a mouse button is pressed'
+ if not self.showverts: return
+ if event.inaxes==None: return
+ if event.button != 1: return
+ self._ind = self.get_ind_under_point(event)
+
+ def button_release_callback(self, event):
+ 'whenever a mouse button is released'
+ if not self.showverts: return
+ if event.button != 1: return
+ self._ind = None
+
+ def key_press_callback(self, event):
+ 'whenever a key is pressed'
+ if not event.inaxes: return
+ if event.key=='t':
+ self.showverts = not self.showverts
+ self.line.set_visible(self.showverts)
+ if not self.showverts: self._ind = None
+
+ self.canvas.draw()
+
+ def motion_notify_callback(self, event):
+ 'on mouse movement'
+ if not self.showverts: return
+ if self._ind is None: return
+ if event.inaxes is None: return
+ if event.button != 1: return
+ x,y = event.xdata, event.ydata
+
+ # todo: expose me
+ vertices = self.pathpatch.get_path().vertices
+
+ vertices[self._ind] = x,y
+ self.line.set_data(zip(*vertices))
+
+ self.canvas.restore_region(self.background)
+ self.ax.draw_artist(self.pathpatch)
+ self.ax.draw_artist(self.line)
+ self.canvas.blit(self.ax.bbox)
+
+
+interactor = PathInteractor(patch)
+ax.set_title('drag vertices to update path')
+ax.set_xlim(-5,5)
+ax.set_ylim(-5,5)
+
+plt.show()
+
+
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins