--- a/Viewer.py Thu May 28 08:10:18 2009 +0200
+++ b/Viewer.py Sat May 30 17:15:22 2009 +0200
@@ -234,7 +234,7 @@
manipulating graphic elements
"""
-class Viewer(wx.ScrolledWindow):
+class Viewer(wx.ScrolledWindow, DebugViewer):
if wx.VERSION < (2, 6, 0):
def Bind(self, event, function, id = None):
@@ -344,6 +344,7 @@
def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""):
wx.ScrolledWindow.__init__(self, parent, pos=wx.Point(0, 0), size=wx.Size(0, 0),
style=wx.HSCROLL | wx.VSCROLL | wx.ALWAYS_SHOW_SB)
+ DebugViewer.__init__(self, controler, debug)
self._init_menus()
# Adding a rubberband to Viewer
self.rubberBand = RubberBand(drawingSurface=self)
@@ -359,7 +360,6 @@
self.current_id = 0
self.TagName = tagname
self.Errors = []
- self.Debug = debug
self.InstancePath = instancepath
self.StartMousePos = None
self.StartScreenPos = None
@@ -378,6 +378,8 @@
if not self.Debug:
self.SetDropTarget(ViewerDropTarget(self))
+ self.NewDataRefreshRect = None
+
dc = wx.ClientDC(self)
font = wx.Font(faces["size"], wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["mono"])
dc.SetFont(font)
@@ -388,6 +390,8 @@
dc.SetFont(font)
width, height = dc.GetTextExtent("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
self.SetFont(font)
+ self.MiniTextDC = wx.MemoryDC()
+ self.MiniTextDC.SetFont(wx.Font(faces["size"] * 0.75, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["helv"]))
self.SetScale(len(ZOOM_FACTORS) / 2)
@@ -442,6 +446,7 @@
# Destructor
def __del__(self):
+ DebugViewer.__del__(self)
self.Flush()
self.ResetView()
@@ -467,10 +472,12 @@
dc.SetUserScale(self.ViewScale[0], self.ViewScale[1])
return dc
+ def GetMiniTextExtent(self, text):
+ return self.MiniTextDC.GetTextExtent(text)
+
def GetMiniFont(self):
- font = self.GetFont()
- return wx.Font(font.GetPointSize() * 0.75, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["helv"])
-
+ return self.MiniTextDC.GetFont()
+
#-------------------------------------------------------------------------------
# Element management functions
#-------------------------------------------------------------------------------
@@ -549,7 +556,7 @@
iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname)
elif isinstance(block, FBD_Variable):
iec_path = "%s.%s"%(self.InstancePath, block.GetName())
- elif isinstance(element, (LD_Contact, LD_Coil)):
+ elif isinstance(element, LD_Contact):
iec_path = "%s.%s"%(self.InstancePath, element.GetName())
elif isinstance(element, SFC_Step):
iec_path = "%s.%s.X"%(self.InstancePath, element.GetName())
@@ -574,8 +581,7 @@
self.HighlightedElement = None
def Flush(self):
- for element, iec_path in self.Subscribed.iteritems():
- self.Controler.UnsubscribeDebugIECVariable(iec_path, element)
+ self.DeleteDataConsumers()
for block in self.Blocks:
block.Flush()
@@ -643,6 +649,18 @@
# Refresh functions
#-------------------------------------------------------------------------------
+ def UpdateRefreshRect(self, refresh_rect):
+ if self.NewDataRefreshRect is None:
+ self.NewDataRefreshRect = refresh_rect
+ else:
+ self.NewDataRefreshRect.Union(refresh_rect)
+
+ def RefreshNewData(self):
+ if self.NewDataRefreshRect is not None:
+ refresh_rect, self.NewDataRefreshRect = self.NewDataRefreshRect, None
+ self.RefreshRect(self.GetScrolledRect(refresh_rect), False)
+ DebugViewer.RefreshNewData(self)
+
def ResetBuffer(self):
pass
@@ -679,15 +697,11 @@
iec_path = "%s.%s%d"%(self.InstancePath, block.GetType(), block.GetId())
else:
iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname)
- if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), wire) is not None:
- self.Subscribed[wire] = iec_path.upper()
- else:
+ if self.AddDataConsumer(iec_path.upper(), wire) is None:
wire.SetValue("undefined")
elif isinstance(block, FBD_Variable):
iec_path = "%s.%s"%(self.InstancePath, block.GetName())
- if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), wire) is not None:
- self.Subscribed[wire] = iec_path.upper()
- else:
+ if self.AddDataConsumer(iec_path.upper(), wire) is None:
wire.SetValue("undefined")
elif isinstance(block, FBD_Connector):
wire.SetValue("undefined")
@@ -697,10 +711,8 @@
block.SpreadCurrent()
iec_path = self.GetElementIECPath(block)
if iec_path is not None:
- result = self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block)
- if result is not None:
- self.Subscribed[block] = iec_path.upper()
-
+ self.AddDataConsumer(iec_path.upper(), block)
+
self.RefreshVisibleElements()
self.ShowErrors()
self.Refresh(False)
@@ -2687,7 +2699,7 @@
names.update(dict([(varname.upper(), True) for varname in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)]))
format = "Block%d"
elif isinstance(element, SFC_Step):
- names.update(dict([block.GetName().upper() for block in self.Blocks if isinstance(block, SFC_Step)]))
+ names.update(dict([(block.GetName().upper(), True) for block in self.Blocks if isinstance(block, SFC_Step)]))
format = "Step%d"
i = 1
while names.get((format%i).upper(), False):