Viewer.py
changeset 253 d9391572655f
parent 249 d8425712acef
child 259 fae941a87cff
--- 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()