--- a/Viewer.py Sun Sep 07 15:27:53 2008 +0200
+++ b/Viewer.py Sun Sep 07 15:29:12 2008 +0200
@@ -102,10 +102,13 @@
message = "Programs can't be used by other POUs!"
elif values[1] in ["function", "functionBlock", "program"]:
name, type = self.ParentWindow.Controler.GetEditedElementType(self.ParentWindow.GetTagName(), self.ParentWindow.Debug)
+ words = self.ParentWindow.TagName.split("::")
if name == values[0]:
message = "\"%s\" can't use itself!"%name
elif type == "function" and values[1] != "function":
- message = "Function Blocks can't be used by Functions!"
+ message = "Function Blocks can't be used in Functions!"
+ elif words[0] == "T" and values[1] != "function":
+ message = "Function Blocks can't be used in Transitions!"
elif self.ParentWindow.Controler.PouIsUsedBy(name, values[0], self.ParentWindow.Debug):
message = "\"%s\" is already used by \"%s\"!"%(name, values[0])
else:
@@ -351,6 +354,7 @@
self.Bind(wx.EVT_MOTION, self.OnViewerMotion)
self.Bind(wx.EVT_CHAR, self.OnChar)
self.Bind(wx.EVT_SCROLLWIN, self.OnScrollWindow)
+ self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheelWindow)
self.Bind(wx.EVT_SIZE, self.OnMoveWindow)
def GetScrolledRect(self, rect):
@@ -397,6 +401,10 @@
self.PrepareDC(dc)
return dc
+ def GetMiniFont(self):
+ font = self.GetFont()
+ return wx.Font(font.GetPointSize() * 0.75, wx.SWISS, wx.NORMAL, wx.NORMAL, faceName = faces["helv"])
+
#-------------------------------------------------------------------------------
# Element management functions
#-------------------------------------------------------------------------------
@@ -574,23 +582,70 @@
if connectorname == "":
connectorname = "OUT"
iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname)
- self.Subscribed[wire] = iec_path.upper()
- self.Controler.SubscribeDebugIECVariable(iec_path.upper(), wire)
+ if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), wire) is not None:
+ self.Subscribed[wire] = iec_path.upper()
+ else:
+ 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:
+ wire.SetValue("undefined")
+ elif isinstance(block, FBD_Connector):
+ wire.SetValue("undefined")
if self.Debug:
for block in self.Blocks.keys():
- if isinstance(block, (LD_Contact, LD_Coil)):
- block.SetValue(False)
- block.SpreadCurrent()
+ block.SpreadCurrent()
if isinstance(block, LD_Contact):
iec_path = "%s.%s"%(self.InstancePath, block.GetName())
- self.Subscribed[block] = iec_path.upper()
- self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block)
-
+ if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block) is not None:
+ self.Subscribed[block] = iec_path.upper()
+ elif isinstance(block, SFC_Step):
+ iec_path = "%s.%s.X"%(self.InstancePath, block.GetName())
+ if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block) is not None:
+ self.Subscribed[block] = iec_path.upper()
+ elif isinstance(block, SFC_Transition):
+ connectors = block.GetConnectors()
+ previous_steps = self.GetPreviousSteps(connectors["input"])
+ next_steps = self.GetNextSteps(connectors["output"])
+ iec_path = "%s.%s->%s"%(self.InstancePath, ",".join(previous_steps), ",".join(next_steps))
+ if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block) is not None:
+ self.Subscribed[block] = iec_path.upper()
+ else:
+ print "Unknown IEC_Path", iec_path
+
self.RefreshVisibleElements()
self.ShowErrors()
self.Refresh(False)
+ def GetPreviousSteps(self, connector):
+ steps = []
+ for wire, handle in connector.GetWires():
+ previous = wire.GetOtherConnected(connector).GetParentBlock()
+ if isinstance(previous, SFC_Step):
+ steps.append(previous.GetName())
+ elif isinstance(previous, SFC_Divergence) and previous.GetType() in [SIMULTANEOUS_CONVERGENCE, SELECTION_DIVERGENCE]:
+ connectors = previous.GetConnectors()
+ for input in connectors["inputs"]:
+ steps.extend(self.GetPreviousSteps(input))
+ return steps
+
+ def GetNextSteps(self, connector):
+ steps = []
+ for wire, handle in connector.GetWires():
+ next = wire.GetOtherConnected(connector).GetParentBlock()
+ if isinstance(next, SFC_Step):
+ steps.append(next.GetName())
+ elif isinstance(next, SFC_Jump):
+ steps.append(next.GetTarget())
+ elif isinstance(next, SFC_Divergence) and next.GetType() in [SIMULTANEOUS_DIVERGENCE, SELECTION_CONVERGENCE]:
+ connectors = next.GetConnectors()
+ for output in connectors["outputs"]:
+ steps.extend(self.GetNextSteps(output))
+ return steps
+
def GetMaxSize(self):
maxx = maxy = 0
for element in self.GetElements():
@@ -1525,7 +1580,11 @@
dialog.Destroy()
def AddNewVariable(self, bbox):
- dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler)
+ words = self.TagName.split("::")
+ if words[0] == "T":
+ dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler, words[2])
+ else:
+ dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler)
dialog.SetPreviewFont(self.GetFont())
dialog.SetMinVariableSize((bbox.width, bbox.height))
varlist = []
@@ -1827,7 +1886,11 @@
dialog.Destroy()
def EditVariableContent(self, variable):
- dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler)
+ words = self.TagName.split("::")
+ if words[0] == "T":
+ dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler, words[2])
+ else:
+ dialog = VariablePropertiesDialog(self.ParentWindow, self.Controler)
dialog.SetPreviewFont(self.GetFont())
dialog.SetMinVariableSize(variable.GetSize())
varlist = []
@@ -2470,6 +2533,12 @@
self.RefreshVisibleElements(yp = event.GetPosition())
event.Skip()
+ def OnMouseWheelWindow(self, event):
+ x, y = self.GetViewStart()
+ yp = max(0, min(y - event.GetWheelRotation() / event.GetWheelDelta() * 3, self.GetVirtualSize()[1] / self.GetScrollPixelsPerUnit()[1]))
+ self.RefreshVisibleElements(yp = yp)
+ self.Scroll(x, yp)
+
def OnMoveWindow(self, event):
self.GetBestSize()
self.RefreshScrollBars()