GraphicViewer.py
changeset 711 5f6a743dcde5
parent 706 9920d8c07e5e
child 714 131ea7f237b9
equal deleted inserted replaced
710:365bb7496697 711:5f6a743dcde5
    20 #
    20 #
    21 #You should have received a copy of the GNU General Public
    21 #You should have received a copy of the GNU General Public
    22 #License along with this library; if not, write to the Free Software
    22 #License along with this library; if not, write to the Free Software
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    23 #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    24 
    24 
       
    25 import numpy
       
    26 import math
       
    27 
    25 import wx
    28 import wx
    26 import wx.lib.plot as plot
    29 import wx.lib.plot as plot
    27 import numpy
    30 import wx.lib.buttons
    28 import math
    31 
    29 from graphics.GraphicCommons import DebugViewer, MODE_SELECTION, MODE_MOTION
    32 from graphics.GraphicCommons import DebugViewer, MODE_SELECTION, MODE_MOTION
    30 from controls import EditorPanel
    33 from controls import EditorPanel
    31 
    34 
    32 colours = ['blue', 'red', 'green', 'yellow', 'orange', 'purple', 'brown', 'cyan',
    35 colours = ['blue', 'red', 'green', 'yellow', 'orange', 'purple', 'brown', 'cyan',
    33            'pink', 'grey']
    36            'pink', 'grey']
    46 RANGE_VALUES = map(lambda x: (str(x), x), [25 * 2 ** i for i in xrange(6)])
    49 RANGE_VALUES = map(lambda x: (str(x), x), [25 * 2 ** i for i in xrange(6)])
    47 TIME_RANGE_VALUES = [("%ds" % i, i * SECOND) for i in (1, 2, 5, 10, 20, 30)] + \
    50 TIME_RANGE_VALUES = [("%ds" % i, i * SECOND) for i in (1, 2, 5, 10, 20, 30)] + \
    48                     [("%dm" % i, i * MINUTE) for i in (1, 2, 5, 10, 20, 30)] + \
    51                     [("%dm" % i, i * MINUTE) for i in (1, 2, 5, 10, 20, 30)] + \
    49                     [("%dh" % i, i * HOUR) for i in (1, 2, 3, 6, 12, 24)]
    52                     [("%dh" % i, i * HOUR) for i in (1, 2, 3, 6, 12, 24)]
    50 
    53 
    51 [ID_GRAPHICVIEWER, ID_GRAPHICVIEWERCANVAS, 
       
    52  ID_GRAPHICVIEWERCANVASRANGE, ID_GRAPHICVIEWERCANVASZOOM, 
       
    53  ID_GRAPHICVIEWERCANVASPOSITION, ID_GRAPHICVIEWERRESETBUTTON, 
       
    54  ID_GRAPHICVIEWERCURRENTBUTTON, ID_GRAPHICVIEWERSTATICTEXT1, 
       
    55  ID_GRAPHICVIEWERSTATICTEXT2, ID_GRAPHICVIEWERSTATICTEXT3, 
       
    56 ] = [wx.NewId() for _init_ctrls in range(10)]
       
    57 
       
    58 class GraphicViewer(EditorPanel, DebugViewer):
    54 class GraphicViewer(EditorPanel, DebugViewer):
    59 
    55 
    60     def _init_coll_MainGridSizer_Items(self, parent):
       
    61         # generated method, don't edit
       
    62         parent.AddWindow(self.Canvas, 0, border=0, flag=wx.GROW)
       
    63         parent.AddSizer(self.RangeSizer, 0, border=0, flag=wx.GROW)
       
    64     
       
    65     def _init_coll_MainGridSizer_Growables(self, parent):
       
    66         # generated method, don't edit
       
    67         parent.AddGrowableCol(0)
       
    68         parent.AddGrowableRow(0)
       
    69 
       
    70     def _init_coll_RangeSizer_Items(self, parent):
       
    71         # generated method, don't edit
       
    72         parent.AddWindow(self.staticbox1, 0, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
    73         parent.AddWindow(self.CanvasRange, 0, border=5, flag=wx.ALL)
       
    74         parent.AddWindow(self.staticbox3, 0, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
    75         parent.AddWindow(self.CanvasZoom, 0, border=5, flag=wx.ALL)
       
    76         parent.AddWindow(self.staticText2, 0, border=5, flag=wx.ALIGN_CENTER_VERTICAL|wx.ALL)
       
    77         parent.AddWindow(self.CanvasPosition, 0, border=5, flag=wx.GROW|wx.ALL)
       
    78         parent.AddWindow(self.ResetButton, 0, border=5, flag=wx.ALL)
       
    79         parent.AddWindow(self.CurrentButton, 0, border=5, flag=wx.ALL)
       
    80         
       
    81     def _init_coll_RangeSizer_Growables(self, parent):
       
    82         # generated method, don't edit
       
    83         parent.AddGrowableCol(5)
       
    84         parent.AddGrowableRow(0)
       
    85         
       
    86     def _init_sizers(self):
       
    87         # generated method, don't edit
       
    88         self.MainGridSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
       
    89         self.RangeSizer = wx.FlexGridSizer(cols=8, hgap=0, rows=1, vgap=0)
       
    90 
       
    91         self._init_coll_MainGridSizer_Items(self.MainGridSizer)
       
    92         self._init_coll_MainGridSizer_Growables(self.MainGridSizer)
       
    93         self._init_coll_RangeSizer_Items(self.RangeSizer)
       
    94         self._init_coll_RangeSizer_Growables(self.RangeSizer)
       
    95         
       
    96         self.Editor.SetSizer(self.MainGridSizer)
       
    97     
       
    98     def _init_Editor(self, prnt):
    56     def _init_Editor(self, prnt):
    99         self.Editor = wx.Panel(prnt, ID_GRAPHICVIEWER, wx.DefaultPosition, 
    57         self.Editor = wx.Panel(prnt)
   100                  wx.DefaultSize, 0)
    58         
   101         
    59         main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
   102         self.Canvas = plot.PlotCanvas(id=ID_GRAPHICVIEWERCANVAS, 
    60         main_sizer.AddGrowableCol(0)
   103               name='Canvas', parent=self.Editor, pos=wx.Point(0, 0),
    61         main_sizer.AddGrowableRow(0)
   104               size=wx.Size(0, 0), style=0)
    62         
       
    63         self.Canvas = plot.PlotCanvas(self.Editor, name='Canvas')
   105         def _axisInterval(spec, lower, upper):
    64         def _axisInterval(spec, lower, upper):
   106             if spec == 'border':
    65             if spec == 'border':
   107                 if lower == upper:
    66                 if lower == upper:
   108                     return lower - 0.5, upper + 0.5
    67                     return lower - 0.5, upper + 0.5
   109                 else:
    68                 else:
   116         self.Canvas.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnCanvasLeftDown)
    75         self.Canvas.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnCanvasLeftDown)
   117         self.Canvas.canvas.Bind(wx.EVT_LEFT_UP, self.OnCanvasLeftUp)
    76         self.Canvas.canvas.Bind(wx.EVT_LEFT_UP, self.OnCanvasLeftUp)
   118         self.Canvas.canvas.Bind(wx.EVT_MOTION, self.OnCanvasMotion)
    77         self.Canvas.canvas.Bind(wx.EVT_MOTION, self.OnCanvasMotion)
   119         self.Canvas.canvas.Bind(wx.EVT_MOUSEWHEEL, self.OnCanvasMouseWheel)
    78         self.Canvas.canvas.Bind(wx.EVT_MOUSEWHEEL, self.OnCanvasMouseWheel)
   120         self.Canvas.canvas.Bind(wx.EVT_SIZE, self.OnCanvasResize)
    79         self.Canvas.canvas.Bind(wx.EVT_SIZE, self.OnCanvasResize)
   121         
    80         main_sizer.AddWindow(self.Canvas, 0, border=0, flag=wx.GROW)
   122         self.staticbox1 = wx.StaticText(id=ID_GRAPHICVIEWERSTATICTEXT1,
    81         
   123               label=_('Range:'), name='staticText1', parent=self.Editor,
    82         range_sizer = wx.FlexGridSizer(cols=9, hgap=5, rows=1, vgap=0)
   124               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
    83         range_sizer.AddGrowableCol(5)
   125         
    84         range_sizer.AddGrowableRow(0)
   126         self.CanvasRange = wx.ComboBox(id=ID_GRAPHICVIEWERCANVASRANGE,
    85         main_sizer.AddSizer(range_sizer, 0, border=5, flag=wx.GROW|wx.ALL)
   127               name='CanvasRange', parent=self.Editor, pos=wx.Point(0, 0),
    86         
       
    87         range_label = wx.StaticText(self.Editor, label=_('Range:'))
       
    88         range_sizer.AddWindow(range_label, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL)
       
    89         
       
    90         self.CanvasRange = wx.ComboBox(self.Editor, 
   128               size=wx.Size(100, 28), style=wx.CB_READONLY)
    91               size=wx.Size(100, 28), style=wx.CB_READONLY)
   129         self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, id=ID_GRAPHICVIEWERCANVASRANGE)
    92         self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange)
   130         
    93         range_sizer.AddWindow(self.CanvasRange, 0, border=0, flag=0)
   131         self.staticbox3 = wx.StaticText(id=ID_GRAPHICVIEWERSTATICTEXT3,
    94         
   132               label=_('Zoom:'), name='staticText3', parent=self.Editor,
    95         zoom_label = wx.StaticText(self.Editor, label=_('Zoom:'))
   133               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
    96         range_sizer.AddWindow(zoom_label, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL)
   134         
    97         
   135         self.CanvasZoom = wx.ComboBox(id=ID_GRAPHICVIEWERCANVASZOOM,
    98         self.CanvasZoom = wx.ComboBox(self.Editor, 
   136               name='CanvasZoom', parent=self.Editor, pos=wx.Point(0, 0),
       
   137               size=wx.Size(70, 28), style=wx.CB_READONLY)
    99               size=wx.Size(70, 28), style=wx.CB_READONLY)
   138         self.Bind(wx.EVT_COMBOBOX, self.OnZoomChanged, id=ID_GRAPHICVIEWERCANVASZOOM)
   100         self.Bind(wx.EVT_COMBOBOX, self.OnZoomChanged, self.CanvasZoom)
   139         
   101         range_sizer.AddWindow(self.CanvasZoom, 0, border=0, flag=0)
   140         self.staticText2 = wx.StaticText(id=ID_GRAPHICVIEWERSTATICTEXT2,
   102         
   141               label=_('Position:'), name='staticText2', parent=self.Editor,
   103         position_label = wx.StaticText(self.Editor, label=_('Position:'))
   142               pos=wx.Point(0, 0), size=wx.DefaultSize, style=0)
   104         range_sizer.AddWindow(position_label, 0, border=0, flag=wx.ALIGN_CENTER_VERTICAL)
   143 
   105         
   144         self.CanvasPosition = wx.ScrollBar(id=ID_GRAPHICVIEWERCANVASPOSITION,
   106         self.CanvasPosition = wx.ScrollBar(self.Editor, 
   145               name='Position', parent=self.Editor, pos=wx.Point(0, 0),
       
   146               size=wx.Size(0, 16), style=wx.SB_HORIZONTAL)
   107               size=wx.Size(0, 16), style=wx.SB_HORIZONTAL)
   147         self.CanvasPosition.SetScrollbar(0, 10, 100, 10)
   108         self.CanvasPosition.SetScrollbar(0, 10, 100, 10)
   148         self.CanvasPosition.Bind(wx.EVT_SCROLL_THUMBTRACK, self.OnPositionChanging, 
   109         self.CanvasPosition.Bind(wx.EVT_SCROLL_THUMBTRACK, 
   149               id = ID_GRAPHICVIEWERCANVASPOSITION)
   110               self.OnPositionChanging, self.CanvasPosition)
   150         self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEUP, self.OnPositionChanging, 
   111         self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEUP, 
   151               id = ID_GRAPHICVIEWERCANVASPOSITION)
   112               self.OnPositionChanging, self.CanvasPosition)
   152         self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEDOWN, self.OnPositionChanging, 
   113         self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEDOWN, 
   153               id = ID_GRAPHICVIEWERCANVASPOSITION)
   114               self.OnPositionChanging, self.CanvasPosition)
   154         self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEUP, self.OnPositionChanging, 
   115         self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEUP, 
   155               id = ID_GRAPHICVIEWERCANVASPOSITION)
   116               self.OnPositionChanging, self.CanvasPosition)
   156         self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEDOWN, self.OnPositionChanging, 
   117         self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEDOWN, 
   157               id = ID_GRAPHICVIEWERCANVASPOSITION)
   118               self.OnPositionChanging, self.CanvasPosition)
   158         
   119         range_sizer.AddWindow(self.CanvasPosition, 0, border=5, flag=wx.GROW|wx.ALL)
   159         self.ResetButton = wx.Button(id=ID_GRAPHICVIEWERRESETBUTTON, label='Reset',
   120         
   160               name='ResetButton', parent=self.Editor, pos=wx.Point(0, 0),
   121         self.ResetButton = wx.Button(self.Editor, label='Reset', size=wx.Size(72, 24))
   161               size=wx.Size(72, 24), style=0)
   122         self.Bind(wx.EVT_BUTTON, self.OnResetButton, self.ResetButton)
   162         self.Bind(wx.EVT_BUTTON, self.OnResetButton, id=ID_GRAPHICVIEWERRESETBUTTON)
   123         range_sizer.AddWindow(self.ResetButton, 0, border=0, flag=0)
   163         
   124         
   164         self.CurrentButton = wx.Button(id=ID_GRAPHICVIEWERCURRENTBUTTON, label='Current',
   125         self.CurrentButton = wx.Button(self.Editor, label='Current', size=wx.Size(72, 24))
   165               name='CurrentButton', parent=self.Editor, pos=wx.Point(0, 0),
   126         self.Bind(wx.EVT_BUTTON, self.OnCurrentButton, self.CurrentButton)
   166               size=wx.Size(72, 24), style=0)
   127         range_sizer.AddWindow(self.CurrentButton, 0, border=0, flag=0)
   167         self.Bind(wx.EVT_BUTTON, self.OnCurrentButton, id=ID_GRAPHICVIEWERCURRENTBUTTON)
   128         
   168         
   129         self.ExportGraphButton = wx.lib.buttons.GenBitmapButton(self.Editor, 
   169         self._init_sizers()
   130               bitmap=self.ParentWindow.GenerateBitmap("export_graph"), 
       
   131               size=wx.Size(28, 28), style=wx.NO_BORDER)
       
   132         self.Bind(wx.EVT_BUTTON, self.OnExportGraphButtonClick, 
       
   133                 self.ExportGraphButton)
       
   134         range_sizer.AddWindow(self.ExportGraphButton, 0, border=0, flag=0)
       
   135         
       
   136         self.Editor.SetSizer(main_sizer)
   170 
   137 
   171     def __init__(self, parent, window, producer, instancepath = ""):
   138     def __init__(self, parent, window, producer, instancepath = ""):
   172         EditorPanel.__init__(self, parent, "", window, None)
   139         EditorPanel.__init__(self, parent, "", window, None)
   173         DebugViewer.__init__(self, producer, True, False)
   140         DebugViewer.__init__(self, producer, True, False)
   174         
   141         
   382     def OnCurrentButton(self, event):
   349     def OnCurrentButton(self, event):
   383         self.ResetBounds()
   350         self.ResetBounds()
   384         self.StartTick = max(self.Datas[0][0], self.Datas[-1][0] - self.CurrentRange)
   351         self.StartTick = max(self.Datas[0][0], self.Datas[-1][0] - self.CurrentRange)
   385         self.Fixed = False
   352         self.Fixed = False
   386         self.NewDataAvailable(True)
   353         self.NewDataAvailable(True)
       
   354         event.Skip()
       
   355     
       
   356     def OnExportGraphButtonClick(self, event):
       
   357         data_copy = self.Datas[:]
       
   358         text = "tick;%s;\n" % self.InstancePath
       
   359         for tick, value in data_copy:
       
   360             text += "%d;%.3f;\n" % (tick, value)
       
   361         self.ParentWindow.SetCopyBuffer(text)
   387         event.Skip()
   362         event.Skip()
   388 
   363 
   389     def OnCanvasLeftDown(self, event):
   364     def OnCanvasLeftDown(self, event):
   390         self.Fixed = True
   365         self.Fixed = True
   391         self.Canvas.canvas.CaptureMouse()
   366         self.Canvas.canvas.CaptureMouse()