Viewer.py
changeset 343 dc8ff76b39fd
parent 338 87e5015330ae
child 345 d79f73a337d7
equal deleted inserted replaced
342:25e093542b40 343:dc8ff76b39fd
   529             comment.TestVisible(screen)
   529             comment.TestVisible(screen)
   530         for wire in self.Wires:
   530         for wire in self.Wires:
   531             wire.TestVisible(screen)
   531             wire.TestVisible(screen)
   532         for block in self.Blocks:
   532         for block in self.Blocks:
   533             block.TestVisible(screen)
   533             block.TestVisible(screen)
   534             
   534     
       
   535     def GetElementIECPath(self, element):
       
   536         iec_path = None
       
   537         if isinstance(element, Wire) and element.EndConnected is not None:
       
   538             block = element.EndConnected.GetParentBlock()
       
   539             if isinstance(block, FBD_Block):
       
   540                 blockname = block.GetName()
       
   541                 connectorname = element.EndConnected.GetName()
       
   542                 if blockname != "":
       
   543                     iec_path = "%s.%s.%s"%(self.InstancePath, blockname, connectorname)
       
   544                 else:
       
   545                     if connectorname == "":
       
   546                         iec_path = "%s.%s%d"%(self.InstancePath, block.GetType(), block.GetId())
       
   547                     else:
       
   548                         iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname)
       
   549             elif isinstance(block, FBD_Variable):
       
   550                 iec_path = "%s.%s"%(self.InstancePath, block.GetName())
       
   551         elif isinstance(element, (LD_Contact, LD_Coil)):
       
   552             iec_path = "%s.%s"%(self.InstancePath, element.GetName())
       
   553         elif isinstance(element, SFC_Step):
       
   554             iec_path = "%s.%s.X"%(self.InstancePath, element.GetName())
       
   555         elif isinstance(element, SFC_Transition):
       
   556             connectors = element.GetConnectors()
       
   557             previous_steps = self.GetPreviousSteps(connectors["input"])
       
   558             next_steps = self.GetNextSteps(connectors["output"])
       
   559             iec_path = "%s.%s->%s"%(self.InstancePath, ",".join(previous_steps), ",".join(next_steps))
       
   560         return iec_path
       
   561        
   535 #-------------------------------------------------------------------------------
   562 #-------------------------------------------------------------------------------
   536 #                              Reset functions
   563 #                              Reset functions
   537 #-------------------------------------------------------------------------------
   564 #-------------------------------------------------------------------------------
   538 
   565 
   539     # Resets Viewer lists
   566     # Resets Viewer lists
   634                 self.loadInstance(instance, ids)
   661                 self.loadInstance(instance, ids)
   635         self.RefreshScrollBars()
   662         self.RefreshScrollBars()
   636         
   663         
   637         for wire in self.Wires:
   664         for wire in self.Wires:
   638             if not wire.IsConnectedCompatible():
   665             if not wire.IsConnectedCompatible():
   639                 wire.MarkAsInvalid()
   666                 wire.SetValid(False)
   640             if self.Debug:
   667             if self.Debug:
   641                 block = wire.EndConnected.GetParentBlock()
   668                 block = wire.EndConnected.GetParentBlock()
   642                 if isinstance(block, LD_PowerRail):
   669                 if isinstance(block, LD_PowerRail):
   643                     wire.SetValue(True)
   670                     wire.SetValue(True)
   644                 if isinstance(block, FBD_Block):
   671                 if isinstance(block, FBD_Block):
   645                     blockname = block.GetName()
   672                     blockname = block.GetName()
   646                     connectorname = wire.EndConnected.GetName()
   673                     connectorname = wire.EndConnected.GetName()
   647                     if blockname != "":
   674                     if blockname != "":
   648                         iec_path = "%s.%s.%s"%(self.InstancePath, block.GetName(), connectorname)
   675                         iec_path = "%s.%s.%s"%(self.InstancePath, blockname, connectorname)
   649                     else:
   676                     else:
   650                         if connectorname == "":
   677                         if connectorname == "":
   651                             iec_path = "%s.%s%d"%(self.InstancePath, block.GetType(), block.GetId())
   678                             iec_path = "%s.%s%d"%(self.InstancePath, block.GetType(), block.GetId())
   652                         else:
   679                         else:
   653                             iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname)
   680                             iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname)
   665                     wire.SetValue("undefined")
   692                     wire.SetValue("undefined")
   666 
   693 
   667         if self.Debug:
   694         if self.Debug:
   668             for block in self.Blocks.keys():
   695             for block in self.Blocks.keys():
   669                 block.SpreadCurrent()
   696                 block.SpreadCurrent()
   670                 if isinstance(block, LD_Contact):
   697                 iec_path = self.GetElementIECPath(block)
   671                     iec_path = "%s.%s"%(self.InstancePath, block.GetName())
   698                 if iec_path is not None:
   672                     if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block) is not None:
   699                     result = self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block)
   673                         self.Subscribed[block] = iec_path.upper()
   700                     if result is not None:
   674                 elif isinstance(block, SFC_Step):
       
   675                     iec_path = "%s.%s.X"%(self.InstancePath, block.GetName())
       
   676                     if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block) is not None:
       
   677                         self.Subscribed[block] = iec_path.upper()
       
   678                 elif isinstance(block, SFC_Transition):
       
   679                     connectors = block.GetConnectors()
       
   680                     previous_steps = self.GetPreviousSteps(connectors["input"])
       
   681                     next_steps = self.GetNextSteps(connectors["output"])
       
   682                     iec_path = "%s.%s->%s"%(self.InstancePath, ",".join(previous_steps), ",".join(next_steps))
       
   683                     if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block) is not None:
       
   684                         self.Subscribed[block] = iec_path.upper()
   701                         self.Subscribed[block] = iec_path.upper()
   685                 
   702                 
   686         self.RefreshVisibleElements()
   703         self.RefreshVisibleElements()
   687         self.ShowErrors()
   704         self.ShowErrors()
   688         self.Refresh(False)
   705         self.Refresh(False)
  1368                         self.SelectedElement.SetSelected(False)
  1385                         self.SelectedElement.SetSelected(False)
  1369                         self.SelectedElement = None
  1386                         self.SelectedElement = None
  1370                     if element is not None:
  1387                     if element is not None:
  1371                         self.SelectedElement = element
  1388                         self.SelectedElement = element
  1372                         if self.Debug:
  1389                         if self.Debug:
       
  1390                             self.StartMousePos = event.GetPosition()
  1373                             Graphic_Element.OnLeftDown(self.SelectedElement, event, dc, self.Scaling)
  1391                             Graphic_Element.OnLeftDown(self.SelectedElement, event, dc, self.Scaling)
  1374                         else:
  1392                         else:
  1375                             self.SelectedElement.OnLeftDown(event, dc, self.Scaling)
  1393                             self.SelectedElement.OnLeftDown(event, dc, self.Scaling)
  1376                         self.SelectedElement.Refresh()
  1394                         self.SelectedElement.Refresh()
  1377                     else:
  1395                     else:
  1383             self.rubberBand.Reset()
  1401             self.rubberBand.Reset()
  1384             self.rubberBand.OnLeftDown(event, self.GetLogicalDC(), self.Scaling)
  1402             self.rubberBand.OnLeftDown(event, self.GetLogicalDC(), self.Scaling)
  1385         event.Skip()
  1403         event.Skip()
  1386 
  1404 
  1387     def OnViewerLeftUp(self, event):
  1405     def OnViewerLeftUp(self, event):
       
  1406         self.StartMousePos = None
  1388         if self.rubberBand.IsShown():
  1407         if self.rubberBand.IsShown():
  1389             if self.Mode == MODE_SELECTION:
  1408             if self.Mode == MODE_SELECTION:
  1390                 elements = self.SearchElements(self.rubberBand.GetCurrentExtent())
  1409                 elements = self.SearchElements(self.rubberBand.GetCurrentExtent())
  1391                 self.rubberBand.OnLeftUp(event, self.GetLogicalDC(), self.Scaling)
  1410                 self.rubberBand.OnLeftUp(event, self.GetLogicalDC(), self.Scaling)
  1392                 if len(elements) == 1:
  1411                 if len(elements) == 1:
  1501         event.Skip()
  1520         event.Skip()
  1502     
  1521     
  1503     def OnViewerLeftDClick(self, event):
  1522     def OnViewerLeftDClick(self, event):
  1504         if self.Mode == MODE_SELECTION and self.SelectedElement is not None:
  1523         if self.Mode == MODE_SELECTION and self.SelectedElement is not None:
  1505             if self.Debug:
  1524             if self.Debug:
  1506                 Graphic_Element.OnLeftDClick(self.SelectedElement, event, self.GetLogicalDC(), self.Scaling)
  1525                 iec_path = self.GetElementIECPath(self.SelectedElement)
       
  1526                 if iec_path is not None:
       
  1527                     if isinstance(self.SelectedElement, Wire):
       
  1528                         if self.SelectedElement.EndConnected is not None:
       
  1529                             var_type = self.SelectedElement.EndConnected.GetType()
       
  1530                             if self.Controler.IsOfType(var_type, "ANY_NUM", self.Debug) or\
       
  1531                                self.Controler.IsOfType(var_type, "ANY_BIT", self.Debug):
       
  1532                                 self.ParentWindow.OpenGraphicViewer(iec_path)
       
  1533                     else:
       
  1534                         self.ParentWindow.OpenGraphicViewer(iec_path)
  1507             elif event.ControlDown() and not event.ShiftDown():
  1535             elif event.ControlDown() and not event.ShiftDown():
  1508                 if self.IsBlock(self.SelectedElement) and self.SelectedElement.GetType() in self.Controler.GetProjectPouNames(self.Debug):
  1536                 if self.IsBlock(self.SelectedElement) and self.SelectedElement.GetType() in self.Controler.GetProjectPouNames(self.Debug):
  1509                     self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType())
  1537                     self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType())
       
  1538                 else:
       
  1539                     self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
  1510             elif event.ControlDown() and event.ShiftDown():
  1540             elif event.ControlDown() and event.ShiftDown():
  1511                 movex, movey = self.SelectedElement.AdjustToScaling(self.Scaling)
  1541                 movex, movey = self.SelectedElement.AdjustToScaling(self.Scaling)
  1512                 self.SelectedElement.RefreshModel()
  1542                 self.SelectedElement.RefreshModel()
  1513                 self.RefreshBuffer()
  1543                 self.RefreshBuffer()
  1514                 if movex != 0 or movey != 0:
  1544                 if movex != 0 or movey != 0:
  1535                     self.Scroll(scrollx, scrolly)
  1565                     self.Scroll(scrollx, scrolly)
  1536                     self.RefreshScrollBars()
  1566                     self.RefreshScrollBars()
  1537                 self.RefreshVisibleElements()
  1567                 self.RefreshVisibleElements()
  1538         else:
  1568         else:
  1539             if not event.Dragging():
  1569             if not event.Dragging():
       
  1570                 if self.Debug:
       
  1571                     tooltip_pos = self.ClientToScreen(event.GetPosition())
       
  1572                     tooltip_pos.x += 10
       
  1573                     tooltip_pos.y += 10
  1540                 highlighted = self.FindElement(pos) 
  1574                 highlighted = self.FindElement(pos) 
  1541                 if self.HighlightedElement is not None and self.HighlightedElement != highlighted:
  1575                 if self.HighlightedElement is not None and self.HighlightedElement != highlighted:
  1542                     if isinstance(self.HighlightedElement, Wire):
  1576                     if self.Debug and isinstance(self.HighlightedElement, Wire):
  1543                         self.HighlightedElement.ClearToolTip()
  1577                         self.HighlightedElement.ClearToolTip()
  1544                     self.HighlightedElement.SetHighlighted(False)
  1578                     self.HighlightedElement.SetHighlighted(False)
  1545                     self.HighlightedElement = None
  1579                     self.HighlightedElement = None
  1546                 if highlighted is not None and self.HighlightedElement != highlighted:
  1580                 if highlighted is not None and self.HighlightedElement != highlighted:
  1547                     if isinstance(highlighted, Wire):
  1581                     if self.Debug and isinstance(highlighted, Wire):
  1548                         pos = self.ClientToScreen(event.GetPosition())
  1582                         highlighted.CreateToolTip(tooltip_pos)
  1549                         pos.x += 10
       
  1550                         pos.y += 10
       
  1551                         highlighted.CreateToolTip(pos)
       
  1552                     highlighted.SetHighlighted(True)
  1583                     highlighted.SetHighlighted(True)
       
  1584                 elif self.Debug and highlighted is not None and isinstance(highlighted, Wire):
       
  1585                     highlighted.MoveToolTip(tooltip_pos)
  1553                 self.HighlightedElement = highlighted
  1586                 self.HighlightedElement = highlighted
  1554             if self.rubberBand.IsShown():
  1587             if self.rubberBand.IsShown():
  1555                 self.rubberBand.OnMotion(event, dc, self.Scaling)
  1588                 self.rubberBand.OnMotion(event, dc, self.Scaling)
  1556             elif not self.Debug and self.Mode == MODE_SELECTION and self.SelectedElement is not None:
  1589             elif not self.Debug and self.Mode == MODE_SELECTION and self.SelectedElement is not None:
  1557                 if self.DrawingWire:
  1590                 if self.DrawingWire:
  1564                             self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
  1597                             self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
  1565                 else:
  1598                 else:
  1566                     movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
  1599                     movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
  1567                     if movex != 0 or movey != 0:
  1600                     if movex != 0 or movey != 0:
  1568                         self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
  1601                         self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
       
  1602             elif self.Debug and self.StartMousePos is not None and event.Dragging():
       
  1603                 pos = event.GetPosition()
       
  1604                 if abs(self.StartMousePos.x - pos.x) > 5 or abs(self.StartMousePos.y - pos.y) > 5:
       
  1605                     iec_path = self.GetElementIECPath(self.SelectedElement)
       
  1606                     if iec_path is not None:
       
  1607                         self.StartMousePos = None
       
  1608                         if self.HighlightedElement is not None:
       
  1609                             if isinstance(self.HighlightedElement, Wire):
       
  1610                                 self.HighlightedElement.ClearToolTip()
       
  1611                             self.HighlightedElement.SetHighlighted(False)
       
  1612                             self.HighlightedElement = None
       
  1613                         data = wx.TextDataObject(str((iec_path, "debug")))
       
  1614                         dragSource = wx.DropSource(self)
       
  1615                         dragSource.SetData(data)
       
  1616                         dragSource.DoDragDrop()
  1569             self.UpdateScrollPos(event)
  1617             self.UpdateScrollPos(event)
  1570         event.Skip()
  1618         event.Skip()
  1571 
  1619 
  1572     def OnLeaveViewer(self, event):
  1620     def OnLeaveViewer(self, event):
       
  1621         self.StartMousePos = None
  1573         if self.SelectedElement is not None and self.SelectedElement.GetDragging():
  1622         if self.SelectedElement is not None and self.SelectedElement.GetDragging():
  1574             event.Skip()
  1623             event.Skip()
  1575         elif self.HighlightedElement is not None:
  1624         elif self.HighlightedElement is not None:
  1576             if isinstance(self.HighlightedElement, Wire):
  1625             if isinstance(self.HighlightedElement, Wire):
  1577                 self.HighlightedElement.ClearToolTip()
  1626                 self.HighlightedElement.ClearToolTip()
  2604                                    max(round_scaling(30, self.Scaling[1], 1),
  2653                                    max(round_scaling(30, self.Scaling[1], 1),
  2605                                        round_scaling(y, self.Scaling[1])))
  2654                                        round_scaling(y, self.Scaling[1])))
  2606             else:
  2655             else:
  2607                 new_pos = wx.Point(max(30, x), max(30, y))
  2656                 new_pos = wx.Point(max(30, x), max(30, y))
  2608             block = self.CopyBlock(element, new_pos)
  2657             block = self.CopyBlock(element, new_pos)
       
  2658             self.RefreshVisibleElements()
  2609             if self.SelectedElement is not None:
  2659             if self.SelectedElement is not None:
  2610                 self.SelectedElement.SetSelected(False)
  2660                 self.SelectedElement.SetSelected(False)
  2611             self.SelectedElement = block
  2661             self.SelectedElement = block
  2612             self.SelectedElement.SetSelected(True)
  2662             self.SelectedElement.SetSelected(True)
  2613             self.RefreshBuffer()
  2663             self.RefreshBuffer()
  2614             self.RefreshScrollBars()
  2664             self.RefreshScrollBars()
  2615             self.RefreshVisibleElements()
       
  2616             self.ParentWindow.RefreshVariablePanel(self.TagName)
  2665             self.ParentWindow.RefreshVariablePanel(self.TagName)
  2617             self.ParentWindow.RefreshInstancesTree()
  2666             self.ParentWindow.RefreshInstancesTree()
  2618         else:
  2667         else:
  2619             message = wx.MessageDialog(self, "You can't paste the element in buffer here!", "Error", wx.OK|wx.ICON_ERROR)
  2668             message = wx.MessageDialog(self, "You can't paste the element in buffer here!", "Error", wx.OK|wx.ICON_ERROR)
  2620             message.ShowModal()
  2669             message.ShowModal()
  2629             return True
  2678             return True
  2630         elif self.CurrentLanguage == "FBD" and isinstance(block, (FBD_Block, FBD_Variable, FBD_Connector, Comment)):
  2679         elif self.CurrentLanguage == "FBD" and isinstance(block, (FBD_Block, FBD_Variable, FBD_Connector, Comment)):
  2631             return True
  2680             return True
  2632         return False
  2681         return False
  2633 
  2682 
  2634     def GenerateNewName(self, element):
  2683     def GenerateNewName(self, element, exclude={}):
       
  2684         names = exclude.copy()
  2635         if isinstance(element, FBD_Block):
  2685         if isinstance(element, FBD_Block):
  2636             names = [varname.upper() for varname in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)]
  2686             names.update(dict([(varname.upper(), True) for varname in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)]))
  2637             format = "Block%d"
  2687             format = "Block%d"
  2638         elif isinstance(element, SFC_Step):
  2688         elif isinstance(element, SFC_Step):
  2639             names = [block.GetName().upper() for block in self.Blocks if isinstance(block, SFC_Step)]
  2689             names.update(dict([block.GetName().upper() for block in self.Blocks if isinstance(block, SFC_Step)]))
  2640             format = "Step%d"
  2690             format = "Step%d"
  2641         i = 1
  2691         i = 1
  2642         while (format%i).upper() in names:
  2692         while names.get((format%i).upper(), False):
  2643             i += 1
  2693             i += 1
  2644         return format%i
  2694         return format%i
  2645 
  2695 
  2646     def IsNamedElement(self, element):
  2696     def IsNamedElement(self, element):
  2647         return isinstance(element, FBD_Block) and element.GetName() != "" or isinstance(element, SFC_Step)
  2697         return isinstance(element, FBD_Block) and element.GetName() != "" or isinstance(element, SFC_Step)