213 |
213 |
214 DebugViewer.__init__(self, producer, True) |
214 DebugViewer.__init__(self, producer, True) |
215 |
215 |
216 self.SetSizer(main_sizer) |
216 self.SetSizer(main_sizer) |
217 |
217 |
|
218 def __del__(self): |
|
219 DebugViewer.__del__(self) |
|
220 |
218 def SetTickTime(self, ticktime=0): |
221 def SetTickTime(self, ticktime=0): |
219 self.Ticktime = ticktime |
222 self.Ticktime = ticktime |
220 if self.Ticktime == 0: |
223 if self.Ticktime == 0: |
221 self.Ticktime = MILLISECOND |
224 self.Ticktime = MILLISECOND |
222 self.CurrentRange = RANGE_VALUES[ |
225 self.CurrentRange = RANGE_VALUES[ |
375 panel.ShowButtons(True) |
378 panel.ShowButtons(True) |
376 merge_type = GRAPH_PARALLEL |
379 merge_type = GRAPH_PARALLEL |
377 if isinstance(panel, DebugVariableTextViewer) or panel.Is3DCanvas(): |
380 if isinstance(panel, DebugVariableTextViewer) or panel.Is3DCanvas(): |
378 if y_mouse > yw + height / 2: |
381 if y_mouse > yw + height / 2: |
379 idx += 1 |
382 idx += 1 |
380 wx.CallAfter(self.MoveValue, variable, idx) |
383 wx.CallAfter(self.MoveValue, variable, idx, True) |
381 else: |
384 else: |
382 rect = panel.GetAxesBoundingBox(True) |
385 rect = panel.GetAxesBoundingBox(True) |
383 if rect.InsideXY(x_mouse, y_mouse): |
386 if rect.InsideXY(x_mouse, y_mouse): |
384 merge_rect = wx.Rect(rect.x, rect.y, rect.width / 2., rect.height) |
387 merge_rect = wx.Rect(rect.x, rect.y, rect.width / 2., rect.height) |
385 if merge_rect.InsideXY(x_mouse, y_mouse): |
388 if merge_rect.InsideXY(x_mouse, y_mouse): |
386 merge_type = GRAPH_ORTHOGONAL |
389 merge_type = GRAPH_ORTHOGONAL |
387 wx.CallAfter(self.MergeGraphs, variable, idx, merge_type, force=True) |
390 wx.CallAfter(self.MergeGraphs, variable, idx, merge_type, force=True) |
388 else: |
391 else: |
389 if y_mouse > yw + height / 2: |
392 if y_mouse > yw + height / 2: |
390 idx += 1 |
393 idx += 1 |
391 wx.CallAfter(self.MoveValue, variable, idx) |
394 wx.CallAfter(self.MoveValue, variable, idx, True) |
392 self.ForceRefresh() |
395 self.ForceRefresh() |
393 return |
396 return |
394 width, height = self.GraphicsWindow.GetVirtualSize() |
397 width, height = self.GraphicsWindow.GetVirtualSize() |
395 rect = wx.Rect(0, 0, width, height) |
398 rect = wx.Rect(0, 0, width, height) |
396 if rect.InsideXY(x_mouse, y_mouse): |
399 if rect.InsideXY(x_mouse, y_mouse): |
397 wx.CallAfter(self.MoveValue, variable, len(self.GraphicPanels)) |
400 wx.CallAfter(self.MoveValue, variable, len(self.GraphicPanels), True) |
398 self.ForceRefresh() |
401 self.ForceRefresh() |
399 |
402 |
400 def RefreshView(self): |
403 def RefreshView(self): |
401 self.RefreshCanvasPosition() |
404 self.RefreshCanvasPosition() |
402 |
405 |
589 return None |
592 return None |
590 |
593 |
591 def IsViewerFirst(self, viewer): |
594 def IsViewerFirst(self, viewer): |
592 return viewer == self.GraphicPanels[0] |
595 return viewer == self.GraphicPanels[0] |
593 |
596 |
594 def IsViewerLast(self, viewer): |
|
595 return viewer == self.GraphicPanels[-1] |
|
596 |
|
597 def HighlightPreviousViewer(self, viewer): |
597 def HighlightPreviousViewer(self, viewer): |
598 if self.IsViewerFirst(viewer): |
598 if self.IsViewerFirst(viewer): |
599 return |
599 return |
600 idx = self.GetViewerIndex(viewer) |
600 idx = self.GetViewerIndex(viewer) |
601 if idx is None: |
601 if idx is None: |
617 self.MaskLabel.SetInsertionPoint(self.MaskLabel.GetLastPosition()) |
617 self.MaskLabel.SetInsertionPoint(self.MaskLabel.GetLastPosition()) |
618 |
618 |
619 def GetVariableNameMask(self): |
619 def GetVariableNameMask(self): |
620 return self.VariableNameMask |
620 return self.VariableNameMask |
621 |
621 |
622 def InsertValue(self, iec_path, idx = None, force=False): |
622 def InsertValue(self, iec_path, idx = None, force=False, graph=False): |
623 for panel in self.GraphicPanels: |
623 for panel in self.GraphicPanels: |
624 if panel.GetItem(iec_path) is not None: |
624 if panel.GetItem(iec_path) is not None: |
625 return |
625 return |
626 if idx is None: |
626 if idx is None: |
627 idx = len(self.GraphicPanels) |
627 idx = len(self.GraphicPanels) |
628 item = DebugVariableItem(self, iec_path, True) |
628 item = DebugVariableItem(self, iec_path, True) |
629 result = self.AddDataConsumer(iec_path.upper(), item) |
629 result = self.AddDataConsumer(iec_path.upper(), item) |
630 if result is not None or force: |
630 if result is not None or force: |
631 |
631 |
632 self.Freeze() |
632 self.Freeze() |
633 if item.IsNumVariable(): |
633 if item.IsNumVariable() and graph: |
634 panel = DebugVariableGraphicViewer(self.GraphicsWindow, self, [item], GRAPH_PARALLEL) |
634 panel = DebugVariableGraphicViewer(self.GraphicsWindow, self, [item], GRAPH_PARALLEL) |
635 if self.CursorTick is not None: |
635 if self.CursorTick is not None: |
636 panel.SetCursorTick(self.CursorTick) |
636 panel.SetCursorTick(self.CursorTick) |
637 else: |
637 else: |
638 panel = DebugVariableTextViewer(self.GraphicsWindow, self, [item]) |
638 panel = DebugVariableTextViewer(self.GraphicsWindow, self, [item]) |
643 self.ResetVariableNameMask() |
643 self.ResetVariableNameMask() |
644 self.RefreshGraphicsSizer() |
644 self.RefreshGraphicsSizer() |
645 self.Thaw() |
645 self.Thaw() |
646 self.ForceRefresh() |
646 self.ForceRefresh() |
647 |
647 |
648 def MoveValue(self, iec_path, idx = None): |
648 def MoveValue(self, iec_path, idx = None, graph=False): |
649 if idx is None: |
649 if idx is None: |
650 idx = len(self.GraphicPanels) |
650 idx = len(self.GraphicPanels) |
651 source_panel = None |
651 source_panel = None |
652 item = None |
652 item = None |
653 for panel in self.GraphicPanels: |
653 for panel in self.GraphicPanels: |
654 item = panel.GetItem(iec_path) |
654 item = panel.GetItem(iec_path) |
655 if item is not None: |
655 if item is not None: |
656 source_panel = panel |
656 source_panel = panel |
657 break |
657 break |
658 if source_panel is not None: |
658 if source_panel is not None: |
|
659 source_panel_idx = self.GraphicPanels.index(source_panel) |
|
660 if len(panel.GetItems()) == 1 and \ |
|
661 idx in [source_panel_idx, source_panel_idx + 1]: |
|
662 return |
|
663 |
659 source_panel.RemoveItem(item) |
664 source_panel.RemoveItem(item) |
660 source_size = source_panel.GetSize() |
665 source_size = source_panel.GetSize() |
|
666 if item.IsNumVariable() and graph: |
|
667 panel = DebugVariableGraphicViewer(self.GraphicsWindow, self, [item], GRAPH_PARALLEL) |
|
668 panel.SetCanvasSize(source_size.width, source_size.height) |
|
669 if self.CursorTick is not None: |
|
670 panel.SetCursorTick(self.CursorTick) |
|
671 else: |
|
672 panel = DebugVariableTextViewer(self.GraphicsWindow, self, [item]) |
|
673 |
|
674 self.GraphicPanels.insert(idx, panel) |
|
675 |
661 if source_panel.ItemsIsEmpty(): |
676 if source_panel.ItemsIsEmpty(): |
662 if source_panel.HasCapture(): |
677 if source_panel.HasCapture(): |
663 source_panel.ReleaseMouse() |
678 source_panel.ReleaseMouse() |
664 self.GraphicPanels.remove(source_panel) |
679 self.GraphicPanels.remove(source_panel) |
665 source_panel.Destroy() |
680 source_panel.Destroy() |
666 |
681 |
667 if item.IsNumVariable(): |
|
668 panel = DebugVariableGraphicViewer(self.GraphicsWindow, self, [item], GRAPH_PARALLEL) |
|
669 panel.SetCanvasSize(source_size.width, source_size.height) |
|
670 if self.CursorTick is not None: |
|
671 panel.SetCursorTick(self.CursorTick) |
|
672 else: |
|
673 panel = DebugVariableTextViewer(self.GraphicsWindow, self, [item]) |
|
674 self.GraphicPanels.insert(idx, panel) |
|
675 self.ResetVariableNameMask() |
682 self.ResetVariableNameMask() |
676 self.RefreshGraphicsSizer() |
683 self.RefreshGraphicsSizer() |
677 self.ForceRefresh() |
684 self.ForceRefresh() |
678 |
685 |
679 def MergeGraphs(self, source, target_idx, merge_type, force=False): |
686 def MergeGraphs(self, source, target_idx, merge_type, force=False): |
749 self.GraphicPanels.remove(source_panel) |
756 self.GraphicPanels.remove(source_panel) |
750 self.ResetVariableNameMask() |
757 self.ResetVariableNameMask() |
751 self.RefreshGraphicsSizer() |
758 self.RefreshGraphicsSizer() |
752 self.ForceRefresh() |
759 self.ForceRefresh() |
753 |
760 |
|
761 def ToggleViewerType(self, panel): |
|
762 panel_idx = self.GetViewerIndex(panel) |
|
763 if panel_idx is not None: |
|
764 self.GraphicPanels.remove(panel) |
|
765 items = panel.GetItems() |
|
766 if isinstance(panel, DebugVariableGraphicViewer): |
|
767 for idx, item in enumerate(items): |
|
768 new_panel = DebugVariableTextViewer(self.GraphicsWindow, self, [item]) |
|
769 self.GraphicPanels.insert(panel_idx + idx, new_panel) |
|
770 else: |
|
771 new_panel = DebugVariableGraphicViewer(self.GraphicsWindow, self, items, GRAPH_PARALLEL) |
|
772 self.GraphicPanels.insert(panel_idx, new_panel) |
|
773 panel.Destroy() |
|
774 self.RefreshGraphicsSizer() |
|
775 self.ForceRefresh() |
|
776 |
754 def ResetGraphicsValues(self): |
777 def ResetGraphicsValues(self): |
755 self.Ticks = numpy.array([]) |
778 self.Ticks = numpy.array([]) |
756 self.StartTick = 0 |
779 self.StartTick = 0 |
757 self.Fixed = False |
780 self.Fixed = False |
758 for panel in self.GraphicPanels: |
781 for panel in self.GraphicPanels: |