GraphicViewer.py
changeset 361 62570186dad4
parent 344 0acc2bd658f0
child 374 16a0a6cb1644
equal deleted inserted replaced
360:072f9f830659 361:62570186dad4
    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 wx
    25 import wx
    26 import wx.lib.plot as plot
    26 import wx.lib.plot as plot
       
    27 from graphics.GraphicCommons import DebugViewer
    27 
    28 
    28 
    29 
    29 colours = ['blue', 'red', 'green', 'yellow', 'orange', 'purple', 'brown', 'cyan',
    30 colours = ['blue', 'red', 'green', 'yellow', 'orange', 'purple', 'brown', 'cyan',
    30            'pink', 'grey']
    31            'pink', 'grey']
    31 markers = ['circle', 'dot', 'square', 'triangle', 'triangle_down', 'cross', 'plus', 'circle']
    32 markers = ['circle', 'dot', 'square', 'triangle', 'triangle_down', 'cross', 'plus', 'circle']
    42  ID_GRAPHICVIEWERCANVASRANGE, ID_GRAPHICVIEWERCANVASPOSITION,
    43  ID_GRAPHICVIEWERCANVASRANGE, ID_GRAPHICVIEWERCANVASPOSITION,
    43  ID_GRAPHICVIEWERRESETBUTTON, ID_GRAPHICVIEWERCURRENTBUTTON, 
    44  ID_GRAPHICVIEWERRESETBUTTON, ID_GRAPHICVIEWERCURRENTBUTTON, 
    44  ID_GRAPHICVIEWERSTATICTEXT1, ID_GRAPHICVIEWERSTATICTEXT2,
    45  ID_GRAPHICVIEWERSTATICTEXT1, ID_GRAPHICVIEWERSTATICTEXT2,
    45 ] = [wx.NewId() for _init_ctrls in range(8)]
    46 ] = [wx.NewId() for _init_ctrls in range(8)]
    46 
    47 
    47 class GraphicViewer(wx.Panel):
    48 class GraphicViewer(wx.Panel, DebugViewer):
    48 
    49 
    49     def _init_coll_MainGridSizer_Items(self, parent):
    50     def _init_coll_MainGridSizer_Items(self, parent):
    50         # generated method, don't edit
    51         # generated method, don't edit
    51         parent.AddWindow(self.Canvas, 0, border=0, flag=wx.GROW)
    52         parent.AddWindow(self.Canvas, 0, border=0, flag=wx.GROW)
    52         parent.AddSizer(self.RangeSizer, 0, border=0, flag=wx.GROW)
    53         parent.AddSizer(self.RangeSizer, 0, border=0, flag=wx.GROW)
   143         
   144         
   144         self._init_sizers()
   145         self._init_sizers()
   145 
   146 
   146     def __init__(self, parent, window, controler, instancepath = ""):
   147     def __init__(self, parent, window, controler, instancepath = ""):
   147         self._init_ctrls(parent)
   148         self._init_ctrls(parent)
   148 
   149         DebugViewer.__init__(self, controler, True, False)
       
   150         
   149         self.ParentWindow = window
   151         self.ParentWindow = window
   150         self.Controler = controler
   152         self.Controler = controler
   151         self.InstancePath = instancepath
   153         self.InstancePath = instancepath
   152 
   154 
   153         self.Datas = []
   155         self.Datas = []
   154         self.CurrentValue = 0
   156         self.CurrentValue = 0
   155         self.CurrentRange = 25
   157         self.CurrentRange = 25
   156         
   158         
   157         self.Controler.SubscribeDebugIECVariable(self.InstancePath.upper(), self)
   159         self.AddDataConsumer(self.InstancePath.upper(), self)
   158     
   160     
   159     def __del__(self):
   161     def __del__(self):
   160         self.Controler.UnsubscribeDebugIECVariable(self.InstancePath.upper(), self)
   162         DebugViewer.__del__(self)
       
   163         self.RemoveDataConsumer(self)
   161     
   164     
   162     def ResetView(self):
   165     def ResetView(self):
   163         self.Datas = []
   166         self.Datas = []
   164         self.CurrentValue = 0
   167         self.CurrentValue = 0
   165         self.RefreshView()
   168         self.RefreshView()
   166     
   169     
   167     def RefreshView(self):
   170     def RefreshNewData(self):
   168         var_name = self.InstancePath.split(".")[-1]
   171         self.RefreshView(False)
   169         
   172     
   170         self.VariableGraphic = plot.PolyLine(self.Datas[self.CurrentValue:self.CurrentValue + self.CurrentRange], 
   173     def RefreshView(self, force=True):
   171                                              legend=var_name, colour=colours[0])
   174         self.Freeze()
   172         self.GraphicsObject = plot.PlotGraphics([self.VariableGraphic], "%s Graphics" % var_name, "Tick", "Values")
   175         if force or self.CurrentValue + self.CurrentRange == len(self.Datas) or self.CurrentValue + len(self.Datas) < self.CurrentRange:
   173         datas_length = len(self.Datas)
   176             var_name = self.InstancePath.split(".")[-1]
   174         if datas_length > 1:
   177             
   175             start = self.Datas[self.CurrentValue][0]
   178             self.VariableGraphic = plot.PolyLine(self.Datas[self.CurrentValue:self.CurrentValue + self.CurrentRange], 
   176             if self.CurrentValue + self.CurrentRange > datas_length:
   179                                                  legend=var_name, colour=colours[0])
   177                 end = start + (self.Datas[datas_length - 1][0] - start) * self.CurrentRange / (datas_length - self.CurrentValue - 1)
   180             self.GraphicsObject = plot.PlotGraphics([self.VariableGraphic], "%s Graphics" % var_name, "Tick", "Values")
       
   181             datas_length = len(self.Datas)
       
   182             if datas_length > 1:
       
   183                 start = self.Datas[self.CurrentValue][0]
       
   184                 if self.CurrentValue + self.CurrentRange > datas_length:
       
   185                     end = start + (self.Datas[datas_length - 1][0] - start) * self.CurrentRange / (datas_length - self.CurrentValue - 1)
       
   186                 else:
       
   187                     end = self.Datas[self.CurrentValue + self.CurrentRange - 1][0]
   178             else:
   188             else:
   179                 end = self.Datas[self.CurrentValue + self.CurrentRange - 1][0]
   189                 start = 0.
   180         else:
   190                 end = 25.
   181             start = 0.
   191             self.Canvas.Draw(self.GraphicsObject, xAxis=(start, end))
   182             end = 25.
       
   183         self.Canvas.Draw(self.GraphicsObject, xAxis=(start, end))
       
   184         
       
   185         self.RefreshScrollBar()
   192         self.RefreshScrollBar()
       
   193         self.Thaw()
   186     
   194     
   187     def SetMode(self, mode):
   195     def SetMode(self, mode):
   188         pass
   196         pass
   189     
   197     
   190     def GetTagName(self):
   198     def GetTagName(self):
   203         pass
   211         pass
   204     
   212     
   205     def SelectAll(self):
   213     def SelectAll(self):
   206         pass
   214         pass
   207     
   215     
   208     def AddPoint(self, tick, value):
   216     def NewValue(self, tick, value):
   209         if self:
   217         self.Datas.append((float(tick), {True:1., False:0.}.get(value, float(value))))
   210             self.Datas.append((float(tick), {True:1., False:0.}.get(value, float(value))))
   218         if self.CurrentValue + self.CurrentRange == len(self.Datas) - 1:
   211             if self.CurrentValue + self.CurrentRange == len(self.Datas) - 1:
   219             self.CurrentValue += 1
   212                 self.CurrentValue += 1
   220         self.NewDataAvailable()
   213                 self.RefreshView()
   221     
   214             elif len(self.Datas) < self.CurrentValue + self.CurrentRange:
       
   215                 self.RefreshView()
       
   216             else:
       
   217                 self.RefreshScrollBar()
       
   218             
       
   219     def RefreshScrollBar(self):
   222     def RefreshScrollBar(self):
   220         self.CanvasPosition.SetScrollbar(self.CurrentValue, self.CurrentRange, len(self.Datas), self.CurrentRange)
   223         self.CanvasPosition.SetScrollbar(self.CurrentValue, self.CurrentRange, len(self.Datas), self.CurrentRange)
   221 
   224 
   222     def OnRangeChanged(self, event):
   225     def OnRangeChanged(self, event):
   223         old_range = self.CurrentRange
   226         old_range = self.CurrentRange