editors/GraphicViewer.py
changeset 887 d3c6c4ab8b28
parent 814 5743cbdff669
child 902 ffa8ee5ee2fe
--- a/editors/GraphicViewer.py	Thu Nov 15 23:49:08 2012 +0100
+++ b/editors/GraphicViewer.py	Fri Nov 23 13:36:47 2012 +0100
@@ -165,7 +165,7 @@
         # Initialize Viewer mode to Selection mode
         self.Mode = MODE_SELECTION
         
-        self.Datas = []
+        self.Data = numpy.array([]).reshape(0, 2)
         self.StartTick = 0
         self.StartIdx = 0
         self.EndIdx = 0
@@ -202,7 +202,7 @@
             wx.CallAfter(self.Canvas.canvas.SetCursor, wx.StockCursor(wx.CURSOR_HAND))
         
     def ResetView(self, register=False):
-        self.Datas = []
+        self.Data = numpy.array([]).reshape(0, 2)
         self.StartTick = 0
         self.StartIdx = 0
         self.EndIdx = 0
@@ -222,11 +222,11 @@
         DebugViewer.RefreshNewData(self)
     
     def GetNearestData(self, tick, adjust):
-        ticks = numpy.array(zip(*self.Datas)[0])
+        ticks = self.Data[:, 0]
         new_cursor = numpy.argmin(abs(ticks - tick))
         if adjust == -1 and ticks[new_cursor] > tick and new_cursor > 0:
             new_cursor -= 1
-        elif adjust == 1 and ticks[new_cursor] < tick and new_cursor < len(self.Datas):
+        elif adjust == 1 and ticks[new_cursor] < tick and new_cursor < len(ticks):
             new_cursor += 1
         return new_cursor
     
@@ -257,7 +257,7 @@
         
     def RefreshView(self, force=False):
         self.Freeze()
-        if force or not self.Fixed or (len(self.Datas) > 0 and self.StartTick + self.CurrentRange > self.Datas[-1][0]):
+        if force or not self.Fixed or (len(self.Data) > 0 and self.StartTick + self.CurrentRange > self.Data[-1, 0]):
             if (self.MinValue is not None and 
                 self.MaxValue is not None and 
                 self.MinValue != self.MaxValue):
@@ -265,15 +265,15 @@
             else:
                 Yrange = 2. / self.CurrentZoom
             
-            if not force and not self.Fixed and len(self.Datas) > 0:
-                self.YCenter = max(self.Datas[-1][1] - Yrange / 2, 
+            if not force and not self.Fixed and len(self.Data) > 0:
+                self.YCenter = max(self.Data[-1, 1] - Yrange / 2, 
                                min(self.YCenter, 
-                                   self.Datas[-1][1] + Yrange / 2))
+                                   self.Data[-1, 1] + Yrange / 2))
             
             var_name = self.InstancePath.split(".")[-1]
             
             self.GetBounds()
