--- a/editors/Viewer.py Fri Jun 14 14:19:28 2013 +0200
+++ b/editors/Viewer.py Mon Jun 17 09:11:55 2013 +0200
@@ -440,15 +440,18 @@
(ID_ALIGN_BOTTOM, wx.ITEM_NORMAL, _(u'Bottom'), '', self.OnAlignBottomMenu)])
# Add Wire Menu items to the given menu
- def AddWireMenuItems(self, menu, delete=False):
- [ID_ADD_SEGMENT, ID_DELETE_SEGMENT] = [wx.NewId() for i in xrange(2)]
+ def AddWireMenuItems(self, menu, delete=False, replace=False): + [ID_ADD_SEGMENT, ID_DELETE_SEGMENT, ID_REPLACE_WIRE, + ] = [wx.NewId() for i in xrange(3)] self.AddMenuItems(menu, [
(ID_ADD_SEGMENT, wx.ITEM_NORMAL, _(u'Add Wire Segment'), '', self.OnAddSegmentMenu),
- (ID_DELETE_SEGMENT, wx.ITEM_NORMAL, _(u'Delete Wire Segment'), '', self.OnDeleteSegmentMenu)])
+ (ID_DELETE_SEGMENT, wx.ITEM_NORMAL, _(u'Delete Wire Segment'), '', self.OnDeleteSegmentMenu), + (ID_REPLACE_WIRE, wx.ITEM_NORMAL, _(u'Replace Wire by connections'), '', self.OnReplaceWireMenu)]) menu.Enable(ID_DELETE_SEGMENT, delete)
+ menu.Enable(ID_REPLACE_WIRE, replace) # Add Divergence Menu items to the given menu
def AddDivergenceMenuItems(self, menu, delete=False):
@@ -1505,7 +1508,18 @@
def PopupWireMenu(self, delete=True):
- self.AddWireMenuItems(menu, delete)
+ # If Check that wire can be replace by connections or abort + connected = self.SelectedElement.GetConnected() + self.SelectedElement.GetEndConnected() + if self.SelectedElement.GetStartConnected() in connected + else self.SelectedElement.GetStartConnected()) + self.AddWireMenuItems(menu, delete, + start_connector.GetDirection() == EAST and + not isinstance(start_connector.GetParentBlock(), SFC_Step)) self.AddDefaultMenuItems(menu, block=True)
self.Editor.PopupMenu(menu)
@@ -1608,7 +1622,111 @@
if self.SelectedElement is not None and self.IsWire(self.SelectedElement):
self.SelectedElement.DeleteSegment()
self.SelectedElement.Refresh()
+ def OnReplaceWireMenu(self, event): + # Check that selected element is a wire before applying replace + if (self.SelectedElement is not None and + self.IsWire(self.SelectedElement)): + # Get wire redraw bbox to erase it from screen + wire = self.SelectedElement + redraw_rect = wire.GetRedrawRect() + # Get connector at both ends of wire + connected = wire.GetConnected() + if wire.GetStartConnected() in connected: + start_connector = wire.GetEndConnected() + end_connector = wire.GetStartConnected() + wire.UnConnectStartPoint() + start_connector = wire.GetStartConnected() + end_connector = wire.GetEndConnected() + wire.UnConnectEndPoint() + # Get a new default connection name + connection_name = self.Controler.GenerateNewName( + self.TagName, None, "Connection%d", 0) + # Create a connector to connect to wire + connection = FBD_Connector(self, CONNECTOR, connection_name, id) + connection.SetSize(*self.GetScaledSize(*connection.GetMinSize())) + # Calculate position of connector at the right of start connector + connector = connection.GetConnectors()["inputs"][0] + rel_pos = connector.GetRelPosition() + direction = connector.GetDirection() + start_point = start_connector.GetPosition(False) + end_point = (start_point[0] + LD_WIRE_SIZE, start_point[1]) + connection.SetPosition(end_point[0] - rel_pos[0], + end_point[1] - rel_pos[1]) + # Connect connector to wire + connector.Connect((wire, point_to_connect)) + if point_to_connect == 0: + wire.SetPoints([end_point, start_point]) + wire.SetPoints([start_point, end_point]) + # Update redraw bbox with new wire trace so that it will be redraw + redraw_rect.Union(wire.GetRedrawRect()) + # Add connector to Viewer and model + self.AddBlock(connection) + self.Controler.AddEditedElementConnection(self.TagName, id, + connection.RefreshModel() + # Update redraw bbox with new connector bbox so that it will be + redraw_rect.Union(connection.GetRedrawRect()) + connection = FBD_Connector(self, CONTINUATION, connection_name, id) + connection.SetSize(*self.GetScaledSize(*connection.GetMinSize())) + # Calculate position of connection at the left of end connector + connector = connection.GetConnectors()["outputs"][0] + rel_pos = connector.GetRelPosition() + direction = connector.GetDirection() + end_point = end_connector.GetPosition(False) + start_point = (end_point[0] - LD_WIRE_SIZE, end_point[1]) + connection.SetPosition(start_point[0] - rel_pos[0], + start_point[1] - rel_pos[1]) + # Add Wire to Viewer and connect it to blocks + [wx.Point(*start_point), connector.GetDirection()], + [wx.Point(*end_point), end_connector.GetDirection()]) + connector.Connect((new_wire, 0), False) + end_connector.Connect((new_wire, -1), False) + new_wire.ConnectStartPoint(None, connector) + new_wire.ConnectEndPoint(None, end_connector) + # Update redraw bbox with new wire bbox so that it will be drawn on + redraw_rect.Union(new_wire.GetRedrawRect()) + # Add connection to Viewer and model + self.AddBlock(connection) + self.Controler.AddEditedElementConnection(self.TagName, id, + connection.RefreshModel() + # Update redraw bbox with new connection bbox so that it will be + redraw_rect.Union(connection.GetRedrawRect()) + # Refresh model for new wire + end_connector.RefreshParentBlock() + self.RefreshScrollBars() + self.RefreshVisibleElements() + self.RefreshRect(self.GetScrolledRect(redraw_rect), False) def OnAddBranchMenu(self, event):
if self.SelectedElement is not None and self.IsBlock(self.SelectedElement):
self.AddDivergenceBranch(self.SelectedElement)