diff -r 166ee9d2e233 -r d9391572655f Viewer.py --- 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()