-            self.VariableGraphic = plot.PolyLine(self.Datas[self.StartIdx:self.EndIdx + 1], 
+            self.VariableGraphic = plot.PolyLine(self.Data[self.StartIdx:self.EndIdx + 1], 
                                                  legend=var_name, colour=colours[0])
             self.GraphicsObject = plot.PlotGraphics([self.VariableGraphic], _("%s Graphics") % var_name, _("Tick"), _("Values"))
             self.Canvas.Draw(self.GraphicsObject, 
@@ -296,7 +296,7 @@
     
     def NewValue(self, tick, value, forced=False):
         value = {True:1., False:0.}.get(value, float(value))
-        self.Datas.append((float(tick), value))
+        self.Data = numpy.append(self.Data, [[float(tick), value]], axis=0)
         if self.MinValue is None:
             self.MinValue = value
         else:
@@ -307,31 +307,31 @@
             self.MaxValue = max(self.MaxValue, value)
         if not self.Fixed or tick < self.StartTick + self.CurrentRange:
             self.GetBounds()
-            while int(self.Datas[self.StartIdx][0]) < tick - self.CurrentRange:
+            while int(self.Data[self.StartIdx, 0]) < tick - self.CurrentRange:
                 self.StartIdx += 1
             self.EndIdx += 1
-            self.StartTick = self.Datas[self.StartIdx][0]
+            self.StartTick = self.Data[self.StartIdx, 0]
         self.NewDataAvailable()
     
     def RefreshScrollBar(self):
-        if len(self.Datas) > 0:
+        if len(self.Data) > 0:
             self.GetBounds()
-            pos = int(self.Datas[self.StartIdx][0] - self.Datas[0][0])
-            range = int(self.Datas[-1][0] - self.Datas[0][0])
+            pos = int(self.Data[self.StartIdx, 0] - self.Data[0, 0])
+            range = int(self.Data[-1, 0] - self.Data[0, 0])
         else:
             pos = 0
             range = 0
         self.CanvasPosition.SetScrollbar(pos, self.CurrentRange, range, self.CurrentRange)
 
     def RefreshRange(self):
-        if len(self.Datas) > 0:
-            if self.Fixed and self.Datas[-1][0] - self.Datas[0][0] < self.CurrentRange:
+        if len(self.Data) > 0:
+            if self.Fixed and self.Data[-1, 0] - self.Data[0, 0] < self.CurrentRange:
                 self.Fixed = False
             self.ResetBounds()
             if self.Fixed:
-                self.StartTick = min(self.StartTick, self.Datas[-1][0] - self.CurrentRange)
+                self.StartTick = min(self.StartTick, self.Data[-1, 0] - self.CurrentRange)
             else:
-                self.StartTick = max(self.Datas[0][0], self.Datas[-1][0] - self.CurrentRange)
+                self.StartTick = max(self.Data[0, 0], self.Data[-1, 0] - self.CurrentRange)
         self.RefreshView(True)
 
     def OnRangeChanged(self, event):
@@ -351,9 +351,9 @@
         event.Skip()
     
     def OnPositionChanging(self, event):
-        if len(self.Datas) > 0:
+        if len(self.Data) > 0:
             self.ResetBounds()
-            self.StartTick = self.Datas[0][0] + event.GetPosition()
+            self.StartTick = self.Data[0, 0] + event.GetPosition()
             self.Fixed = True
             self.NewDataAvailable(True)
         event.Skip()
@@ -364,15 +364,15 @@
         event.Skip()
 
     def OnCurrentButton(self, event):
-        if len(self.Datas) > 0:
+        if len(self.Data) > 0:
             self.ResetBounds()
-            self.StartTick = max(self.Datas[0][0], self.Datas[-1][0] - self.CurrentRange)
+            self.StartTick = max(self.Data[0, 0], self.Data[-1, 0] - self.CurrentRange)
             self.Fixed = False
             self.NewDataAvailable(True)
         event.Skip()
     
     def OnResetZoomOffsetButton(self, event):
-        if len(self.Datas) > 0:
+        if len(self.Data) > 0:
             self.YCenter = (self.MaxValue + self.MinValue) / 2
         else:
             self.YCenter = 0.0
@@ -382,7 +382,7 @@
         event.Skip()
     
     def OnExportGraphButtonClick(self, event):
-        data_copy = self.Datas[:]
+        data_copy = self.Data[:]
         text = "tick;%s;\n" % self.InstancePath
         for tick, value in data_copy:
             text += "%d;%.3f;\n" % (tick, value)
@@ -392,7 +392,7 @@
     def OnCanvasLeftDown(self, event):
         self.Fixed = True
         self.Canvas.canvas.CaptureMouse()
-        if len(self.Datas) > 0:
+        if len(self.Data) > 0:
             if self.Mode == MODE_SELECTION:
                 self.Dragging = True
                 pos = self.Canvas.PositionScreenToUser(event.GetPosition())
@@ -401,7 +401,7 @@
             elif self.Mode == MODE_MOTION:
                 self.GetBounds()
                 self.CurrentMousePos = event.GetPosition()
-                self.CurrentMotionValue = self.Datas[self.StartIdx][0]
+                self.CurrentMotionValue = self.Data[self.StartIdx, 0]
         event.Skip()
     
     def OnCanvasLeftUp(self, event):
@@ -416,10 +416,10 @@
     def OnCanvasMiddleDown(self, event):
         self.Fixed = True
         self.Canvas.canvas.CaptureMouse()
-        if len(self.Datas) > 0:
+        if len(self.Data) > 0:
             self.GetBounds()
             self.CurrentMousePos = event.GetPosition()
-            self.CurrentMotionValue = self.Datas[self.StartIdx][0]
+            self.CurrentMotionValue = self.Data[self.StartIdx, 0]
         event.Skip()
         
     def OnCanvasMiddleUp(self, event):
@@ -435,13 +435,13 @@
             graphics, xAxis, yAxis = self.Canvas.last_draw
             self.CursorIdx = self.GetNearestData(max(xAxis[0], min(pos[0], xAxis[1])), -1)
             self.RefreshCursor()
-        elif self.CurrentMousePos is not None and len(self.Datas) > 0:
+        elif self.CurrentMousePos is not None and len(self.Data) > 0:
             oldpos = self.Canvas.PositionScreenToUser(self.CurrentMousePos)
             newpos = self.Canvas.PositionScreenToUser(event.GetPosition())
             self.CurrentMotionValue += oldpos[0] - newpos[0]
             self.YCenter += oldpos[1] - newpos[1]
             self.ResetBounds()
-            self.StartTick = max(self.Datas[0][0], min(self.CurrentMotionValue, self.Datas[-1][0] - self.CurrentRange))
+            self.StartTick = max(self.Data[0, 0], min(self.CurrentMotionValue, self.Data[-1, 0] - self.CurrentRange))
             self.CurrentMousePos = event.GetPosition()
             self.NewDataAvailable(True)
         event.Skip()
@@ -538,5 +538,5 @@
             
             # Draw new time cursor
             if self.CursorIdx is not None:
-                self.LastCursor = self.Datas[self.CursorIdx]
+                self.LastCursor = self.Data[self.CursorIdx]
                 self.DrawCursor(dc, *self.LastCursor)