etisserant@0: #!/usr/bin/env python etisserant@0: # -*- coding: utf-8 -*- etisserant@0: etisserant@0: #This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor etisserant@0: #based on the plcopen standard. etisserant@0: # lbessard@58: #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD etisserant@0: # etisserant@0: #See COPYING file for copyrights details. etisserant@0: # etisserant@0: #This library is free software; you can redistribute it and/or etisserant@5: #modify it under the terms of the GNU General Public etisserant@0: #License as published by the Free Software Foundation; either etisserant@0: #version 2.1 of the License, or (at your option) any later version. etisserant@0: # etisserant@0: #This library is distributed in the hope that it will be useful, etisserant@0: #but WITHOUT ANY WARRANTY; without even the implied warranty of etisserant@0: #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU lbessard@58: #General Public License for more details. etisserant@0: # etisserant@5: #You should have received a copy of the GNU General Public etisserant@0: #License along with this library; if not, write to the Free Software etisserant@0: #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA etisserant@0: etisserant@0: from wxPython.wx import * etisserant@0: import wx etisserant@0: from types import * etisserant@0: etisserant@0: from Viewer import * etisserant@0: etisserant@0: class SFC_Viewer(Viewer): etisserant@0: etisserant@0: def __init__(self, parent, window, controler): etisserant@0: Viewer.__init__(self, parent, window, controler) etisserant@0: etisserant@0: def ConnectConnectors(self, start, end): etisserant@0: startpoint = [start.GetPosition(False), start.GetDirection()] etisserant@0: endpoint = [end.GetPosition(False), end.GetDirection()] etisserant@0: wire = Wire(self, startpoint, endpoint) lbessard@42: self.AddWire(wire) etisserant@0: start.Connect((wire, 0), False) etisserant@0: end.Connect((wire, -1), False) etisserant@0: wire.ConnectStartPoint(None, start) etisserant@0: wire.ConnectEndPoint(None, end) etisserant@0: return wire etisserant@0: etisserant@0: def CreateTransition(self, connector, next = None): etisserant@0: previous = connector.GetParentBlock() etisserant@0: id = self.GetNewId() etisserant@0: transition = SFC_Transition(self, "reference", "", id) etisserant@0: pos = connector.GetPosition(False) etisserant@0: transition.SetPosition(pos.x, pos.y + SFC_WIRE_MIN_SIZE) etisserant@0: transition_connectors = transition.GetConnectors() etisserant@0: wire = self.ConnectConnectors(transition_connectors["input"], connector) etisserant@0: if isinstance(previous, SFC_Divergence): etisserant@0: previous.RefreshConnectedPosition(connector) etisserant@0: else: etisserant@0: previous.RefreshOutputPosition() etisserant@0: wire.SetPoints([wxPoint(pos.x, pos.y + GetWireSize(previous)), wxPoint(pos.x, pos.y)]) lbessard@42: self.AddBlock(transition) etisserant@0: self.Controler.AddCurrentElementEditingTransition(id) etisserant@0: self.RefreshTransitionModel(transition) etisserant@0: if next: etisserant@0: wire = self.ConnectConnectors(next, transition_connectors["output"]) etisserant@0: pos = transition_connectors["output"].GetPosition(False) etisserant@0: next_block = next.GetParentBlock() etisserant@0: next_pos = next.GetPosition(False) etisserant@0: transition.RefreshOutputPosition((0, pos.y + SFC_WIRE_MIN_SIZE - next_pos.y)) etisserant@0: wire.SetPoints([wxPoint(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wxPoint(pos.x, pos.y)]) etisserant@0: if isinstance(next_block, SFC_Divergence): etisserant@0: next_block.RefreshPosition() lbessard@2: transition.RefreshOutputModel(True) etisserant@0: return transition etisserant@0: etisserant@0: def RemoveTransition(self, transition): etisserant@0: connectors = transition.GetConnectors() etisserant@0: input_wires = connectors["input"].GetWires() etisserant@0: if len(input_wires) != 1: etisserant@0: return etisserant@0: input_wire = input_wires[0][0] etisserant@0: previous = input_wire.EndConnected etisserant@0: input_wire.Clean() lbessard@42: self.RemoveWire(input_wire) etisserant@0: output_wires = connectors["output"].GetWires() etisserant@0: if len(output_wires) != 1: etisserant@0: return etisserant@0: output_wire = output_wires[0][0] etisserant@0: next = output_wire.StartConnected etisserant@0: output_wire.Clean() lbessard@42: self.RemoveWire(output_wire) etisserant@0: transition.Clean() lbessard@42: self.RemoveBlock(transition) etisserant@0: self.Controler.RemoveCurrentElementEditingInstance(transition.GetId()) etisserant@0: wire = self.ConnectConnectors(next, previous) etisserant@0: return wire etisserant@0: etisserant@0: def CreateStep(self, name, connector, next = None): etisserant@0: previous = connector.GetParentBlock() etisserant@0: id = self.GetNewId() etisserant@0: step = SFC_Step(self, name, False, id) etisserant@0: if next: etisserant@0: step.AddOutput() etisserant@0: min_width, min_height = step.GetMinSize() etisserant@0: pos = connector.GetPosition(False) etisserant@0: step.SetPosition(pos.x, pos.y + SFC_WIRE_MIN_SIZE) etisserant@0: step.SetSize(min_width, min_height) etisserant@0: step_connectors = step.GetConnectors() etisserant@0: wire = self.ConnectConnectors(step_connectors["input"], connector) etisserant@0: if isinstance(previous, SFC_Divergence): etisserant@0: previous.RefreshConnectedPosition(connector) etisserant@0: else: etisserant@0: previous.RefreshOutputPosition() etisserant@0: wire.SetPoints([wxPoint(pos.x, pos.y + GetWireSize(previous)), wxPoint(pos.x, pos.y)]) lbessard@42: self.AddBlock(step) etisserant@0: self.Controler.AddCurrentElementEditingStep(id) etisserant@0: self.RefreshStepModel(step) etisserant@0: if next: etisserant@0: wire = self.ConnectConnectors(next, step_connectors["output"]) etisserant@0: pos = step_connectors["output"].GetPosition(False) etisserant@0: next_block = next.GetParentBlock() etisserant@0: next_pos = next.GetPosition(False) etisserant@0: step.RefreshOutputPosition((0, pos.y + SFC_WIRE_MIN_SIZE - next_pos.y)) etisserant@0: wire.SetPoints([wxPoint(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wxPoint(pos.x, pos.y)]) etisserant@0: if isinstance(next_block, SFC_Divergence): etisserant@0: next_block.RefreshPosition() lbessard@2: step.RefreshOutputModel(True) etisserant@0: return step etisserant@0: etisserant@0: def RemoveStep(self, step): etisserant@0: connectors = step.GetConnectors() etisserant@0: if connectors["input"]: etisserant@0: input_wires = connectors["input"].GetWires() etisserant@0: if len(input_wires) != 1: etisserant@0: return etisserant@0: input_wire = input_wires[0][0] etisserant@0: previous = input_wire.EndConnected etisserant@0: input_wire.Clean() lbessard@42: self.RemoveWire(input_wire) etisserant@0: else: etisserant@0: previous = None etisserant@0: if connectors["output"]: etisserant@0: output_wires = connectors["output"].GetWires() etisserant@0: if len(output_wires) != 1: etisserant@0: return etisserant@0: output_wire = output_wires[0][0] etisserant@0: next = output_wire.StartConnected etisserant@0: output_wire.Clean() lbessard@42: self.RemoveWire(output_wire) etisserant@0: else: etisserant@0: next = None etisserant@0: action = step.GetActionConnector() etisserant@0: if action: etisserant@0: self.DeleteActionBlock(action.GetParentBlock()) etisserant@0: step.Clean() lbessard@42: self.RemoveBlock(step) etisserant@0: self.Controler.RemoveCurrentElementEditingInstance(step.GetId()) etisserant@0: if next and previous: etisserant@0: wire = self.ConnectConnectors(next, previous) etisserant@0: return wire etisserant@0: else: etisserant@0: return None etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Mouse event functions etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: def OnViewerLeftDown(self, event): lbessard@27: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@27: Viewer.OnViewerLeftDown(self, event) lbessard@27: elif self.Mode == MODE_SELECTION: lbessard@27: dc = self.GetLogicalDC() lbessard@27: pos = event.GetLogicalPosition(dc) etisserant@0: if event.ControlDown(): etisserant@0: element = self.FindElement(pos, True) lbessard@42: if element and not self.IsWire(element): etisserant@0: if isinstance(self.SelectedElement, Graphic_Group): etisserant@0: self.SelectedElement.SelectElement(element) etisserant@0: else: etisserant@0: group = Graphic_Group(self) etisserant@0: self.SelectedElement.SetSelected(False) etisserant@0: group.SelectElement(self.SelectedElement) etisserant@0: group.SelectElement(element) etisserant@0: self.SelectedElement = group etisserant@0: elements = self.SelectedElement.GetElements() etisserant@0: if len(elements) == 0: etisserant@0: self.SelectedElement = element etisserant@0: elif len(elements) == 1: etisserant@0: self.SelectedElement = elements[0] etisserant@0: else: etisserant@0: element = self.FindElement(pos) etisserant@0: if self.SelectedElement and self.SelectedElement != element: lbessard@42: if self.IsWire(self.SelectedElement): etisserant@0: self.SelectedElement.SetSelectedSegment(None) etisserant@0: else: etisserant@0: self.SelectedElement.SetSelected(False) etisserant@0: self.SelectedElement = None etisserant@0: self.Refresh() etisserant@0: if element: etisserant@0: self.SelectedElement = element lbessard@27: self.SelectedElement.OnLeftDown(event, dc, self.Scaling) etisserant@0: self.Refresh() etisserant@0: else: etisserant@0: self.rubberBand.Reset() lbessard@27: self.rubberBand.OnLeftDown(event, dc, self.Scaling) etisserant@0: elif self.Mode == MODE_COMMENT: etisserant@0: self.rubberBand.Reset() lbessard@27: self.rubberBand.OnLeftDown(event, self.GetLogicalDC(), self.Scaling) etisserant@0: elif self.Mode == MODE_WIRE: lbessard@27: pos = GetScaledEventPosition(event, self.GetLogicalDC(), self.Scaling) etisserant@0: wire = Wire(self, [wxPoint(pos.x, pos.y), SOUTH], [wxPoint(pos.x, pos.y), NORTH]) etisserant@0: wire.oldPos = pos etisserant@0: wire.Handle = (HANDLE_POINT, 0) etisserant@0: wire.ProcessDragging(0, 0) etisserant@0: wire.Handle = (HANDLE_POINT, 1) lbessard@42: self.AddWire(wire) etisserant@0: if self.SelectedElement: etisserant@0: self.SelectedElement.SetSelected(False) etisserant@0: self.SelectedElement = wire etisserant@0: self.Refresh() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnViewerLeftUp(self, event): lbessard@27: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@27: Viewer.OnViewerLeftUp(self, event) lbessard@27: elif self.rubberBand.IsShown(): etisserant@0: if self.Mode == MODE_SELECTION: etisserant@0: elements = self.SearchElements(self.rubberBand.GetCurrentExtent()) lbessard@27: self.rubberBand.OnLeftUp(event, self.GetLogicalDC(), self.Scaling) etisserant@0: if len(elements) > 0: etisserant@0: self.SelectedElement = Graphic_Group(self) etisserant@0: self.SelectedElement.SetElements(elements) etisserant@0: self.SelectedElement.SetSelected(True) etisserant@0: self.Refresh() etisserant@0: elif self.Mode == MODE_COMMENT: etisserant@0: bbox = self.rubberBand.GetCurrentExtent() lbessard@27: self.rubberBand.OnLeftUp(event, self.GetLogicalDC(), self.Scaling) etisserant@0: wxCallAfter(self.AddComment, bbox) lbessard@27: elif self.Mode == MODE_INITIALSTEP: lbessard@27: wxCallAfter(self.AddInitialStep, GetScaledEventPosition(event, self.GetLogicalDC(), self.Scaling)) etisserant@0: elif self.Mode == MODE_SELECTION and self.SelectedElement: lbessard@42: if self.IsWire(self.SelectedElement): etisserant@0: self.SelectedElement.SetSelectedSegment(0) etisserant@0: else: lbessard@27: self.SelectedElement.OnLeftUp(event, self.GetLogicalDC(), self.Scaling) etisserant@0: wxCallAfter(self.SetCursor, wxNullCursor) etisserant@0: self.ReleaseMouse() etisserant@0: self.Refresh() etisserant@0: elif self.Mode == MODE_WIRE and self.SelectedElement: etisserant@0: self.SelectedElement.ResetPoints() lbessard@27: self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling) etisserant@0: self.SelectedElement.GeneratePoints() etisserant@0: self.SelectedElement.RefreshModel() etisserant@0: self.SelectedElement.SetSelected(True) etisserant@0: self.Refresh() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnViewerRightUp(self, event): lbessard@27: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@27: Viewer.OnViewerRightUp(self, event) lbessard@27: else: lbessard@27: dc = self.GetLogicalDC() lbessard@27: pos = event.GetLogicalPosition(dc) lbessard@27: element = self.FindElement(pos) lbessard@27: if element: lbessard@27: if self.SelectedElement and self.SelectedElement != element: lbessard@27: self.SelectedElement.SetSelected(False) lbessard@27: self.SelectedElement = element lbessard@42: if self.IsWire(self.SelectedElement): lbessard@27: self.SelectedElement.SetSelectedSegment(0) lbessard@27: else: lbessard@27: self.SelectedElement.SetSelected(True) lbessard@27: self.SelectedElement.OnRightUp(event, dc, self.Scaling) lbessard@27: wxCallAfter(self.SetCursor, wxNullCursor) lbessard@27: self.ReleaseMouse() lbessard@27: self.Refresh() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnViewerLeftDClick(self, event): lbessard@27: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@27: Viewer.OnViewerLeftDClick(self, event) lbessard@27: elif self.Mode == MODE_SELECTION and self.SelectedElement: lbessard@27: self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling) etisserant@0: self.Refresh() etisserant@0: event.Skip() etisserant@0: etisserant@0: def OnViewerMotion(self, event): lbessard@27: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@27: Viewer.OnViewerMotion(self, event) lbessard@27: elif self.rubberBand.IsShown(): lbessard@27: self.rubberBand.OnMotion(event, self.GetLogicalDC(), self.Scaling) etisserant@0: elif self.Mode == MODE_SELECTION and self.SelectedElement: lbessard@42: if not self.IsWire(self.SelectedElement): lbessard@27: self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling) etisserant@0: self.Refresh() etisserant@0: elif self.Mode == MODE_WIRE and self.SelectedElement: etisserant@0: self.SelectedElement.ResetPoints() lbessard@27: self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling) etisserant@0: self.SelectedElement.GeneratePoints() etisserant@0: self.Refresh() lbessard@27: Viewer.OnViewerMotion(self, event) etisserant@0: event.Skip() etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Keyboard event functions etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: def OnChar(self, event): etisserant@0: keycode = event.GetKeyCode() etisserant@0: if self.Scaling: etisserant@0: scaling = self.Scaling etisserant@0: else: etisserant@0: scaling = (8, 8) etisserant@0: if keycode == WXK_DELETE and self.SelectedElement: etisserant@0: self.SelectedElement.Delete() etisserant@0: self.SelectedElement = None lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() lbessard@56: self.Refresh() lbessard@42: elif keycode == WXK_LEFT: lbessard@42: if event.ControlDown() and event.ShiftDown(): lbessard@42: self.Scroll(0, ypos) lbessard@42: elif event.ControlDown(): lbessard@42: self.Scroll(max(0, xpos - 1), ypos) lbessard@42: elif self.SelectedElement: lbessard@42: self.SelectedElement.Move(-scaling[0], 0) lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() lbessard@56: self.Refresh() lbessard@42: elif keycode == WXK_RIGHT: lbessard@42: if event.ControlDown() and event.ShiftDown(): lbessard@42: self.Scroll(xmax, ypos) lbessard@42: elif event.ControlDown(): lbessard@42: self.Scroll(min(xpos + 1, xmax), ypos) lbessard@42: elif self.SelectedElement: lbessard@42: self.SelectedElement.Move(scaling[0], 0) lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() lbessard@56: self.Refresh() lbessard@42: elif keycode == WXK_UP: lbessard@42: if event.ControlDown() and event.ShiftDown(): lbessard@42: self.Scroll(xpos, 0) lbessard@42: elif event.ControlDown(): lbessard@42: self.Scroll(xpos, max(0, ypos - 1)) lbessard@42: elif self.SelectedElement: lbessard@42: self.SelectedElement.Move(0, -scaling[1]) lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() lbessard@56: self.Refresh() lbessard@42: elif keycode == WXK_DOWN: lbessard@42: if event.ControlDown() and event.ShiftDown(): lbessard@42: self.Scroll(xpos, ymax) lbessard@42: elif event.ControlDown(): lbessard@42: self.Scroll(xpos, min(ypos + 1, ymax)) lbessard@42: elif self.SelectedElement: lbessard@42: self.SelectedElement.Move(0, scaling[1]) lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() lbessard@56: self.Refresh() etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Adding element functions etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: def AddInitialStep(self, pos): lbessard@9: dialog = StepNameDialog(self.Parent, "Add a new initial step", "Please enter step name", "", wxOK|wxCANCEL) lbessard@9: dialog.SetPouNames(self.Controler.GetProjectPouNames()) lbessard@9: dialog.SetVariables(self.Controler.GetCurrentElementEditingInterfaceVars()) lbessard@9: dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)]) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: id = self.GetNewId() etisserant@0: name = dialog.GetValue() etisserant@0: step = SFC_Step(self, name, True, id) etisserant@0: min_width, min_height = step.GetMinSize() etisserant@0: step.SetPosition(pos.x, pos.y) etisserant@0: width, height = step.GetSize() etisserant@0: step.SetSize(max(min_width, width), max(min_height, height)) lbessard@42: self.AddBlock(step) etisserant@0: self.Controler.AddCurrentElementEditingStep(id) etisserant@0: self.RefreshStepModel(step) etisserant@0: self.Parent.RefreshProjectTree() lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() etisserant@0: self.Refresh() etisserant@0: dialog.Destroy() etisserant@0: etisserant@0: def AddStep(self): etisserant@0: if self.SelectedElement in self.Wires or isinstance(self.SelectedElement, SFC_Step): lbessard@9: dialog = StepNameDialog(self.Parent, "Add a new step", "Please enter step name", "", wxOK|wxCANCEL) lbessard@9: dialog.SetPouNames(self.Controler.GetProjectPouNames()) lbessard@9: dialog.SetVariables(self.Controler.GetCurrentElementEditingInterfaceVars()) lbessard@9: dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)]) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: name = dialog.GetValue() lbessard@42: if self.IsWire(self.SelectedElement): etisserant@0: self.SelectedElement.SetSelectedSegment(None) etisserant@0: previous = self.SelectedElement.EndConnected etisserant@0: next = self.SelectedElement.StartConnected etisserant@0: self.SelectedElement.Clean() lbessard@42: self.RemoveWire(self.SelectedElement) etisserant@0: else: etisserant@0: connectors = self.SelectedElement.GetConnectors() etisserant@0: if connectors["output"]: etisserant@0: previous = connectors["output"] etisserant@0: wires = previous.GetWires() etisserant@0: if len(wires) != 1: etisserant@0: return etisserant@0: wire = wires[0][0] etisserant@0: next = wire.StartConnected etisserant@0: wire.Clean() lbessard@42: self.RemoveWire(wire) etisserant@0: else: etisserant@0: self.SelectedElement.AddOutput() etisserant@0: connectors = self.SelectedElement.GetConnectors() etisserant@0: self.RefreshStepModel(self.SelectedElement) etisserant@0: previous = connectors["output"] etisserant@0: next = None etisserant@0: previous_block = previous.GetParentBlock() etisserant@0: if isinstance(previous_block, SFC_Step) or isinstance(previous_block, SFC_Divergence) and previous_block.GetType() in [SELECTION_DIVERGENCE, SELECTION_CONVERGENCE]: etisserant@0: transition = self.CreateTransition(previous) etisserant@0: transition_connectors = transition.GetConnectors() etisserant@0: step = self.CreateStep(name, transition_connectors["output"], next) etisserant@0: else: etisserant@0: step = self.CreateStep(name, previous) etisserant@0: step.AddOutput() etisserant@0: step.RefreshModel() etisserant@0: step_connectors = step.GetConnectors() etisserant@0: transition = self.CreateTransition(step_connectors["output"], next) lbessard@42: if self.IsWire(self.SelectedElement): etisserant@0: self.SelectedElement = wire etisserant@0: self.SelectedElement.SetSelectedSegment(0) etisserant@0: else: etisserant@0: self.SelectedElement.SetSelected(False) etisserant@0: self.SelectedElement = step etisserant@0: self.SelectedElement.SetSelected(True) etisserant@0: self.Parent.RefreshProjectTree() lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() etisserant@0: self.Refresh() etisserant@0: dialog.Destroy() etisserant@0: etisserant@0: def AddStepAction(self): etisserant@0: if isinstance(self.SelectedElement, SFC_Step): etisserant@0: connectors = self.SelectedElement.GetConnectors() etisserant@0: if not connectors["action"]: etisserant@0: dialog = ActionBlockDialog(self.Parent) etisserant@0: dialog.SetQualifierList(self.Controler.GetQualifierTypes()) etisserant@0: dialog.SetActionList(self.Controler.GetCurrentElementEditingActions()) etisserant@0: dialog.SetVariableList(self.Controler.GetCurrentElementEditingInterfaceVars()) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: actions = dialog.GetValues() etisserant@0: self.SelectedElement.AddAction() etisserant@0: self.RefreshStepModel(self.SelectedElement) etisserant@0: connectors = self.SelectedElement.GetConnectors() etisserant@0: pos = connectors["action"].GetPosition(False) etisserant@0: id = self.GetNewId() etisserant@0: actionblock = SFC_ActionBlock(self, [], id) etisserant@0: actionblock.SetPosition(pos.x + SFC_WIRE_MIN_SIZE, pos.y - SFC_STEP_DEFAULT_SIZE[1] / 2) etisserant@0: actionblock_connector = actionblock.GetConnector() etisserant@0: wire = self.ConnectConnectors(actionblock_connector, connectors["action"]) etisserant@0: wire.SetPoints([wxPoint(pos.x + SFC_WIRE_MIN_SIZE, pos.y), wxPoint(pos.x, pos.y)]) etisserant@0: actionblock.SetActions(actions) lbessard@42: self.AddBlock(actionblock) etisserant@0: self.Controler.AddCurrentElementEditingActionBlock(id) etisserant@0: self.RefreshActionBlockModel(actionblock) lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() etisserant@0: self.Refresh() etisserant@0: dialog.Destroy() etisserant@0: etisserant@0: def AddDivergence(self): etisserant@0: if self.SelectedElement in self.Wires or isinstance(self.SelectedElement, Graphic_Group) or isinstance(self.SelectedElement, SFC_Step): etisserant@0: dialog = DivergenceCreateDialog(self.Parent) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: value = dialog.GetValues() etisserant@0: if value["type"] == SELECTION_DIVERGENCE: etisserant@0: if self.SelectedElement in self.Wires and isinstance(self.SelectedElement.EndConnected.GetParentBlock(), SFC_Step): etisserant@0: self.SelectedElement.SetSelectedSegment(None) etisserant@0: previous = self.SelectedElement.EndConnected etisserant@0: next = self.SelectedElement.StartConnected etisserant@0: self.SelectedElement.Clean() lbessard@42: self.RemoveWire(self.SelectedElement) etisserant@0: self.SelectedElement = None etisserant@0: elif isinstance(self.SelectedElement, SFC_Step): etisserant@0: connectors = self.SelectedElement.GetConnectors() etisserant@0: if connectors["output"]: etisserant@0: previous = connectors["output"] etisserant@0: wires = previous.GetWires() etisserant@0: if len(wires) != 1: etisserant@0: return etisserant@0: wire = wires[0][0] etisserant@0: next = wire.StartConnected etisserant@0: wire.Clean() lbessard@42: self.RemoveWire(wire) etisserant@0: else: etisserant@0: self.SelectedElement.AddOutput() etisserant@0: connectors = self.SelectedElement.GetConnectors() etisserant@0: self.RefreshStepModel(self.SelectedElement) etisserant@0: previous = connectors["output"] etisserant@0: next = None etisserant@0: else: etisserant@0: return etisserant@0: id = self.GetNewId() etisserant@0: divergence = SFC_Divergence(self, SELECTION_DIVERGENCE, value["number"], id) etisserant@0: pos = previous.GetPosition(False) etisserant@0: previous_block = previous.GetParentBlock() etisserant@0: wire_size = GetWireSize(previous_block) etisserant@0: divergence.SetPosition(pos.x, pos.y + wire_size) etisserant@0: divergence_connectors = divergence.GetConnectors() etisserant@0: wire = self.ConnectConnectors(divergence_connectors["inputs"][0], previous) etisserant@0: previous_block.RefreshOutputPosition() etisserant@0: wire.SetPoints([wxPoint(pos.x, pos.y + wire_size), wxPoint(pos.x, pos.y)]) lbessard@42: self.AddBlock(divergence) etisserant@0: self.Controler.AddCurrentElementEditingDivergence(id, value["type"]) etisserant@0: self.RefreshDivergenceModel(divergence) etisserant@0: for index, connector in enumerate(divergence_connectors["outputs"]): etisserant@0: if next: etisserant@0: wire = self.ConnectConnectors(next, connector) etisserant@0: pos = connector.GetPosition(False) etisserant@0: next_pos = next.GetPosition(False) etisserant@0: next_block = next.GetParentBlock() etisserant@0: divergence.RefreshOutputPosition((0, pos.y + SFC_WIRE_MIN_SIZE - next_pos.y)) etisserant@0: divergence.RefreshConnectedPosition(connector) etisserant@0: wire.SetPoints([wxPoint(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wxPoint(pos.x, pos.y)]) etisserant@0: next_block.RefreshModel() etisserant@0: next = None etisserant@0: else: etisserant@0: transition = self.CreateTransition(connector) etisserant@0: transition_connectors = transition.GetConnectors() etisserant@0: step = self.CreateStep("Step", transition_connectors["output"]) etisserant@0: elif value["type"] == SIMULTANEOUS_DIVERGENCE: etisserant@0: if self.SelectedElement in self.Wires and isinstance(self.SelectedElement.EndConnected.GetParentBlock(), SFC_Transition): etisserant@0: self.SelectedElement.SetSelectedSegment(None) etisserant@0: previous = self.SelectedElement.EndConnected etisserant@0: next = self.SelectedElement.StartConnected etisserant@0: self.SelectedElement.Clean() lbessard@42: self.RemoveWire(self.SelectedElement) etisserant@0: self.SelectedElement = None etisserant@0: elif isinstance(self.SelectedElement, SFC_Step): etisserant@0: connectors = self.SelectedElement.GetConnectors() etisserant@0: if connectors["output"]: etisserant@0: previous = connectors["output"] etisserant@0: wires = previous.GetWires() etisserant@0: if len(wires) != 1: etisserant@0: return etisserant@0: wire = wires[0][0] etisserant@0: next = wire.StartConnected etisserant@0: wire.Clean() lbessard@42: self.RemoveWire(wire) etisserant@0: else: etisserant@0: self.SelectedElement.AddOutput() etisserant@0: connectors = self.SelectedElement.GetConnectors() etisserant@0: self.RefreshStepModel(self.SelectedElement) etisserant@0: previous = connectors["output"] etisserant@0: next = None etisserant@0: transition = self.CreateTransition(previous) etisserant@0: transition_connectors = transition.GetConnectors() etisserant@0: previous = transition_connectors["output"] etisserant@0: else: etisserant@0: return etisserant@0: id = self.GetNewId() etisserant@0: divergence = SFC_Divergence(self, SIMULTANEOUS_DIVERGENCE, value["number"], id) etisserant@0: pos = previous.GetPosition(False) etisserant@0: previous_block = previous.GetParentBlock() etisserant@0: wire_size = GetWireSize(previous_block) etisserant@0: divergence.SetPosition(pos.x, pos.y + wire_size) etisserant@0: divergence_connectors = divergence.GetConnectors() etisserant@0: wire = self.ConnectConnectors(divergence_connectors["inputs"][0], previous) etisserant@0: previous_block.RefreshOutputPosition() etisserant@0: wire.SetPoints([wxPoint(pos.x, pos.y + wire_size), wxPoint(pos.x, pos.y)]) lbessard@42: self.AddBlock(divergence) etisserant@0: self.Controler.AddCurrentElementEditingDivergence(id, value["type"]) etisserant@0: self.RefreshDivergenceModel(divergence) etisserant@0: for index, connector in enumerate(divergence_connectors["outputs"]): etisserant@0: if next: etisserant@0: wire = self.ConnectConnectors(next, connector) etisserant@0: pos = connector.GetPosition(False) etisserant@0: next_pos = next.GetPosition(False) etisserant@0: next_block = next.GetParentBlock() etisserant@0: divergence.RefreshOutputPosition((0, pos.y + SFC_WIRE_MIN_SIZE - next_pos.y)) etisserant@0: divergence.RefreshConnectedPosition(connector) etisserant@0: wire.SetPoints([wxPoint(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wxPoint(pos.x, pos.y)]) etisserant@0: next_block.RefreshModel() etisserant@0: next = None etisserant@0: else: etisserant@0: step = self.CreateStep("Step", connector) etisserant@0: elif isinstance(self.SelectedElement, Graphic_Group) and len(self.SelectedElement.GetElements()) > 1: etisserant@0: next = None etisserant@0: for element in self.SelectedElement.GetElements(): etisserant@0: connectors = element.GetConnectors() etisserant@0: if not isinstance(element, SFC_Step) or connectors["output"] and next: etisserant@0: return etisserant@0: elif connectors["output"] and not next: etisserant@0: wires = connectors["output"].GetWires() etisserant@0: if len(wires) != 1: etisserant@0: return etisserant@0: if value["type"] == SELECTION_CONVERGENCE: etisserant@0: transition = wires[0][0].StartConnected.GetParentBlock() etisserant@0: transition_connectors = transition.GetConnectors() etisserant@0: wires = transition_connectors["output"].GetWires() etisserant@0: if len(wires) != 1: etisserant@0: return etisserant@0: wire = wires[0][0] etisserant@0: next = wire.StartConnected etisserant@0: wire.Clean() lbessard@42: self.RemoveWire(wire) etisserant@0: inputs = [] etisserant@0: for input in self.SelectedElement.GetElements(): etisserant@0: input_connectors = input.GetConnectors() etisserant@0: if not input_connectors["output"]: etisserant@0: input.AddOutput() etisserant@0: input.RefreshModel() etisserant@0: input_connectors = input.GetConnectors() etisserant@0: if value["type"] == SELECTION_CONVERGENCE: etisserant@0: transition = self.CreateTransition(input_connectors["output"]) etisserant@0: transition_connectors = transition.GetConnectors() etisserant@0: inputs.append(transition_connectors["output"]) etisserant@0: else: etisserant@0: inputs.append(input_connectors["output"]) etisserant@0: elif value["type"] == SELECTION_CONVERGENCE: etisserant@0: wires = input_connectors["output"].GetWires() etisserant@0: transition = wires[0][0].StartConnected.GetParentBlock() etisserant@0: transition_connectors = transition.GetConnectors() etisserant@0: inputs.append(transition_connectors["output"]) etisserant@0: else: etisserant@0: inputs.append(input_connectors["output"]) etisserant@0: id = self.GetNewId() etisserant@0: divergence = SFC_Divergence(self, value["type"], len(inputs), id) etisserant@0: pos = inputs[0].GetPosition(False) etisserant@0: divergence.SetPosition(pos.x, pos.y + SFC_WIRE_MIN_SIZE) etisserant@0: divergence_connectors = divergence.GetConnectors() etisserant@0: for i, input in enumerate(inputs): etisserant@0: pos = input.GetPosition(False) etisserant@0: wire = self.ConnectConnectors(divergence_connectors["inputs"][i], input) etisserant@0: wire_size = GetWireSize(input) etisserant@0: wire.SetPoints([wxPoint(pos.x, pos.y + wire_size), wxPoint(pos.x, pos.y)]) etisserant@0: input_block = input.GetParentBlock() etisserant@0: input_block.RefreshOutputPosition() etisserant@0: divergence.RefreshPosition() etisserant@0: pos = divergence_connectors["outputs"][0].GetRelPosition() etisserant@0: divergence.MoveConnector(divergence_connectors["outputs"][0], - pos.x) lbessard@42: self.AddBlock(divergence) etisserant@0: self.Controler.AddCurrentElementEditingDivergence(id, value["type"]) etisserant@0: self.RefreshDivergenceModel(divergence) etisserant@0: if next: etisserant@0: wire = self.ConnectConnectors(next, divergence_connectors["outputs"][0]) etisserant@0: pos = divergence_connectors["outputs"][0].GetPosition(False) etisserant@0: next_pos = next.GetPosition(False) etisserant@0: next_block = next.GetParentBlock() etisserant@0: divergence.RefreshOutputPosition((0, pos.y + SFC_WIRE_MIN_SIZE - next_pos.y)) etisserant@0: divergence.RefreshConnectedPosition(divergence_connectors["outputs"][0]) etisserant@0: wire.SetPoints([wxPoint(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wxPoint(pos.x, pos.y)]) etisserant@0: next_block.RefreshModel() etisserant@0: else: etisserant@0: if value["type"] == SELECTION_CONVERGENCE: etisserant@0: previous = divergence_connectors["outputs"][0] etisserant@0: else: etisserant@0: transition = self.CreateTransition(divergence_connectors["outputs"][0]) etisserant@0: transition_connectors = transition.GetConnectors() etisserant@0: previous = transition_connectors["output"] etisserant@0: self.CreateStep("Step", previous) lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() etisserant@0: self.Refresh() etisserant@0: dialog.Destroy() etisserant@0: etisserant@0: def AddDivergenceBranch(self, divergence): etisserant@0: if isinstance(divergence, SFC_Divergence): etisserant@0: type = divergence.GetType() etisserant@0: if type in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]: etisserant@0: divergence.AddBranch() etisserant@0: divergence_connectors = divergence.GetConnectors() etisserant@0: if type == SELECTION_DIVERGENCE: etisserant@0: transition = self.CreateTransition(divergence_connectors["outputs"][-1]) etisserant@0: transition_connectors = transition.GetConnectors() etisserant@0: previous = transition_connectors["output"] etisserant@0: else: etisserant@0: previous = divergence_connectors["outputs"][-1] etisserant@0: step = self.CreateStep("Step", previous) lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() etisserant@0: self.Refresh() etisserant@0: etisserant@0: def AddJump(self): etisserant@0: if isinstance(self.SelectedElement, SFC_Step) and not self.SelectedElement.Output: etisserant@0: choices = [] etisserant@0: for block in self.Blocks: etisserant@0: if isinstance(block, SFC_Step): etisserant@0: choices.append(block.GetName()) etisserant@0: dialog = wxSingleChoiceDialog(self.Parent, "Add a new jump", "Please choose a target", choices, wxOK|wxCANCEL) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: value = dialog.GetStringSelection() etisserant@0: self.SelectedElement.AddOutput() etisserant@0: self.RefreshStepModel(self.SelectedElement) etisserant@0: step_connectors = self.SelectedElement.GetConnectors() etisserant@0: transition = self.CreateTransition(step_connectors["output"]) etisserant@0: transition_connectors = transition.GetConnectors() etisserant@0: id = self.GetNewId() etisserant@0: jump = SFC_Jump(self, value, id) etisserant@0: pos = transition_connectors["output"].GetPosition(False) etisserant@0: jump.SetPosition(pos.x, pos.y + SFC_WIRE_MIN_SIZE) lbessard@42: self.AddBlock(jump) etisserant@0: self.Controler.AddCurrentElementEditingJump(id) etisserant@0: jump_connector = jump.GetConnector() etisserant@0: wire = self.ConnectConnectors(jump_connector, transition_connectors["output"]) etisserant@0: transition.RefreshOutputPosition() etisserant@0: wire.SetPoints([wxPoint(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wxPoint(pos.x, pos.y)]) etisserant@0: self.RefreshJumpModel(jump) lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() etisserant@0: self.Refresh() etisserant@0: dialog.Destroy() etisserant@0: etisserant@0: def EditStepContent(self, step): lbessard@9: dialog = StepNameDialog(self.Parent, "Edit step name", "Please enter step name", step.GetName(), wxOK|wxCANCEL) lbessard@9: dialog.SetPouNames(self.Controler.GetProjectPouNames()) lbessard@9: dialog.SetVariables(self.Controler.GetCurrentElementEditingInterfaceVars()) lbessard@9: dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step) and block.GetName() != step.GetName()]) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: value = dialog.GetValue() etisserant@0: step.SetName(value) etisserant@0: min_size = step.GetMinSize() etisserant@0: size = step.GetSize() etisserant@0: step.UpdateSize(max(min_size[0], size[0]), max(min_size[1], size[1])) etisserant@0: step.RefreshModel() lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() etisserant@0: self.Refresh() etisserant@0: dialog.Destroy() etisserant@0: etisserant@0: def EditTransitionContent(self, transition): etisserant@0: dialog = TransitionContentDialog(self.Parent) etisserant@0: dialog.SetTransitions(self.Controler.GetCurrentElementEditingTransitions()) etisserant@0: dialog.SetValues({"type":transition.GetType(),"value":transition.GetCondition()}) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: values = dialog.GetValues() etisserant@0: transition.SetType(values["type"]) etisserant@0: transition.SetCondition(values["value"]) etisserant@0: transition.RefreshModel() lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() etisserant@0: self.Refresh() etisserant@0: dialog.Destroy() etisserant@0: etisserant@0: def EditJumpContent(self, jump): etisserant@0: choices = [] etisserant@0: for block in self.Blocks: etisserant@0: if isinstance(block, SFC_Step): etisserant@0: choices.append(block.GetName()) etisserant@0: dialog = wxSingleChoiceDialog(self.Parent, "Edit jump target", "Please choose a target", choices, wxOK|wxCANCEL) etisserant@0: dialog.SetSelection(choices.index(jump.GetTarget())) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: value = dialog.GetStringSelection() etisserant@0: jump.SetTarget(value) etisserant@0: jump.RefreshModel() lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() etisserant@0: self.Refresh() etisserant@0: dialog.Destroy() etisserant@0: etisserant@0: def EditActionBlockContent(self, actionblock): etisserant@0: dialog = ActionBlockDialog(self.Parent) etisserant@0: dialog.SetQualifierList(self.Controler.GetQualifierTypes()) etisserant@0: dialog.SetActionList(self.Controler.GetCurrentElementEditingActions()) etisserant@0: dialog.SetVariableList(self.Controler.GetCurrentElementEditingInterfaceVars()) etisserant@0: dialog.SetValues(actionblock.GetActions()) etisserant@0: if dialog.ShowModal() == wxID_OK: etisserant@0: actions = dialog.GetValues() etisserant@0: actionblock.SetActions(actions) etisserant@0: actionblock.RefreshModel() lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() etisserant@0: self.Refresh() etisserant@0: dialog.Destroy() etisserant@0: etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Delete element functions etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: def DeleteStep(self, step): lbessard@28: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@28: Viewer.DeleteStep(self, step) lbessard@28: else: lbessard@28: step_connectors = step.GetConnectors() lbessard@28: if not step.GetInitial() or not step_connectors["output"]: lbessard@28: previous = step.GetPreviousConnector() lbessard@28: if previous: lbessard@28: previous_block = previous.GetParentBlock() lbessard@28: else: lbessard@28: previous_block = None etisserant@0: next = step.GetNextConnector() etisserant@0: if next: etisserant@0: next_block = next.GetParentBlock() etisserant@0: else: etisserant@0: next_block = None lbessard@28: if isinstance(next_block, SFC_Transition): lbessard@28: self.RemoveTransition(next_block) lbessard@28: next = step.GetNextConnector() lbessard@28: if next: lbessard@28: next_block = next.GetParentBlock() etisserant@0: else: lbessard@28: next_block = None lbessard@28: elif isinstance(previous_block, SFC_Transition): lbessard@28: self.RemoveTransition(previous_block) lbessard@28: previous = step.GetPreviousConnector() lbessard@28: if previous: lbessard@28: previous_block = previous.GetParentBlock() etisserant@0: else: lbessard@28: previous_block = None lbessard@28: wire = self.RemoveStep(step) lbessard@28: self.SelectedElement = None lbessard@28: if next_block: lbessard@28: if isinstance(next_block, SFC_Divergence) and next_block.GetType() == SIMULTANEOUS_CONVERGENCE and isinstance(previous_block, SFC_Divergence) and previous_block.GetType() == SIMULTANEOUS_DIVERGENCE: lbessard@28: wire.Clean() lbessard@42: self.RemoveWire(wire) lbessard@28: next_block.RemoveBranch(next) lbessard@28: if next_block.GetBranchNumber() < 2: lbessard@28: self.DeleteDivergence(next_block) lbessard@28: else: lbessard@28: next_block.RefreshModel() etisserant@0: previous_block.RemoveBranch(previous) etisserant@0: if previous_block.GetBranchNumber() < 2: etisserant@0: self.DeleteDivergence(previous_block) etisserant@0: else: lbessard@28: previous_block.RefreshModel() lbessard@28: else: lbessard@28: pos = previous.GetPosition(False) lbessard@28: next_pos = next.GetPosition(False) lbessard@28: wire_size = GetWireSize(previous_block) lbessard@28: previous_block.RefreshOutputPosition((0, pos.y + wire_size - next_pos.y)) lbessard@28: wire.SetPoints([wxPoint(pos.x, pos.y + wire_size), wxPoint(pos.x, pos.y)]) lbessard@28: if isinstance(next_block, SFC_Divergence): lbessard@28: next_block.RefreshPosition() lbessard@28: previous_block.RefreshOutputModel(True) lbessard@28: else: lbessard@28: if isinstance(previous_block, SFC_Step): lbessard@28: previous_block.RemoveOutput() lbessard@28: self.RefreshStepModel(previous_block) lbessard@28: elif isinstance(previous_block, SFC_Divergence): lbessard@28: if previous_block.GetType() in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]: lbessard@28: self.DeleteDivergence(previous_block) lbessard@28: else: lbessard@28: previous_block.RemoveBranch(previous) lbessard@28: if previous_block.GetBranchNumber() < 2: lbessard@28: self.DeleteDivergence(previous_block) lbessard@28: else: lbessard@28: self.RefreshDivergenceModel(previous_block) etisserant@0: etisserant@0: def DeleteTransition(self, transition): lbessard@28: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@28: Viewer.DeleteTransition(self, transition) lbessard@28: else: lbessard@28: previous = transition.GetPreviousConnector() lbessard@28: previous_block = previous.GetParentBlock() lbessard@28: next = transition.GetNextConnector() lbessard@28: next_block = next.GetParentBlock() lbessard@28: if isinstance(previous_block, SFC_Divergence) and previous_block.GetType() == SELECTION_DIVERGENCE and isinstance(next_block, SFC_Divergence) and next_block.GetType() == SELECTION_CONVERGENCE: lbessard@28: wires = previous.GetWires() lbessard@28: if len(wires) != 1: lbessard@28: return lbessard@28: wire = wires[0][0] lbessard@28: wire.Clean() lbessard@42: self.RemoveWire(wire) lbessard@28: wires = next.GetWires() lbessard@28: if len(wires) != 1: lbessard@28: return lbessard@28: wire = wires[0][0] lbessard@28: wire.Clean() lbessard@42: self.RemoveWire(wire) lbessard@28: transition.Clean() lbessard@44: self.RemoveBlock(transition) lbessard@28: self.Controler.RemoveCurrentElementEditingInstance(transition.GetId()) lbessard@28: previous_block.RemoveBranch(previous) lbessard@28: if previous_block.GetBranchNumber() < 2: lbessard@28: self.DeleteDivergence(previous_block) lbessard@28: else: lbessard@28: self.RefreshDivergenceModel(previous_block) lbessard@28: next_block.RemoveBranch(next) lbessard@28: if next_block.GetBranchNumber() < 2: lbessard@28: self.DeleteDivergence(next_block) lbessard@28: else: lbessard@28: self.RefreshDivergenceModel(next_block) lbessard@28: self.Parent.RefreshProjectTree() lbessard@28: lbessard@28: def DeleteDivergence(self, divergence): lbessard@28: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@28: Viewer.DeleteDivergence(self, divergence) lbessard@28: else: lbessard@28: connectors = divergence.GetConnectors() lbessard@28: type = divergence.GetType() lbessard@28: if type in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]: lbessard@28: wires = connectors["outputs"][0].GetWires() lbessard@28: if len(wires) > 1: lbessard@28: return lbessard@28: elif len(wires) == 1: lbessard@28: next = wires[0][0].StartConnected lbessard@28: next_block = next.GetParentBlock() lbessard@28: wire = wires[0][0] lbessard@28: wire.Clean() lbessard@42: self.RemoveWire(wire) lbessard@28: else: lbessard@28: next = None lbessard@28: next_block = None lbessard@28: for index, connector in enumerate(connectors["inputs"]): lbessard@28: if next and index == 0: lbessard@28: wires = connector.GetWires() lbessard@28: wire = wires[0][0] lbessard@28: previous = wires[0][0].EndConnected lbessard@28: wire.Clean() lbessard@42: self.RemoveWire(wire) lbessard@28: else: lbessard@28: if type == SELECTION_CONVERGENCE: lbessard@28: wires = connector.GetWires() lbessard@28: previous_block = wires[0][0].EndConnected.GetParentBlock() lbessard@28: self.RemoveTransition(previous_block) lbessard@28: wires = connector.GetWires() lbessard@28: wire = wires[0][0] lbessard@28: previous_connector = wire.EndConnected lbessard@28: previous_block = previous_connector.GetParentBlock() lbessard@28: wire.Clean() lbessard@42: self.RemoveWire(wire) lbessard@28: if isinstance(previous_block, SFC_Step): lbessard@28: previous_block.RemoveOutput() lbessard@28: self.RefreshStepModel(previous_block) lbessard@28: elif isinstance(previous_block, SFC_Divergence): lbessard@28: if previous_block.GetType() in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]: lbessard@28: previous_block.RemoveBranch(previous_connector) lbessard@28: if previous_block.GetBranchNumber() < 2: lbessard@28: self.DeleteDivergence(previous_block) lbessard@28: else: lbessard@28: self.RefreshDivergenceModel(previous_block) lbessard@28: else: lbessard@28: self.DeleteDivergence(previous_block) lbessard@28: divergence.Clean() lbessard@44: self.RemoveBlock(divergence) lbessard@28: self.Controler.RemoveCurrentElementEditingInstance(divergence.GetId()) lbessard@28: if next: lbessard@28: wire = self.ConnectConnectors(next, previous) lbessard@28: previous_block = previous.GetParentBlock() lbessard@45: previous_pos = previous.GetPosition(False) lbessard@28: next_pos = next.GetPosition(False) lbessard@28: wire_size = GetWireSize(previous_block) lbessard@28: previous_block.RefreshOutputPosition((0, previous_pos.y + wire_size - next_pos.y)) lbessard@28: wire.SetPoints([wxPoint(previous_pos.x, previous_pos.y + wire_size), lbessard@28: wxPoint(previous_pos.x, previous_pos.y)]) lbessard@28: if isinstance(next_block, SFC_Divergence): lbessard@28: next_block.RefreshPosition() lbessard@28: previous_block.RefreshOutputModel(True) lbessard@28: elif divergence.GetBranchNumber() == 1: lbessard@28: wires = connectors["inputs"][0].GetWires() lbessard@28: if len(wires) != 1: lbessard@28: return lbessard@28: wire = wires[0][0] lbessard@28: previous = wire.EndConnected lbessard@28: previous_block = previous.GetParentBlock() lbessard@28: wire.Clean() lbessard@42: self.RemoveWire(wire) lbessard@28: wires = connectors["outputs"][0].GetWires() lbessard@28: if len(wires) != 1: lbessard@28: return lbessard@28: wire = wires[0][0] lbessard@28: next = wire.StartConnected lbessard@28: next_block = next.GetParentBlock() lbessard@28: wire.Clean() lbessard@42: self.RemoveWire(wire) lbessard@28: divergence.Clean() lbessard@44: self.RemoveBlock(divergence) lbessard@28: self.Controler.RemoveCurrentElementEditingInstance(divergence.GetId()) lbessard@28: wire = self.ConnectConnectors(next, previous) lbessard@28: previous_pos = previous.GetPosition(False) lbessard@28: next_pos = next.GetPosition(False) lbessard@28: wire_size = GetWireSize(previous_block) lbessard@28: previous_block.RefreshOutputPosition((previous_pos.x - next_pos.x, previous_pos.y + wire_size - next_pos.y)) lbessard@28: wire.SetPoints([wxPoint(previous_pos.x, previous_pos.y + wire_size), lbessard@28: wxPoint(previous_pos.x, previous_pos.y)]) lbessard@28: if isinstance(next_block, SFC_Divergence): lbessard@28: next_block.RefreshPosition() lbessard@28: previous_block.RefreshOutputModel(True) lbessard@28: self.Parent.RefreshProjectTree() lbessard@28: lbessard@28: def DeleteJump(self, jump): lbessard@28: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@28: Viewer.DeleteJump(self, jump) lbessard@28: else: lbessard@28: previous = jump.GetPreviousConnector() lbessard@28: previous_block = previous.GetParentBlock() lbessard@28: if isinstance(previous_block, SFC_Transition): lbessard@28: self.RemoveTransition(previous_block) lbessard@28: previous = jump.GetPreviousConnector() lbessard@28: if previous: lbessard@28: previous_block = previous.GetParentBlock() lbessard@28: else: lbessard@28: previous_block = None etisserant@0: wires = previous.GetWires() etisserant@0: if len(wires) != 1: etisserant@0: return etisserant@0: wire = wires[0][0] etisserant@0: wire.Clean() lbessard@42: self.RemoveWire(wire) lbessard@28: jump.Clean() lbessard@44: self.RemoveBlock(jump) lbessard@28: self.Controler.RemoveCurrentElementEditingInstance(jump.GetId()) lbessard@28: if isinstance(previous_block, SFC_Step): lbessard@28: previous_block.RemoveOutput() lbessard@28: self.RefreshStepModel(previous_block) lbessard@28: elif isinstance(previous_block, SFC_Divergence): lbessard@28: if previous_block.GetType() in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]: lbessard@28: self.DeleteDivergence(previous_block) lbessard@28: else: lbessard@28: previous_block.RemoveBranch(previous) lbessard@28: if previous_block.GetBranchNumber() < 2: lbessard@28: self.DeleteDivergence(previous_block) lbessard@28: else: lbessard@28: previous_block.RefreshModel() lbessard@28: self.Parent.RefreshProjectTree() lbessard@28: lbessard@28: def DeleteActionBlock(self, actionblock): lbessard@28: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@28: Viewer.DeleteActionBlock(self, actionblock) lbessard@28: else: lbessard@28: connector = actionblock.GetConnector() lbessard@28: wires = connector.GetWires() etisserant@0: if len(wires) != 1: etisserant@0: return etisserant@0: wire = wires[0][0] lbessard@28: step = wire.EndConnected.GetParentBlock() etisserant@0: wire.Clean() lbessard@42: self.RemoveWire(wire) lbessard@28: actionblock.Clean() lbessard@44: self.RemoveBlock(actionblock) lbessard@28: self.Controler.RemoveCurrentElementEditingInstance(actionblock.GetId()) lbessard@28: step.RemoveAction() lbessard@28: self.RefreshStepModel(step) lbessard@28: step.RefreshOutputPosition() lbessard@28: step.RefreshOutputModel(True) lbessard@28: self.Parent.RefreshProjectTree() lbessard@28: etisserant@0: def DeleteWire(self, wire): lbessard@28: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@28: Viewer.DeleteWire(self, wire) lbessard@28: