Viewer.py
changeset 383 25ffba02b6a8
parent 381 98890d848701
child 384 ed27a676d5c9
equal deleted inserted replaced
382:42a9b03bba82 383:25ffba02b6a8
    73               'other': 'new century schoolbook',
    73               'other': 'new century schoolbook',
    74               'size' : 20,
    74               'size' : 20,
    75              }
    75              }
    76 
    76 
    77 ZOOM_FACTORS = [math.sqrt(2) ** x for x in xrange(-6, 7)]
    77 ZOOM_FACTORS = [math.sqrt(2) ** x for x in xrange(-6, 7)]
       
    78 
       
    79 
       
    80 def GetVariableCreationFunction(variable_type):
       
    81     def variableCreationFunction(viewer, id, specific_values):
       
    82         return FBD_Variable(viewer, variable_type, 
       
    83                                     specific_values["name"], 
       
    84                                     specific_values["value_type"], 
       
    85                                     id,
       
    86                                     specific_values["executionOrder"])
       
    87     return variableCreationFunction
       
    88 
       
    89 def GetConnectorCreationFunction(connector_type):
       
    90     def connectorCreationFunction(viewer, id, specific_values):
       
    91         return FBD_Connector(viewer, connector_type, 
       
    92                                      specific_values["name"], id)
       
    93     return connectorCreationFunction
       
    94 
       
    95 def commentCreationFunction(viewer, id, specific_values):
       
    96     return Comment(viewer, specific_values["content"], id)
       
    97 
       
    98 def GetPowerRailCreationFunction(powerrail_type):
       
    99     def powerRailCreationFunction(viewer, id, specific_values):
       
   100         return LD_PowerRail(viewer, powerrail_type, id, 
       
   101                                     specific_values["connectors"])
       
   102     return powerRailCreationFunction
       
   103 
       
   104 CONTACT_TYPES = {(True, "none"): CONTACT_REVERSE,
       
   105                  (False, "rising"): CONTACT_RISING,
       
   106                  (False, "falling"): CONTACT_FALLING}
       
   107 
       
   108 def contactCreationFunction(viewer, id, specific_values):
       
   109     contact_type = CONTACT_TYPES.get((specific_values.get("negated", False), 
       
   110                                       specific_values.get("edge", "none")),
       
   111                                      CONTACT_NORMAL)
       
   112     return LD_Contact(viewer, contact_type, specific_values["name"], id)
       
   113 
       
   114 COIL_TYPES = {(True, "none", "none"): COIL_REVERSE,
       
   115               (False, "none", "set"): COIL_SET,
       
   116               (False, "none", "reset"): COIL_RESET,
       
   117               (False, "rising", "none"): COIL_RISING,
       
   118               (False, "falling", "none"): COIL_FALLING}
       
   119 
       
   120 def coilCreationFunction(viewer, id, specific_values):
       
   121     coil_type = COIL_TYPES.get((specific_values.get("negated", False), 
       
   122                                 specific_values.get("edge", "none"),
       
   123                                 specific_values.get("storage", "none")),
       
   124                                COIL_NORMAL)
       
   125     return LD_Coil(viewer, coil_type, specific_values["name"], id)
       
   126 
       
   127 def stepCreationFunction(viewer, id, specific_values):
       
   128     step = SFC_Step(viewer, specific_values["name"], 
       
   129                             specific_values.get("initial", False), id)
       
   130     if specific_values.get("action", None):
       
   131         step.AddAction()
       
   132         connector = step.GetActionConnector()
       
   133         connector.SetPosition(wx.Point(*specific_values["action"]["position"]))
       
   134     return step
       
   135 
       
   136 def transitionCreationFunction(viewer, id, specific_values):
       
   137     transition = SFC_Transition(viewer, specific_values["condition_type"], 
       
   138                                         specific_values.get("condition", None), 
       
   139                                         specific_values["priority"], id)
       
   140     return transition
       
   141 
       
   142 def GetDivergenceCreationFunction(divergence_type):
       
   143     def divergenceCreationFunction(viewer, id, specific_values):
       
   144         return SFC_Divergence(viewer, divergence_type, 
       
   145                                       specific_values["connectors"], id)
       
   146     return divergenceCreationFunction
       
   147 
       
   148 def jumpCreationFunction(viewer, id, specific_values):
       
   149     return SFC_Jump(viewer, specific_values["target"], id)
       
   150 
       
   151 def actionBlockCreationFunction(viewer, id, specific_values):
       
   152     return SFC_ActionBlock(viewer, specific_values["actions"], id)
       
   153 
       
   154 ElementCreationFunctions = {
       
   155     "input": GetVariableCreationFunction(INPUT),
       
   156     "output": GetVariableCreationFunction(OUTPUT),
       
   157     "inout": GetVariableCreationFunction(INOUT),
       
   158     "connector": GetConnectorCreationFunction(CONNECTOR),
       
   159     "continuation": GetConnectorCreationFunction(CONTINUATION),
       
   160     "comment": commentCreationFunction,
       
   161     "leftPowerRail": GetPowerRailCreationFunction(LEFTRAIL),
       
   162     "rightPowerRail": GetPowerRailCreationFunction(RIGHTRAIL),
       
   163     "contact": contactCreationFunction,
       
   164     "coil": coilCreationFunction,
       
   165     "step": stepCreationFunction, 
       
   166     "transition": transitionCreationFunction,
       
   167     "selectionDivergence": GetDivergenceCreationFunction(SELECTION_DIVERGENCE), 
       
   168     "selectionConvergence": GetDivergenceCreationFunction(SELECTION_CONVERGENCE), 
       
   169     "simultaneousDivergence": GetDivergenceCreationFunction(SIMULTANEOUS_DIVERGENCE), 
       
   170     "simultaneousConvergence": GetDivergenceCreationFunction(SIMULTANEOUS_CONVERGENCE), 
       
   171     "jump": jumpCreationFunction,
       
   172     "actionBlock": actionBlockCreationFunction,
       
   173 }
    78 
   174 
    79 #-------------------------------------------------------------------------------
   175 #-------------------------------------------------------------------------------
    80 #                       Graphic elements Viewer base class
   176 #                       Graphic elements Viewer base class
    81 #-------------------------------------------------------------------------------
   177 #-------------------------------------------------------------------------------
    82 
   178 
   379         # Initialize Cursors
   475         # Initialize Cursors
   380         ResetCursors()
   476         ResetCursors()
   381         self.CurrentCursor = 0
   477         self.CurrentCursor = 0
   382         
   478         
   383         # Initialize Block, Wire and Comment numbers
   479         # Initialize Block, Wire and Comment numbers
   384         self.block_id = self.wire_id = self.comment_id = 0
   480         self.wire_id = 0
   385         
   481         
   386         # Initialize Viewer mode to Selection mode
   482         # Initialize Viewer mode to Selection mode
   387         self.Mode = MODE_SELECTION
   483         self.Mode = MODE_SELECTION
   388         self.SavedMode = False
   484         self.SavedMode = False
   389         self.CurrentLanguage = "FBD"
   485         self.CurrentLanguage = "FBD"
   503 #-------------------------------------------------------------------------------
   599 #-------------------------------------------------------------------------------
   504 #                         Element management functions
   600 #                         Element management functions
   505 #-------------------------------------------------------------------------------
   601 #-------------------------------------------------------------------------------
   506 
   602 
   507     def AddBlock(self, block):
   603     def AddBlock(self, block):
   508         self.block_id += 1
   604         self.Blocks[block.GetId()] = block
   509         self.Blocks[block] = self.block_id
       
   510         
   605         
   511     def AddWire(self, wire):
   606     def AddWire(self, wire):
   512         self.wire_id += 1
   607         self.wire_id += 1
   513         self.Wires[wire] = self.wire_id
   608         self.Wires[wire] = self.wire_id
   514         
   609         
   515     def AddComment(self, comment):
   610     def AddComment(self, comment):
   516         self.comment_id += 1
   611         self.Comments[comment.GetId()] = comment
   517         self.Comments[comment] = self.comment_id
       
   518 
   612 
   519     def IsBlock(self, block):
   613     def IsBlock(self, block):
   520         return self.Blocks.get(block, False)
   614         return self.Blocks.get(block.GetId(), False)
   521         
   615         
   522     def IsWire(self, wire):
   616     def IsWire(self, wire):
   523         return self.Wires.get(wire, False)
   617         return self.Wires.get(wire, False)
   524         
   618         
   525     def IsComment(self, comment):
   619     def IsComment(self, comment):
   526         return self.Comments.get(comment, False)
   620         return self.Comments.get(comment.GetId(), False)
   527 
   621 
   528     def RemoveBlock(self, block):
   622     def RemoveBlock(self, block):
   529         self.Blocks.pop(block)
   623         self.Blocks.pop(block.GetId())
   530         
   624         
   531     def RemoveWire(self, wire):
   625     def RemoveWire(self, wire):
   532         self.Wires.pop(wire)
   626         self.Wires.pop(wire)
   533         
   627         
   534     def RemoveComment(self, comment):
   628     def RemoveComment(self, comment):
   535         self.Comments.pop(comment)
   629         self.Comments.pop(comment.GetId())
   536 
   630 
   537     def GetElements(self, sort_blocks=False, sort_wires=False, sort_comments=False):
   631     def GetElements(self, sort_blocks=False, sort_wires=False, sort_comments=False):
   538         blocks = self.Blocks.keys()
   632         blocks = self.Blocks.values()
   539         wires = self.Wires.keys()
   633         wires = self.Wires.keys()
   540         comments = self.Comments.keys()
   634         comments = self.Comments.values()
   541         if sort_blocks:
   635         if sort_blocks:
   542             blocks.sort(lambda x, y: cmp(self.Blocks[x], self.Blocks[y]))
   636             blocks.sort(lambda x, y: cmp(x.GetId(), y.GetId()))
   543         if sort_wires:
   637         if sort_wires:
   544             wires.sort(lambda x, y: cmp(self.Wires[x], self.Wires[y]))
   638             wires.sort(lambda x, y: cmp(self.Wires[x], self.Wires[y]))
   545         if sort_comments:
   639         if sort_comments:
   546             comments.sort(lambda x, y: cmp(self.Comments[x], self.Comments[y]))
   640             comments.sort(lambda x, y: cmp(x.GetId(), y.GetId()))
   547         return blocks + wires + comments
   641         return blocks + wires + comments
   548 
   642 
   549     def RefreshVisibleElements(self, xp = None, yp = None):
   643     def RefreshVisibleElements(self, xp = None, yp = None):
   550         x, y = self.CalcUnscrolledPosition(0, 0)
   644         x, y = self.CalcUnscrolledPosition(0, 0)
   551         if xp is not None:
   645         if xp is not None:
   553         if yp is not None:
   647         if yp is not None:
   554             y = yp * self.GetScrollPixelsPerUnit()[1]
   648             y = yp * self.GetScrollPixelsPerUnit()[1]
   555         width, height = self.GetClientSize()
   649         width, height = self.GetClientSize()
   556         screen = wx.Rect(int(x / self.ViewScale[0]), int(y / self.ViewScale[1]),
   650         screen = wx.Rect(int(x / self.ViewScale[0]), int(y / self.ViewScale[1]),
   557                          int(width / self.ViewScale[0]), int(height / self.ViewScale[1]))
   651                          int(width / self.ViewScale[0]), int(height / self.ViewScale[1]))
   558         for comment in self.Comments:
   652         for comment in self.Comments.itervalues():
   559             comment.TestVisible(screen)
   653             comment.TestVisible(screen)
   560         for wire in self.Wires:
   654         for wire in self.Wires.iterkeys():
   561             wire.TestVisible(screen)
   655             wire.TestVisible(screen)
   562         for block in self.Blocks:
   656         for block in self.Blocks.itervalues():
   563             block.TestVisible(screen)
   657             block.TestVisible(screen)
   564     
   658     
   565     def GetElementIECPath(self, element):
   659     def GetElementIECPath(self, element):
   566         iec_path = None
   660         iec_path = None
   567         if isinstance(element, Wire) and element.EndConnected is not None:
   661         if isinstance(element, Wire) and element.EndConnected is not None:
   602         self.SelectedElement = None
   696         self.SelectedElement = None
   603         self.HighlightedElement = None
   697         self.HighlightedElement = None
   604     
   698     
   605     def Flush(self):
   699     def Flush(self):
   606         self.DeleteDataConsumers()
   700         self.DeleteDataConsumers()
   607         for block in self.Blocks:
   701         for block in self.Blocks.itervalues():
   608             block.Flush()
   702             block.Flush()
   609     
   703     
   610     # Remove all elements
   704     # Remove all elements
   611     def CleanView(self):
   705     def CleanView(self):
   612         for block in self.Blocks.keys():
   706         for block in self.Blocks.itervalues():
   613             block.Clean()
   707             block.Clean()
   614         self.ResetView()
   708         self.ResetView()
   615     
   709     
   616     # Changes Viewer mode
   710     # Changes Viewer mode
   617     def SetMode(self, mode):
   711     def SetMode(self, mode):
   687         
   781         
   688     def ResetBuffer(self):
   782     def ResetBuffer(self):
   689         pass
   783         pass
   690 
   784 
   691     # Refresh Viewer elements
   785     # Refresh Viewer elements
   692     def RefreshView(self):
   786     def RefreshView(self, selection=None):
   693         self.Inhibit(True)
   787         self.Inhibit(True)
   694         self.current_id = 0
   788         self.current_id = 0
   695         # Start by reseting Viewer
   789         # Start by reseting Viewer
   696         self.Flush()
   790         self.Flush()
   697         self.ResetView()
   791         self.ResetView()
   700         ids = []
   794         ids = []
   701         # Load Blocks until they are all loaded
   795         # Load Blocks until they are all loaded
   702         while instance is not None:
   796         while instance is not None:
   703             instance = self.Controler.GetEditedElementInstanceInfos(self.TagName, exclude = ids, debug = self.Debug)
   797             instance = self.Controler.GetEditedElementInstanceInfos(self.TagName, exclude = ids, debug = self.Debug)
   704             if instance is not None:
   798             if instance is not None:
   705                 self.loadInstance(instance, ids)
   799                 self.loadInstance(instance, ids, selection)
   706         self.RefreshScrollBars()
   800         self.RefreshScrollBars()
   707         
   801         
   708         for wire in self.Wires:
   802         for wire in self.Wires:
   709             if not wire.IsConnectedCompatible():
   803             if not wire.IsConnectedCompatible():
   710                 wire.SetValid(False)
   804                 wire.SetValid(False)
   711             if self.Debug:
   805             if self.Debug:
   712                 block = wire.EndConnected.GetParentBlock()
   806                 iec_path = self.GetElementIECPath(wire)
   713                 if isinstance(block, LD_PowerRail):
   807                 if self.AddDataConsumer(iec_path.upper(), wire) is None:
   714                     wire.SetValue(True)
       
   715                 if isinstance(block, FBD_Block):
       
   716                     blockname = block.GetName()
       
   717                     connectorname = wire.EndConnected.GetName()
       
   718                     if blockname != "":
       
   719                         iec_path = "%s.%s.%s"%(self.InstancePath, blockname, connectorname)
       
   720                     else:
       
   721                         if connectorname == "":
       
   722                             iec_path = "%s.%s%d"%(self.InstancePath, block.GetType(), block.GetId())
       
   723                         else:
       
   724                             iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname)
       
   725                     if self.AddDataConsumer(iec_path.upper(), wire) is None:
       
   726                         wire.SetValue("undefined")
       
   727                 elif isinstance(block, FBD_Variable):
       
   728                     iec_path = "%s.%s"%(self.InstancePath, block.GetName())
       
   729                     if self.AddDataConsumer(iec_path.upper(), wire) is None:
       
   730                         wire.SetValue("undefined")
       
   731                 elif isinstance(block, FBD_Connector):
       
   732                     wire.SetValue("undefined")
   808                     wire.SetValue("undefined")
   733 
   809 
   734         if self.Debug:
   810         if self.Debug:
   735             for block in self.Blocks.keys():
   811             for block in self.Blocks.itervalues():
   736                 block.SpreadCurrent()
   812                 block.SpreadCurrent()
   737                 iec_path = self.GetElementIECPath(block)
   813                 iec_path = self.GetElementIECPath(block)
   738                 if iec_path is not None:
   814                 if iec_path is not None:
   739                     self.AddDataConsumer(iec_path.upper(), block)
   815                     self.AddDataConsumer(iec_path.upper(), block)
   740 
   816 
   790         maxx = int(maxx * self.ViewScale[0])
   866         maxx = int(maxx * self.ViewScale[0])
   791         maxy = int(maxy * self.ViewScale[1])
   867         maxy = int(maxy * self.ViewScale[1])
   792         self.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, 
   868         self.SetScrollbars(SCROLLBAR_UNIT, SCROLLBAR_UNIT, 
   793             round(maxx / SCROLLBAR_UNIT) + width_incr, round(maxy / SCROLLBAR_UNIT) + height_incr, 
   869             round(maxx / SCROLLBAR_UNIT) + width_incr, round(maxy / SCROLLBAR_UNIT) + height_incr, 
   794             xstart, ystart, True)
   870             xstart, ystart, True)
       
   871     
       
   872     def SelectInGroup(self, element):
       
   873         element.SetSelected(True)
       
   874         if self.SelectedElement is None:
       
   875             self.SelectedElement = element
       
   876         elif isinstance(self.SelectedElement, Graphic_Group):
       
   877             self.SelectedElement.SelectElement(element)
       
   878         else:
       
   879             group = Graphic_Group(self)
       
   880             group.SelectElement(self.SelectedElement)
       
   881             group.SelectElement(element)
       
   882             self.SelectedElement = group
   795         
   883         
   796     # Load instance from given informations
   884     # Load instance from given informations
   797     def loadInstance(self, instance, ids):
   885     def loadInstance(self, instance, ids, selection):
   798         ids.append(instance["id"])
   886         ids.append(instance["id"])
   799         self.current_id = max(self.current_id, instance["id"]) 
   887         self.current_id = max(self.current_id, instance["id"])
   800         if instance["type"] == "input":
   888         creation_function = ElementCreationFunctions.get(instance["type"], None)
   801             variable = FBD_Variable(self, INPUT, instance["name"], instance["value_type"], instance["id"], instance["executionOrder"])
   889         connectors = {"inputs" : [], "outputs" : []}
   802             variable.SetPosition(instance["x"], instance["y"])
   890         specific_values = instance["specific_values"]
   803             variable.SetSize(instance["width"], instance["height"])
   891         if creation_function is not None:
   804             self.AddBlock(variable)
   892             element = creation_function(self, instance["id"], specific_values)
   805             connectors = variable.GetConnectors()
   893             if isinstance(element, SFC_Step):
   806             connectors["output"].SetPosition(wx.Point(*instance["connector"]["position"]))
   894                 if len(instance["inputs"]) > 0:
   807             if instance["connector"]["negated"]:
   895                     element.AddInput()
   808                 connectors["output"].SetNegated(True)
   896                 if len(instance["outputs"]) > 0:
   809             if instance["connector"]["edge"]:
   897                     element.AddOutput()
   810                 connectors["output"].SetEdge(instance["connector"]["edge"])
   898             if isinstance(element, SFC_Transition) and specific_values["condition_type"] == "connection":
   811         elif instance["type"] == "output":
   899                 connector = element.GetConditionConnector()
   812             variable = FBD_Variable(self, OUTPUT, instance["name"], instance["value_type"], instance["id"], instance["executionOrder"])
   900                 self.CreateWires(connector, id, specific_values["connection"]["links"], ids, selection)
   813             variable.SetPosition(instance["x"], instance["y"])
       
   814             variable.SetSize(instance["width"], instance["height"])
       
   815             self.AddBlock(variable)
       
   816             connectors = variable.GetConnectors()
       
   817             connectors["input"].SetPosition(wx.Point(*instance["connector"]["position"]))
       
   818             if instance["connector"]["negated"]:
       
   819                 connectors["input"].SetNegated(True)
       
   820             if instance["connector"]["edge"]:
       
   821                 connectors["input"].SetEdge(instance["connector"]["edge"])
       
   822             self.CreateWires(connectors["input"], instance["connector"]["links"], ids)
       
   823         elif instance["type"] == "inout":
       
   824             variable = FBD_Variable(self, INOUT, instance["name"], instance["value_type"], instance["id"], instance["executionOrder"])
       
   825             variable.SetPosition(instance["x"], instance["y"])
       
   826             variable.SetSize(instance["width"], instance["height"])
       
   827             self.AddBlock(variable)
       
   828             connectors = variable.GetConnectors()
       
   829             connectors["output"].SetPosition(wx.Point(*instance["connectors"]["output"]["position"]))
       
   830             connectors["input"].SetPosition(wx.Point(*instance["connectors"]["input"]["position"]))
       
   831             if instance["connectors"]["output"]["negated"]:
       
   832                 connectors["output"].SetNegated(True)
       
   833             if instance["connectors"]["output"]["edge"]:
       
   834                 connectors["output"].SetEdge(instance["connectors"]["output"]["edge"])
       
   835             if instance["connectors"]["input"]["negated"]:
       
   836                 connectors["input"].SetNegated(True)
       
   837             if instance["connectors"]["input"]["edge"]:
       
   838                 connectors["input"].SetEdge(instance["connectors"]["input"]["edge"])
       
   839             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
       
   840         elif instance["type"] == "continuation":
       
   841             connection = FBD_Connector(self, CONTINUATION, instance["name"], instance["id"])
       
   842             connection.SetPosition(instance["x"], instance["y"])
       
   843             connection.SetSize(instance["width"], instance["height"])
       
   844             self.AddBlock(connection)
       
   845             connector = connection.GetConnector()
       
   846             connector.SetPosition(wx.Point(*instance["connector"]["position"]))
       
   847         elif instance["type"] == "connection":
       
   848             connection = FBD_Connector(self, CONNECTOR, instance["name"], instance["id"])
       
   849             connection.SetPosition(instance["x"], instance["y"])
       
   850             connection.SetSize(instance["width"], instance["height"])
       
   851             self.AddBlock(connection)
       
   852             connector = connection.GetConnector()
       
   853             connector.SetPosition(wx.Point(*instance["connector"]["position"]))
       
   854             self.CreateWires(connector, instance["connector"]["links"], ids)
       
   855         elif instance["type"] == "comment":
       
   856             comment = Comment(self, instance["content"], instance["id"])
       
   857             comment.SetPosition(instance["x"], instance["y"])
       
   858             comment.SetSize(instance["width"], instance["height"])
       
   859             self.AddComment(comment)
       
   860         elif instance["type"] == "leftPowerRail":
       
   861             leftpowerrail = LD_PowerRail(self, LEFTRAIL, instance["id"], [True for i in range(len(instance["connectors"]))])
       
   862             leftpowerrail.SetPosition(instance["x"], instance["y"])
       
   863             leftpowerrail.SetSize(instance["width"], instance["height"])
       
   864             self.AddBlock(leftpowerrail)
       
   865             connectors = leftpowerrail.GetConnectors()
       
   866             for i, connector in enumerate(instance["connectors"]):
       
   867                 connectors[i].SetPosition(wx.Point(*connector["position"]))
       
   868         elif instance["type"] == "rightPowerRail":
       
   869             rightpowerrail = LD_PowerRail(self, RIGHTRAIL, instance["id"], [True for i in range(len(instance["connectors"]))])
       
   870             rightpowerrail.SetPosition(instance["x"], instance["y"])
       
   871             rightpowerrail.SetSize(instance["width"], instance["height"])
       
   872             self.AddBlock(rightpowerrail)
       
   873             connectors = rightpowerrail.GetConnectors()
       
   874             for i, connector in enumerate(instance["connectors"]):
       
   875                 connectors[i].SetPosition(wx.Point(*connector["position"]))
       
   876                 self.CreateWires(connectors[i], connector["links"], ids)
       
   877         elif instance["type"] == "contact":
       
   878             if instance["negated"]:
       
   879                 negated = instance["negated"]
       
   880             else:
       
   881                 negated = False
       
   882             if instance["edge"]:
       
   883                 edge = instance["edge"]
       
   884             else:
       
   885                 edge = "none"
       
   886             if negated and edge == "none":
       
   887                 contact_type = CONTACT_REVERSE
       
   888             elif not negated and edge == "rising":
       
   889                 contact_type = CONTACT_RISING
       
   890             elif not negated and edge == "falling":
       
   891                 contact_type = CONTACT_FALLING
       
   892             else:
       
   893                 contact_type = CONTACT_NORMAL
       
   894             contact = LD_Contact(self, contact_type, instance["name"], instance["id"])
       
   895             contact.SetPosition(instance["x"], instance["y"])
       
   896             contact.SetSize(instance["width"], instance["height"])
       
   897             self.AddBlock(contact)
       
   898             connectors = contact.GetConnectors()
       
   899             connectors["input"].SetPosition(wx.Point(*instance["connectors"]["input"]["position"]))
       
   900             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
       
   901             connectors["output"].SetPosition(wx.Point(*instance["connectors"]["output"]["position"]))
       
   902         elif instance["type"] == "coil":
       
   903             if instance["negated"]:
       
   904                 negated = instance["negated"]
       
   905             else:
       
   906                 negated = False
       
   907             if instance["storage"]:
       
   908                 storage = instance["storage"]
       
   909             else:
       
   910                 storage = "none"
       
   911             if instance["edge"]:
       
   912                 edge = instance["edge"]
       
   913             else:
       
   914                 edge = "none"
       
   915             if negated and storage == "none" and edge == "none":
       
   916                 coil_type = COIL_REVERSE
       
   917             elif not negated and edge == "none" and storage == "set":
       
   918                 coil_type = COIL_SET
       
   919             elif not negated and edge == "none" and storage == "reset":
       
   920                 coil_type = COIL_RESET
       
   921             elif not negated and storage == "none" and edge == "rising":
       
   922                 coil_type = COIL_RISING
       
   923             elif not negated and storage == "none" and edge == "falling":
       
   924                 coil_type = COIL_FALLING
       
   925             else:
       
   926                 coil_type = COIL_NORMAL
       
   927             coil = LD_Coil(self, coil_type, instance["name"], instance["id"])
       
   928             coil.SetPosition(instance["x"], instance["y"])
       
   929             coil.SetSize(instance["width"], instance["height"])
       
   930             self.AddBlock(coil)
       
   931             connectors = coil.GetConnectors()
       
   932             connectors["input"].SetPosition(wx.Point(*instance["connectors"]["input"]["position"]))
       
   933             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
       
   934             connectors["output"].SetPosition(wx.Point(*instance["connectors"]["output"]["position"]))
       
   935         elif instance["type"] == "step":
       
   936             if instance["initial"]:
       
   937                 initial = instance["initial"]
       
   938             else:
       
   939                 initial = False
       
   940             step = SFC_Step(self, instance["name"], initial, instance["id"])
       
   941             step.SetPosition(instance["x"], instance["y"])
       
   942             step.SetSize(instance["width"], instance["height"])
       
   943             self.AddBlock(step)
       
   944             if "output" in instance["connectors"]:
       
   945                 step.AddOutput()
       
   946             if "action" in instance["connectors"]:
       
   947                 step.AddAction()
       
   948             connectors = step.GetConnectors()
       
   949             if connectors["input"]:
       
   950                 connectors["input"].SetPosition(wx.Point(*instance["connectors"]["input"]["position"]))
       
   951                 self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
       
   952             if connectors["output"]:
       
   953                 connectors["output"].SetPosition(wx.Point(*instance["connectors"]["output"]["position"]))
       
   954             if connectors["action"]:
       
   955                 connectors["action"].SetPosition(wx.Point(*instance["connectors"]["action"]["position"]))
       
   956         elif instance["type"] == "transition":
       
   957             transition = SFC_Transition(self, instance["condition_type"], instance["condition"], instance["priority"], instance["id"])
       
   958             transition.SetPosition(instance["x"], instance["y"])
       
   959             transition.SetSize(instance["width"], instance["height"])
       
   960             self.AddBlock(transition)
       
   961             connectors = transition.GetConnectors()
       
   962             connectors["input"].SetPosition(wx.Point(*instance["connectors"]["input"]["position"]))
       
   963             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
       
   964             connectors["output"].SetPosition(wx.Point(*instance["connectors"]["output"]["position"]))
       
   965             if instance["condition_type"] == "connection":
       
   966                 self.CreateWires(connectors["connection"], instance["connectors"]["connection"]["links"], ids)
       
   967         elif instance["type"] in ["selectionDivergence", "selectionConvergence", "simultaneousDivergence", "simultaneousConvergence"]:
       
   968             if instance["type"] == "selectionDivergence":
       
   969                 divergence = SFC_Divergence(self, SELECTION_DIVERGENCE, 
       
   970                     len(instance["connectors"]["outputs"]), instance["id"])
       
   971             elif instance["type"] == "selectionConvergence":
       
   972                 divergence = SFC_Divergence(self, SELECTION_CONVERGENCE, 
       
   973                     len(instance["connectors"]["inputs"]), instance["id"])
       
   974             elif instance["type"] == "simultaneousDivergence":
       
   975                 divergence = SFC_Divergence(self, SIMULTANEOUS_DIVERGENCE, 
       
   976                     len(instance["connectors"]["outputs"]), instance["id"])
       
   977             else:
       
   978                 divergence = SFC_Divergence(self, SIMULTANEOUS_CONVERGENCE, 
       
   979                     len(instance["connectors"]["inputs"]), instance["id"])
       
   980             divergence.SetPosition(instance["x"], instance["y"])
       
   981             divergence.SetSize(instance["width"], instance["height"])
       
   982             self.AddBlock(divergence)
       
   983             connectors = divergence.GetConnectors()
       
   984             for i, input_connector in enumerate(instance["connectors"]["inputs"]):
       
   985                 connector = connectors["inputs"][i]
       
   986                 connector.SetPosition(wx.Point(*input_connector["position"]))
       
   987                 self.CreateWires(connector, input_connector["links"], ids)
       
   988             for i, output_connector in enumerate(instance["connectors"]["outputs"]):
       
   989                 connector = connectors["outputs"][i]
       
   990                 connector.SetPosition(wx.Point(*output_connector["position"]))
       
   991         elif instance["type"] == "jump":
       
   992             jump = SFC_Jump(self, instance["target"], instance["id"])
       
   993             jump.SetPosition(instance["x"], instance["y"])
       
   994             jump.SetSize(instance["width"], instance["height"])
       
   995             self.AddBlock(jump)
       
   996             connector = jump.GetConnector()
       
   997             connector.SetPosition(wx.Point(*instance["connector"]["position"]))
       
   998             self.CreateWires(connector, instance["connector"]["links"], ids)
       
   999         elif instance["type"] == "actionBlock":
       
  1000             actionBlock = SFC_ActionBlock(self, instance["actions"], instance["id"])
       
  1001             actionBlock.SetPosition(instance["x"], instance["y"])
       
  1002             actionBlock.SetSize(instance["width"], instance["height"])
       
  1003             self.AddBlock(actionBlock)
       
  1004             connector = actionBlock.GetConnector()
       
  1005             connector.SetPosition(wx.Point(*instance["connector"]["position"]))
       
  1006             self.CreateWires(connector, instance["connector"]["links"], ids)
       
  1007         else:
   901         else:
  1008             connectors = {"inputs" : [], "outputs" : []}
       
  1009             executionControl = False
   902             executionControl = False
  1010             for input in instance["connectors"]["inputs"]:
   903             for input in instance["inputs"]:
  1011                 if input["negated"]:
   904                 if input["negated"]:
  1012                     connectors["inputs"].append((input["name"], None, "negated"))
   905                     connectors["inputs"].append((input["name"], None, "negated"))
  1013                 elif input["edge"]:
   906                 elif input["edge"]:
  1014                     connectors["inputs"].append((input["name"], None, input["edge"]))
   907                     connectors["inputs"].append((input["name"], None, input["edge"]))
  1015                 else:
   908                 else:
  1016                     connectors["inputs"].append((input["name"], None, "none"))
   909                     connectors["inputs"].append((input["name"], None, "none"))
  1017             for output in instance["connectors"]["outputs"]:
   910             for output in instance["outputs"]:
  1018                 if output["negated"]:
   911                 if output["negated"]:
  1019                     connectors["outputs"].append((output["name"], None, "negated"))
   912                     connectors["outputs"].append((output["name"], None, "negated"))
  1020                 elif output["edge"]:
   913                 elif output["edge"]:
  1021                     connectors["outputs"].append((output["name"], None, output["edge"]))
   914                     connectors["outputs"].append((output["name"], None, output["edge"]))
  1022                 else:
   915                 else:
  1023                     connectors["outputs"].append((output["name"], None, "none"))
   916                     connectors["outputs"].append((output["name"], None, "none"))
  1024             if len(connectors["inputs"]) > 0 and connectors["inputs"][0][0] == "EN":
   917             if len(connectors["inputs"]) > 0 and connectors["inputs"][0][0] == "EN":
  1025 		connectors["inputs"].pop(0)
   918                 connectors["inputs"].pop(0)
  1026 	        executionControl = True
   919                 executionControl = True
  1027             if len(connectors["outputs"]) > 0 and connectors["outputs"][0][0] == "ENO":
   920             if len(connectors["outputs"]) > 0 and connectors["outputs"][0][0] == "ENO":
  1028                 connectors["outputs"].pop(0)
   921                 connectors["outputs"].pop(0)
  1029                 executionControl = True
   922                 executionControl = True
  1030             if instance["name"] is None:
   923             if specific_values["name"] is None:
  1031                 instance["name"] = ""
   924                 specific_values["name"] = ""
  1032             block = FBD_Block(self, instance["type"], instance["name"], 
   925             element = FBD_Block(self, instance["type"], specific_values["name"], 
  1033                     instance["id"], len(connectors["inputs"]), 
   926                       instance["id"], len(connectors["inputs"]), 
  1034                     connectors=connectors, executionControl=executionControl, 
   927                       connectors=connectors, executionControl=executionControl, 
  1035                     executionOrder=instance["executionOrder"])
   928                       executionOrder=specific_values["executionOrder"])
  1036             block.SetPosition(instance["x"], instance["y"])
   929         element.SetPosition(instance["x"], instance["y"])
  1037             block.SetSize(instance["width"], instance["height"])
   930         element.SetSize(instance["width"], instance["height"])
  1038             self.AddBlock(block)
   931         if isinstance(element, Comment):
  1039             connectors = block.GetConnectors()
   932             self.AddComment(element)
  1040             for i, input_connector in enumerate(instance["connectors"]["inputs"]):
   933         else:
  1041                 if i < len(connectors["inputs"]):
   934             self.AddBlock(element)
  1042                     connector = connectors["inputs"][i]
   935             connectors = element.GetConnectors()
  1043                     connector.SetPosition(wx.Point(*input_connector["position"]))
   936         for i, input_connector in enumerate(instance["inputs"]):
  1044                     if input_connector["negated"]:
   937             if i < len(connectors["inputs"]):
  1045                         connector.SetNegated(True)
   938                 connector = connectors["inputs"][i]
  1046                     if input_connector["edge"] != "none":
   939                 connector.SetPosition(wx.Point(*input_connector["position"]))
  1047                         connector.SetEdge(input_connector["edge"])
   940                 if input_connector.get("negated", False):
  1048                     self.CreateWires(connector, input_connector["links"], ids)
   941                     connector.SetNegated(True)
  1049             for i, output_connector in enumerate(instance["connectors"]["outputs"]):
   942                 if input_connector.get("edge", "none") != "none":
  1050                 if i < len(connectors["outputs"]):
   943                     connector.SetEdge(input_connector["edge"])
  1051                     connector = connectors["outputs"][i]
   944                 self.CreateWires(connector, instance["id"], input_connector["links"], ids, selection)
  1052                     if output_connector["negated"]:
   945         for i, output_connector in enumerate(instance["outputs"]):
  1053                         connector.SetNegated(True)
   946             if i < len(connectors["outputs"]):
  1054                     if output_connector["edge"] != "none":
   947                 connector = connectors["outputs"][i]
  1055                         connector.SetEdge(output_connector["edge"])
   948                 if output_connector.get("negated", False):
  1056                     connector.SetPosition(wx.Point(*output_connector["position"]))
   949                     connector.SetNegated(True)
  1057     
   950                 if output_connector.get("edge", "none") != "none":
  1058     def CreateWires(self, start_connector, links, ids):
   951                     connector.SetEdge(output_connector["edge"])
       
   952                 connector.SetPosition(wx.Point(*output_connector["position"]))
       
   953         if selection is not None and selection[0].get(instance["id"], False):
       
   954             self.SelectInGroup(element)
       
   955 
       
   956     def CreateWires(self, start_connector, id, links, ids, selection=None):
  1059         for link in links:
   957         for link in links:
  1060             refLocalId = link["refLocalId"]
   958             refLocalId = link["refLocalId"]
  1061             if refLocalId is not None:
   959             if refLocalId is not None:
  1062                 if refLocalId not in ids:
   960                 if refLocalId not in ids:
  1063                     new_instance = self.Controler.GetEditedElementInstanceInfos(self.TagName, refLocalId, debug = self.Debug)
   961                     new_instance = self.Controler.GetEditedElementInstanceInfos(self.TagName, refLocalId, debug = self.Debug)
  1064                     if new_instance is not None:
   962                     if new_instance is not None:
  1065                         self.loadInstance(new_instance, ids)
   963                         self.loadInstance(new_instance, ids, selection)
  1066                 connected = self.FindElementById(refLocalId)
   964                 connected = self.FindElementById(refLocalId)
  1067                 if connected is not None:
   965                 if connected is not None:
  1068                     points = link["points"]
   966                     points = link["points"]
  1069                     end_connector = connected.GetConnector(wx.Point(points[-1][0], points[-1][1]), link["formalParameter"])
   967                     end_connector = connected.GetConnector(wx.Point(points[-1][0], points[-1][1]), link["formalParameter"])
  1070                     if end_connector is not None:
   968                     if end_connector is not None:
  1073                         start_connector.Connect((wire, 0), False)
   971                         start_connector.Connect((wire, 0), False)
  1074                         end_connector.Connect((wire, -1), False)
   972                         end_connector.Connect((wire, -1), False)
  1075                         wire.ConnectStartPoint(None, start_connector)
   973                         wire.ConnectStartPoint(None, start_connector)
  1076                         wire.ConnectEndPoint(None, end_connector)
   974                         wire.ConnectEndPoint(None, end_connector)
  1077                         self.AddWire(wire)
   975                         self.AddWire(wire)
       
   976                         if selection is not None and (\
       
   977                            selection[1].get((id, refLocalId), False) or \
       
   978                            selection[1].get((refLocalId, id), False)):
       
   979                             self.SelectInGroup(wire)
  1078 
   980 
  1079     def IsOfType(self, type, reference):
   981     def IsOfType(self, type, reference):
  1080         return self.Controler.IsOfType(type, reference, self.Debug)
   982         return self.Controler.IsOfType(type, reference, self.Debug)
  1081     
   983     
  1082     def IsEndType(self, type):
   984     def IsEndType(self, type):
  1088 #-------------------------------------------------------------------------------
   990 #-------------------------------------------------------------------------------
  1089 #                          Search Element functions
   991 #                          Search Element functions
  1090 #-------------------------------------------------------------------------------
   992 #-------------------------------------------------------------------------------
  1091 
   993 
  1092     def FindBlock(self, pos):
   994     def FindBlock(self, pos):
  1093         for block in self.Blocks:
   995         for block in self.Blocks.itervalues():
  1094             if block.HitTest(pos) or block.TestHandle(pos) != (0, 0):
   996             if block.HitTest(pos) or block.TestHandle(pos) != (0, 0):
  1095                 return block
   997                 return block
  1096         return None
   998         return None
  1097     
   999     
  1098     def FindWire(self, pos):
  1000     def FindWire(self, pos):
  1109             if element.HitTest(pos) or element.TestHandle(pos) != (0, 0):
  1011             if element.HitTest(pos) or element.TestHandle(pos) != (0, 0):
  1110                 return element
  1012                 return element
  1111         return None
  1013         return None
  1112     
  1014     
  1113     def FindBlockConnector(self, pos, direction = None, exclude = None):
  1015     def FindBlockConnector(self, pos, direction = None, exclude = None):
  1114         for block in self.Blocks:
  1016         for block in self.Blocks.itervalues():
  1115             result = block.TestConnector(pos, direction, exclude)
  1017             result = block.TestConnector(pos, direction, exclude)
  1116             if result:
  1018             if result:
  1117                 return result
  1019                 return result
  1118         return None
  1020         return None
  1119     
  1021     
  1120     def FindElementById(self, id):
  1022     def FindElementById(self, id):
  1121         for element in self.Blocks:
  1023         block = self.Blocks.get(id, None)
  1122             if element.GetId() == id:
  1024         if block is not None:
  1123                 return element
  1025             return block
  1124         for element in self.Comments:
  1026         comment = self.Comments.get(id, None)
  1125             if element.GetId() == id:
  1027         if comment is not None:
  1126                 return element
  1028             return comment
  1127         return None
  1029         return None
  1128     
  1030     
  1129     def SearchElements(self, bbox):
  1031     def SearchElements(self, bbox):
  1130         elements = []
  1032         elements = []
  1131         for element in self.GetElements():
  1033         for element in self.GetElements():
  1975     def AddNewStep(self, bbox, initial = False):
  1877     def AddNewStep(self, bbox, initial = False):
  1976         dialog = StepContentDialog(self.ParentWindow, self.Controler, initial)
  1878         dialog = StepContentDialog(self.ParentWindow, self.Controler, initial)
  1977         dialog.SetPreviewFont(self.GetFont())
  1879         dialog.SetPreviewFont(self.GetFont())
  1978         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  1880         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  1979         dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
  1881         dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
  1980         dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step)])
  1882         dialog.SetStepNames([block.GetName() for block in self.Blocks.itervalues() if isinstance(block, SFC_Step)])
  1981         dialog.SetMinStepSize((bbox.width, bbox.height))
  1883         dialog.SetMinStepSize((bbox.width, bbox.height))
  1982         if dialog.ShowModal() == wx.ID_OK:
  1884         if dialog.ShowModal() == wx.ID_OK:
  1983             id = self.GetNewId()
  1885             id = self.GetNewId()
  1984             values = dialog.GetValues()
  1886             values = dialog.GetValues()
  1985             step = SFC_Step(self, values["name"], initial, id)
  1887             step = SFC_Step(self, values["name"], initial, id)
  2047             divergence.Refresh()
  1949             divergence.Refresh()
  2048         dialog.Destroy()
  1950         dialog.Destroy()
  2049 
  1951 
  2050     def AddNewJump(self, bbox):
  1952     def AddNewJump(self, bbox):
  2051         choices = []
  1953         choices = []
  2052         for block in self.Blocks:
  1954         for block in self.Blocks.itervalues():
  2053             if isinstance(block, SFC_Step):
  1955             if isinstance(block, SFC_Step):
  2054                 choices.append(block.GetName())
  1956                 choices.append(block.GetName())
  2055         dialog = wx.SingleChoiceDialog(self.ParentWindow, "Add a new jump", "Please choose a target", choices, wx.OK|wx.CANCEL)
  1957         dialog = wx.SingleChoiceDialog(self.ParentWindow, "Add a new jump", "Please choose a target", choices, wx.OK|wx.CANCEL)
  2056         if dialog.ShowModal() == wx.ID_OK:
  1958         if dialog.ShowModal() == wx.ID_OK:
  2057             id = self.GetNewId()
  1959             id = self.GetNewId()
  2285     def EditStepContent(self, step):
  2187     def EditStepContent(self, step):
  2286         dialog = StepContentDialog(self.ParentWindow, self.Controler, step.GetInitial())
  2188         dialog = StepContentDialog(self.ParentWindow, self.Controler, step.GetInitial())
  2287         dialog.SetPreviewFont(self.GetFont())
  2189         dialog.SetPreviewFont(self.GetFont())
  2288         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2190         dialog.SetPouNames(self.Controler.GetProjectPouNames(self.Debug))
  2289         dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
  2191         dialog.SetVariables(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
  2290         dialog.SetStepNames([block.GetName() for block in self.Blocks if isinstance(block, SFC_Step) and block.GetName() != step.GetName()])
  2192         dialog.SetStepNames([block.GetName() for block in self.Blocks.itervalues() if isinstance(block, SFC_Step) and block.GetName() != step.GetName()])
  2291         dialog.SetMinStepSize(step.GetSize())
  2193         dialog.SetMinStepSize(step.GetSize())
  2292         values = {"name" : step.GetName()}
  2194         values = {"name" : step.GetName()}
  2293         connectors = step.GetConnectors()
  2195         connectors = step.GetConnectors()
  2294         values["input"] = connectors["input"] != None
  2196         values["input"] = connectors["input"] != None
  2295         values["output"] = connectors["output"] != None
  2197         values["output"] = connectors["output"] != None
  2338             transition.Refresh(rect)
  2240             transition.Refresh(rect)
  2339         dialog.Destroy()
  2241         dialog.Destroy()
  2340 
  2242 
  2341     def EditJumpContent(self, jump):
  2243     def EditJumpContent(self, jump):
  2342         choices = []
  2244         choices = []
  2343         for block in self.Blocks:
  2245         for block in self.Blocks.itervalues():
  2344             if isinstance(block, SFC_Step):
  2246             if isinstance(block, SFC_Step):
  2345                 choices.append(block.GetName())
  2247                 choices.append(block.GetName())
  2346         dialog = wx.SingleChoiceDialog(self.ParentWindow, "Edit jump target", "Please choose a target", choices, wx.OK|wx.CANCEL)
  2248         dialog = wx.SingleChoiceDialog(self.ParentWindow, "Edit jump target", "Please choose a target", choices, wx.OK|wx.CANCEL)
  2347         dialog.SetSelection(choices.index(jump.GetTarget()))
  2249         dialog.SetSelection(choices.index(jump.GetTarget()))
  2348         if dialog.ShowModal() == wx.ID_OK:
  2250         if dialog.ShowModal() == wx.ID_OK:
  2472         infos["name"] = step.GetName()
  2374         infos["name"] = step.GetName()
  2473         infos["initial"] = step.GetInitial()
  2375         infos["initial"] = step.GetInitial()
  2474         infos["x"], infos["y"] = step.GetPosition()
  2376         infos["x"], infos["y"] = step.GetPosition()
  2475         infos["width"], infos["height"] = step.GetSize()
  2377         infos["width"], infos["height"] = step.GetSize()
  2476         infos["connectors"] = step.GetConnectors()
  2378         infos["connectors"] = step.GetConnectors()
       
  2379         infos["action"] = step.GetActionConnector()
  2477         self.Controler.SetEditedElementStepInfos(self.TagName, stepid, infos)
  2380         self.Controler.SetEditedElementStepInfos(self.TagName, stepid, infos)
  2478 
  2381 
  2479     def RefreshTransitionModel(self, transition):
  2382     def RefreshTransitionModel(self, transition):
  2480         transitionid = transition.GetId()
  2383         transitionid = transition.GetId()
  2481         infos = {}
  2384         infos = {}
  2483         infos["priority"] = transition.GetPriority()
  2386         infos["priority"] = transition.GetPriority()
  2484         infos["condition"] = transition.GetCondition()
  2387         infos["condition"] = transition.GetCondition()
  2485         infos["x"], infos["y"] = transition.GetPosition()
  2388         infos["x"], infos["y"] = transition.GetPosition()
  2486         infos["width"], infos["height"] = transition.GetSize()
  2389         infos["width"], infos["height"] = transition.GetSize()
  2487         infos["connectors"] = transition.GetConnectors()
  2390         infos["connectors"] = transition.GetConnectors()
       
  2391         infos["connection"] = transition.GetConditionConnector()
  2488         self.Controler.SetEditedElementTransitionInfos(self.TagName, transitionid, infos)
  2392         self.Controler.SetEditedElementTransitionInfos(self.TagName, transitionid, infos)
  2489 
  2393 
  2490     def RefreshDivergenceModel(self, divergence):
  2394     def RefreshDivergenceModel(self, divergence):
  2491         divergenceid = divergence.GetId()
  2395         divergenceid = divergence.GetId()
  2492         infos = {}
  2396         infos = {}
  2533         wx.CallAfter(self.ParentWindow.RefreshVariablePanel, self.TagName)
  2437         wx.CallAfter(self.ParentWindow.RefreshVariablePanel, self.TagName)
  2534         wx.CallAfter(self.ParentWindow.RefreshInstancesTree)
  2438         wx.CallAfter(self.ParentWindow.RefreshInstancesTree)
  2535         
  2439         
  2536     def DeleteVariable(self, variable):
  2440     def DeleteVariable(self, variable):
  2537         connectors = variable.GetConnectors()
  2441         connectors = variable.GetConnectors()
  2538         if connectors["output"]:
  2442         if len(connectors["outputs"]) > 0:
  2539             elements = connectors["output"].GetConnectedBlocks()
  2443             elements = connectors["outputs"][0].GetConnectedBlocks()
  2540         else:
  2444         else:
  2541             elements = []
  2445             elements = []
  2542         variable.Clean()
  2446         variable.Clean()
  2543         self.RemoveBlock(variable)
  2447         self.RemoveBlock(variable)
  2544         self.Controler.RemoveEditedElementInstance(self.TagName, variable.GetId())
  2448         self.Controler.RemoveEditedElementInstance(self.TagName, variable.GetId())
  2568             for connector in connected:
  2472             for connector in connected:
  2569                 connector.RefreshParentBlock()
  2473                 connector.RefreshParentBlock()
  2570 
  2474 
  2571     def DeleteContact(self, contact):
  2475     def DeleteContact(self, contact):
  2572         connectors = contact.GetConnectors()
  2476         connectors = contact.GetConnectors()
  2573         elements = connectors["output"].GetConnectedBlocks()
  2477         elements = connectors["outputs"][0].GetConnectedBlocks()
  2574         contact.Clean()
  2478         contact.Clean()
  2575         self.RemoveBlock(contact)
  2479         self.RemoveBlock(contact)
  2576         self.Controler.RemoveEditedElementInstance(self.TagName, contact.GetId())
  2480         self.Controler.RemoveEditedElementInstance(self.TagName, contact.GetId())
  2577         for element in elements:
  2481         for element in elements:
  2578             element.RefreshModel()
  2482             element.RefreshModel()
  2579 
  2483 
  2580     def DeleteCoil(self, coil):
  2484     def DeleteCoil(self, coil):
  2581         connectors = coil.GetConnectors()
  2485         connectors = coil.GetConnectors()
  2582         elements = connectors["output"].GetConnectedBlocks()
  2486         elements = connectors["outputs"][0].GetConnectedBlocks()
  2583         coil.Clean()
  2487         coil.Clean()
  2584         self.RemoveBlock(coil)
  2488         self.RemoveBlock(coil)
  2585         self.Controler.RemoveEditedElementInstance(self.TagName, coil.GetId())
  2489         self.Controler.RemoveEditedElementInstance(self.TagName, coil.GetId())
  2586         for element in elements:
  2490         for element in elements:
  2587             element.RefreshModel()
  2491             element.RefreshModel()
  2588 
  2492 
  2589     def DeletePowerRail(self, powerrail):
  2493     def DeletePowerRail(self, powerrail):
  2590         elements = []
  2494         elements = []
  2591         if powerrail.GetType() == LEFTRAIL:
  2495         if powerrail.GetType() == LEFTRAIL:
  2592             for connector in powerrail.GetConnectors():
  2496             connectors = powerrail.GetConnectors()
       
  2497             for connector in connectors["outputs"]:
  2593                 for element in connector.GetConnectedBlocks():
  2498                 for element in connector.GetConnectedBlocks():
  2594                     if element not in elements:
  2499                     if element not in elements:
  2595                         elements.append(element)
  2500                         elements.append(element)
  2596         powerrail.Clean()
  2501         powerrail.Clean()
  2597         self.RemoveBlock(powerrail)
  2502         self.RemoveBlock(powerrail)
  2600             element.RefreshModel()
  2505             element.RefreshModel()
  2601 
  2506 
  2602     def DeleteStep(self, step):
  2507     def DeleteStep(self, step):
  2603         elements = []
  2508         elements = []
  2604         connectors = step.GetConnectors()
  2509         connectors = step.GetConnectors()
  2605         if connectors["output"]:
  2510         action_connector = step.GetActionConnector()
  2606             for element in connectors["output"].GetConnectedBlocks():
  2511         if len(connectors["outputs"]) > 0:
       
  2512             for element in connectors["outputs"][0].GetConnectedBlocks():
  2607                 if element not in elements:
  2513                 if element not in elements:
  2608                     elements.append(element)
  2514                     elements.append(element)
  2609         if connectors["action"]:
  2515         if action_connector is not None:
  2610             for element in connectors["action"].GetConnectedBlocks():
  2516             for element in action_connector.GetConnectedBlocks():
  2611                 if element not in elements:
  2517                 if element not in elements:
  2612                     elements.append(element)
  2518                     elements.append(element)
  2613         step.Clean()
  2519         step.Clean()
  2614         self.RemoveBlock(step)
  2520         self.RemoveBlock(step)
  2615         self.Controler.RemoveEditedElementInstance(self.TagName, step.GetId())
  2521         self.Controler.RemoveEditedElementInstance(self.TagName, step.GetId())
  2617             element.RefreshModel()
  2523             element.RefreshModel()
  2618             
  2524             
  2619     def DeleteTransition(self, transition):
  2525     def DeleteTransition(self, transition):
  2620         elements = []
  2526         elements = []
  2621         connectors = transition.GetConnectors()
  2527         connectors = transition.GetConnectors()
  2622         if connectors["output"]:
  2528         for element in connectors["outputs"][0].GetConnectedBlocks():
  2623             for element in connectors["output"].GetConnectedBlocks():
  2529             if element not in elements:
  2624                 if element not in elements:
  2530                 elements.append(element)
  2625                     elements.append(element)
       
  2626         transition.Clean()
  2531         transition.Clean()
  2627         self.RemoveBlock(transition)
  2532         self.RemoveBlock(transition)
  2628         self.Controler.RemoveEditedElementInstance(self.TagName, transition.GetId())
  2533         self.Controler.RemoveEditedElementInstance(self.TagName, transition.GetId())
  2629         for element in elements:
  2534         for element in elements:
  2630             element.RefreshModel()
  2535             element.RefreshModel()
  2895             for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], int(window_size[1] / self.ViewScale[1]), self.PageSize[1]):
  2800             for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], int(window_size[1] / self.ViewScale[1]), self.PageSize[1]):
  2896                 dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1, 
  2801                 dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1, 
  2897                             int((xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[1]), ystart * SCROLLBAR_UNIT + y + 1)
  2802                             int((xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[1]), ystart * SCROLLBAR_UNIT + y + 1)
  2898         
  2803         
  2899         # Draw all elements
  2804         # Draw all elements
  2900         for comment in self.Comments:
  2805         for comment in self.Comments.itervalues():
  2901             if comment != self.SelectedElement and (comment.IsVisible() or printing):
  2806             if comment != self.SelectedElement and (comment.IsVisible() or printing):
  2902                 comment.Draw(dc)
  2807                 comment.Draw(dc)
  2903         for wire in self.Wires:
  2808         for wire in self.Wires.iterkeys():
  2904             if wire != self.SelectedElement and (wire.IsVisible() or printing):
  2809             if wire != self.SelectedElement and (wire.IsVisible() or printing):
  2905                  if not self.Debug or wire.GetValue() != True:
  2810                  if not self.Debug or wire.GetValue() != True:
  2906                     wire.Draw(dc)
  2811                     wire.Draw(dc)
  2907         if self.Debug:
  2812         if self.Debug:
  2908             for wire in self.Wires:
  2813             for wire in self.Wires.iterkeys():
  2909                 if wire != self.SelectedElement and (wire.IsVisible() or printing) and wire.GetValue() == True:
  2814                 if wire != self.SelectedElement and (wire.IsVisible() or printing) and wire.GetValue() == True:
  2910                     wire.Draw(dc)
  2815                     wire.Draw(dc)
  2911         for block in self.Blocks:
  2816         for block in self.Blocks.itervalues():
  2912             if block != self.SelectedElement and (block.IsVisible() or printing):
  2817             if block != self.SelectedElement and (block.IsVisible() or printing):
  2913                 block.Draw(dc)
  2818                 block.Draw(dc)
  2914         
  2819         
  2915         if self.SelectedElement is not None and (self.SelectedElement.IsVisible() or printing):
  2820         if self.SelectedElement is not None and (self.SelectedElement.IsVisible() or printing):
  2916             self.SelectedElement.Draw(dc)
  2821             self.SelectedElement.Draw(dc)