editors/SFCViewer.py
changeset 1784 64beb9e9c749
parent 1782 5b6ad7a7fd9d
child 1828 396da88d7b5c
equal deleted inserted replaced
1729:31e63e25b4cc 1784:64beb9e9c749
    33 
    33 
    34 SFC_Objects = (SFC_Step, SFC_ActionBlock, SFC_Transition, SFC_Divergence, SFC_Jump)
    34 SFC_Objects = (SFC_Step, SFC_ActionBlock, SFC_Transition, SFC_Divergence, SFC_Jump)
    35 
    35 
    36 
    36 
    37 class SFC_Viewer(Viewer):
    37 class SFC_Viewer(Viewer):
    38     
    38 
    39     SFC_StandardRules = {
    39     SFC_StandardRules = {
    40         # The key of this dict is a block that user try to connect,
    40         # The key of this dict is a block that user try to connect,
    41         # and the value is a list of blocks, that can be connected with the current block
    41         # and the value is a list of blocks, that can be connected with the current block
    42         # and with directions of connection
    42         # and with directions of connection
    43         "SFC_Step": [("SFC_ActionBlock", EAST),
    43         "SFC_Step": [("SFC_ActionBlock", EAST),
    59                            ("LD_Coil", EAST)],
    59                            ("LD_Coil", EAST)],
    60 
    60 
    61         SELECTION_DIVERGENCE: [("SFC_Transition", SOUTH)],
    61         SELECTION_DIVERGENCE: [("SFC_Transition", SOUTH)],
    62 
    62 
    63         SELECTION_CONVERGENCE: [("SFC_Step", SOUTH),
    63         SELECTION_CONVERGENCE: [("SFC_Step", SOUTH),
    64                                   ("SFC_Jump", SOUTH)],
    64                                 ("SFC_Jump", SOUTH)],
    65 
    65 
    66         SIMULTANEOUS_DIVERGENCE: [("SFC_Step", SOUTH)],
    66         SIMULTANEOUS_DIVERGENCE: [("SFC_Step", SOUTH)],
    67 
    67 
    68         SIMULTANEOUS_CONVERGENCE: [("SFC_Transition", SOUTH)],
    68         SIMULTANEOUS_CONVERGENCE: [("SFC_Transition", SOUTH)],
    69 
    69 
    80         "LD_PowerRail": [("SFC_Transition", WEST)],
    80         "LD_PowerRail": [("SFC_Transition", WEST)],
    81 
    81 
    82         "LD_Coil": [("SFC_Transition", WEST)]
    82         "LD_Coil": [("SFC_Transition", WEST)]
    83     }
    83     }
    84 
    84 
    85     def __init__(self, parent, tagname, window, controler, debug = False, instancepath = ""):
    85     def __init__(self, parent, tagname, window, controler, debug=False, instancepath=""):
    86         Viewer.__init__(self, parent, tagname, window, controler, debug, instancepath)
    86         Viewer.__init__(self, parent, tagname, window, controler, debug, instancepath)
    87         self.CurrentLanguage = "SFC"
    87         self.CurrentLanguage = "SFC"
    88     
    88 
    89     def ConnectConnectors(self, start, end):
    89     def ConnectConnectors(self, start, end):
    90         startpoint = [start.GetPosition(False), start.GetDirection()]
    90         startpoint = [start.GetPosition(False), start.GetDirection()]
    91         endpoint = [end.GetPosition(False), end.GetDirection()]
    91         endpoint = [end.GetPosition(False), end.GetDirection()]
    92         wire = Wire(self, startpoint, endpoint)
    92         wire = Wire(self, startpoint, endpoint)
    93         self.AddWire(wire)
    93         self.AddWire(wire)
    94         start.Connect((wire, 0), False)
    94         start.Connect((wire, 0), False)
    95         end.Connect((wire, -1), False)
    95         end.Connect((wire, -1), False)
    96         wire.ConnectStartPoint(None, start)
    96         wire.ConnectStartPoint(None, start)
    97         wire.ConnectEndPoint(None, end)
    97         wire.ConnectEndPoint(None, end)
    98         return wire
    98         return wire
    99     
    99 
   100     def CreateTransition(self, connector, next = None):
   100     def CreateTransition(self, connector, next=None):
   101         previous = connector.GetParentBlock()
   101         previous = connector.GetParentBlock()
   102         id = self.GetNewId()
   102         id = self.GetNewId()
   103         transition = SFC_Transition(self, "reference", "", 0, id)
   103         transition = SFC_Transition(self, "reference", "", 0, id)
   104         pos = connector.GetPosition(False)
   104         pos = connector.GetPosition(False)
   105         transition.SetPosition(pos.x, pos.y + SFC_WIRE_MIN_SIZE)
   105         transition.SetPosition(pos.x, pos.y + SFC_WIRE_MIN_SIZE)
   122             wire.SetPoints([wx.Point(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wx.Point(pos.x, pos.y)])
   122             wire.SetPoints([wx.Point(pos.x, pos.y + SFC_WIRE_MIN_SIZE), wx.Point(pos.x, pos.y)])
   123             if isinstance(next_block, SFC_Divergence):
   123             if isinstance(next_block, SFC_Divergence):
   124                 next_block.RefreshPosition()
   124                 next_block.RefreshPosition()
   125             transition.RefreshOutputModel(True)
   125             transition.RefreshOutputModel(True)
   126         return transition
   126         return transition
   127     
   127 
   128     def RemoveTransition(self, transition):
   128     def RemoveTransition(self, transition):
   129         connectors = transition.GetConnectors()
   129         connectors = transition.GetConnectors()
   130         input_wires = connectors["input"].GetWires()
   130         input_wires = connectors["input"].GetWires()
   131         if len(input_wires) != 1:
   131         if len(input_wires) != 1:
   132             return
   132             return
   144         transition.Clean()
   144         transition.Clean()
   145         self.RemoveBlock(transition)
   145         self.RemoveBlock(transition)
   146         self.Controler.RemoveEditedElementInstance(self.TagName, transition.GetId())
   146         self.Controler.RemoveEditedElementInstance(self.TagName, transition.GetId())
   147         wire = self.ConnectConnectors(next, previous)
   147         wire = self.ConnectConnectors(next, previous)
   148         return wire
   148         return wire
   149     
   149 
   150     def CreateStep(self, name, connector, next = None):
   150     def CreateStep(self, name, connector, next=None):
   151         previous = connector.GetParentBlock()
   151         previous = connector.GetParentBlock()
   152         id = self.GetNewId()
   152         id = self.GetNewId()
   153         step = SFC_Step(self, name, False, id)
   153         step = SFC_Step(self, name, False, id)
   154         if next:
   154         if next:
   155             step.AddOutput()
   155             step.AddOutput()
   211             wire = self.ConnectConnectors(next, previous)
   211             wire = self.ConnectConnectors(next, previous)
   212             return wire
   212             return wire
   213         else:
   213         else:
   214             return None
   214             return None
   215 
   215 
   216 #-------------------------------------------------------------------------------
   216     # -------------------------------------------------------------------------------
   217 #                          Mouse event functions
   217     #                          Mouse event functions
   218 #-------------------------------------------------------------------------------
   218     # -------------------------------------------------------------------------------
   219 
   219 
   220     def OnViewerLeftDown(self, event):
   220     def OnViewerLeftDown(self, event):
   221         if self.GetDrawingMode() == FREEDRAWING_MODE:
   221         if self.GetDrawingMode() == FREEDRAWING_MODE:
   222             Viewer.OnViewerLeftDown(self, event)
   222             Viewer.OnViewerLeftDown(self, event)
   223         elif self.Mode == MODE_SELECTION:
   223         elif self.Mode == MODE_SELECTION:
   287             self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
   287             self.SelectedElement.OnMotion(event, self.GetLogicalDC(), self.Scaling)
   288             self.SelectedElement.GeneratePoints()
   288             self.SelectedElement.GeneratePoints()
   289             self.SelectedElement.RefreshModel()
   289             self.SelectedElement.RefreshModel()
   290             self.SelectedElement.SetSelected(True)
   290             self.SelectedElement.SetSelected(True)
   291         event.Skip()
   291         event.Skip()
   292     
   292 
   293     def OnViewerRightUp(self, event):
   293     def OnViewerRightUp(self, event):
   294         if self.GetDrawingMode() == FREEDRAWING_MODE:
   294         if self.GetDrawingMode() == FREEDRAWING_MODE:
   295             Viewer.OnViewerRightUp(self, event)
   295             Viewer.OnViewerRightUp(self, event)
   296         else:
   296         else:
   297             element = self.FindElement(event)
   297             element = self.FindElement(event)
   305                     self.SelectedElement.SetSelected(True)
   305                     self.SelectedElement.SetSelected(True)
   306                     self.SelectedElement.OnRightUp(event, self.GetLogicalDC(), self.Scaling)
   306                     self.SelectedElement.OnRightUp(event, self.GetLogicalDC(), self.Scaling)
   307                     self.SelectedElement.Refresh()
   307                     self.SelectedElement.Refresh()
   308                 wx.CallAfter(self.SetCurrentCursor, 0)
   308                 wx.CallAfter(self.SetCurrentCursor, 0)
   309         event.Skip()
   309         event.Skip()
   310     
   310 
   311     def OnViewerLeftDClick(self, event):
   311     def OnViewerLeftDClick(self, event):
   312         if self.GetDrawingMode() == FREEDRAWING_MODE:
   312         if self.GetDrawingMode() == FREEDRAWING_MODE:
   313             Viewer.OnViewerLeftDClick(self, event)
   313             Viewer.OnViewerLeftDClick(self, event)
   314         elif self.Mode == MODE_SELECTION and self.SelectedElement:
   314         elif self.Mode == MODE_SELECTION and self.SelectedElement:
   315             self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
   315             self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
   316             self.Refresh(False)
   316             self.Refresh(False)
   317         event.Skip()
   317         event.Skip()
   318     
   318 
   319     def OnViewerMotion(self, event):
   319     def OnViewerMotion(self, event):
   320         if self.GetDrawingMode() == FREEDRAWING_MODE:
   320         if self.GetDrawingMode() == FREEDRAWING_MODE:
   321             Viewer.OnViewerMotion(self, event)
   321             Viewer.OnViewerMotion(self, event)
   322         else:
   322         else:
   323             if self.rubberBand.IsShown():
   323             if self.rubberBand.IsShown():
   339         if blockName == "SFC_Divergence":
   339         if blockName == "SFC_Divergence":
   340             blockName = block.Type
   340             blockName = block.Type
   341         return blockName
   341         return blockName
   342 
   342 
   343     # This method check the IEC 61131-3 compatibility between two SFC blocks
   343     # This method check the IEC 61131-3 compatibility between two SFC blocks
   344     def BlockCompatibility(self,startblock = None, endblock = None, direction = None):
   344     def BlockCompatibility(self, startblock=None, endblock=None, direction=None):
   345         if startblock!= None and endblock != None and (isinstance(startblock,SFC_Objects)\
   345         if startblock is not None and endblock is not None and \
   346                                                                or isinstance(endblock,SFC_Objects)):
   346            (isinstance(startblock, SFC_Objects) or isinstance(endblock, SFC_Objects)):
   347             # Full "SFC_StandardRules" table would be symmetrical and
   347             # Full "SFC_StandardRules" table would be symmetrical and
   348             # to avoid duplicate records and minimize the table only upper part is defined.
   348             # to avoid duplicate records and minimize the table only upper part is defined.
   349             if (direction == SOUTH or direction == EAST):
   349             if (direction == SOUTH or direction == EAST):
   350                 startblock, endblock = endblock, startblock
   350                 startblock, endblock = endblock, startblock
   351             start = self.GetBlockName(startblock)
   351             start = self.GetBlockName(startblock)
   354                 if end in val:
   354                 if end in val:
   355                     return True
   355                     return True
   356             return False
   356             return False
   357         return True
   357         return True
   358 
   358 
   359 #-------------------------------------------------------------------------------
   359     # -------------------------------------------------------------------------------
   360 #                          Keyboard event functions
   360     #                          Keyboard event functions
   361 #-------------------------------------------------------------------------------
   361     # -------------------------------------------------------------------------------
   362 
   362 
   363     def OnChar(self, event):
   363     def OnChar(self, event):
   364         if self.GetDrawingMode() == FREEDRAWING_MODE:
   364         if self.GetDrawingMode() == FREEDRAWING_MODE:
   365             Viewer.OnChar(self, event)
   365             Viewer.OnChar(self, event)
   366         else:
   366         else:
   422                     self.RefreshBuffer()
   422                     self.RefreshBuffer()
   423                     self.RefreshScrollBars()
   423                     self.RefreshScrollBars()
   424                     self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, scaling[1])), False)
   424                     self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(0, scaling[1])), False)
   425             else:
   425             else:
   426                 event.Skip()
   426                 event.Skip()
   427         
   427 
   428 #-------------------------------------------------------------------------------
   428     # -------------------------------------------------------------------------------
   429 #                          Adding element functions
   429     #                          Adding element functions
   430 #-------------------------------------------------------------------------------
   430     # -------------------------------------------------------------------------------
   431 
   431 
   432     def AddInitialStep(self, pos):
   432     def AddInitialStep(self, pos):
   433         dialog = SFCStepNameDialog(self.ParentWindow, _("Please enter step name"), _("Add a new initial step"), "", wx.OK|wx.CANCEL)
   433         dialog = SFCStepNameDialog(self.ParentWindow, _("Please enter step name"), _("Add a new initial step"), "", wx.OK | wx.CANCEL)
   434         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
   434         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
   435         dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug))
   435         dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug))
   436         dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)])
   436         dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)])
   437         if dialog.ShowModal() == wx.ID_OK:
   437         if dialog.ShowModal() == wx.ID_OK:
   438             id = self.GetNewId()
   438             id = self.GetNewId()
   450             self.Refresh(False)
   450             self.Refresh(False)
   451         dialog.Destroy()
   451         dialog.Destroy()
   452 
   452 
   453     def AddStep(self):
   453     def AddStep(self):
   454         if self.SelectedElement in self.Wires or isinstance(self.SelectedElement, SFC_Step):
   454         if self.SelectedElement in self.Wires or isinstance(self.SelectedElement, SFC_Step):
   455             dialog = SFCStepNameDialog(self.ParentWindow, _("Add a new step"), _("Please enter step name"), "", wx.OK|wx.CANCEL)
   455             dialog = SFCStepNameDialog(self.ParentWindow, _("Add a new step"), _("Please enter step name"), "", wx.OK | wx.CANCEL)
   456             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
   456             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
   457             dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug))
   457             dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug))
   458             dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)])
   458             dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)])
   459             if dialog.ShowModal() == wx.ID_OK:
   459             if dialog.ShowModal() == wx.ID_OK:
   460                 name = dialog.GetValue()
   460                 name = dialog.GetValue()
   501                     self.SelectedElement.SetSelected(True)
   501                     self.SelectedElement.SetSelected(True)
   502                 self.RefreshBuffer()
   502                 self.RefreshBuffer()
   503                 self.RefreshScrollBars()
   503                 self.RefreshScrollBars()
   504                 self.Refresh(False)
   504                 self.Refresh(False)
   505             dialog.Destroy()
   505             dialog.Destroy()
   506     
   506 
   507     def AddStepAction(self):
   507     def AddStepAction(self):
   508         if isinstance(self.SelectedElement, SFC_Step):
   508         if isinstance(self.SelectedElement, SFC_Step):
   509             connectors = self.SelectedElement.GetConnectors()
   509             connectors = self.SelectedElement.GetConnectors()
   510             if not connectors["action"]:
   510             if not connectors["action"]:
   511                 dialog = ActionBlockDialog(self.ParentWindow)
   511                 dialog = ActionBlockDialog(self.ParentWindow)
   530                     self.RefreshActionBlockModel(actionblock)
   530                     self.RefreshActionBlockModel(actionblock)
   531                     self.RefreshBuffer()
   531                     self.RefreshBuffer()
   532                     self.RefreshScrollBars()
   532                     self.RefreshScrollBars()
   533                     self.Refresh(False)
   533                     self.Refresh(False)
   534                 dialog.Destroy()
   534                 dialog.Destroy()
   535     
   535 
   536     def AddDivergence(self):
   536     def AddDivergence(self):
   537         if self.SelectedElement in self.Wires or isinstance(self.SelectedElement, Graphic_Group) or isinstance(self.SelectedElement, SFC_Step):        
   537         if self.SelectedElement in self.Wires or isinstance(self.SelectedElement, Graphic_Group) or isinstance(self.SelectedElement, SFC_Step):
   538             dialog = SFCDivergenceDialog(self.ParentWindow)
   538             dialog = SFCDivergenceDialog(self.ParentWindow)
   539             dialog.SetPreviewFont(self.GetFont())
   539             dialog.SetPreviewFont(self.GetFont())
   540             if dialog.ShowModal() == wx.ID_OK:
   540             if dialog.ShowModal() == wx.ID_OK:
   541                 value = dialog.GetValues()
   541                 value = dialog.GetValues()
   542                 if value["type"] == SELECTION_DIVERGENCE:
   542                 if value["type"] == SELECTION_DIVERGENCE:
   727                         self.CreateStep("Step", previous)
   727                         self.CreateStep("Step", previous)
   728                 self.RefreshBuffer()
   728                 self.RefreshBuffer()
   729                 self.RefreshScrollBars()
   729                 self.RefreshScrollBars()
   730                 self.Refresh(False)
   730                 self.Refresh(False)
   731             dialog.Destroy()
   731             dialog.Destroy()
   732     
   732 
   733     def AddDivergenceBranch(self, divergence):
   733     def AddDivergenceBranch(self, divergence):
   734         if isinstance(divergence, SFC_Divergence):
   734         if isinstance(divergence, SFC_Divergence):
   735             if self.GetDrawingMode() == FREEDRAWING_MODE:
   735             if self.GetDrawingMode() == FREEDRAWING_MODE:
   736                 divergence.AddBranch()
   736                 divergence.AddBranch()
   737                 self.RefreshDivergenceModel(divergence)
   737                 self.RefreshDivergenceModel(divergence)
   748                         previous = divergence_connectors["outputs"][-1]
   748                         previous = divergence_connectors["outputs"][-1]
   749                     step = self.CreateStep("Step", previous)
   749                     step = self.CreateStep("Step", previous)
   750             self.RefreshBuffer()
   750             self.RefreshBuffer()
   751             self.RefreshScrollBars()
   751             self.RefreshScrollBars()
   752             self.Refresh(False)
   752             self.Refresh(False)
   753     
   753 
   754     def RemoveDivergenceBranch(self, divergence):
   754     def RemoveDivergenceBranch(self, divergence):
   755         if isinstance(divergence, SFC_Divergence):
   755         if isinstance(divergence, SFC_Divergence):
   756             if self.GetDrawingMode() == FREEDRAWING_MODE:
   756             if self.GetDrawingMode() == FREEDRAWING_MODE:
   757                 divergence.RemoveHandledBranch()
   757                 divergence.RemoveHandledBranch()
   758                 self.RefreshDivergenceModel(divergence)
   758                 self.RefreshDivergenceModel(divergence)
   759                 self.RefreshBuffer()
   759                 self.RefreshBuffer()
   760                 self.RefreshScrollBars()
   760                 self.RefreshScrollBars()
   761                 self.Refresh(False)
   761                 self.Refresh(False)
   762     
   762 
   763     def AddJump(self):
   763     def AddJump(self):
   764         if isinstance(self.SelectedElement, SFC_Step) and not self.SelectedElement.Output:
   764         if isinstance(self.SelectedElement, SFC_Step) and not self.SelectedElement.Output:
   765             choices = []
   765             choices = []
   766             for block in self.Blocks:
   766             for block in self.Blocks:
   767                 if isinstance(block, SFC_Step):
   767                 if isinstance(block, SFC_Step):
   768                     choices.append(block.GetName())
   768                     choices.append(block.GetName())
   769             dialog = wx.SingleChoiceDialog(self.ParentWindow, 
   769             dialog = wx.SingleChoiceDialog(self.ParentWindow,
   770                   _("Add a new jump"), _("Please choose a target"), 
   770                                            _("Add a new jump"),
   771                   choices, wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
   771                                            _("Please choose a target"),
       
   772                                            choices,
       
   773                                            wx.DEFAULT_DIALOG_STYLE | wx.OK | wx.CANCEL)
   772             if dialog.ShowModal() == wx.ID_OK:
   774             if dialog.ShowModal() == wx.ID_OK:
   773                 value = dialog.GetStringSelection()
   775                 value = dialog.GetStringSelection()
   774                 self.SelectedElement.AddOutput()
   776                 self.SelectedElement.AddOutput()
   775                 self.RefreshStepModel(self.SelectedElement)
   777                 self.RefreshStepModel(self.SelectedElement)
   776                 step_connectors = self.SelectedElement.GetConnectors()
   778                 step_connectors = self.SelectedElement.GetConnectors()
   794 
   796 
   795     def EditStepContent(self, step):
   797     def EditStepContent(self, step):
   796         if self.GetDrawingMode() == FREEDRAWING_MODE:
   798         if self.GetDrawingMode() == FREEDRAWING_MODE:
   797             Viewer.EditStepContent(self, step)
   799             Viewer.EditStepContent(self, step)
   798         else:
   800         else:
   799             dialog = SFCStepNameDialog(self.ParentWindow, _("Edit step name"), _("Please enter step name"), step.GetName(), wx.OK|wx.CANCEL)
   801             dialog = SFCStepNameDialog(self.ParentWindow, _("Edit step name"), _("Please enter step name"), step.GetName(), wx.OK | wx.CANCEL)
   800             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
   802             dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
   801             dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug))
   803             dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug))
   802             dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step) and block.GetName() != step.GetName()])
   804             dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step) and block.GetName() != step.GetName()])
   803             if dialog.ShowModal() == wx.ID_OK:
   805             if dialog.ShowModal() == wx.ID_OK:
   804                 value = dialog.GetValue()
   806                 value = dialog.GetValue()
   810                 self.RefreshBuffer()
   812                 self.RefreshBuffer()
   811                 self.RefreshScrollBars()
   813                 self.RefreshScrollBars()
   812                 self.Refresh(False)
   814                 self.Refresh(False)
   813             dialog.Destroy()
   815             dialog.Destroy()
   814 
   816 
   815 #-------------------------------------------------------------------------------
   817     # -------------------------------------------------------------------------------
   816 #                          Delete element functions
   818     #                          Delete element functions
   817 #-------------------------------------------------------------------------------
   819     # -------------------------------------------------------------------------------
   818 
   820 
   819     def DeleteStep(self, step):
   821     def DeleteStep(self, step):
   820         if self.GetDrawingMode() == FREEDRAWING_MODE:
   822         if self.GetDrawingMode() == FREEDRAWING_MODE:
   821             Viewer.DeleteStep(self, step)
   823             Viewer.DeleteStep(self, step)
   822         else:
   824         else:
   882                             previous_block.RemoveBranch(previous)
   884                             previous_block.RemoveBranch(previous)
   883                             if previous_block.GetBranchNumber() < 2:
   885                             if previous_block.GetBranchNumber() < 2:
   884                                 self.DeleteDivergence(previous_block)
   886                                 self.DeleteDivergence(previous_block)
   885                             else:
   887                             else:
   886                                 self.RefreshDivergenceModel(previous_block)
   888                                 self.RefreshDivergenceModel(previous_block)
   887         
   889 
   888     def DeleteTransition(self, transition):
   890     def DeleteTransition(self, transition):
   889         if self.GetDrawingMode() == FREEDRAWING_MODE:
   891         if self.GetDrawingMode() == FREEDRAWING_MODE:
   890             Viewer.DeleteTransition(self, transition)
   892             Viewer.DeleteTransition(self, transition)
   891         else:
   893         else:
   892             previous = transition.GetPreviousConnector()
   894             previous = transition.GetPreviousConnector()
   917                 next_block.RemoveBranch(next)
   919                 next_block.RemoveBranch(next)
   918                 if next_block.GetBranchNumber() < 2:
   920                 if next_block.GetBranchNumber() < 2:
   919                     self.DeleteDivergence(next_block)
   921                     self.DeleteDivergence(next_block)
   920                 else:
   922                 else:
   921                     self.RefreshDivergenceModel(next_block)
   923                     self.RefreshDivergenceModel(next_block)
   922             
   924 
   923     def DeleteDivergence(self, divergence):
   925     def DeleteDivergence(self, divergence):
   924         if self.GetDrawingMode() == FREEDRAWING_MODE:
   926         if self.GetDrawingMode() == FREEDRAWING_MODE:
   925             Viewer.DeleteDivergence(self, divergence)
   927             Viewer.DeleteDivergence(self, divergence)
   926         else:
   928         else:
   927             connectors = divergence.GetConnectors()
   929             connectors = divergence.GetConnectors()
   977                     previous_block = previous.GetParentBlock()
   979                     previous_block = previous.GetParentBlock()
   978                     previous_pos = previous.GetPosition(False)
   980                     previous_pos = previous.GetPosition(False)
   979                     next_pos = next.GetPosition(False)
   981                     next_pos = next.GetPosition(False)
   980                     wire_size = GetWireSize(previous_block)
   982                     wire_size = GetWireSize(previous_block)
   981                     previous_block.RefreshOutputPosition((0, previous_pos.y + wire_size - next_pos.y))
   983                     previous_block.RefreshOutputPosition((0, previous_pos.y + wire_size - next_pos.y))
   982                     wire.SetPoints([wx.Point(previous_pos.x, previous_pos.y + wire_size), 
   984                     wire.SetPoints([wx.Point(previous_pos.x, previous_pos.y + wire_size),
   983                         wx.Point(previous_pos.x, previous_pos.y)])
   985                                     wx.Point(previous_pos.x, previous_pos.y)])
   984                     if isinstance(next_block, SFC_Divergence):
   986                     if isinstance(next_block, SFC_Divergence):
   985                         next_block.RefreshPosition()
   987                         next_block.RefreshPosition()
   986                     previous_block.RefreshOutputModel(True)
   988                     previous_block.RefreshOutputModel(True)
   987             elif divergence.GetBranchNumber() == 1:
   989             elif divergence.GetBranchNumber() == 1:
   988                 wires = connectors["inputs"][0].GetWires()
   990                 wires = connectors["inputs"][0].GetWires()
  1007                 wire = self.ConnectConnectors(next, previous)
  1009                 wire = self.ConnectConnectors(next, previous)
  1008                 previous_pos = previous.GetPosition(False)
  1010                 previous_pos = previous.GetPosition(False)
  1009                 next_pos = next.GetPosition(False)
  1011                 next_pos = next.GetPosition(False)
  1010                 wire_size = GetWireSize(previous_block)
  1012                 wire_size = GetWireSize(previous_block)
  1011                 previous_block.RefreshOutputPosition((previous_pos.x - next_pos.x, previous_pos.y + wire_size - next_pos.y))
  1013                 previous_block.RefreshOutputPosition((previous_pos.x - next_pos.x, previous_pos.y + wire_size - next_pos.y))
  1012                 wire.SetPoints([wx.Point(previous_pos.x, previous_pos.y + wire_size), 
  1014                 wire.SetPoints([wx.Point(previous_pos.x, previous_pos.y + wire_size),
  1013                     wx.Point(previous_pos.x, previous_pos.y)])
  1015                                 wx.Point(previous_pos.x, previous_pos.y)])
  1014                 if isinstance(next_block, SFC_Divergence):
  1016                 if isinstance(next_block, SFC_Divergence):
  1015                     next_block.RefreshPosition()
  1017                     next_block.RefreshPosition()
  1016                 previous_block.RefreshOutputModel(True)
  1018                 previous_block.RefreshOutputModel(True)
  1017             
  1019 
  1018     def DeleteJump(self, jump):
  1020     def DeleteJump(self, jump):
  1019         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1021         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1020             Viewer.DeleteJump(self, jump)
  1022             Viewer.DeleteJump(self, jump)
  1021         else:
  1023         else:
  1022             previous = jump.GetPreviousConnector()
  1024             previous = jump.GetPreviousConnector()
  1047                     previous_block.RemoveBranch(previous)
  1049                     previous_block.RemoveBranch(previous)
  1048                     if previous_block.GetBranchNumber() < 2:
  1050                     if previous_block.GetBranchNumber() < 2:
  1049                         self.DeleteDivergence(previous_block)
  1051                         self.DeleteDivergence(previous_block)
  1050                     else:
  1052                     else:
  1051                         previous_block.RefreshModel()
  1053                         previous_block.RefreshModel()
  1052             
  1054 
  1053     def DeleteActionBlock(self, actionblock):
  1055     def DeleteActionBlock(self, actionblock):
  1054         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1056         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1055             Viewer.DeleteActionBlock(self, actionblock)
  1057             Viewer.DeleteActionBlock(self, actionblock)
  1056         else:
  1058         else:
  1057             connector = actionblock.GetConnector()
  1059             connector = actionblock.GetConnector()
  1067             self.Controler.RemoveEditedElementInstance(self.TagName, actionblock.GetId())
  1069             self.Controler.RemoveEditedElementInstance(self.TagName, actionblock.GetId())
  1068             step.RemoveAction()
  1070             step.RemoveAction()
  1069             self.RefreshStepModel(step)
  1071             self.RefreshStepModel(step)
  1070             step.RefreshOutputPosition()
  1072             step.RefreshOutputPosition()
  1071             step.RefreshOutputModel(True)
  1073             step.RefreshOutputModel(True)
  1072             
  1074 
  1073     def DeleteWire(self, wire):
  1075     def DeleteWire(self, wire):
  1074         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1076         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1075             Viewer.DeleteWire(self, wire)
  1077             Viewer.DeleteWire(self, wire)
  1076 
  1078 
  1077 #-------------------------------------------------------------------------------
  1079     # -------------------------------------------------------------------------------
  1078 #                          Model update functions
  1080     #                          Model update functions
  1079 #-------------------------------------------------------------------------------
  1081     # -------------------------------------------------------------------------------
  1080 
  1082 
  1081     def RefreshBlockModel(self, block):
  1083     def RefreshBlockModel(self, block):
  1082         blockid = block.GetId()
  1084         blockid = block.GetId()
  1083         infos = {}
  1085         infos = {}
  1084         infos["type"] = block.GetType()
  1086         infos["type"] = block.GetType()
  1085         infos["name"] = block.GetName()
  1087         infos["name"] = block.GetName()
  1086         infos["x"], infos["y"] = block.GetPosition()
  1088         infos["x"], infos["y"] = block.GetPosition()
  1087         infos["width"], infos["height"] = block.GetSize()
  1089         infos["width"], infos["height"] = block.GetSize()
  1088         infos["connectors"] = block.GetConnectors()
  1090         infos["connectors"] = block.GetConnectors()
  1089         self.Controler.SetEditedElementBlockInfos(self.TagName, blockid, infos)
  1091         self.Controler.SetEditedElementBlockInfos(self.TagName, blockid, infos)
  1090