source: SHX/trunk/sandbox/bc_example.py @ 351

Revision 351, 4.0 KB checked in by marcus, 9 years ago (diff)

double buffered trace view test

  • Property svn:eol-style set to native
Line 
1# -*- coding: utf-8 -*-
2
3import wx
4from bufferedcanvas import *
5
6from obspy.core import read
7
8class TestCanvas(BufferedCanvas):
9    def __init__(self, parent, ID=-1):
10        self.data = -read("../SeismicHandler/tests/data/mseed/2010.284.GR.GRA1..BHN")[0].data
11        # demean
12        self.data = self.data-self.data.mean()
13        min, max = self.data.min(), self.data.max()
14        self.base = abs(max) > abs(min) and abs(max) or abs(min)
15        self.npts = len(self.data)
16
17        self.overlay = wx.Overlay()
18
19        BufferedCanvas.__init__(self,parent,ID)
20
21        self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
22        self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
23        self.Bind(wx.EVT_MOTION, self.OnMouseMove)
24
25    def OnRightDown(self, evt):
26        # Capture the mouse and save the starting position for the
27        # rubber-band
28        self.CaptureMouse()
29        self.startPos = (evt.GetPosition()[0], 10)
30
31    def OnMouseMove(self, evt):
32        if not evt.RightIsDown():
33#            print "move to", evt.GetPosition()
34            dc = wx.ClientDC(self)
35            odc = wx.DCOverlay(self.overlay, dc)
36            odc.Clear()
37            dc.SetPen(wx.Pen("Blue", 1))
38            dc.SetBrush(wx.TRANSPARENT_BRUSH)
39            dc.DrawLine(evt.GetPosition()[0], 10, evt.GetPosition()[0], self.buffer.Height-10)
40            del odc
41
42        if evt.Dragging() and evt.RightIsDown():
43            rect = wx.RectPP(self.startPos, (evt.GetPosition()[0], self.buffer.Height-10))
44
45            # Draw the rubber-band rectangle using an overlay so it
46            # will manage keeping the rectangle and the former window
47            # contents separate.
48            dc = wx.ClientDC(self)
49            odc = wx.DCOverlay(self.overlay, dc)
50            odc.Clear()
51
52            dc.SetPen(wx.Pen("red", 2))
53            if 'wxMac' in wx.PlatformInfo:
54                dc.SetBrush(wx.Brush(wx.Colour(0xC0, 0xC0, 0xC0, 0x80)))
55            else:
56                dc.SetBrush(wx.TRANSPARENT_BRUSH)
57            dc.DrawRectangleRect(rect)
58
59            del odc # work around a bug in the Python wrappers to make
60                    # sure the odc is destroyed before the dc is.
61
62    def OnRightUp(self, evt):
63        if self.HasCapture():
64            self.ReleaseMouse()
65        self.startPos = None
66
67        # When the mouse is released we reset the overlay and it
68        # restores the former content to the window.
69        dc = wx.ClientDC(self)
70        odc = wx.DCOverlay(self.overlay, dc)
71        odc.Clear()
72        del odc
73        self.overlay.Reset()
74
75    def draw(self, dc):
76        self.overlay.Reset()
77
78        w, h = self.buffer.Width-20, self.buffer.Height
79        zoomx = float(w)/self.npts
80        zoomy = float(h)/self.base/2.1
81
82       
83        dc.SetBackground(wx.Brush("White"))
84        dc.Clear()
85
86        dc.SetPen(wx.Pen('Black', 1))
87
88        lines = []
89        offsetx, offsety = 10, int(h / 2.)
90        print "zoom: x=%.2f y=%.2f offset: x=%i y=%i" % (zoomx, zoomy, offsetx, offsety)
91
92        for n, i in enumerate(self.data):
93            lines.append([n*zoomx, i*zoomy])
94
95        dc.SetPen(wx.Pen('Grey', 1, wx.LONG_DASH))
96        dc.DrawLine(offsetx, offsety, offsetx+w, offsety)
97        dc.DrawLabel("TEST", (0, 100, offsetx, offsety))
98
99        pen = wx.Pen((80,80,80), 1)
100#        pen.SetJoin(wx.JOIN_ROUND)
101#        pen.SetCap(wx.CAP_ROUND)
102        dc.SetPen(pen)
103        dc.DrawLines(lines, xoffset=offsetx, yoffset=offsety)
104
105class TestFrame(wx.Frame):
106    def __init__(self,
107                 parent=None,
108                 ID=-1,
109                 title="BufferedCanvas Trace Test",
110                 pos=wx.DefaultPosition,
111                 size=wx.DefaultSize,
112                 style=wx.DEFAULT_FRAME_STYLE):
113
114        wx.Frame.__init__(self, parent, ID, title, pos, size, style)
115        self.canvas = TestCanvas(self)
116        self.Bind(wx.EVT_CLOSE, self.onClose)
117
118    def onClose(self,event):
119        self.Show(False)
120        self.Destroy()
121
122def main():
123    app = wx.PySimpleApp()
124    frame = TestFrame(size=[600,200])
125    frame.Show(True)
126    app.MainLoop()
127
128if __name__ == '__main__':
129    main()
Note: See TracBrowser for help on using the repository browser.