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: import wx etisserant@0: from types import * etisserant@0: from Viewer import * etisserant@0: lbessard@121: etisserant@0: class SFC_Viewer(Viewer): etisserant@0: lbessard@249: def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""): lbessard@249: Viewer.__init__(self, parent, tagname, window, controler, debug, instancepath) lbessard@112: self.CurrentLanguage = "SFC" 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() lbessard@80: transition = SFC_Transition(self, "reference", "", 0, 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() lbessard@64: wire.SetPoints([wx.Point(pos.x, pos.y + GetWireSize(previous)), wx.Point(pos.x, pos.y)]) lbessard@42: self.AddBlock(transition) lbessard@121: self.Controler.AddEditedElementTransition(self.TagName, 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)) lbessard@64: wire.SetPoints([wx.Point(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wx.Point(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) lbessard@121: self.Controler.RemoveEditedElementInstance(self.TagName, 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() lbessard@64: wire.SetPoints([wx.Point(pos.x, pos.y + GetWireSize(previous)), wx.Point(pos.x, pos.y)]) lbessard@42: self.AddBlock(step) lbessard@121: self.Controler.AddEditedElementStep(self.TagName, 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)) lbessard@64: wire.SetPoints([wx.Point(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wx.Point(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 laurent@383: action = step.GetActionConnected() etisserant@0: if action: etisserant@0: self.DeleteActionBlock(action.GetParentBlock()) etisserant@0: step.Clean() lbessard@42: self.RemoveBlock(step) lbessard@121: self.Controler.RemoveEditedElementInstance(self.TagName, 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@331: if event.ShiftDown() and not event.ControlDown() and self.SelectedElement is not None: laurent@563: element = self.FindElement(event, 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] lbessard@331: self.SelectedElement.SetSelected(True) etisserant@0: else: laurent@563: element = self.FindElement(event) 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: if element: etisserant@0: self.SelectedElement = element laurent@563: self.SelectedElement.OnLeftDown(event, self.GetLogicalDC(), self.Scaling) lbessard@144: self.SelectedElement.Refresh() etisserant@0: else: etisserant@0: self.rubberBand.Reset() laurent@563: self.rubberBand.OnLeftDown(event, self.GetLogicalDC(), 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: 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: elif self.Mode == MODE_COMMENT: etisserant@0: bbox = self.rubberBand.GetCurrentExtent() lbessard@27: self.rubberBand.OnLeftUp(event, self.GetLogicalDC(), self.Scaling) lbessard@64: wx.CallAfter(self.AddComment, bbox) lbessard@27: elif self.Mode == MODE_INITIALSTEP: lbessard@64: wx.CallAfter(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) lbessard@144: self.SelectedElement.Refresh() laurent@382: wx.CallAfter(self.SetCurrentCursor, 0) 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: 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: laurent@563: element = self.FindElement(event) 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) laurent@563: self.SelectedElement.OnRightUp(event, self.GetLogicalDC(), self.Scaling) lbessard@144: self.SelectedElement.Refresh() laurent@382: wx.CallAfter(self.SetCurrentCursor, 0) 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) lbessard@155: self.Refresh(False) 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@71: else: lbessard@71: if self.rubberBand.IsShown(): lbessard@71: self.rubberBand.OnMotion(event, self.GetLogicalDC(), self.Scaling) lbessard@71: elif self.Mode == MODE_SELECTION and self.SelectedElement: lbessard@71: if not self.IsWire(self.SelectedElement) and not isinstance(self.SelectedElement, Graphic_Group): lbessard@71: self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling) lbessard@144: self.SelectedElement.Refresh() lbessard@71: elif self.Mode == MODE_WIRE and self.SelectedElement: lbessard@71: self.SelectedElement.ResetPoints() lbessard@27: self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling) lbessard@71: self.SelectedElement.GeneratePoints() lbessard@144: self.SelectedElement.Refresh() lbessard@71: self.UpdateScrollPos(event) etisserant@0: event.Skip() etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Keyboard event functions etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: def OnChar(self, event): greg@362: if self.GetDrawingMode() == FREEDRAWING_MODE: greg@362: Viewer.OnChar(self, event) greg@362: else: greg@362: xpos, ypos = self.GetScrollPos(wx.HORIZONTAL), self.GetScrollPos(wx.VERTICAL) greg@362: xmax = self.GetScrollRange(wx.HORIZONTAL) - self.GetScrollThumb(wx.HORIZONTAL) greg@362: ymax = self.GetScrollRange(wx.VERTICAL) - self.GetScrollThumb(wx.VERTICAL) greg@362: keycode = event.GetKeyCode() greg@362: if self.Scaling: greg@362: scaling = self.Scaling greg@362: else: greg@362: scaling = (8, 8) greg@362: if keycode == wx.WXK_DELETE and self.SelectedElement: greg@362: self.SelectedElement.Delete() greg@362: self.SelectedElement = None lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() greg@362: self.Refresh(False) greg@362: elif keycode == wx.WXK_LEFT: greg@362: if event.ControlDown() and event.ShiftDown(): greg@362: self.Scroll(0, ypos) greg@362: elif event.ControlDown(): greg@362: event.Skip() greg@362: elif self.SelectedElement: greg@362: self.SelectedElement.Move(-scaling[0], 0) greg@362: self.SelectedElement.RefreshModel() greg@362: self.RefreshBuffer() greg@362: self.RefreshScrollBars() greg@362: self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(-scaling[0], 0)), False) greg@362: elif keycode == wx.WXK_RIGHT: greg@362: if event.ControlDown() and event.ShiftDown(): greg@362: self.Scroll(xmax, ypos) greg@362: elif event.ControlDown(): greg@362: event.Skip() greg@362: elif self.SelectedElement: greg@362: self.SelectedElement.Move(scaling[0], 0) greg@362: self.SelectedElement.RefreshModel() greg@362: self.RefreshBuffer() greg@362: self.RefreshScrollBars() greg@362: self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(scaling[0], 0)), False) greg@362: elif keycode == wx.WXK_UP: greg@362: if event.ControlDown() and event.ShiftDown(): greg@362: self.Scroll(xpos, 0) greg@362: elif event.ControlDown(): greg@362: event.Skip() greg@362: elif self.SelectedElement: greg@362: self.SelectedElement.Move(0, -scaling[1]) greg@362: self.SelectedElement.RefreshModel() greg@362: self.RefreshBuffer() greg@362: self.RefreshScrollBars() greg@362: self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, -scaling[1])), False) greg@362: elif keycode == wx.WXK_DOWN: greg@362: if event.ControlDown() and event.ShiftDown(): greg@362: self.Scroll(xpos, ymax) greg@362: elif event.ControlDown(): greg@362: event.Skip() greg@362: elif self.SelectedElement: greg@362: self.SelectedElement.Move(0, scaling[1]) greg@362: self.SelectedElement.RefreshModel() greg@362: self.RefreshBuffer() greg@362: self.RefreshScrollBars() greg@362: self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, scaling[1])), False) greg@362: else: lbessard@112: event.Skip() etisserant@0: etisserant@0: #------------------------------------------------------------------------------- etisserant@0: # Adding element functions etisserant@0: #------------------------------------------------------------------------------- etisserant@0: etisserant@0: def AddInitialStep(self, pos): laurent@409: dialog = SFCStepNameDialog(self.ParentWindow, _("Please enter step name"), _("Add a new initial step"), "", wx.OK|wx.CANCEL) lbessard@249: dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) lbessard@249: dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)) lbessard@9: dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)]) lbessard@64: if dialog.ShowModal() == wx.ID_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) lbessard@121: self.Controler.AddEditedElementStep(self.TagName, id) etisserant@0: self.RefreshStepModel(step) lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() lbessard@155: self.Refresh(False) 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): laurent@409: dialog = SFCStepNameDialog(self.ParentWindow, _("Add a new step"), _("Please enter step name"), "", wx.OK|wx.CANCEL) lbessard@249: dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) lbessard@249: dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)) lbessard@9: dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)]) lbessard@64: if dialog.ShowModal() == wx.ID_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) lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() lbessard@155: self.Refresh(False) 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"]: lbessard@90: dialog = ActionBlockDialog(self.ParentWindow) etisserant@0: dialog.SetQualifierList(self.Controler.GetQualifierTypes()) lbessard@249: dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName, self.Debug)) lbessard@249: dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)) lbessard@64: if dialog.ShowModal() == wx.ID_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"]) lbessard@64: wire.SetPoints([wx.Point(pos.x + SFC_WIRE_MIN_SIZE, pos.y), wx.Point(pos.x, pos.y)]) etisserant@0: actionblock.SetActions(actions) lbessard@42: self.AddBlock(actionblock) lbessard@121: self.Controler.AddEditedElementActionBlock(self.TagName, id) etisserant@0: self.RefreshActionBlockModel(actionblock) lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() lbessard@155: self.Refresh(False) 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): laurent@409: dialog = SFCDivergenceDialog(self.ParentWindow) lbessard@165: dialog.SetPreviewFont(self.GetFont()) lbessard@64: if dialog.ShowModal() == wx.ID_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() lbessard@64: wire.SetPoints([wx.Point(pos.x, pos.y + wire_size), wx.Point(pos.x, pos.y)]) lbessard@42: self.AddBlock(divergence) lbessard@121: self.Controler.AddEditedElementDivergence(self.TagName, 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) lbessard@64: wire.SetPoints([wx.Point(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wx.Point(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() lbessard@64: wire.SetPoints([wx.Point(pos.x, pos.y + wire_size), wx.Point(pos.x, pos.y)]) lbessard@42: self.AddBlock(divergence) lbessard@121: self.Controler.AddEditedElementDivergence(self.TagName, 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) lbessard@64: wire.SetPoints([wx.Point(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wx.Point(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) lbessard@64: wire.SetPoints([wx.Point(pos.x, pos.y + wire_size), wx.Point(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) lbessard@121: self.Controler.AddEditedElementDivergence(self.TagName, 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]) lbessard@64: wire.SetPoints([wx.Point(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wx.Point(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() lbessard@155: self.Refresh(False) etisserant@0: dialog.Destroy() etisserant@0: etisserant@0: def AddDivergenceBranch(self, divergence): etisserant@0: if isinstance(divergence, SFC_Divergence): lbessard@80: if self.GetDrawingMode() == FREEDRAWING_MODE: etisserant@0: divergence.AddBranch() lbessard@318: self.RefreshDivergenceModel(divergence) lbessard@80: else: lbessard@80: type = divergence.GetType() lbessard@80: if type in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]: lbessard@80: divergence.AddBranch() lbessard@80: divergence_connectors = divergence.GetConnectors() lbessard@80: if type == SELECTION_DIVERGENCE: lbessard@80: transition = self.CreateTransition(divergence_connectors["outputs"][-1]) lbessard@80: transition_connectors = transition.GetConnectors() lbessard@80: previous = transition_connectors["output"] lbessard@80: else: lbessard@80: previous = divergence_connectors["outputs"][-1] lbessard@80: step = self.CreateStep("Step", previous) lbessard@80: self.RefreshBuffer() lbessard@80: self.RefreshScrollBars() lbessard@155: self.Refresh(False) lbessard@80: lbessard@80: def RemoveDivergenceBranch(self, divergence): lbessard@80: if isinstance(divergence, SFC_Divergence): lbessard@80: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@80: divergence.RemoveHandledBranch() lbessard@318: self.RefreshDivergenceModel(divergence) lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() lbessard@155: self.Refresh(False) 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()) Laurent@720: dialog = wx.SingleChoiceDialog(self.ParentWindow, Laurent@720: _("Add a new jump"), _("Please choose a target"), Laurent@720: choices, wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL) lbessard@64: if dialog.ShowModal() == wx.ID_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) lbessard@121: self.Controler.AddEditedElementJump(self.TagName, id) etisserant@0: jump_connector = jump.GetConnector() etisserant@0: wire = self.ConnectConnectors(jump_connector, transition_connectors["output"]) etisserant@0: transition.RefreshOutputPosition() lbessard@64: wire.SetPoints([wx.Point(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wx.Point(pos.x, pos.y)]) etisserant@0: self.RefreshJumpModel(jump) lbessard@56: self.RefreshBuffer() lbessard@56: self.RefreshScrollBars() lbessard@155: self.Refresh(False) etisserant@0: dialog.Destroy() etisserant@0: etisserant@0: def EditStepContent(self, step): lbessard@71: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@71: Viewer.EditStepContent(self, step) lbessard@71: else: laurent@409: dialog = SFCStepNameDialog(self.ParentWindow, _("Edit step name"), _("Please enter step name"), step.GetName(), wx.OK|wx.CANCEL) lbessard@249: dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug)) lbessard@249: dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug)) lbessard@71: dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step) and block.GetName() != step.GetName()]) lbessard@71: if dialog.ShowModal() == wx.ID_OK: lbessard@71: value = dialog.GetValue() lbessard@71: step.SetName(value) lbessard@71: min_size = step.GetMinSize() lbessard@71: size = step.GetSize() lbessard@71: step.UpdateSize(max(min_size[0], size[0]), max(min_size[1], size[1])) lbessard@71: step.RefreshModel() lbessard@71: self.RefreshBuffer() lbessard@71: self.RefreshScrollBars() lbessard@155: self.Refresh(False) lbessard@71: dialog.Destroy() 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@64: wire.SetPoints([wx.Point(pos.x, pos.y + wire_size), wx.Point(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@121: self.Controler.RemoveEditedElementInstance(self.TagName, 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@80: 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@121: self.Controler.RemoveEditedElementInstance(self.TagName, 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@64: wire.SetPoints([wx.Point(previous_pos.x, previous_pos.y + wire_size), lbessard@64: wx.Point(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@121: self.Controler.RemoveEditedElementInstance(self.TagName, 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@64: wire.SetPoints([wx.Point(previous_pos.x, previous_pos.y + wire_size), lbessard@64: wx.Point(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@80: 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@121: self.Controler.RemoveEditedElementInstance(self.TagName, 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@80: 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@121: self.Controler.RemoveEditedElementInstance(self.TagName, actionblock.GetId()) lbessard@28: step.RemoveAction() lbessard@28: self.RefreshStepModel(step) lbessard@28: step.RefreshOutputPosition() lbessard@28: step.RefreshOutputModel(True) lbessard@80: etisserant@0: def DeleteWire(self, wire): lbessard@28: if self.GetDrawingMode() == FREEDRAWING_MODE: lbessard@28: Viewer.DeleteWire(self, wire) lbessard@122: lbessard@122: #------------------------------------------------------------------------------- lbessard@122: # Model update functions lbessard@122: #------------------------------------------------------------------------------- lbessard@122: lbessard@122: def RefreshBlockModel(self, block): lbessard@122: blockid = block.GetId() lbessard@122: infos = {} lbessard@122: infos["type"] = block.GetType() lbessard@122: infos["name"] = block.GetName() lbessard@122: infos["x"], infos["y"] = block.GetPosition() lbessard@122: infos["width"], infos["height"] = block.GetSize() lbessard@122: infos["connectors"] = block.GetConnectors() lbessard@122: self.Controler.SetEditedElementBlockInfos(self.TagName, blockid, infos) lbessard@122: