editors/Viewer.py
branchpython3
changeset 3750 f62625418bff
parent 3742 8c3d9159b6a9
child 3752 9f6f46dbe3ae
equal deleted inserted replaced
3749:fda6c1a37662 3750:f62625418bff
    21 # You should have received a copy of the GNU General Public License
    21 # You should have received a copy of the GNU General Public License
    22 # along with this program; if not, write to the Free Software
    22 # along with this program; if not, write to the Free Software
    23 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
    23 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
    24 
    24 
    25 
    25 
    26 from __future__ import absolute_import
    26 
    27 from __future__ import division
    27 
    28 import math
    28 import math
    29 from time import time as gettime
    29 from time import time as gettime
    30 from threading import Lock
    30 from threading import Lock
    31 from future.builtins import round
    31 from future.builtins import round
    32 
    32 
    86 
    86 
    87 if wx.Platform == '__WXMSW__':
    87 if wx.Platform == '__WXMSW__':
    88     MAX_ZOOMIN = 4
    88     MAX_ZOOMIN = 4
    89 else:
    89 else:
    90     MAX_ZOOMIN = 7
    90     MAX_ZOOMIN = 7
    91 ZOOM_FACTORS = [math.sqrt(2) ** x for x in xrange(-6, MAX_ZOOMIN)]
    91 ZOOM_FACTORS = [math.sqrt(2) ** x for x in range(-6, MAX_ZOOMIN)]
    92 
    92 
    93 
    93 
    94 WX_NO_LOGICAL = "gtk3" in wx.PlatformInfo
    94 WX_NO_LOGICAL = "gtk3" in wx.PlatformInfo
    95 
    95 
    96 def GetVariableCreationFunction(variable_type):
    96 def GetVariableCreationFunction(variable_type):
   479     def GetRedrawRect(self):
   479     def GetRedrawRect(self):
   480         x, y = self.Parent.CalcUnscrolledPosition(self.x_offset, self.y_offset)
   480         x, y = self.Parent.CalcUnscrolledPosition(self.x_offset, self.y_offset)
   481         dc = self.Parent.GetLogicalDC()
   481         dc = self.Parent.GetLogicalDC()
   482         ipw, _iph = dc.GetTextExtent(self.GetInstanceName())
   482         ipw, _iph = dc.GetTextExtent(self.GetInstanceName())
   483         vw, vh = 0, 0
   483         vw, vh = 0, 0
   484         for value in self.VALUE_TRANSLATION.itervalues():
   484         for value in self.VALUE_TRANSLATION.values():
   485             w, h = dc.GetTextExtent(" (%s)" % value)
   485             w, h = dc.GetTextExtent(" (%s)" % value)
   486             vw = max(vw, w)
   486             vw = max(vw, w)
   487             vh = max(vh, h)
   487             vh = max(vh, h)
   488         return wx.Rect(ipw + x, y, vw, vh)
   488         return wx.Rect(ipw + x, y, vw, vh)
   489 
   489 
   524         self.Bind(wx.EVT_MENU, callback, item)
   524         self.Bind(wx.EVT_MENU, callback, item)
   525         return item
   525         return item
   526 
   526 
   527     # Add Block Pin Menu items to the given menu
   527     # Add Block Pin Menu items to the given menu
   528     def AddBlockPinMenuItems(self, menu, connector):
   528     def AddBlockPinMenuItems(self, menu, connector):
   529         no_modifier = self.AppendItem(menu,  _(u'No modifier'), self.OnNoModifierMenu, kind=wx.ITEM_RADIO)
   529         no_modifier = self.AppendItem(menu,  _('No modifier'), self.OnNoModifierMenu, kind=wx.ITEM_RADIO)
   530         negated = self.AppendItem(menu,  _(u'Negated'), self.OnNegatedMenu, kind=wx.ITEM_RADIO)
   530         negated = self.AppendItem(menu,  _('Negated'), self.OnNegatedMenu, kind=wx.ITEM_RADIO)
   531         rising_edge = self.AppendItem(menu,  _(u'Rising Edge'), self.OnRisingEdgeMenu, kind=wx.ITEM_RADIO)
   531         rising_edge = self.AppendItem(menu,  _('Rising Edge'), self.OnRisingEdgeMenu, kind=wx.ITEM_RADIO)
   532         falling_edge = self.AppendItem(menu,  _(u'Falling Edge'), self.OnFallingEdgeMenu, kind=wx.ITEM_RADIO)
   532         falling_edge = self.AppendItem(menu,  _('Falling Edge'), self.OnFallingEdgeMenu, kind=wx.ITEM_RADIO)
   533 
   533 
   534         not_a_function = self.Controler.GetEditedElementType(
   534         not_a_function = self.Controler.GetEditedElementType(
   535             self.TagName, self.Debug) != "function"
   535             self.TagName, self.Debug) != "function"
   536         rising_edge.Enable(not_a_function)
   536         rising_edge.Enable(not_a_function)
   537         falling_edge.Enable(not_a_function)
   537         falling_edge.Enable(not_a_function)
   545         else:
   545         else:
   546             no_modifier.Check(True)
   546             no_modifier.Check(True)
   547 
   547 
   548     # Add Alignment Menu items to the given menu
   548     # Add Alignment Menu items to the given menu
   549     def AddAlignmentMenuItems(self, menu):
   549     def AddAlignmentMenuItems(self, menu):
   550         self.AppendItem(menu, _(u'Left'), self.OnAlignLeftMenu)
   550         self.AppendItem(menu, _('Left'), self.OnAlignLeftMenu)
   551         self.AppendItem(menu, _(u'Center'), self.OnAlignCenterMenu)
   551         self.AppendItem(menu, _('Center'), self.OnAlignCenterMenu)
   552         self.AppendItem(menu, _(u'Right'), self.OnAlignRightMenu)
   552         self.AppendItem(menu, _('Right'), self.OnAlignRightMenu)
   553         menu.AppendSeparator()
   553         menu.AppendSeparator()
   554         self.AppendItem(menu, _(u'Top'), self.OnAlignTopMenu)
   554         self.AppendItem(menu, _('Top'), self.OnAlignTopMenu)
   555         self.AppendItem(menu, _(u'Middle'), self.OnAlignMiddleMenu)
   555         self.AppendItem(menu, _('Middle'), self.OnAlignMiddleMenu)
   556         self.AppendItem(menu, _(u'Bottom'), self.OnAlignBottomMenu)
   556         self.AppendItem(menu, _('Bottom'), self.OnAlignBottomMenu)
   557 
   557 
   558     # Add Wire Menu items to the given menu
   558     # Add Wire Menu items to the given menu
   559     def AddWireMenuItems(self, menu, delete=False, replace=False):
   559     def AddWireMenuItems(self, menu, delete=False, replace=False):
   560         self.AppendItem(menu, _(u'Add Wire Segment'), self.OnAddSegmentMenu)
   560         self.AppendItem(menu, _('Add Wire Segment'), self.OnAddSegmentMenu)
   561         delete_segment = self.AppendItem(menu, _(u'Delete Wire Segment'),
   561         delete_segment = self.AppendItem(menu, _('Delete Wire Segment'),
   562                                          self.OnDeleteSegmentMenu)
   562                                          self.OnDeleteSegmentMenu)
   563         replace_wire = self.AppendItem(menu, _(u'Replace Wire by connections'),
   563         replace_wire = self.AppendItem(menu, _('Replace Wire by connections'),
   564                                        self.OnReplaceWireMenu)
   564                                        self.OnReplaceWireMenu)
   565 
   565 
   566         delete_segment.Enable(delete)
   566         delete_segment.Enable(delete)
   567         replace_wire.Enable(replace)
   567         replace_wire.Enable(replace)
   568 
   568 
   569     # Add Divergence Menu items to the given menu
   569     # Add Divergence Menu items to the given menu
   570     def AddDivergenceMenuItems(self, menu, delete=False):
   570     def AddDivergenceMenuItems(self, menu, delete=False):
   571         self.AppendItem(menu, _(u'Add Divergence Branch'),
   571         self.AppendItem(menu, _('Add Divergence Branch'),
   572                         self.OnAddBranchMenu)
   572                         self.OnAddBranchMenu)
   573         delete_branch = self.AppendItem(menu, _(u'Delete Divergence Branch'),
   573         delete_branch = self.AppendItem(menu, _('Delete Divergence Branch'),
   574                                         self.OnDeleteBranchMenu)
   574                                         self.OnDeleteBranchMenu)
   575 
   575 
   576         delete_branch.Enable(delete)
   576         delete_branch.Enable(delete)
   577 
   577 
   578     # Add Add Menu items to the given menu
   578     # Add Add Menu items to the given menu
   579     def AddAddMenuItems(self, menu):
   579     def AddAddMenuItems(self, menu):
   580         self.AppendItem(menu, _(u'Block'),
   580         self.AppendItem(menu, _('Block'),
   581                         self.GetAddMenuCallBack(self.AddNewBlock))
   581                         self.GetAddMenuCallBack(self.AddNewBlock))
   582         self.AppendItem(menu, _(u'Variable'),
   582         self.AppendItem(menu, _('Variable'),
   583                         self.GetAddMenuCallBack(self.AddNewVariable))
   583                         self.GetAddMenuCallBack(self.AddNewVariable))
   584         self.AppendItem(menu, _(u'Connection'),
   584         self.AppendItem(menu, _('Connection'),
   585                         self.GetAddMenuCallBack(self.AddNewConnection))
   585                         self.GetAddMenuCallBack(self.AddNewConnection))
   586         menu.AppendSeparator()
   586         menu.AppendSeparator()
   587 
   587 
   588         if self.CurrentLanguage != "FBD":
   588         if self.CurrentLanguage != "FBD":
   589             self.AppendItem(menu, _(u'Power Rail'),
   589             self.AppendItem(menu, _('Power Rail'),
   590                             self.GetAddMenuCallBack(self.AddNewPowerRail))
   590                             self.GetAddMenuCallBack(self.AddNewPowerRail))
   591             self.AppendItem(menu, _(u'Contact'),
   591             self.AppendItem(menu, _('Contact'),
   592                             self.GetAddMenuCallBack(self.AddNewContact))
   592                             self.GetAddMenuCallBack(self.AddNewContact))
   593 
   593 
   594             if self.CurrentLanguage != "SFC":
   594             if self.CurrentLanguage != "SFC":
   595                 self.AppendItem(menu, _(u'Coil'),
   595                 self.AppendItem(menu, _('Coil'),
   596                                 self.GetAddMenuCallBack(self.AddNewCoil))
   596                                 self.GetAddMenuCallBack(self.AddNewCoil))
   597 
   597 
   598             menu.AppendSeparator()
   598             menu.AppendSeparator()
   599 
   599 
   600         if self.CurrentLanguage == "SFC":
   600         if self.CurrentLanguage == "SFC":
   601             self.AppendItem(menu, _(u'Initial Step'),
   601             self.AppendItem(menu, _('Initial Step'),
   602                             self.GetAddMenuCallBack(self.AddNewStep, True))
   602                             self.GetAddMenuCallBack(self.AddNewStep, True))
   603             self.AppendItem(menu, (u'Step'),
   603             self.AppendItem(menu, ('Step'),
   604                             self.GetAddMenuCallBack(self.AddNewStep))
   604                             self.GetAddMenuCallBack(self.AddNewStep))
   605             self.AppendItem(menu, (u'Transition'),
   605             self.AppendItem(menu, ('Transition'),
   606                             self.GetAddMenuCallBack(self.AddNewTransition))
   606                             self.GetAddMenuCallBack(self.AddNewTransition))
   607             self.AppendItem(menu, (u'Action Block'),
   607             self.AppendItem(menu, ('Action Block'),
   608                             self.GetAddMenuCallBack(self.AddNewActionBlock))
   608                             self.GetAddMenuCallBack(self.AddNewActionBlock))
   609             self.AppendItem(menu, (u'Divergence'),
   609             self.AppendItem(menu, ('Divergence'),
   610                             self.GetAddMenuCallBack(self.AddNewDivergence))
   610                             self.GetAddMenuCallBack(self.AddNewDivergence))
   611             self.AppendItem(menu, (u'Jump'),
   611             self.AppendItem(menu, ('Jump'),
   612                             self.GetAddMenuCallBack(self.AddNewJump))
   612                             self.GetAddMenuCallBack(self.AddNewJump))
   613             menu.AppendSeparator()
   613             menu.AppendSeparator()
   614 
   614 
   615         self.AppendItem(menu, _(u'Comment'),
   615         self.AppendItem(menu, _('Comment'),
   616                         self.GetAddMenuCallBack(self.AddNewComment))
   616                         self.GetAddMenuCallBack(self.AddNewComment))
   617 
   617 
   618     # Add Default Menu items to the given menu
   618     # Add Default Menu items to the given menu
   619     def AddDefaultMenuItems(self, menu, edit=False, block=False):
   619     def AddDefaultMenuItems(self, menu, edit=False, block=False):
   620         if block:
   620         if block:
   621             edit_block = self.AppendItem(menu, _(u'Edit Block'),
   621             edit_block = self.AppendItem(menu, _('Edit Block'),
   622                                          self.OnEditBlockMenu)
   622                                          self.OnEditBlockMenu)
   623             self.AppendItem(menu, _(u'Adjust Block Size'),
   623             self.AppendItem(menu, _('Adjust Block Size'),
   624                             self.OnAdjustBlockSizeMenu)
   624                             self.OnAdjustBlockSizeMenu)
   625             self.AppendItem(menu, _(u'Delete'), self.OnDeleteMenu)
   625             self.AppendItem(menu, _('Delete'), self.OnDeleteMenu)
   626 
   626 
   627             edit_block.Enable(edit)
   627             edit_block.Enable(edit)
   628 
   628 
   629         else:
   629         else:
   630             if self.CurrentLanguage == 'FBD':
   630             if self.CurrentLanguage == 'FBD':
   631                 self.AppendItem(menu, _(u'Clear Execution Order'),
   631                 self.AppendItem(menu, _('Clear Execution Order'),
   632                                 self.OnClearExecutionOrderMenu)
   632                                 self.OnClearExecutionOrderMenu)
   633                 self.AppendItem(menu, _(u'Reset Execution Order'),
   633                 self.AppendItem(menu, _('Reset Execution Order'),
   634                                 self.OnResetExecutionOrderMenu)
   634                                 self.OnResetExecutionOrderMenu)
   635                 menu.AppendSeparator()
   635                 menu.AppendSeparator()
   636 
   636 
   637             add_menu = wx.Menu(title='')
   637             add_menu = wx.Menu(title='')
   638             self.AddAddMenuItems(add_menu)
   638             self.AddAddMenuItems(add_menu)
   639             menu.AppendMenu(-1, _(u'Add'), add_menu)
   639             menu.AppendMenu(-1, _('Add'), add_menu)
   640 
   640 
   641         menu.AppendSeparator()
   641         menu.AppendSeparator()
   642 
   642 
   643         cut = self.AppendItem(menu, _(u'Cut'), self.GetClipboardCallBack(self.Cut))
   643         cut = self.AppendItem(menu, _('Cut'), self.GetClipboardCallBack(self.Cut))
   644         copy = self.AppendItem(menu, _(u'Copy'), self.GetClipboardCallBack(self.Copy))
   644         copy = self.AppendItem(menu, _('Copy'), self.GetClipboardCallBack(self.Copy))
   645         paste = self.AppendItem(menu, _(u'Paste'), self.GetAddMenuCallBack(self.Paste))
   645         paste = self.AppendItem(menu, _('Paste'), self.GetAddMenuCallBack(self.Paste))
   646 
   646 
   647         cut.Enable(block)
   647         cut.Enable(block)
   648         copy.Enable(block)
   648         copy.Enable(block)
   649         paste.Enable(self.ParentWindow.GetCopyBuffer() is not None)
   649         paste.Enable(self.ParentWindow.GetCopyBuffer() is not None)
   650 
   650 
   918 
   918 
   919     def RemoveComment(self, comment):
   919     def RemoveComment(self, comment):
   920         self.Comments.pop(comment.GetId())
   920         self.Comments.pop(comment.GetId())
   921 
   921 
   922     def GetElements(self, sort_blocks=False, sort_wires=False, sort_comments=False):
   922     def GetElements(self, sort_blocks=False, sort_wires=False, sort_comments=False):
   923         blocks = self.Blocks.values()
   923         blocks = list(self.Blocks.values())
   924         wires = self.Wires.keys()
   924         wires = list(self.Wires.keys())
   925         comments = self.Comments.values()
   925         comments = list(self.Comments.values())
   926         if sort_blocks:
   926         if sort_blocks:
   927             blocks.sort(lambda x, y: cmp(x.GetId(), y.GetId()))
   927             blocks.sort(lambda x, y: cmp(x.GetId(), y.GetId()))
   928         if sort_wires:
   928         if sort_wires:
   929             wires.sort(lambda x, y: cmp(self.Wires[x], self.Wires[y]))
   929             wires.sort(lambda x, y: cmp(self.Wires[x], self.Wires[y]))
   930         if sort_comments:
   930         if sort_comments:
   931             comments.sort(lambda x, y: cmp(x.GetId(), y.GetId()))
   931             comments.sort(lambda x, y: cmp(x.GetId(), y.GetId()))
   932         return blocks + wires + comments
   932         return blocks + wires + comments
   933 
   933 
   934     def GetContinuationByName(self, name):
   934     def GetContinuationByName(self, name):
   935         blocks = []
   935         blocks = []
   936         for block in self.Blocks.itervalues():
   936         for block in self.Blocks.values():
   937             if isinstance(block, FBD_Connector) and\
   937             if isinstance(block, FBD_Connector) and\
   938                block.GetType() == CONTINUATION and\
   938                block.GetType() == CONTINUATION and\
   939                block.GetName() == name:
   939                block.GetName() == name:
   940                 blocks.append(block)
   940                 blocks.append(block)
   941         return blocks
   941         return blocks
   942 
   942 
   943     def GetConnectorByName(self, name):
   943     def GetConnectorByName(self, name):
   944         for block in self.Blocks.itervalues():
   944         for block in self.Blocks.values():
   945             if isinstance(block, FBD_Connector) and\
   945             if isinstance(block, FBD_Connector) and\
   946                block.GetType() == CONNECTOR and\
   946                block.GetType() == CONNECTOR and\
   947                block.GetName() == name:
   947                block.GetName() == name:
   948                 return block
   948                 return block
   949         return None
   949         return None
   955         if yp is not None:
   955         if yp is not None:
   956             y = yp * self.Editor.GetScrollPixelsPerUnit()[1]
   956             y = yp * self.Editor.GetScrollPixelsPerUnit()[1]
   957         width, height = self.Editor.GetClientSize()
   957         width, height = self.Editor.GetClientSize()
   958         screen = wx.Rect(int(x / self.ViewScale[0]), int(y / self.ViewScale[1]),
   958         screen = wx.Rect(int(x / self.ViewScale[0]), int(y / self.ViewScale[1]),
   959                          int(width / self.ViewScale[0]), int(height / self.ViewScale[1]))
   959                          int(width / self.ViewScale[0]), int(height / self.ViewScale[1]))
   960         for comment in self.Comments.itervalues():
   960         for comment in self.Comments.values():
   961             comment.TestVisible(screen)
   961             comment.TestVisible(screen)
   962         for wire in self.Wires.iterkeys():
   962         for wire in self.Wires.keys():
   963             wire.TestVisible(screen)
   963             wire.TestVisible(screen)
   964         for block in self.Blocks.itervalues():
   964         for block in self.Blocks.values():
   965             block.TestVisible(screen)
   965             block.TestVisible(screen)
   966 
   966 
   967     def GetElementIECPath(self, element):
   967     def GetElementIECPath(self, element):
   968         iec_path = None
   968         iec_path = None
   969         instance_path = self.GetInstancePath(True)
   969         instance_path = self.GetInstancePath(True)
  1040         self.HighlightedElement = None
  1040         self.HighlightedElement = None
  1041         self.ToolTipElement = None
  1041         self.ToolTipElement = None
  1042 
  1042 
  1043     def Flush(self):
  1043     def Flush(self):
  1044         self.UnsubscribeAllDataConsumers(tick=False)
  1044         self.UnsubscribeAllDataConsumers(tick=False)
  1045         for block in self.Blocks.itervalues():
  1045         for block in self.Blocks.values():
  1046             block.Flush()
  1046             block.Flush()
  1047 
  1047 
  1048     # Remove all elements
  1048     # Remove all elements
  1049     def CleanView(self):
  1049     def CleanView(self):
  1050         for block in self.Blocks.itervalues():
  1050         for block in self.Blocks.values():
  1051             block.Clean()
  1051             block.Clean()
  1052         self.ResetView()
  1052         self.ResetView()
  1053 
  1053 
  1054     # Changes Viewer mode
  1054     # Changes Viewer mode
  1055     def SetMode(self, mode):
  1055     def SetMode(self, mode):
  1135         else:
  1135         else:
  1136             self.Scaling = None
  1136             self.Scaling = None
  1137             self.GridBrush = wx.TRANSPARENT_BRUSH
  1137             self.GridBrush = wx.TRANSPARENT_BRUSH
  1138         page_size = properties["pageSize"]
  1138         page_size = properties["pageSize"]
  1139         if page_size != (0, 0):
  1139         if page_size != (0, 0):
  1140             self.PageSize = map(int, page_size)
  1140             self.PageSize = list(map(int, page_size))
  1141             self.PagePen = MiterPen(wx.Colour(180, 180, 180))
  1141             self.PagePen = MiterPen(wx.Colour(180, 180, 180))
  1142         else:
  1142         else:
  1143             self.PageSize = None
  1143             self.PageSize = None
  1144             self.PagePen = wx.TRANSPARENT_PEN
  1144             self.PagePen = wx.TRANSPARENT_PEN
  1145         if refresh:
  1145         if refresh:
  1217                     wire.SetValue("undefined")
  1217                     wire.SetValue("undefined")
  1218                 else:
  1218                 else:
  1219                     wire.SetModifier(self.GetWireModifier(wire))
  1219                     wire.SetModifier(self.GetWireModifier(wire))
  1220 
  1220 
  1221         if self.Debug:
  1221         if self.Debug:
  1222             for block in self.Blocks.itervalues():
  1222             for block in self.Blocks.values():
  1223                 block.SpreadCurrent()
  1223                 block.SpreadCurrent()
  1224                 if isinstance(block, FBD_Block):
  1224                 if isinstance(block, FBD_Block):
  1225                     for output_connector in block.GetConnectors()["outputs"]:
  1225                     for output_connector in block.GetConnectors()["outputs"]:
  1226                         if len(output_connector.GetWires()) == 0:
  1226                         if len(output_connector.GetWires()) == 0:
  1227                             iec_path = self.GetElementIECPath(output_connector)
  1227                             iec_path = self.GetElementIECPath(output_connector)
  1477     # -------------------------------------------------------------------------------
  1477     # -------------------------------------------------------------------------------
  1478 
  1478 
  1479     def FindBlock(self, event):
  1479     def FindBlock(self, event):
  1480         dc = self.GetLogicalDC()
  1480         dc = self.GetLogicalDC()
  1481         pos = event.GetLogicalPosition(dc)
  1481         pos = event.GetLogicalPosition(dc)
  1482         for block in self.Blocks.itervalues():
  1482         for block in self.Blocks.values():
  1483             if block.HitTest(pos) or block.TestHandle(event) != (0, 0):
  1483             if block.HitTest(pos) or block.TestHandle(event) != (0, 0):
  1484                 return block
  1484                 return block
  1485         return None
  1485         return None
  1486 
  1486 
  1487     def FindWire(self, event):
  1487     def FindWire(self, event):
  1508         return result
  1508         return result
  1509 
  1509 
  1510     def FindBlockConnectorWithError(self, pos, direction=None, exclude=None):
  1510     def FindBlockConnectorWithError(self, pos, direction=None, exclude=None):
  1511         error = False
  1511         error = False
  1512         startblock = None
  1512         startblock = None
  1513         for block in self.Blocks.itervalues():
  1513         for block in self.Blocks.values():
  1514             connector = block.TestConnector(pos, direction, exclude)
  1514             connector = block.TestConnector(pos, direction, exclude)
  1515             if connector:
  1515             if connector:
  1516                 if self.IsWire(self.SelectedElement):
  1516                 if self.IsWire(self.SelectedElement):
  1517                     startblock = self.SelectedElement.StartConnected.GetParentBlock()
  1517                     startblock = self.SelectedElement.StartConnected.GetParentBlock()
  1518                 avail, error = connector.ConnectionAvailable(direction, exclude)
  1518                 avail, error = connector.ConnectionAvailable(direction, exclude)
  1668 
  1668 
  1669     def PopupGroupMenu(self):
  1669     def PopupGroupMenu(self):
  1670         menu = wx.Menu(title='')
  1670         menu = wx.Menu(title='')
  1671         align_menu = wx.Menu(title='')
  1671         align_menu = wx.Menu(title='')
  1672         self.AddAlignmentMenuItems(align_menu)
  1672         self.AddAlignmentMenuItems(align_menu)
  1673         menu.AppendMenu(-1, _(u'Alignment'), align_menu)
  1673         menu.AppendMenu(-1, _('Alignment'), align_menu)
  1674         menu.AppendSeparator()
  1674         menu.AppendSeparator()
  1675         self.AddDefaultMenuItems(menu, block=True)
  1675         self.AddDefaultMenuItems(menu, block=True)
  1676         self.Editor.PopupMenu(menu)
  1676         self.Editor.PopupMenu(menu)
  1677         menu.Destroy()
  1677         menu.Destroy()
  1678 
  1678 
  1997                         EAST: [EAST, WEST],
  1997                         EAST: [EAST, WEST],
  1998                         WEST: [WEST, EAST],
  1998                         WEST: [WEST, EAST],
  1999                         NORTH: [NORTH, SOUTH],
  1999                         NORTH: [NORTH, SOUTH],
  2000                         SOUTH: [SOUTH, NORTH]}[connector.GetDirection()]
  2000                         SOUTH: [SOUTH, NORTH]}[connector.GetDirection()]
  2001                     wire = Wire(self,
  2001                     wire = Wire(self,
  2002                                 *map(list, zip(
  2002                                 *list(map(list, list(zip(
  2003                                     [wx.Point(pos.x, pos.y),
  2003                                     [wx.Point(pos.x, pos.y),
  2004                                      wx.Point(scaled_pos.x, scaled_pos.y)],
  2004                                      wx.Point(scaled_pos.x, scaled_pos.y)],
  2005                                     directions)))
  2005                                     directions)))))
  2006                     wire.oldPos = scaled_pos
  2006                     wire.oldPos = scaled_pos
  2007                     wire.Handle = (HANDLE_POINT, 0)
  2007                     wire.Handle = (HANDLE_POINT, 0)
  2008                     wire.ProcessDragging(0, 0, event, None)
  2008                     wire.ProcessDragging(0, 0, event, None)
  2009                     wire.Handle = (HANDLE_POINT, 1)
  2009                     wire.Handle = (HANDLE_POINT, 1)
  2010                     self.AddWire(wire)
  2010                     self.AddWire(wire)
  2370         if isinstance(startblock, SFC_Objects):
  2370         if isinstance(startblock, SFC_Objects):
  2371             startblockname = self.GetBlockName(startblock)
  2371             startblockname = self.GetBlockName(startblock)
  2372             poss_div_types = []
  2372             poss_div_types = []
  2373 
  2373 
  2374             SFC_WireMenu_Buttons = {
  2374             SFC_WireMenu_Buttons = {
  2375                 'SFC_Step': (_(u'Step'), self.GetAddToWireMenuCallBack(self.AddNewStep, False)),
  2375                 'SFC_Step': (_('Step'), self.GetAddToWireMenuCallBack(self.AddNewStep, False)),
  2376                 'SFC_Jump': (_(u'Jump'), self.GetAddToWireMenuCallBack(self.AddNewJump)),
  2376                 'SFC_Jump': (_('Jump'), self.GetAddToWireMenuCallBack(self.AddNewJump)),
  2377                 'SFC_Transition': (_(u'Transition'), self.GetAddToWireMenuCallBack(self.AddNewTransition, False)),
  2377                 'SFC_Transition': (_('Transition'), self.GetAddToWireMenuCallBack(self.AddNewTransition, False)),
  2378                 'SFC_ActionBlock': (_(u'Action Block'), self.GetAddToWireMenuCallBack(self.AddNewActionBlock))}
  2378                 'SFC_ActionBlock': (_('Action Block'), self.GetAddToWireMenuCallBack(self.AddNewActionBlock))}
  2379 
  2379 
  2380             for endblock in self.SFC_StandardRules.get(startblockname):
  2380             for endblock in self.SFC_StandardRules.get(startblockname):
  2381                 if start_direction in endblock:
  2381                 if start_direction in endblock:
  2382                     if endblock[0] in divergence_types:
  2382                     if endblock[0] in divergence_types:
  2383                         poss_div_types.append(endblock[0])
  2383                         poss_div_types.append(endblock[0])
  2384                     else:
  2384                     else:
  2385                         items.append(SFC_WireMenu_Buttons[endblock[0]])
  2385                         items.append(SFC_WireMenu_Buttons[endblock[0]])
  2386             if len(poss_div_types) > 0:
  2386             if len(poss_div_types) > 0:
  2387                 items.append((_(u'Divergence'), self.GetAddToWireMenuCallBack(self.AddNewDivergence,
  2387                 items.append((_('Divergence'), self.GetAddToWireMenuCallBack(self.AddNewDivergence,
  2388                                                                               poss_div_types)))
  2388                                                                               poss_div_types)))
  2389         elif start_direction == EAST:
  2389         elif start_direction == EAST:
  2390             items.extend([
  2390             items.extend([
  2391                 (_(u'Block'), self.GetAddToWireMenuCallBack(self.AddNewBlock)),
  2391                 (_('Block'), self.GetAddToWireMenuCallBack(self.AddNewBlock)),
  2392                 (_(u'Connection'), self.GetAddToWireMenuCallBack(self.AddNewConnection))])
  2392                 (_('Connection'), self.GetAddToWireMenuCallBack(self.AddNewConnection))])
  2393 
  2393 
  2394             if self.CurrentLanguage != "FBD":
  2394             if self.CurrentLanguage != "FBD":
  2395                 items.append((_(u'Contact'), self.GetAddToWireMenuCallBack(self.AddNewContact)))
  2395                 items.append((_('Contact'), self.GetAddToWireMenuCallBack(self.AddNewContact)))
  2396 
  2396 
  2397             if self.CurrentLanguage == "LD":
  2397             if self.CurrentLanguage == "LD":
  2398                 items.extend([
  2398                 items.extend([
  2399                     (_(u'Coil'), self.GetAddToWireMenuCallBack(self.AddNewCoil)),
  2399                     (_('Coil'), self.GetAddToWireMenuCallBack(self.AddNewCoil)),
  2400                     (_(u'Power Rail'), self.GetAddToWireMenuCallBack(self.AddNewPowerRail))])
  2400                     (_('Power Rail'), self.GetAddToWireMenuCallBack(self.AddNewPowerRail))])
  2401 
  2401 
  2402             if self.CurrentLanguage == "SFC":
  2402             if self.CurrentLanguage == "SFC":
  2403                 items.append(
  2403                 items.append(
  2404                     (_(u'Transition'), self.GetAddToWireMenuCallBack(self.AddNewTransition, True)))
  2404                     (_('Transition'), self.GetAddToWireMenuCallBack(self.AddNewTransition, True)))
  2405             else:
  2405             else:
  2406                 items.append(
  2406                 items.append(
  2407                     (_(u'Variable'), self.GetAddToWireMenuCallBack(self.AddNewVariable, True)))
  2407                     (_('Variable'), self.GetAddToWireMenuCallBack(self.AddNewVariable, True)))
  2408         return items
  2408         return items
  2409 
  2409 
  2410     # -------------------------------------------------------------------------------
  2410     # -------------------------------------------------------------------------------
  2411     #                          Keyboard event functions
  2411     #                          Keyboard event functions
  2412     # -------------------------------------------------------------------------------
  2412     # -------------------------------------------------------------------------------
  2730             self.AddNewElement(divergence, bbox, wire)
  2730             self.AddNewElement(divergence, bbox, wire)
  2731         dialog.Destroy()
  2731         dialog.Destroy()
  2732 
  2732 
  2733     def AddNewJump(self, bbox, wire=None):
  2733     def AddNewJump(self, bbox, wire=None):
  2734         choices = []
  2734         choices = []
  2735         for block in self.Blocks.itervalues():
  2735         for block in self.Blocks.values():
  2736             if isinstance(block, SFC_Step):
  2736             if isinstance(block, SFC_Step):
  2737                 choices.append(block.GetName())
  2737                 choices.append(block.GetName())
  2738         dialog = wx.SingleChoiceDialog(self.ParentWindow,
  2738         dialog = wx.SingleChoiceDialog(self.ParentWindow,
  2739                                        _("Add a new jump"),
  2739                                        _("Add a new jump"),
  2740                                        _("Please choose a target"),
  2740                                        _("Please choose a target"),
  2945 
  2945 
  2946             new_name = values["name"]
  2946             new_name = values["name"]
  2947             if self.GetDrawingMode() == DRIVENDRAWING_MODE:
  2947             if self.GetDrawingMode() == DRIVENDRAWING_MODE:
  2948                 old_name = step.GetName().upper()
  2948                 old_name = step.GetName().upper()
  2949                 if new_name.upper() != old_name:
  2949                 if new_name.upper() != old_name:
  2950                     for block in self.Blocks.itervalues():
  2950                     for block in self.Blocks.values():
  2951                         if isinstance(block, SFC_Jump):
  2951                         if isinstance(block, SFC_Jump):
  2952                             if old_name == block.GetTarget().upper():
  2952                             if old_name == block.GetTarget().upper():
  2953                                 block.SetTarget(new_name)
  2953                                 block.SetTarget(new_name)
  2954                                 block.RefreshModel()
  2954                                 block.RefreshModel()
  2955                                 rect = rect.Union(block.GetRedrawRect())
  2955                                 rect = rect.Union(block.GetRedrawRect())
  2998             transition.Refresh(rect)
  2998             transition.Refresh(rect)
  2999         dialog.Destroy()
  2999         dialog.Destroy()
  3000 
  3000 
  3001     def EditJumpContent(self, jump):
  3001     def EditJumpContent(self, jump):
  3002         choices = []
  3002         choices = []
  3003         for block in self.Blocks.itervalues():
  3003         for block in self.Blocks.values():
  3004             if isinstance(block, SFC_Step):
  3004             if isinstance(block, SFC_Step):
  3005                 choices.append(block.GetName())
  3005                 choices.append(block.GetName())
  3006         dialog = wx.SingleChoiceDialog(self.ParentWindow,
  3006         dialog = wx.SingleChoiceDialog(self.ParentWindow,
  3007                                        _("Edit jump target"),
  3007                                        _("Edit jump target"),
  3008                                        _("Please choose a target"),
  3008                                        _("Please choose a target"),
  3312         step.Clean()
  3312         step.Clean()
  3313 
  3313 
  3314         if self.GetDrawingMode() == DRIVENDRAWING_MODE:
  3314         if self.GetDrawingMode() == DRIVENDRAWING_MODE:
  3315             name = step.GetName().upper()
  3315             name = step.GetName().upper()
  3316             remove_jumps = []
  3316             remove_jumps = []
  3317             for block in self.Blocks.itervalues():
  3317             for block in self.Blocks.values():
  3318                 if isinstance(block, SFC_Jump):
  3318                 if isinstance(block, SFC_Jump):
  3319                     if name == block.GetTarget().upper():
  3319                     if name == block.GetTarget().upper():
  3320                         remove_jumps.append(block)
  3320                         remove_jumps.append(block)
  3321             for jump in remove_jumps:
  3321             for jump in remove_jumps:
  3322                 self.DeleteJump(jump)
  3322                 self.DeleteJump(jump)
  3656         if self.PageSize is not None and not printing:
  3656         if self.PageSize is not None and not printing:
  3657             dc.SetPen(self.PagePen)
  3657             dc.SetPen(self.PagePen)
  3658             xstart, ystart = self.GetViewStart()
  3658             xstart, ystart = self.GetViewStart()
  3659             window_size = self.Editor.GetClientSize()
  3659             window_size = self.Editor.GetClientSize()
  3660             if self.PageSize[0] != 0:
  3660             if self.PageSize[0] != 0:
  3661                 for x in xrange(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], int(window_size[0] / self.ViewScale[0]), self.PageSize[0]):
  3661                 for x in range(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], int(window_size[0] / self.ViewScale[0]), self.PageSize[0]):
  3662                     dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, int(ystart * SCROLLBAR_UNIT / self.ViewScale[0]),
  3662                     dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, int(ystart * SCROLLBAR_UNIT / self.ViewScale[0]),
  3663                                 xstart * SCROLLBAR_UNIT + x + 1, int((ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[0]))
  3663                                 xstart * SCROLLBAR_UNIT + x + 1, int((ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[0]))
  3664             if self.PageSize[1] != 0:
  3664             if self.PageSize[1] != 0:
  3665                 for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], int(window_size[1] / self.ViewScale[1]), self.PageSize[1]):
  3665                 for y in range(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], int(window_size[1] / self.ViewScale[1]), self.PageSize[1]):
  3666                     dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1,
  3666                     dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1,
  3667                                 int((xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[1]), ystart * SCROLLBAR_UNIT + y + 1)
  3667                                 int((xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[1]), ystart * SCROLLBAR_UNIT + y + 1)
  3668 
  3668 
  3669         # Draw all elements
  3669         # Draw all elements
  3670         for comment in self.Comments.itervalues():
  3670         for comment in self.Comments.values():
  3671             if comment != self.SelectedElement and (comment.IsVisible() or printing):
  3671             if comment != self.SelectedElement and (comment.IsVisible() or printing):
  3672                 comment.Draw(dc)
  3672                 comment.Draw(dc)
  3673         for wire in self.Wires.iterkeys():
  3673         for wire in self.Wires.keys():
  3674             if wire != self.SelectedElement and (wire.IsVisible() or printing):
  3674             if wire != self.SelectedElement and (wire.IsVisible() or printing):
  3675                 if not self.Debug or not wire.GetValue():
  3675                 if not self.Debug or not wire.GetValue():
  3676                     wire.Draw(dc)
  3676                     wire.Draw(dc)
  3677         if self.Debug:
  3677         if self.Debug:
  3678             for wire in self.Wires.iterkeys():
  3678             for wire in self.Wires.keys():
  3679                 if wire != self.SelectedElement and (wire.IsVisible() or printing) and wire.GetValue():
  3679                 if wire != self.SelectedElement and (wire.IsVisible() or printing) and wire.GetValue():
  3680                     wire.Draw(dc)
  3680                     wire.Draw(dc)
  3681         for block in self.Blocks.itervalues():
  3681         for block in self.Blocks.values():
  3682             if block != self.SelectedElement and (block.IsVisible() or printing):
  3682             if block != self.SelectedElement and (block.IsVisible() or printing):
  3683                 block.Draw(dc)
  3683                 block.Draw(dc)
  3684 
  3684 
  3685         if self.SelectedElement is not None and (self.SelectedElement.IsVisible() or printing):
  3685         if self.SelectedElement is not None and (self.SelectedElement.IsVisible() or printing):
  3686             self.SelectedElement.Draw(dc)
  3686             self.SelectedElement.Draw(dc)