controls/DebugVariablePanel.py
changeset 1191 5237f87e035f
parent 1190 410b519abd66
child 1192 d8783c0c7d80
equal deleted inserted replaced
1190:410b519abd66 1191:5237f87e035f
   390     MINUTE = 60 * SECOND
   390     MINUTE = 60 * SECOND
   391     HOUR = 60 * MINUTE
   391     HOUR = 60 * MINUTE
   392     DAY = 24 * HOUR
   392     DAY = 24 * HOUR
   393     
   393     
   394     ZOOM_VALUES = map(lambda x:("x %.1f" % x, x), [math.sqrt(2) ** i for i in xrange(8)])
   394     ZOOM_VALUES = map(lambda x:("x %.1f" % x, x), [math.sqrt(2) ** i for i in xrange(8)])
   395     RANGE_VALUES = map(lambda x: (str(x), x), [25 * 2 ** i for i in xrange(6)])
   395     RANGE_VALUES = \
   396     TIME_RANGE_VALUES = [("%ds" % i, i * SECOND) for i in (1, 2, 5, 10, 20, 30)] + \
   396         [("%dms" % i, i * MILLISECOND) for i in (10, 20, 50, 100, 200, 500)] + \
   397                         [("%dm" % i, i * MINUTE) for i in (1, 2, 5, 10, 20, 30)] + \
   397         [("%ds" % i, i * SECOND) for i in (1, 2, 5, 10, 20, 30)] + \
   398                         [("%dh" % i, i * HOUR) for i in (1, 2, 3, 6, 12, 24)]
   398         [("%dm" % i, i * MINUTE) for i in (1, 2, 5, 10, 20, 30)] + \
       
   399         [("%dh" % i, i * HOUR) for i in (1, 2, 3, 6, 12, 24)]
   399     
   400     
   400     GRAPH_PARALLEL, GRAPH_ORTHOGONAL = range(2)
   401     GRAPH_PARALLEL, GRAPH_ORTHOGONAL = range(2)
   401     
   402     
   402     SCROLLBAR_UNIT = 10
   403     SCROLLBAR_UNIT = 10
   403     
   404     
  1440             self.SetBackgroundColour(wx.WHITE)
  1441             self.SetBackgroundColour(wx.WHITE)
  1441             
  1442             
  1442             main_sizer = wx.BoxSizer(wx.VERTICAL)
  1443             main_sizer = wx.BoxSizer(wx.VERTICAL)
  1443             
  1444             
  1444             self.Ticks = numpy.array([])
  1445             self.Ticks = numpy.array([])
  1445             self.RangeValues = None
       
  1446             self.StartTick = 0
  1446             self.StartTick = 0
  1447             self.Fixed = False
  1447             self.Fixed = False
  1448             self.CursorTick = None
  1448             self.CursorTick = None
  1449             self.DraggingAxesPanel = None
  1449             self.DraggingAxesPanel = None
  1450             self.DraggingAxesBoundingBox = None
  1450             self.DraggingAxesBoundingBox = None
  1462             
  1462             
  1463             self.CanvasRange = wx.ComboBox(self, style=wx.CB_READONLY)
  1463             self.CanvasRange = wx.ComboBox(self, style=wx.CB_READONLY)
  1464             self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange)
  1464             self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange)
  1465             graphics_button_sizer.AddWindow(self.CanvasRange, 1, 
  1465             graphics_button_sizer.AddWindow(self.CanvasRange, 1, 
  1466                   border=5, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL)
  1466                   border=5, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL)
       
  1467             
       
  1468             self.CanvasRange.Clear()
       
  1469             for text, value in RANGE_VALUES:
       
  1470                 self.CanvasRange.Append(text)
       
  1471             self.CanvasRange.SetStringSelection(RANGE_VALUES[6][0])
       
  1472             self.CurrentRange = RANGE_VALUES[6][1] / self.Ticktime
  1467             
  1473             
  1468             for name, bitmap, help in [
  1474             for name, bitmap, help in [
  1469                 ("CurrentButton", "current", _("Go to current value")),
  1475                 ("CurrentButton", "current", _("Go to current value")),
  1470                 ("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]:
  1476                 ("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]:
  1471                 button = wx.lib.buttons.GenBitmapButton(self, 
  1477                 button = wx.lib.buttons.GenBitmapButton(self, 
  1513             main_sizer.AddWindow(self.GraphicsWindow, 1, flag=wx.GROW)
  1519             main_sizer.AddWindow(self.GraphicsWindow, 1, flag=wx.GROW)
  1514             
  1520             
  1515             self.GraphicsSizer = wx.BoxSizer(wx.VERTICAL)
  1521             self.GraphicsSizer = wx.BoxSizer(wx.VERTICAL)
  1516             self.GraphicsWindow.SetSizer(self.GraphicsSizer)
  1522             self.GraphicsWindow.SetSizer(self.GraphicsSizer)
  1517             
  1523             
  1518             self.RefreshCanvasRange()
       
  1519             
       
  1520         else:
  1524         else:
  1521             main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
  1525             main_sizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
  1522             main_sizer.AddGrowableCol(0)
  1526             main_sizer.AddGrowableCol(0)
  1523             main_sizer.AddGrowableRow(1)
  1527             main_sizer.AddGrowableRow(1)
  1524             
  1528             
  1588         DebugViewer.SetDataProducer(self, producer)
  1592         DebugViewer.SetDataProducer(self, producer)
  1589         
  1593         
  1590         if USE_MPL:
  1594         if USE_MPL:
  1591             if self.DataProducer is not None:
  1595             if self.DataProducer is not None:
  1592                 self.Ticktime = self.DataProducer.GetTicktime()
  1596                 self.Ticktime = self.DataProducer.GetTicktime()
  1593                 self.RefreshCanvasRange()
  1597             else:
  1594             else:
  1598                 self.Ticktime = MILLISECOND
  1595                 self.Ticktime = 0
       
  1596     
  1599     
  1597     def RefreshNewData(self, *args, **kwargs):
  1600     def RefreshNewData(self, *args, **kwargs):
  1598         if self.HasNewData or self.Force:
  1601         if self.HasNewData or self.Force:
  1599             self.HasNewData = False
  1602             self.HasNewData = False
  1600             self.RefreshView(only_values=True)
  1603             self.RefreshView(only_values=True)
  1841     def UnregisterObsoleteData(self):
  1844     def UnregisterObsoleteData(self):
  1842         self.SubscribeAllDataConsumers()
  1845         self.SubscribeAllDataConsumers()
  1843         if USE_MPL:
  1846         if USE_MPL:
  1844             if self.DataProducer is not None:
  1847             if self.DataProducer is not None:
  1845                 self.Ticktime = self.DataProducer.GetTicktime()
  1848                 self.Ticktime = self.DataProducer.GetTicktime()
  1846                 self.RefreshCanvasRange()
       
  1847             
  1849             
  1848             for panel in self.GraphicPanels:
  1850             for panel in self.GraphicPanels:
  1849                 panel.UnregisterObsoleteData()
  1851                 panel.UnregisterObsoleteData()
  1850                 if panel.IsEmpty():
  1852                 if panel.IsEmpty():
  1851                     if panel.HasCapture():
  1853                     if panel.HasCapture():
  1887             self.Freeze()
  1889             self.Freeze()
  1888             self.Table.ResetView(self.VariablesGrid)
  1890             self.Table.ResetView(self.VariablesGrid)
  1889             self.VariablesGrid.RefreshButtons()
  1891             self.VariablesGrid.RefreshButtons()
  1890             self.Thaw()
  1892             self.Thaw()
  1891     
  1893     
  1892     def RefreshCanvasRange(self):
       
  1893         if self.Ticktime == 0 and self.RangeValues != RANGE_VALUES:
       
  1894             self.RangeValues = RANGE_VALUES
       
  1895             self.CanvasRange.Clear()
       
  1896             for text, value in RANGE_VALUES:
       
  1897                 self.CanvasRange.Append(text)
       
  1898             self.CanvasRange.SetStringSelection(RANGE_VALUES[0][0])
       
  1899             self.CurrentRange = RANGE_VALUES[0][1]
       
  1900             self.RefreshView(True)
       
  1901         elif self.Ticktime != 0 and self.RangeValues != TIME_RANGE_VALUES:
       
  1902             self.RangeValues = TIME_RANGE_VALUES
       
  1903             self.CanvasRange.Clear()
       
  1904             for text, value in TIME_RANGE_VALUES:
       
  1905                 self.CanvasRange.Append(text)
       
  1906             self.CanvasRange.SetStringSelection(TIME_RANGE_VALUES[0][0])
       
  1907             self.CurrentRange = TIME_RANGE_VALUES[0][1] / self.Ticktime
       
  1908             self.RefreshView(True)
       
  1909     
       
  1910     def RefreshCanvasPosition(self):
  1894     def RefreshCanvasPosition(self):
  1911         if len(self.Ticks) > 0:
  1895         if len(self.Ticks) > 0:
  1912             pos = int(self.StartTick - self.Ticks[0])
  1896             pos = int(self.StartTick - self.Ticks[0])
  1913             range = int(self.Ticks[-1] - self.Ticks[0])
  1897             range = int(self.Ticks[-1] - self.Ticks[0])
  1914         else:
  1898         else:
  1965         event.Skip()
  1949         event.Skip()
  1966     
  1950     
  1967     def ChangeRange(self, dir, tick=None):
  1951     def ChangeRange(self, dir, tick=None):
  1968         current_range = self.CurrentRange
  1952         current_range = self.CurrentRange
  1969         current_range_idx = self.CanvasRange.GetSelection()
  1953         current_range_idx = self.CanvasRange.GetSelection()
  1970         new_range_idx = max(0, min(current_range_idx + dir, len(self.RangeValues) - 1))
  1954         new_range_idx = max(0, min(current_range_idx + dir, len(RANGE_VALUES) - 1))
  1971         if new_range_idx != current_range_idx:
  1955         if new_range_idx != current_range_idx:
  1972             self.CanvasRange.SetSelection(new_range_idx)
  1956             self.CanvasRange.SetSelection(new_range_idx)
  1973             if self.Ticktime == 0:
  1957             self.CurrentRange = RANGE_VALUES[new_range_idx][1] / self.Ticktime
  1974                 self.CurrentRange = self.RangeValues[new_range_idx][1]
       
  1975             else:
       
  1976                 self.CurrentRange = self.RangeValues[new_range_idx][1] / self.Ticktime
       
  1977             if len(self.Ticks) > 0:
  1958             if len(self.Ticks) > 0:
  1978                 if tick is None:
  1959                 if tick is None:
  1979                     tick = self.StartTick + self.CurrentRange / 2.
  1960                     tick = self.StartTick + self.CurrentRange / 2.
  1980                 new_start_tick = tick - (tick - self.StartTick) * self.CurrentRange / current_range 
  1961                 new_start_tick = tick - (tick - self.StartTick) * self.CurrentRange / current_range 
  1981                 self.StartTick = self.Ticks[numpy.argmin(numpy.abs(self.Ticks - new_start_tick))]
  1962                 self.StartTick = self.Ticks[numpy.argmin(numpy.abs(self.Ticks - new_start_tick))]
  1992                 self.StartTick = max(self.Ticks[0], self.Ticks[-1] - self.CurrentRange)
  1973                 self.StartTick = max(self.Ticks[0], self.Ticks[-1] - self.CurrentRange)
  1993         self.ForceRefresh()
  1974         self.ForceRefresh()
  1994     
  1975     
  1995     def OnRangeChanged(self, event):
  1976     def OnRangeChanged(self, event):
  1996         try:
  1977         try:
  1997             if self.Ticktime == 0:
  1978             self.CurrentRange = RANGE_VALUES[self.CanvasRange.GetSelection()][1] / self.Ticktime
  1998                 self.CurrentRange = self.RangeValues[self.CanvasRange.GetSelection()][1]
       
  1999             else:
       
  2000                 self.CurrentRange = self.RangeValues[self.CanvasRange.GetSelection()][1] / self.Ticktime
       
  2001         except ValueError, e:
  1979         except ValueError, e:
  2002             self.CanvasRange.SetValue(str(self.CurrentRange))
  1980             self.CanvasRange.SetValue(str(self.CurrentRange))
  2003         wx.CallAfter(self.RefreshRange)
  1981         wx.CallAfter(self.RefreshRange)
  2004         event.Skip()
  1982         event.Skip()
  2005     
  1983