--- a/controls/DebugVariablePanel/DebugVariablePanel.py Mon Aug 21 20:17:19 2017 +0000
+++ b/controls/DebugVariablePanel/DebugVariablePanel.py Mon Aug 21 23:22:58 2017 +0300
@@ -30,10 +30,11 @@
import wx.lib.buttons
import matplotlib
-matplotlib.use('WX')
+matplotlib.use('WX') # noqa
import matplotlib.pyplot
from matplotlib.backends.backend_wxagg import _convert_agg_to_wx_bitmap
+
from editors.DebugViewer import DebugViewer
from util.BitmapLibrary import GetBitmap
@@ -41,11 +42,12 @@
from DebugVariableTextViewer import DebugVariableTextViewer
from DebugVariableGraphicViewer import *
-MILLISECOND = 1000000 # Number of nanosecond in a millisecond
-SECOND = 1000 * MILLISECOND # Number of nanosecond in a second
-MINUTE = 60 * SECOND # Number of nanosecond in a minute
-HOUR = 60 * MINUTE # Number of nanosecond in a hour
-DAY = 24 * HOUR # Number of nanosecond in a day
+
+MILLISECOND = 1000000 # Number of nanosecond in a millisecond
+SECOND = 1000 * MILLISECOND # Number of nanosecond in a second
+MINUTE = 60 * SECOND # Number of nanosecond in a minute
+HOUR = 60 * MINUTE # Number of nanosecond in a hour
+DAY = 24 * HOUR # Number of nanosecond in a day
# List of values possible for graph range
# Format is [(time_in_plain_text, value_in_nanosecond),...]
@@ -58,33 +60,35 @@
# Scrollbar increment in pixel
SCROLLBAR_UNIT = 10
+
def compute_mask(x, y):
return [(xp if xp == yp else "*")
for xp, yp in zip(x, y)]
+
def NextTick(variables):
next_tick = None
for item, data in variables:
if len(data) == 0:
continue
-
+
next_tick = (data[0][0]
if next_tick is None
else min(next_tick, data[0][0]))
-
+
return next_tick
-#-------------------------------------------------------------------------------
+# -------------------------------------------------------------------------------
# Debug Variable Graphic Panel Drop Target
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a custom drop target class for Debug Variable Graphic
-Panel
-"""
+# -------------------------------------------------------------------------------
+
class DebugVariableDropTarget(wx.TextDropTarget):
-
+ """
+ Class that implements a custom drop target class for Debug Variable Graphic
+ Panel
+ """
+
def __init__(self, window):
"""
Constructor
@@ -92,14 +96,14 @@
"""
wx.TextDropTarget.__init__(self)
self.ParentWindow = window
-
+
def __del__(self):
"""
Destructor
"""
# Remove reference to Debug Variable Panel
self.ParentWindow = None
-
+
def OnDragOver(self, x, y, d):
"""
Function called when mouse is dragged over Drop Target
@@ -107,10 +111,10 @@
@param y: Y coordinate of mouse pointer
@param d: Suggested default for return value
"""
- # Signal Debug Variable Panel to refresh highlight giving mouse position
+ # Signal Debug Variable Panel to refresh highlight giving mouse position
self.ParentWindow.RefreshHighlight(x, y)
return wx.TextDropTarget.OnDragOver(self, x, y, d)
-
+
def OnDropText(self, x, y, data):
"""
Function called when mouse is released in Drop Target
@@ -120,34 +124,34 @@
"""
# Signal Debug Variable Panel to reset highlight
self.ParentWindow.ResetHighlight()
-
+
message = None
-
+
# Check that data is valid regarding DebugVariablePanel
try:
values = eval(data)
if not isinstance(values, TupleType):
raise ValueError
- except:
- message = _("Invalid value \"%s\" for debug variable")%data
+ except Exception:
+ message = _("Invalid value \"%s\" for debug variable") % data
values = None
-
+
# Display message if data is invalid
if message is not None:
wx.CallAfter(self.ShowMessage, message)
-
+
# Data contain a reference to a variable to debug
elif values[1] == "debug":
-
+
# Drag'n Drop is an internal is an internal move inside Debug
- # Variable Panel
+ # Variable Panel
if len(values) > 2 and values[2] == "move":
self.ParentWindow.MoveValue(values[0])
-
+
# Drag'n Drop was initiated by another control of Beremiz
else:
self.ParentWindow.InsertValue(values[0], force=True)
-
+
def OnLeave(self):
"""
Function called when mouse is leave Drop Target
@@ -155,30 +159,25 @@
# Signal Debug Variable Panel to reset highlight
self.ParentWindow.ResetHighlight()
return wx.TextDropTarget.OnLeave(self)
-
+
def ShowMessage(self, message):
"""
Show error message in Error Dialog
@param message: Error message to display
"""
- dialog = wx.MessageDialog(self.ParentWindow,
- message,
- _("Error"),
- wx.OK|wx.ICON_ERROR)
+ dialog = wx.MessageDialog(self.ParentWindow,
+ message,
+ _("Error"),
+ wx.OK | wx.ICON_ERROR)
dialog.ShowModal()
dialog.Destroy()
-#-------------------------------------------------------------------------------
-# Debug Variable Graphic Panel Class
-#-------------------------------------------------------------------------------
-
-"""
-Class that implements a Viewer that display variable values as a graphs
-"""
-
class DebugVariablePanel(wx.Panel, DebugViewer):
-
+ """
+ Class that implements a Viewer that display variable values as a graphs
+ """
+
def __init__(self, parent, producer, window):
"""
Constructor
@@ -187,49 +186,50 @@
consumers
@param window: Reference to Beremiz frame
"""
- wx.Panel.__init__(self, parent, style=wx.SP_3D|wx.TAB_TRAVERSAL)
-
+ wx.Panel.__init__(self, parent, style=wx.SP_3D | wx.TAB_TRAVERSAL)
+
# Save Reference to Beremiz frame
self.ParentWindow = window
-
+
# Variable storing flag indicating that variable displayed in table
# received new value and then table need to be refreshed
self.HasNewData = False
-
+
# Variable storing flag indicating that refresh has been forced, and
# that next time refresh is possible, it will be done even if no new
# data is available
self.Force = False
-
+
self.SetBackgroundColour(wx.WHITE)
-
+
main_sizer = wx.BoxSizer(wx.VERTICAL)
-
- self.Ticks = numpy.array([]) # List of tick received
- self.StartTick = 0 # Tick starting range of data displayed
- self.Fixed = False # Flag that range of data is fixed
- self.CursorTick = None # Tick of cursor for displaying values
-
+
+ self.Ticks = numpy.array([]) # List of tick received
+ self.StartTick = 0 # Tick starting range of data displayed
+ self.Fixed = False # Flag that range of data is fixed
+ self.CursorTick = None # Tick of cursor for displaying values
+
self.DraggingAxesPanel = None
self.DraggingAxesBoundingBox = None
self.DraggingAxesMousePos = None
self.VetoScrollEvent = False
-
+
self.VariableNameMask = []
-
+
self.GraphicPanels = []
-
+
graphics_button_sizer = wx.BoxSizer(wx.HORIZONTAL)
- main_sizer.AddSizer(graphics_button_sizer, border=5, flag=wx.GROW|wx.ALL)
-
+ main_sizer.AddSizer(graphics_button_sizer, border=5, flag=wx.GROW | wx.ALL)
+
range_label = wx.StaticText(self, label=_('Range:'))
graphics_button_sizer.AddWindow(range_label, flag=wx.ALIGN_CENTER_VERTICAL)
-
+
self.CanvasRange = wx.ComboBox(self, style=wx.CB_READONLY)
self.Bind(wx.EVT_COMBOBOX, self.OnRangeChanged, self.CanvasRange)
- graphics_button_sizer.AddWindow(self.CanvasRange, 1,
- border=5, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL)
-
+ graphics_button_sizer.AddWindow(self.CanvasRange, 1,
+ border=5,
+ flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL)
+
self.CanvasRange.Clear()
default_range_idx = 0
for idx, (text, value) in enumerate(RANGE_VALUES):
@@ -237,62 +237,62 @@
if text == "1s":
default_range_idx = idx
self.CanvasRange.SetSelection(default_range_idx)
-
+
for name, bitmap, help in [
- ("CurrentButton", "current", _("Go to current value")),
- ("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]:
- button = wx.lib.buttons.GenBitmapButton(self,
- bitmap=GetBitmap(bitmap),
- size=wx.Size(28, 28), style=wx.NO_BORDER)
+ ("CurrentButton", "current", _("Go to current value")),
+ ("ExportGraphButton", "export_graph", _("Export graph values to clipboard"))]:
+ button = wx.lib.buttons.GenBitmapButton(
+ self, bitmap=GetBitmap(bitmap),
+ size=wx.Size(28, 28), style=wx.NO_BORDER)
button.SetToolTipString(help)
setattr(self, name, button)
self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button)
graphics_button_sizer.AddWindow(button, border=5, flag=wx.LEFT)
-
- self.CanvasPosition = wx.ScrollBar(self,
- size=wx.Size(0, 16), style=wx.SB_HORIZONTAL)
- self.CanvasPosition.Bind(wx.EVT_SCROLL_THUMBTRACK,
- self.OnPositionChanging, self.CanvasPosition)
- self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEUP,
- self.OnPositionChanging, self.CanvasPosition)
- self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEDOWN,
- self.OnPositionChanging, self.CanvasPosition)
- self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEUP,
- self.OnPositionChanging, self.CanvasPosition)
- self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEDOWN,
- self.OnPositionChanging, self.CanvasPosition)
- main_sizer.AddWindow(self.CanvasPosition, border=5, flag=wx.GROW|wx.LEFT|wx.RIGHT|wx.BOTTOM)
-
+
+ self.CanvasPosition = wx.ScrollBar(
+ self, size=wx.Size(0, 16), style=wx.SB_HORIZONTAL)
+ self.CanvasPosition.Bind(wx.EVT_SCROLL_THUMBTRACK,
+ self.OnPositionChanging, self.CanvasPosition)
+ self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEUP,
+ self.OnPositionChanging, self.CanvasPosition)
+ self.CanvasPosition.Bind(wx.EVT_SCROLL_LINEDOWN,
+ self.OnPositionChanging, self.CanvasPosition)
+ self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEUP,
+ self.OnPositionChanging, self.CanvasPosition)
+ self.CanvasPosition.Bind(wx.EVT_SCROLL_PAGEDOWN,
+ self.OnPositionChanging, self.CanvasPosition)
+ main_sizer.AddWindow(self.CanvasPosition, border=5, flag=wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM)
+
self.TickSizer = wx.BoxSizer(wx.HORIZONTAL)
- main_sizer.AddSizer(self.TickSizer, border=5, flag=wx.ALL|wx.GROW)
-
+ main_sizer.AddSizer(self.TickSizer, border=5, flag=wx.ALL | wx.GROW)
+
self.TickLabel = wx.StaticText(self)
self.TickSizer.AddWindow(self.TickLabel, border=5, flag=wx.RIGHT)
-
- self.MaskLabel = wx.TextCtrl(self, style=wx.TE_READONLY|wx.TE_CENTER|wx.NO_BORDER)
- self.TickSizer.AddWindow(self.MaskLabel, 1, border=5, flag=wx.RIGHT|wx.GROW)
-
+
+ self.MaskLabel = wx.TextCtrl(self, style=wx.TE_READONLY | wx.TE_CENTER | wx.NO_BORDER)
+ self.TickSizer.AddWindow(self.MaskLabel, 1, border=5, flag=wx.RIGHT | wx.GROW)
+
self.TickTimeLabel = wx.StaticText(self)
self.TickSizer.AddWindow(self.TickTimeLabel)
-
- self.GraphicsWindow = wx.ScrolledWindow(self, style=wx.HSCROLL|wx.VSCROLL)
+
+ self.GraphicsWindow = wx.ScrolledWindow(self, style=wx.HSCROLL | wx.VSCROLL)
self.GraphicsWindow.SetBackgroundColour(wx.WHITE)
self.GraphicsWindow.SetDropTarget(DebugVariableDropTarget(self))
self.GraphicsWindow.Bind(wx.EVT_ERASE_BACKGROUND, self.OnGraphicsWindowEraseBackground)
self.GraphicsWindow.Bind(wx.EVT_PAINT, self.OnGraphicsWindowPaint)
self.GraphicsWindow.Bind(wx.EVT_SIZE, self.OnGraphicsWindowResize)
self.GraphicsWindow.Bind(wx.EVT_MOUSEWHEEL, self.OnGraphicsWindowMouseWheel)
-
+
main_sizer.AddWindow(self.GraphicsWindow, 1, flag=wx.GROW)
-
+
self.GraphicsSizer = wx.BoxSizer(wx.VERTICAL)
self.GraphicsWindow.SetSizer(self.GraphicsSizer)
-
+
DebugViewer.__init__(self, producer, True)
-
+
self.SetSizer(main_sizer)
self.SetTickTime()
-
+
def SetTickTime(self, ticktime=0):
"""
Set Ticktime for calculate data range according to time range selected
@@ -300,26 +300,26 @@
"""
# Save ticktime
self.Ticktime = ticktime
-
+
# Set ticktime to millisecond if undefined
if self.Ticktime == 0:
self.Ticktime = MILLISECOND
-
+
# Calculate range to apply to data
self.CurrentRange = RANGE_VALUES[
self.CanvasRange.GetSelection()][1] / self.Ticktime
-
+
def SetDataProducer(self, producer):
"""
Set Data Producer
@param producer: Data Producer
"""
DebugViewer.SetDataProducer(self, producer)
-
+
# Set ticktime if data producer is available
if self.DataProducer is not None:
self.SetTickTime(self.DataProducer.GetTicktime())
-
+
def RefreshNewData(self):
"""
Called to refresh Panel according to values received by variables
@@ -329,50 +329,50 @@
if self.HasNewData or self.Force:
self.HasNewData = False
self.RefreshView()
-
+
DebugViewer.RefreshNewData(self)
-
+
def NewDataAvailable(self, ticks):
"""
Called by DataProducer for each tick captured or by panel to refresh
graphs
@param tick: PLC tick captured
- All other parameters are passed to refresh function
+ All other parameters are passed to refresh function
"""
# If tick given
if ticks is not None:
tick = ticks[-1]
-
+
# Save tick as start tick for range if data is still empty
if len(self.Ticks) == 0:
self.StartTick = ticks[0]
-
+
# Add tick to list of ticks received
self.Ticks = numpy.append(self.Ticks, ticks)
-
+
# Update start tick for range if range follow ticks received
if not self.Fixed or tick < self.StartTick + self.CurrentRange:
self.StartTick = max(self.StartTick, tick - self.CurrentRange)
-
+
# Force refresh if graph is fixed because range of data received
# is too small to fill data range selected
if self.Fixed and \
self.Ticks[-1] - self.Ticks[0] < self.CurrentRange:
self.Force = True
-
+
self.HasNewData = False
self.RefreshView()
-
+
else:
DebugViewer.NewDataAvailable(self, ticks)
-
+
def ForceRefresh(self):
"""
Called to force refresh of graphs
"""
self.Force = True
wx.CallAfter(self.NewDataAvailable, None)
-
+
def SetCursorTick(self, cursor_tick):
"""
Set Cursor for displaying values of items at a tick given
@@ -381,37 +381,36 @@
# Save cursor tick
self.CursorTick = cursor_tick
self.Fixed = cursor_tick is not None
- self.UpdateCursorTick()
-
+ self.UpdateCursorTick()
+
def MoveCursorTick(self, move):
if self.CursorTick is not None:
- cursor_tick = max(self.Ticks[0],
- min(self.CursorTick + move,
- self.Ticks[-1]))
+ cursor_tick = max(self.Ticks[0],
+ min(self.CursorTick + move, self.Ticks[-1]))
cursor_tick_idx = numpy.argmin(numpy.abs(self.Ticks - cursor_tick))
if self.Ticks[cursor_tick_idx] == self.CursorTick:
- cursor_tick_idx = max(0,
- min(cursor_tick_idx + abs(move) / move,
- len(self.Ticks) - 1))
+ cursor_tick_idx = max(0,
+ min(cursor_tick_idx + abs(move) / move,
+ len(self.Ticks) - 1))
self.CursorTick = self.Ticks[cursor_tick_idx]
- self.StartTick = max(self.Ticks[
- numpy.argmin(numpy.abs(self.Ticks -
- self.CursorTick + self.CurrentRange))],
- min(self.StartTick, self.CursorTick))
+ self.StartTick = max(
+ self.Ticks[numpy.argmin(
+ numpy.abs(self.Ticks - self.CursorTick + self.CurrentRange))],
+ min(self.StartTick, self.CursorTick))
self.RefreshCanvasPosition()
- self.UpdateCursorTick()
-
+ self.UpdateCursorTick()
+
def ResetCursorTick(self):
self.CursorTick = None
self.Fixed = False
self.UpdateCursorTick()
-
+
def UpdateCursorTick(self):
for panel in self.GraphicPanels:
if isinstance(panel, DebugVariableGraphicViewer):
panel.SetCursorTick(self.CursorTick)
self.ForceRefresh()
-
+
def StartDragNDrop(self, panel, item, x_mouse, y_mouse, x_mouse_start, y_mouse_start):
if len(panel.GetItems()) > 1:
self.DraggingAxesPanel = DebugVariableGraphicViewer(self.GraphicsWindow, self, [item], GRAPH_PARALLEL)
@@ -424,23 +423,23 @@
self.DraggingAxesPanel = panel
self.DraggingAxesBoundingBox = panel.GetAxesBoundingBox(parent_coordinate=True)
self.DraggingAxesMousePos = wx.Point(
- x_mouse_start - self.DraggingAxesBoundingBox.x,
+ x_mouse_start - self.DraggingAxesBoundingBox.x,
y_mouse_start - self.DraggingAxesBoundingBox.y)
self.MoveDragNDrop(x_mouse, y_mouse)
-
+
def MoveDragNDrop(self, x_mouse, y_mouse):
self.DraggingAxesBoundingBox.x = x_mouse - self.DraggingAxesMousePos.x
self.DraggingAxesBoundingBox.y = y_mouse - self.DraggingAxesMousePos.y
self.RefreshHighlight(x_mouse, y_mouse)
-
+
def RefreshHighlight(self, x_mouse, y_mouse):
for idx, panel in enumerate(self.GraphicPanels):
x, y = panel.GetPosition()
width, height = panel.GetSize()
rect = wx.Rect(x, y, width, height)
- if (rect.InsideXY(x_mouse, y_mouse) or
- idx == 0 and y_mouse < 0 or
- idx == len(self.GraphicPanels) - 1 and y_mouse > panel.GetPosition()[1]):
+ if rect.InsideXY(x_mouse, y_mouse) or \
+ idx == 0 and y_mouse < 0 or \
+ idx == len(self.GraphicPanels) - 1 and y_mouse > panel.GetPosition()[1]:
panel.RefreshHighlight(x_mouse - x, y_mouse - y)
else:
panel.SetHighlight(HIGHLIGHT_NONE)
@@ -448,7 +447,7 @@
self.RefreshView()
else:
self.ForceRefresh()
-
+
def ResetHighlight(self):
for panel in self.GraphicPanels:
panel.SetHighlight(HIGHLIGHT_NONE)
@@ -456,10 +455,10 @@
self.RefreshView()
else:
self.ForceRefresh()
-
+
def IsDragging(self):
return self.DraggingAxesPanel is not None
-
+
def GetDraggingAxesClippingRegion(self, panel):
x, y = panel.GetPosition()
width, height = panel.GetSize()
@@ -468,12 +467,12 @@
bbox.x -= x
bbox.y -= y
return bbox
-
+
def GetDraggingAxesPosition(self, panel):
x, y = panel.GetPosition()
return wx.Point(self.DraggingAxesBoundingBox.x - x,
self.DraggingAxesBoundingBox.y - y)
-
+
def StopDragNDrop(self, variable, x_mouse, y_mouse):
if self.DraggingAxesPanel not in self.GraphicPanels:
self.DraggingAxesPanel.Destroy()
@@ -504,25 +503,25 @@
idx += 1
wx.CallAfter(self.MoveValue, variable, idx, True)
self.ForceRefresh()
- return
+ return
width, height = self.GraphicsWindow.GetVirtualSize()
rect = wx.Rect(0, 0, width, height)
if rect.InsideXY(x_mouse, y_mouse):
wx.CallAfter(self.MoveValue, variable, len(self.GraphicPanels), True)
self.ForceRefresh()
-
+
def RefreshGraphicsSizer(self):
self.GraphicsSizer.Clear()
-
+
for panel in self.GraphicPanels:
self.GraphicsSizer.AddWindow(panel, flag=wx.GROW)
-
+
self.GraphicsSizer.Layout()
self.RefreshGraphicsWindowScrollbars()
-
+
def RefreshView(self):
self.RefreshCanvasPosition()
-
+
width, height = self.GraphicsWindow.GetVirtualSize()
bitmap = wx.EmptyBitmap(width, height)
dc = wx.BufferedDC(wx.ClientDC(self.GraphicsWindow), bitmap)
@@ -531,22 +530,22 @@
if self.DraggingAxesPanel is not None:
destBBox = self.DraggingAxesBoundingBox
srcBBox = self.DraggingAxesPanel.GetAxesBoundingBox()
-
+
srcBmp = _convert_agg_to_wx_bitmap(self.DraggingAxesPanel.get_renderer(), None)
srcDC = wx.MemoryDC()
srcDC.SelectObject(srcBmp)
-
- dc.Blit(destBBox.x, destBBox.y,
- int(destBBox.width), int(destBBox.height),
+
+ dc.Blit(destBBox.x, destBBox.y,
+ int(destBBox.width), int(destBBox.height),
srcDC, srcBBox.x, srcBBox.y)
dc.EndDrawing()
-
+
if not self.Fixed or self.Force:
self.Force = False
refresh_graphics = True
else:
refresh_graphics = False
-
+
if self.DraggingAxesPanel is not None and self.DraggingAxesPanel not in self.GraphicPanels:
self.DraggingAxesPanel.RefreshViewer(refresh_graphics)
for panel in self.GraphicPanels:
@@ -554,7 +553,7 @@
panel.RefreshViewer(refresh_graphics)
else:
panel.RefreshViewer()
-
+
if self.CursorTick is not None:
tick = self.CursorTick
elif len(self.Ticks) > 0:
@@ -570,27 +569,27 @@
((tick_duration % DAY) / HOUR, _("%dh")),
((tick_duration % HOUR) / MINUTE, _("%dm")),
((tick_duration % MINUTE) / SECOND, _("%ds"))]:
-
+
if value > 0 or not_null:
duration += format % value
not_null = True
-
- duration += _("%03gms") % (float(tick_duration % SECOND) / MILLISECOND)
+
+ duration += _("%03gms") % (float(tick_duration % SECOND) / MILLISECOND)
self.TickTimeLabel.SetLabel("t: %s" % duration)
else:
self.TickLabel.SetLabel("")
self.TickTimeLabel.SetLabel("")
self.TickSizer.Layout()
-
+
def SubscribeAllDataConsumers(self):
DebugViewer.SubscribeAllDataConsumers(self)
-
+
if self.DataProducer is not None:
if self.DataProducer is not None:
self.SetTickTime(self.DataProducer.GetTicktime())
-
+
self.ResetCursorTick()
-
+
for panel in self.GraphicPanels[:]:
panel.SubscribeAllDataConsumers()
if panel.ItemsIsEmpty():
@@ -598,28 +597,28 @@
panel.ReleaseMouse()
self.GraphicPanels.remove(panel)
panel.Destroy()
-
+
self.ResetVariableNameMask()
self.RefreshGraphicsSizer()
self.ForceRefresh()
-
+
def ResetView(self):
self.UnsubscribeAllDataConsumers()
-
+
self.Fixed = False
for panel in self.GraphicPanels:
panel.Destroy()
self.GraphicPanels = []
self.ResetVariableNameMask()
self.RefreshGraphicsSizer()
-
+
def SetCanvasPosition(self, tick):
tick = max(self.Ticks[0], min(tick, self.Ticks[-1] - self.CurrentRange))
self.StartTick = self.Ticks[numpy.argmin(numpy.abs(self.Ticks - tick))]
self.Fixed = True
self.RefreshCanvasPosition()
self.ForceRefresh()
-
+
def RefreshCanvasPosition(self):
if len(self.Ticks) > 0:
pos = int(self.StartTick - self.Ticks[0])
@@ -628,7 +627,7 @@
pos = 0
range = 0
self.CanvasPosition.SetScrollbar(pos, self.CurrentRange, range, self.CurrentRange)
-
+
def ChangeRange(self, dir, tick=None):
current_range = self.CurrentRange
current_range_idx = self.CanvasRange.GetSelection()
@@ -644,7 +643,7 @@
self.StartTick = self.Ticks[numpy.argmin(numpy.abs(self.Ticks - new_start_tick))]
self.Fixed = new_start_tick < self.Ticks[-1] - self.CurrentRange
self.ForceRefresh()
-
+
def RefreshRange(self):
if len(self.Ticks) > 0:
if self.Fixed and self.Ticks[-1] - self.Ticks[0] < self.CurrentRange:
@@ -654,7 +653,7 @@
else:
self.StartTick = max(self.Ticks[0], self.Ticks[-1] - self.CurrentRange)
self.ForceRefresh()
-
+
def OnRangeChanged(self, event):
try:
self.CurrentRange = RANGE_VALUES[self.CanvasRange.GetSelection()][1] / self.Ticktime
@@ -662,13 +661,13 @@
self.CanvasRange.SetValue(str(self.CurrentRange))
wx.CallAfter(self.RefreshRange)
event.Skip()
-
+
def OnCurrentButton(self, event):
if len(self.Ticks) > 0:
self.StartTick = max(self.Ticks[0], self.Ticks[-1] - self.CurrentRange)
self.ResetCursorTick()
event.Skip()
-
+
def CopyDataToClipboard(self, variables):
text = "tick;%s;\n" % ";".join([item.GetVariable() for item, data in variables])
next_tick = NextTick(variables)
@@ -693,7 +692,7 @@
text += "%d;%s;\n" % (next_tick, ";".join(values))
next_tick = NextTick(variables)
self.ParentWindow.SetCopyBuffer(text)
-
+
def OnExportGraphButton(self, event):
items = reduce(lambda x, y: x + y,
[panel.GetItems() for panel in self.GraphicPanels],
@@ -703,25 +702,25 @@
if item.IsNumVariable()]
wx.CallAfter(self.CopyDataToClipboard, variables)
event.Skip()
-
+
def OnPositionChanging(self, event):
if len(self.Ticks) > 0:
self.StartTick = self.Ticks[0] + event.GetPosition()
self.Fixed = True
self.ForceRefresh()
event.Skip()
-
+
def GetRange(self):
return self.StartTick, self.StartTick + self.CurrentRange
-
+
def GetViewerIndex(self, viewer):
if viewer in self.GraphicPanels:
return self.GraphicPanels.index(viewer)
return None
-
+
def IsViewerFirst(self, viewer):
return viewer == self.GraphicPanels[0]
-
+
def HighlightPreviousViewer(self, viewer):
if self.IsViewerFirst(viewer):
return
@@ -729,25 +728,25 @@
if idx is None:
return
self.GraphicPanels[idx-1].SetHighlight(HIGHLIGHT_AFTER)
-
+
def ResetVariableNameMask(self):
items = []
for panel in self.GraphicPanels:
items.extend(panel.GetItems())
if len(items) > 1:
- self.VariableNameMask = reduce(compute_mask,
- [item.GetVariable().split('.') for item in items])
+ self.VariableNameMask = reduce(
+ compute_mask, [item.GetVariable().split('.') for item in items])
elif len(items) > 0:
self.VariableNameMask = items[0].GetVariable().split('.')[:-1] + ['*']
else:
self.VariableNameMask = []
self.MaskLabel.ChangeValue(".".join(self.VariableNameMask))
self.MaskLabel.SetInsertionPoint(self.MaskLabel.GetLastPosition())
-
+
def GetVariableNameMask(self):
return self.VariableNameMask
-
- def InsertValue(self, iec_path, idx = None, force=False, graph=False):
+
+ def InsertValue(self, iec_path, idx=None, force=False, graph=False):
for panel in self.GraphicPanels:
if panel.GetItem(iec_path) is not None:
if graph and isinstance(panel, DebugVariableTextViewer):
@@ -758,7 +757,7 @@
item = DebugVariableItem(self, iec_path, True)
result = self.AddDataConsumer(iec_path.upper(), item, True)
if result is not None or force:
-
+
self.Freeze()
if item.IsNumVariable() and graph:
panel = DebugVariableGraphicViewer(self.GraphicsWindow, self, [item], GRAPH_PARALLEL)
@@ -774,8 +773,8 @@
self.RefreshGraphicsSizer()
self.Thaw()
self.ForceRefresh()
-
- def MoveValue(self, iec_path, idx = None, graph=False):
+
+ def MoveValue(self, iec_path, idx=None, graph=False):
if idx is None:
idx = len(self.GraphicPanels)
source_panel = None
@@ -787,9 +786,9 @@
break
if source_panel is not None:
source_panel_idx = self.GraphicPanels.index(source_panel)
-
+
if (len(source_panel.GetItems()) == 1):
-
+
if source_panel_idx < idx:
self.GraphicPanels.insert(idx, source_panel)
self.GraphicPanels.pop(source_panel_idx)
@@ -798,7 +797,7 @@
self.GraphicPanels.insert(idx, source_panel)
else:
return
-
+
else:
source_panel.RemoveItem(item)
source_size = source_panel.GetSize()
@@ -807,22 +806,22 @@
panel.SetCanvasHeight(source_size.height)
if self.CursorTick is not None:
panel.SetCursorTick(self.CursorTick)
-
+
else:
panel = DebugVariableTextViewer(self.GraphicsWindow, self, [item])
-
+
self.GraphicPanels.insert(idx, panel)
-
+
if source_panel.ItemsIsEmpty():
if source_panel.HasCapture():
source_panel.ReleaseMouse()
source_panel.Destroy()
self.GraphicPanels.remove(source_panel)
-
+
self.ResetVariableNameMask()
self.RefreshGraphicsSizer()
self.ForceRefresh()
-
+
def MergeGraphs(self, source, target_idx, merge_type, force=False):
source_item = None
source_panel = None
@@ -846,11 +845,11 @@
graph_type = target_panel.GraphType
if target_panel != source_panel:
if (merge_type == GRAPH_PARALLEL and graph_type != merge_type or
- merge_type == GRAPH_ORTHOGONAL and
+ merge_type == GRAPH_ORTHOGONAL and
(graph_type == GRAPH_PARALLEL and len(target_panel.Items) > 1 or
graph_type == GRAPH_ORTHOGONAL and len(target_panel.Items) >= 3)):
return
-
+
if source_panel is not None:
source_panel.RemoveItem(source_item)
if source_panel.ItemsIsEmpty():
@@ -862,7 +861,7 @@
target_panel.RemoveItem(source_item)
else:
target_panel = None
-
+
if target_panel is not None:
target_panel.AddItem(source_item)
target_panel.GraphType = merge_type
@@ -874,15 +873,15 @@
else:
target_panel.SetCanvasHeight(size.height)
target_panel.ResetGraphics()
-
+
self.ResetVariableNameMask()
self.RefreshGraphicsSizer()
self.ForceRefresh()
-
+
def DeleteValue(self, source_panel, item=None):
source_idx = self.GetViewerIndex(source_panel)
if source_idx is not None:
-
+
if item is None:
source_panel.ClearItems()
source_panel.Destroy()
@@ -900,7 +899,7 @@
self.Fixed = False
self.ResetCursorTick()
self.ForceRefresh()
-
+
def ToggleViewerType(self, panel):
panel_idx = self.GetViewerIndex(panel)
if panel_idx is not None:
@@ -916,7 +915,7 @@
panel.Destroy()
self.RefreshGraphicsSizer()
self.ForceRefresh()
-
+
def ResetGraphicsValues(self):
self.Ticks = numpy.array([])
self.StartTick = 0
@@ -931,23 +930,24 @@
posx = max(0, min(xstart, (vwidth - window_size[0]) / SCROLLBAR_UNIT))
posy = max(0, min(ystart, (vheight - window_size[1]) / SCROLLBAR_UNIT))
self.GraphicsWindow.Scroll(posx, posy)
- self.GraphicsWindow.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
- vwidth / SCROLLBAR_UNIT, vheight / SCROLLBAR_UNIT, posx, posy)
-
+ self.GraphicsWindow.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT,
+ vwidth / SCROLLBAR_UNIT, vheight / SCROLLBAR_UNIT,
+ posx, posy)
+
def OnGraphicsWindowEraseBackground(self, event):
pass
-
+
def OnGraphicsWindowPaint(self, event):
self.RefreshView()
event.Skip()
-
+
def OnGraphicsWindowResize(self, event):
size = self.GetSize()
for panel in self.GraphicPanels:
panel_size = panel.GetSize()
- if (isinstance(panel, DebugVariableGraphicViewer) and
- panel.GraphType == GRAPH_ORTHOGONAL and
- panel_size.width == panel_size.height):
+ if isinstance(panel, DebugVariableGraphicViewer) and \
+ panel.GraphType == GRAPH_ORTHOGONAL and \
+ panel_size.width == panel_size.height:
panel.SetCanvasHeight(size.width)
self.RefreshGraphicsWindowScrollbars()
self.GraphicsSizer.Layout()