editors/SFCViewer.py
changeset 1730 64d8f52bc8c8
parent 1584 431f4ef34bde
child 1740 b789b695b5c6
equal deleted inserted replaced
1726:d51af006fa6b 1730:64d8f52bc8c8
    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),
    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)
   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:
   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():
   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):
   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"), _("Please choose a target"),
   771                   choices, wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
   771                   choices, wx.DEFAULT_DIALOG_STYLE|wx.OK|wx.CANCEL)
   772             if dialog.ShowModal() == wx.ID_OK:
   772             if dialog.ShowModal() == wx.ID_OK:
   773                 value = dialog.GetStringSelection()
   773                 value = dialog.GetStringSelection()
   774                 self.SelectedElement.AddOutput()
   774                 self.SelectedElement.AddOutput()
   775                 self.RefreshStepModel(self.SelectedElement)
   775                 self.RefreshStepModel(self.SelectedElement)
   882                             previous_block.RemoveBranch(previous)
   882                             previous_block.RemoveBranch(previous)
   883                             if previous_block.GetBranchNumber() < 2:
   883                             if previous_block.GetBranchNumber() < 2:
   884                                 self.DeleteDivergence(previous_block)
   884                                 self.DeleteDivergence(previous_block)
   885                             else:
   885                             else:
   886                                 self.RefreshDivergenceModel(previous_block)
   886                                 self.RefreshDivergenceModel(previous_block)
   887         
   887 
   888     def DeleteTransition(self, transition):
   888     def DeleteTransition(self, transition):
   889         if self.GetDrawingMode() == FREEDRAWING_MODE:
   889         if self.GetDrawingMode() == FREEDRAWING_MODE:
   890             Viewer.DeleteTransition(self, transition)
   890             Viewer.DeleteTransition(self, transition)
   891         else:
   891         else:
   892             previous = transition.GetPreviousConnector()
   892             previous = transition.GetPreviousConnector()
   917                 next_block.RemoveBranch(next)
   917                 next_block.RemoveBranch(next)
   918                 if next_block.GetBranchNumber() < 2:
   918                 if next_block.GetBranchNumber() < 2:
   919                     self.DeleteDivergence(next_block)
   919                     self.DeleteDivergence(next_block)
   920                 else:
   920                 else:
   921                     self.RefreshDivergenceModel(next_block)
   921                     self.RefreshDivergenceModel(next_block)
   922             
   922 
   923     def DeleteDivergence(self, divergence):
   923     def DeleteDivergence(self, divergence):
   924         if self.GetDrawingMode() == FREEDRAWING_MODE:
   924         if self.GetDrawingMode() == FREEDRAWING_MODE:
   925             Viewer.DeleteDivergence(self, divergence)
   925             Viewer.DeleteDivergence(self, divergence)
   926         else:
   926         else:
   927             connectors = divergence.GetConnectors()
   927             connectors = divergence.GetConnectors()
   977                     previous_block = previous.GetParentBlock()
   977                     previous_block = previous.GetParentBlock()
   978                     previous_pos = previous.GetPosition(False)
   978                     previous_pos = previous.GetPosition(False)
   979                     next_pos = next.GetPosition(False)
   979                     next_pos = next.GetPosition(False)
   980                     wire_size = GetWireSize(previous_block)
   980                     wire_size = GetWireSize(previous_block)
   981                     previous_block.RefreshOutputPosition((0, previous_pos.y + wire_size - next_pos.y))
   981                     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), 
   982                     wire.SetPoints([wx.Point(previous_pos.x, previous_pos.y + wire_size),
   983                         wx.Point(previous_pos.x, previous_pos.y)])
   983                         wx.Point(previous_pos.x, previous_pos.y)])
   984                     if isinstance(next_block, SFC_Divergence):
   984                     if isinstance(next_block, SFC_Divergence):
   985                         next_block.RefreshPosition()
   985                         next_block.RefreshPosition()
   986                     previous_block.RefreshOutputModel(True)
   986                     previous_block.RefreshOutputModel(True)
   987             elif divergence.GetBranchNumber() == 1:
   987             elif divergence.GetBranchNumber() == 1:
  1007                 wire = self.ConnectConnectors(next, previous)
  1007                 wire = self.ConnectConnectors(next, previous)
  1008                 previous_pos = previous.GetPosition(False)
  1008                 previous_pos = previous.GetPosition(False)
  1009                 next_pos = next.GetPosition(False)
  1009                 next_pos = next.GetPosition(False)
  1010                 wire_size = GetWireSize(previous_block)
  1010                 wire_size = GetWireSize(previous_block)
  1011                 previous_block.RefreshOutputPosition((previous_pos.x - next_pos.x, previous_pos.y + wire_size - next_pos.y))
  1011                 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), 
  1012                 wire.SetPoints([wx.Point(previous_pos.x, previous_pos.y + wire_size),
  1013                     wx.Point(previous_pos.x, previous_pos.y)])
  1013                     wx.Point(previous_pos.x, previous_pos.y)])
  1014                 if isinstance(next_block, SFC_Divergence):
  1014                 if isinstance(next_block, SFC_Divergence):
  1015                     next_block.RefreshPosition()
  1015                     next_block.RefreshPosition()
  1016                 previous_block.RefreshOutputModel(True)
  1016                 previous_block.RefreshOutputModel(True)
  1017             
  1017 
  1018     def DeleteJump(self, jump):
  1018     def DeleteJump(self, jump):
  1019         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1019         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1020             Viewer.DeleteJump(self, jump)
  1020             Viewer.DeleteJump(self, jump)
  1021         else:
  1021         else:
  1022             previous = jump.GetPreviousConnector()
  1022             previous = jump.GetPreviousConnector()
  1047                     previous_block.RemoveBranch(previous)
  1047                     previous_block.RemoveBranch(previous)
  1048                     if previous_block.GetBranchNumber() < 2:
  1048                     if previous_block.GetBranchNumber() < 2:
  1049                         self.DeleteDivergence(previous_block)
  1049                         self.DeleteDivergence(previous_block)
  1050                     else:
  1050                     else:
  1051                         previous_block.RefreshModel()
  1051                         previous_block.RefreshModel()
  1052             
  1052 
  1053     def DeleteActionBlock(self, actionblock):
  1053     def DeleteActionBlock(self, actionblock):
  1054         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1054         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1055             Viewer.DeleteActionBlock(self, actionblock)
  1055             Viewer.DeleteActionBlock(self, actionblock)
  1056         else:
  1056         else:
  1057             connector = actionblock.GetConnector()
  1057             connector = actionblock.GetConnector()
  1067             self.Controler.RemoveEditedElementInstance(self.TagName, actionblock.GetId())
  1067             self.Controler.RemoveEditedElementInstance(self.TagName, actionblock.GetId())
  1068             step.RemoveAction()
  1068             step.RemoveAction()
  1069             self.RefreshStepModel(step)
  1069             self.RefreshStepModel(step)
  1070             step.RefreshOutputPosition()
  1070             step.RefreshOutputPosition()
  1071             step.RefreshOutputModel(True)
  1071             step.RefreshOutputModel(True)
  1072             
  1072 
  1073     def DeleteWire(self, wire):
  1073     def DeleteWire(self, wire):
  1074         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1074         if self.GetDrawingMode() == FREEDRAWING_MODE:
  1075             Viewer.DeleteWire(self, wire)
  1075             Viewer.DeleteWire(self, wire)
  1076 
  1076 
  1077 #-------------------------------------------------------------------------------
  1077 #-------------------------------------------------------------------------------
  1085         infos["name"] = block.GetName()
  1085         infos["name"] = block.GetName()
  1086         infos["x"], infos["y"] = block.GetPosition()
  1086         infos["x"], infos["y"] = block.GetPosition()
  1087         infos["width"], infos["height"] = block.GetSize()
  1087         infos["width"], infos["height"] = block.GetSize()
  1088         infos["connectors"] = block.GetConnectors()
  1088         infos["connectors"] = block.GetConnectors()
  1089         self.Controler.SetEditedElementBlockInfos(self.TagName, blockid, infos)
  1089         self.Controler.SetEditedElementBlockInfos(self.TagName, blockid, infos)
  1090