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 |