Viewer.py
changeset 42 4a8400732001
parent 28 fc23e1f415d8
child 45 42637f721b5b
equal deleted inserted replaced
41:0688db995ddf 42:4a8400732001
   118         self.Scaling = None
   118         self.Scaling = None
   119         #self.Scaling = (8, 8)
   119         #self.Scaling = (8, 8)
   120         self.DrawGrid = True
   120         self.DrawGrid = True
   121         self.current_id = 0    
   121         self.current_id = 0    
   122         
   122         
       
   123         # Initialize Block, Wire and Comment numbers
       
   124         self.block_id = self.wire_id = self.comment_id = 0
       
   125         
   123         # Initialize Viewer mode to Selection mode
   126         # Initialize Viewer mode to Selection mode
   124         self.Mode = MODE_SELECTION
   127         self.Mode = MODE_SELECTION
   125         self.SavedMode = False
   128         self.SavedMode = False
   126         
   129         
   127         self.Parent = window
   130         self.Parent = window
   151         dc = wxClientDC(self)
   154         dc = wxClientDC(self)
   152         self.DoPrepareDC(dc)
   155         self.DoPrepareDC(dc)
   153         return dc
   156         return dc
   154 
   157 
   155 #-------------------------------------------------------------------------------
   158 #-------------------------------------------------------------------------------
       
   159 #                         Element management functions
       
   160 #-------------------------------------------------------------------------------
       
   161 
       
   162     def AddBlock(self, block):
       
   163         self.block_id += 1
       
   164         self.Blocks[block] = self.block_id
       
   165         
       
   166     def AddWire(self, wire):
       
   167         self.wire_id += 1
       
   168         self.Wires[wire] = self.wire_id
       
   169         
       
   170     def AddComment(self, comment):
       
   171         self.comment_id += 1
       
   172         self.Comments[comment] = self.comment_id
       
   173 
       
   174     def IsBlock(self, block):
       
   175         return self.Blocks.get(block, False)
       
   176         
       
   177     def IsWire(self, wire):
       
   178         return self.Wires.get(wire, False)
       
   179         
       
   180     def IsComment(self, comment):
       
   181         return self.Comments.get(comment, False)
       
   182 
       
   183     def RemoveBlock(self, block):
       
   184         self.Blocks.pop(block)
       
   185         
       
   186     def RemoveWire(self, wire):
       
   187         self.Wires.pop(wire)
       
   188         
       
   189     def RemoveComment(self, comment):
       
   190         self.Comments.pop(comment)
       
   191 
       
   192     def GetElements(self, sort_blocks=False, sort_wires=False, sort_comments=False):
       
   193         blocks = self.Blocks.keys()
       
   194         wires = self.Wires.keys()
       
   195         comments = self.Comments.keys()
       
   196         if sort_blocks:
       
   197             blocks.sort(lambda x,y:self.Blocks[x].__cmp__(self.Blocks[y]))
       
   198         if sort_wires:
       
   199             wires.sort(lambda x,y:self.Wires[x].__cmp__(self.Wires[y]))
       
   200         if sort_comments:
       
   201             comments.sort(lambda x,y:self.Comments[x].__cmp__(self.Comments[y]))
       
   202         return blocks + wires + comments
       
   203 
       
   204 #-------------------------------------------------------------------------------
   156 #                              Reset functions
   205 #                              Reset functions
   157 #-------------------------------------------------------------------------------
   206 #-------------------------------------------------------------------------------
   158 
   207 
   159     # Resets Viewer lists
   208     # Resets Viewer lists
   160     def ResetView(self):
   209     def ResetView(self):
   161         self.Blocks = []
   210         self.Blocks = {}
   162         self.Wires = []
   211         self.Wires = {}
   163         self.Elements = []
   212         self.Comments = {}
   164         self.SelectedElement = None
   213         self.SelectedElement = None
   165     
   214     
   166     # Changes Viewer mode
   215     # Changes Viewer mode
   167     def SetMode(self, mode):
   216     def SetMode(self, mode):
   168         if self.Mode != mode or mode == MODE_SELECTION:
   217         if self.Mode != mode or mode == MODE_SELECTION:
   195         # Load Blocks until they are all loaded
   244         # Load Blocks until they are all loaded
   196         while instance:
   245         while instance:
   197             instance = self.Controler.GetCurrentElementEditingInstanceInfos(exclude=ids)
   246             instance = self.Controler.GetCurrentElementEditingInstanceInfos(exclude=ids)
   198             if instance:
   247             if instance:
   199                 self.loadInstance(instance, ids)
   248                 self.loadInstance(instance, ids)
   200         self.RefreshScrollBar()
   249         self.RefreshScrollBars()
   201         self.Refresh()
   250         self.Refresh()
   202     
   251     
   203     def RefreshScrollBar(self):
   252     def RefreshScrollBars(self):
   204         xstart, ystart = self.GetViewStart()
   253         xstart, ystart = self.GetViewStart()
   205         window_size = self.GetClientSize()
   254         window_size = self.GetClientSize()
   206         maxx = maxy = 0
   255         maxx = maxy = 0
   207         for element in self.Elements:
   256         for element in self.GetElements():
   208             posx, posy = element.GetPosition()
   257             posx, posy = element.GetPosition()
   209             width, height = element.GetSize()
   258             width, height = element.GetSize()
   210             maxx = max(maxx, posx + width)
   259             maxx = max(maxx, posx + width)
   211             maxy = max(maxy, posy + height)
   260             maxy = max(maxy, posy + height)
   212         maxx = max(maxx + WINDOW_BORDER, xstart * SCROLLBAR_UNIT + window_size[0])
   261         maxx = max(maxx + WINDOW_BORDER, xstart * SCROLLBAR_UNIT + window_size[0])
   224         self.current_id = max(self.current_id, instance["id"]) 
   273         self.current_id = max(self.current_id, instance["id"]) 
   225         if instance["type"] == "input":
   274         if instance["type"] == "input":
   226             variable = FBD_Variable(self, INPUT, instance["name"], instance["value_type"], instance["id"])
   275             variable = FBD_Variable(self, INPUT, instance["name"], instance["value_type"], instance["id"])
   227             variable.SetPosition(instance["x"], instance["y"])
   276             variable.SetPosition(instance["x"], instance["y"])
   228             variable.SetSize(instance["width"], instance["height"])
   277             variable.SetSize(instance["width"], instance["height"])
   229             self.Blocks.append(variable)
   278             self.AddBlock(variable)
   230             self.Elements.append(variable)
       
   231             connectors = variable.GetConnectors()
   279             connectors = variable.GetConnectors()
   232             connectors["output"].SetPosition(wxPoint(*instance["connector"]["position"]))
   280             connectors["output"].SetPosition(wxPoint(*instance["connector"]["position"]))
   233             if instance["connector"]["negated"]:
   281             if instance["connector"]["negated"]:
   234                 connectors["output"].SetNegated(True)
   282                 connectors["output"].SetNegated(True)
   235             if instance["connector"]["edge"]:
   283             if instance["connector"]["edge"]:
   236                 connectors["output"].SetEdge(instance["connector"]["edge"])
   284                 connectors["output"].SetEdge(instance["connector"]["edge"])
   237         elif instance["type"] == "output":
   285         elif instance["type"] == "output":
   238             variable = FBD_Variable(self, OUTPUT, instance["name"], instance["value_type"], instance["id"])
   286             variable = FBD_Variable(self, OUTPUT, instance["name"], instance["value_type"], instance["id"])
   239             variable.SetPosition(instance["x"], instance["y"])
   287             variable.SetPosition(instance["x"], instance["y"])
   240             variable.SetSize(instance["width"], instance["height"])
   288             variable.SetSize(instance["width"], instance["height"])
   241             self.Blocks.append(variable)
   289             self.AddBlock(variable)
   242             self.Elements.append(variable)
       
   243             connectors = variable.GetConnectors()
   290             connectors = variable.GetConnectors()
   244             connectors["input"].SetPosition(wxPoint(*instance["connector"]["position"]))
   291             connectors["input"].SetPosition(wxPoint(*instance["connector"]["position"]))
   245             if instance["connector"]["negated"]:
   292             if instance["connector"]["negated"]:
   246                 connectors["input"].SetNegated(True)
   293                 connectors["input"].SetNegated(True)
   247             if instance["connector"]["edge"]:
   294             if instance["connector"]["edge"]:
   249             self.CreateWires(connectors["input"], instance["connector"]["links"], ids)
   296             self.CreateWires(connectors["input"], instance["connector"]["links"], ids)
   250         elif instance["type"] == "inout":
   297         elif instance["type"] == "inout":
   251             variable = FBD_Variable(self, INOUT, instance["name"], instance["value_type"], instance["id"])
   298             variable = FBD_Variable(self, INOUT, instance["name"], instance["value_type"], instance["id"])
   252             variable.SetPosition(instance["x"], instance["y"])
   299             variable.SetPosition(instance["x"], instance["y"])
   253             variable.SetSize(instance["width"], instance["height"])
   300             variable.SetSize(instance["width"], instance["height"])
   254             self.Blocks.append(variable)
   301             self.AddBlock(variable)
   255             self.Elements.append(variable)
       
   256             connectors = variable.GetConnectors()
   302             connectors = variable.GetConnectors()
   257             connectors["output"].SetPosition(wxPoint(*instance["connectors"]["output"]["position"]))
   303             connectors["output"].SetPosition(wxPoint(*instance["connectors"]["output"]["position"]))
   258             connectors["input"].SetPosition(wxPoint(*instance["connectors"]["input"]["position"]))
   304             connectors["input"].SetPosition(wxPoint(*instance["connectors"]["input"]["position"]))
   259             if instance["connectors"]["output"]["negated"]:
   305             if instance["connectors"]["output"]["negated"]:
   260                 connectors["output"].SetNegated(True)
   306                 connectors["output"].SetNegated(True)
   267             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
   313             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
   268         elif instance["type"] == "continuation":
   314         elif instance["type"] == "continuation":
   269             connection = FBD_Connector(self, CONTINUATION, instance["name"], instance["id"])
   315             connection = FBD_Connector(self, CONTINUATION, instance["name"], instance["id"])
   270             connection.SetPosition(instance["x"], instance["y"])
   316             connection.SetPosition(instance["x"], instance["y"])
   271             connection.SetSize(instance["width"], instance["height"])
   317             connection.SetSize(instance["width"], instance["height"])
   272             self.Blocks.append(connection)
   318             self.AddBlock(connection)
   273             self.Elements.append(connection)
       
   274             connector = connection.GetConnector()
   319             connector = connection.GetConnector()
   275             connector.SetPosition(wxPoint(*instance["connector"]["position"]))
   320             connector.SetPosition(wxPoint(*instance["connector"]["position"]))
   276         elif instance["type"] == "connection":
   321         elif instance["type"] == "connection":
   277             connection = FBD_Connector(self, CONNECTOR, instance["name"], instance["id"])
   322             connection = FBD_Connector(self, CONNECTOR, instance["name"], instance["id"])
   278             connection.SetPosition(instance["x"], instance["y"])
   323             connection.SetPosition(instance["x"], instance["y"])
   279             connection.SetSize(instance["width"], instance["height"])
   324             connection.SetSize(instance["width"], instance["height"])
   280             self.Blocks.append(connection)
   325             self.AddBlock(connection)
   281             self.Elements.append(connection)
       
   282             connector = connection.GetConnector()
   326             connector = connection.GetConnector()
   283             connector.SetPosition(wxPoint(*instance["connector"]["position"]))
   327             connector.SetPosition(wxPoint(*instance["connector"]["position"]))
   284             self.CreateWires(connector, instance["connector"]["links"], ids)
   328             self.CreateWires(connector, instance["connector"]["links"], ids)
   285         elif instance["type"] == "comment":
   329         elif instance["type"] == "comment":
   286             comment = Comment(self, instance["content"], instance["id"])
   330             comment = Comment(self, instance["content"], instance["id"])
   287             comment.SetPosition(instance["x"], instance["y"])
   331             comment.SetPosition(instance["x"], instance["y"])
   288             comment.SetSize(instance["width"], instance["height"])
   332             comment.SetSize(instance["width"], instance["height"])
   289             self.Elements.append(comment)
   333             self.AddComment(comment)
   290         elif instance["type"] == "leftPowerRail":
   334         elif instance["type"] == "leftPowerRail":
   291             leftpowerrail = LD_PowerRail(self, LEFTRAIL, instance["id"], [True for i in range(len(instance["connectors"]))])
   335             leftpowerrail = LD_PowerRail(self, LEFTRAIL, instance["id"], [True for i in range(len(instance["connectors"]))])
   292             leftpowerrail.SetPosition(instance["x"], instance["y"])
   336             leftpowerrail.SetPosition(instance["x"], instance["y"])
   293             self.Blocks.append(leftpowerrail)
   337             self.AddBlock(leftpowerrail)
   294             self.Elements.append(leftpowerrail)
       
   295             connectors = leftpowerrail.GetConnectors()
   338             connectors = leftpowerrail.GetConnectors()
   296             for i, connector in enumerate(instance["connectors"]):
   339             for i, connector in enumerate(instance["connectors"]):
   297                 connectors[i].SetPosition(wxPoint(*connector["position"]))
   340                 connectors[i].SetPosition(wxPoint(*connector["position"]))
   298         elif instance["type"] == "rightPowerRail":
   341         elif instance["type"] == "rightPowerRail":
   299             rightpowerrail = LD_PowerRail(self, RIGHTRAIL, instance["id"], [True for i in range(len(instance["connectors"]))])
   342             rightpowerrail = LD_PowerRail(self, RIGHTRAIL, instance["id"], [True for i in range(len(instance["connectors"]))])
   300             rightpowerrail.SetPosition(instance["x"], instance["y"])
   343             rightpowerrail.SetPosition(instance["x"], instance["y"])
   301             self.Blocks.append(rightpowerrail)
   344             self.AddBlock(rightpowerrail)
   302             self.Elements.append(rightpowerrail)
       
   303             connectors = rightpowerrail.GetConnectors()
   345             connectors = rightpowerrail.GetConnectors()
   304             for i, connector in enumerate(instance["connectors"]):
   346             for i, connector in enumerate(instance["connectors"]):
   305                 connectors[i].SetPosition(wxPoint(*connector["position"]))
   347                 connectors[i].SetPosition(wxPoint(*connector["position"]))
   306                 self.CreateWires(connectors[i], connector["links"], ids)
   348                 self.CreateWires(connectors[i], connector["links"], ids)
   307         elif instance["type"] == "contact":
   349         elif instance["type"] == "contact":
   321                 contact_type = CONTACT_FALLING
   363                 contact_type = CONTACT_FALLING
   322             else:
   364             else:
   323                 contact_type = CONTACT_NORMAL
   365                 contact_type = CONTACT_NORMAL
   324             contact = LD_Contact(self, contact_type, instance["name"], instance["id"])
   366             contact = LD_Contact(self, contact_type, instance["name"], instance["id"])
   325             contact.SetPosition(instance["x"], instance["y"])
   367             contact.SetPosition(instance["x"], instance["y"])
   326             self.Blocks.append(contact)
   368             self.AddBlock(contact)
   327             self.Elements.append(contact)
       
   328             connectors = contact.GetConnectors()
   369             connectors = contact.GetConnectors()
   329             connectors["input"].SetPosition(wxPoint(*instance["connectors"]["input"]["position"]))
   370             connectors["input"].SetPosition(wxPoint(*instance["connectors"]["input"]["position"]))
   330             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
   371             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
   331             connectors["output"].SetPosition(wxPoint(*instance["connectors"]["output"]["position"]))
   372             connectors["output"].SetPosition(wxPoint(*instance["connectors"]["output"]["position"]))
   332         elif instance["type"] == "coil":
   373         elif instance["type"] == "coil":
   346                 coil_type = COIL_RESET
   387                 coil_type = COIL_RESET
   347             else:
   388             else:
   348                 coil_type = COIL_NORMAL
   389                 coil_type = COIL_NORMAL
   349             coil = LD_Coil(self, coil_type, instance["name"], instance["id"])
   390             coil = LD_Coil(self, coil_type, instance["name"], instance["id"])
   350             coil.SetPosition(instance["x"], instance["y"])
   391             coil.SetPosition(instance["x"], instance["y"])
   351             self.Blocks.append(coil)
   392             self.AddBlock(coil)
   352             self.Elements.append(coil)
       
   353             connectors = coil.GetConnectors()
   393             connectors = coil.GetConnectors()
   354             connectors["input"].SetPosition(wxPoint(*instance["connectors"]["input"]["position"]))
   394             connectors["input"].SetPosition(wxPoint(*instance["connectors"]["input"]["position"]))
   355             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
   395             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
   356             connectors["output"].SetPosition(wxPoint(*instance["connectors"]["output"]["position"]))
   396             connectors["output"].SetPosition(wxPoint(*instance["connectors"]["output"]["position"]))
   357         elif instance["type"] == "step":
   397         elif instance["type"] == "step":
   360             else:
   400             else:
   361                 initial = False
   401                 initial = False
   362             step = SFC_Step(self, instance["name"], initial, instance["id"])
   402             step = SFC_Step(self, instance["name"], initial, instance["id"])
   363             step.SetPosition(instance["x"], instance["y"])
   403             step.SetPosition(instance["x"], instance["y"])
   364             step.SetSize(instance["width"], instance["height"])
   404             step.SetSize(instance["width"], instance["height"])
   365             self.Blocks.append(step)
   405             self.AddBlock(step)
   366             self.Elements.append(step)
       
   367             if "output" in instance["connectors"]:
   406             if "output" in instance["connectors"]:
   368                 step.AddOutput()
   407                 step.AddOutput()
   369             if "action" in instance["connectors"]:
   408             if "action" in instance["connectors"]:
   370                 step.AddAction()
   409                 step.AddAction()
   371             connectors = step.GetConnectors()
   410             connectors = step.GetConnectors()
   377             if connectors["action"]:
   416             if connectors["action"]:
   378                 connectors["action"].SetPosition(wxPoint(*instance["connectors"]["action"]["position"]))
   417                 connectors["action"].SetPosition(wxPoint(*instance["connectors"]["action"]["position"]))
   379         elif instance["type"] == "transition":
   418         elif instance["type"] == "transition":
   380             transition = SFC_Transition(self, instance["condition_type"], instance["condition"], instance["id"])
   419             transition = SFC_Transition(self, instance["condition_type"], instance["condition"], instance["id"])
   381             transition.SetPosition(instance["x"], instance["y"])
   420             transition.SetPosition(instance["x"], instance["y"])
   382             self.Blocks.append(transition)
   421             self.AddBlock(transition)
   383             self.Elements.append(transition)
       
   384             connectors = transition.GetConnectors()
   422             connectors = transition.GetConnectors()
   385             connectors["input"].SetPosition(wxPoint(*instance["connectors"]["input"]["position"]))
   423             connectors["input"].SetPosition(wxPoint(*instance["connectors"]["input"]["position"]))
   386             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
   424             self.CreateWires(connectors["input"], instance["connectors"]["input"]["links"], ids)
   387             connectors["output"].SetPosition(wxPoint(*instance["connectors"]["output"]["position"]))
   425             connectors["output"].SetPosition(wxPoint(*instance["connectors"]["output"]["position"]))
   388         elif instance["type"] in ["selectionDivergence", "selectionConvergence", "simultaneousDivergence", "simultaneousConvergence"]:
   426         elif instance["type"] in ["selectionDivergence", "selectionConvergence", "simultaneousDivergence", "simultaneousConvergence"]:
   398             else:
   436             else:
   399                 divergence = SFC_Divergence(self, SIMULTANEOUS_CONVERGENCE, 
   437                 divergence = SFC_Divergence(self, SIMULTANEOUS_CONVERGENCE, 
   400                     len(instance["connectors"]["inputs"]), instance["id"])
   438                     len(instance["connectors"]["inputs"]), instance["id"])
   401             divergence.SetPosition(instance["x"], instance["y"])
   439             divergence.SetPosition(instance["x"], instance["y"])
   402             divergence.SetSize(instance["width"], instance["height"])
   440             divergence.SetSize(instance["width"], instance["height"])
   403             self.Blocks.append(divergence)
   441             self.AddBlock(divergence)
   404             self.Elements.append(divergence)
       
   405             connectors = divergence.GetConnectors()
   442             connectors = divergence.GetConnectors()
   406             for i, input_connector in enumerate(instance["connectors"]["inputs"]):
   443             for i, input_connector in enumerate(instance["connectors"]["inputs"]):
   407                 connector = connectors["inputs"][i]
   444                 connector = connectors["inputs"][i]
   408                 connector.SetPosition(wxPoint(*input_connector["position"]))
   445                 connector.SetPosition(wxPoint(*input_connector["position"]))
   409                 self.CreateWires(connector, input_connector["links"], ids)
   446                 self.CreateWires(connector, input_connector["links"], ids)
   411                 connector = connectors["outputs"][i]
   448                 connector = connectors["outputs"][i]
   412                 connector.SetPosition(wxPoint(*output_connector["position"]))
   449                 connector.SetPosition(wxPoint(*output_connector["position"]))
   413         elif instance["type"] == "jump":
   450         elif instance["type"] == "jump":
   414             jump = SFC_Jump(self, instance["target"], instance["id"])
   451             jump = SFC_Jump(self, instance["target"], instance["id"])
   415             jump.SetPosition(instance["x"], instance["y"])
   452             jump.SetPosition(instance["x"], instance["y"])
   416             self.Blocks.append(jump)
   453             self.AddBlock(jump)
   417             self.Elements.append(jump)
       
   418             connector = jump.GetConnector()
   454             connector = jump.GetConnector()
   419             connector.SetPosition(wxPoint(*instance["connector"]["position"]))
   455             connector.SetPosition(wxPoint(*instance["connector"]["position"]))
   420             self.CreateWires(connector, instance["connector"]["links"], ids)
   456             self.CreateWires(connector, instance["connector"]["links"], ids)
   421         elif instance["type"] == "actionBlock":
   457         elif instance["type"] == "actionBlock":
   422             actionBlock = SFC_ActionBlock(self, instance["actions"], instance["id"])
   458             actionBlock = SFC_ActionBlock(self, instance["actions"], instance["id"])
   423             actionBlock.SetPosition(instance["x"], instance["y"])
   459             actionBlock.SetPosition(instance["x"], instance["y"])
   424             actionBlock.SetSize(instance["width"], instance["height"])
   460             actionBlock.SetSize(instance["width"], instance["height"])
   425             self.Blocks.append(actionBlock)
   461             self.AddBlock(actionBlock)
   426             self.Elements.append(actionBlock)
       
   427             connector = actionBlock.GetConnector()
   462             connector = actionBlock.GetConnector()
   428             connector.SetPosition(wxPoint(*instance["connector"]["position"]))
   463             connector.SetPosition(wxPoint(*instance["connector"]["position"]))
   429             self.CreateWires(connector, instance["connector"]["links"], ids)
   464             self.CreateWires(connector, instance["connector"]["links"], ids)
   430         else:
   465         else:
   431             if instance["name"] != None:
   466             if instance["name"] != None:
   432                 block = FBD_Block(self, instance["type"], instance["name"], instance["id"], len(instance["connectors"]["inputs"]))
   467                 block = FBD_Block(self, instance["type"], instance["name"], instance["id"], len(instance["connectors"]["inputs"]))
   433             else:
   468             else:
   434                 block = FBD_Block(self, instance["type"], "", instance["id"], len(instance["connectors"]["inputs"]))
   469                 block = FBD_Block(self, instance["type"], "", instance["id"], len(instance["connectors"]["inputs"]))
   435             block.SetPosition(instance["x"], instance["y"])
   470             block.SetPosition(instance["x"], instance["y"])
   436             block.SetSize(instance["width"], instance["height"])
   471             block.SetSize(instance["width"], instance["height"])
   437             self.Blocks.append(block)
   472             self.AddBlock(block)
   438             self.Elements.append(block)
       
   439             connectors = block.GetConnectors()
   473             connectors = block.GetConnectors()
   440             for i, input_connector in enumerate(instance["connectors"]["inputs"]):
   474             for i, input_connector in enumerate(instance["connectors"]["inputs"]):
   441                 connector = connectors["inputs"][i]
   475                 connector = connectors["inputs"][i]
   442                 connector.SetPosition(wxPoint(*input_connector["position"]))
   476                 connector.SetPosition(wxPoint(*input_connector["position"]))
   443                 if input_connector["negated"]:
   477                 if input_connector["negated"]:
   470                         wire.SetPoints(points)
   504                         wire.SetPoints(points)
   471                         start_connector.Connect((wire, 0), False)
   505                         start_connector.Connect((wire, 0), False)
   472                         end_connector.Connect((wire, -1), False)
   506                         end_connector.Connect((wire, -1), False)
   473                         wire.ConnectStartPoint(None, start_connector)
   507                         wire.ConnectStartPoint(None, start_connector)
   474                         wire.ConnectEndPoint(None, end_connector)
   508                         wire.ConnectEndPoint(None, end_connector)
   475                         self.Wires.append(wire)
   509                         self.AddWire(wire)
   476                         self.Elements.append(wire)
       
   477 
   510 
   478 #-------------------------------------------------------------------------------
   511 #-------------------------------------------------------------------------------
   479 #                          Search Element functions
   512 #                          Search Element functions
   480 #-------------------------------------------------------------------------------
   513 #-------------------------------------------------------------------------------
   481 
   514 
   493     
   526     
   494     def FindElement(self, pos, exclude_group = False):
   527     def FindElement(self, pos, exclude_group = False):
   495         if self.SelectedElement and not (exclude_group and isinstance(self.SelectedElement, Graphic_Group)):
   528         if self.SelectedElement and not (exclude_group and isinstance(self.SelectedElement, Graphic_Group)):
   496             if self.SelectedElement.HitTest(pos) or self.SelectedElement.TestHandle(pos) != (0, 0):
   529             if self.SelectedElement.HitTest(pos) or self.SelectedElement.TestHandle(pos) != (0, 0):
   497                 return self.SelectedElement
   530                 return self.SelectedElement
   498         for element in self.Elements:
   531         for element in self.GetElements():
   499             if element.HitTest(pos) or element.TestHandle(pos) != (0, 0):
   532             if element.HitTest(pos) or element.TestHandle(pos) != (0, 0):
   500                 return element
   533                 return element
   501         return None
   534         return None
   502     
   535     
   503     def FindBlockConnector(self, pos, exclude = True):
   536     def FindBlockConnector(self, pos, exclude = True):
   506             if result:
   539             if result:
   507                 return result
   540                 return result
   508         return None
   541         return None
   509     
   542     
   510     def FindElementById(self, id):
   543     def FindElementById(self, id):
   511         for element in self.Elements:
   544         for element in self.Blocks:
       
   545             if element.GetId() == id:
       
   546                 return element
       
   547         for element in self.Comments:
   512             if element.GetId() == id:
   548             if element.GetId() == id:
   513                 return element
   549                 return element
   514         return None
   550         return None
   515     
   551     
   516     def SearchElements(self, bbox):
   552     def SearchElements(self, bbox):
   517         elements = []
   553         elements = []
   518         for element in self.Elements:
   554         for element in self.GetElements():
   519             element_bbox = element.GetBoundingBox()
   555             if element.IsInSelection(bbox):
   520             if element_bbox.x >= bbox.x and element_bbox.y >= bbox.y and element_bbox.x + element_bbox.width <= bbox.x + bbox.width and element_bbox.y + element_bbox.height <= bbox.y + bbox.height:
       
   521                 elements.append(element)
   556                 elements.append(element)
   522         return elements
   557         return elements
   523 
   558 
   524 #-------------------------------------------------------------------------------
   559 #-------------------------------------------------------------------------------
   525 #                           Popup menu functions
   560 #                           Popup menu functions
   609 #-------------------------------------------------------------------------------
   644 #-------------------------------------------------------------------------------
   610 #                            Menu items functions
   645 #                            Menu items functions
   611 #-------------------------------------------------------------------------------
   646 #-------------------------------------------------------------------------------
   612 
   647 
   613     def OnNoModifierMenu(self, event):
   648     def OnNoModifierMenu(self, event):
   614         if self.SelectedElement and self.SelectedElement in self.Blocks:
   649         if self.SelectedElement and self.IsBlock(self.SelectedElement):
   615             self.SelectedElement.SetConnectorNegated(False)
   650             self.SelectedElement.SetConnectorNegated(False)
   616         event.Skip()
   651         event.Skip()
   617     
   652     
   618     def OnNegatedMenu(self, event):
   653     def OnNegatedMenu(self, event):
   619         if self.SelectedElement and self.SelectedElement in self.Blocks:
   654         if self.SelectedElement and self.IsBlock(self.SelectedElement):
   620             self.SelectedElement.SetConnectorNegated(True)
   655             self.SelectedElement.SetConnectorNegated(True)
   621         event.Skip()
   656         event.Skip()
   622 
   657 
   623     def OnRisingEdgeMenu(self, event):
   658     def OnRisingEdgeMenu(self, event):
   624         if self.SelectedElement and self.SelectedElement in self.Blocks:
   659         if self.SelectedElement and self.IsBlock(self.SelectedElement):
   625             self.SelectedElement.SetConnectorEdge("rising")
   660             self.SelectedElement.SetConnectorEdge("rising")
   626         event.Skip()
   661         event.Skip()
   627 
   662 
   628     def OnFallingEdgeMenu(self, event):
   663     def OnFallingEdgeMenu(self, event):
   629         if self.SelectedElement and self.SelectedElement in self.Blocks:
   664         if self.SelectedElement and self.IsBlock(self.SelectedElement):
   630             self.SelectedElement.SetConnectorEdge("falling")
   665             self.SelectedElement.SetConnectorEdge("falling")
   631         event.Skip()
   666         event.Skip()
   632 
   667 
   633     def OnAddSegmentMenu(self, event):
   668     def OnAddSegmentMenu(self, event):
   634         if self.SelectedElement and self.SelectedElement in self.Wires:
   669         if self.SelectedElement and self.IsBlock(self.SelectedElement):
   635             self.SelectedElement.AddSegment()
   670             self.SelectedElement.AddSegment()
   636         event.Skip()
   671         event.Skip()
   637 
   672 
   638     def OnDeleteSegmentMenu(self, event):
   673     def OnDeleteSegmentMenu(self, event):
   639         if self.SelectedElement and self.SelectedElement in self.Wires:
   674         if self.SelectedElement and self.IsBlock(self.SelectedElement):
   640             self.SelectedElement.DeleteSegment()
   675             self.SelectedElement.DeleteSegment()
   641         event.Skip()
   676         event.Skip()
   642 
   677 
   643     def OnAddBranchMenu(self, event):
   678     def OnAddBranchMenu(self, event):
   644         if self.SelectedElement and self.SelectedElement in self.Blocks:
   679         if self.SelectedElement and self.IsBlock(self.SelectedElement):
   645             self.AddDivergenceBranch(self.SelectedElement)
   680             self.AddDivergenceBranch(self.SelectedElement)
   646         event.Skip()
   681         event.Skip()
   647 
   682 
   648     def OnDeleteBranchMenu(self, event):
   683     def OnDeleteBranchMenu(self, event):
   649         if self.SelectedElement and self.SelectedElement in self.Blocks:
   684         if self.SelectedElement and self.IsBlock(self.SelectedElement):
   650             self.RemoveDivergenceBranch(self.SelectedElement)
   685             self.RemoveDivergenceBranch(self.SelectedElement)
   651         event.Skip()
   686         event.Skip()
   652 
   687 
   653     def OnDeleteMenu(self, event):
   688     def OnDeleteMenu(self, event):
   654         if self.SelectedElement:
   689         if self.SelectedElement:
   709                     wire = Wire(self, [wxPoint(pos.x, pos.y), WEST], [wxPoint(pos.x, pos.y), EAST])
   744                     wire = Wire(self, [wxPoint(pos.x, pos.y), WEST], [wxPoint(pos.x, pos.y), EAST])
   710                 wire.oldPos = pos
   745                 wire.oldPos = pos
   711                 wire.Handle = (HANDLE_POINT, 0)
   746                 wire.Handle = (HANDLE_POINT, 0)
   712                 wire.ProcessDragging(0, 0)
   747                 wire.ProcessDragging(0, 0)
   713                 wire.Handle = (HANDLE_POINT, 1)
   748                 wire.Handle = (HANDLE_POINT, 1)
   714                 self.Wires.append(wire)
   749                 self.AddWire(wire)
   715                 self.Elements.append(wire)
       
   716                 if self.SelectedElement:
   750                 if self.SelectedElement:
   717                     self.SelectedElement.SetSelected(False)
   751                     self.SelectedElement.SetSelected(False)
   718                 self.SelectedElement = wire
   752                 self.SelectedElement = wire
   719             elif self.SelectedElement:
   753             elif self.SelectedElement:
   720                 self.SelectedElement.SetSelected(False)
   754                 self.SelectedElement.SetSelected(False)
   765             self.SelectedElement.OnLeftUp(event, self.GetLogicalDC(), self.Scaling)
   799             self.SelectedElement.OnLeftUp(event, self.GetLogicalDC(), self.Scaling)
   766             wxCallAfter(self.SetCursor, wxNullCursor)
   800             wxCallAfter(self.SetCursor, wxNullCursor)
   767             self.ReleaseMouse()
   801             self.ReleaseMouse()
   768             self.Refresh()
   802             self.Refresh()
   769         elif self.Mode == MODE_WIRE and self.SelectedElement:
   803         elif self.Mode == MODE_WIRE and self.SelectedElement:
   770             dc = self.GetLogicalDC()
   804             if self.SelectedElement.EndConnected != None:
   771             pos = GetScaledEventPosition(event, dc, self.Scaling)
       
   772             connector = self.FindBlockConnector(pos, False)
       
   773             if connector and connector != self.SelectedElement.StartConnected:
       
   774                 self.SelectedElement.ResetPoints()
   805                 self.SelectedElement.ResetPoints()
   775                 self.SelectedElement.OnMotion(event, dc, self.Scaling)
   806                 self.SelectedElement.OnMotion(event, dc, self.Scaling)
   776                 self.SelectedElement.GeneratePoints()
   807                 self.SelectedElement.GeneratePoints()
   777                 self.SelectedElement.RefreshModel()
   808                 self.SelectedElement.RefreshModel()
   778                 self.SelectedElement.SetSelected(True)
   809                 self.SelectedElement.SetSelected(True)
   832                 move_window.y = -1
   863                 move_window.y = -1
   833             elif position.y > window_size[1] - SCROLL_ZONE:
   864             elif position.y > window_size[1] - SCROLL_ZONE:
   834                 move_window.y = 1
   865                 move_window.y = 1
   835             if move_window.x != 0 or move_window.y != 0:
   866             if move_window.x != 0 or move_window.y != 0:
   836                 self.Scroll(xstart + move_window.x, ystart + move_window.y)
   867                 self.Scroll(xstart + move_window.x, ystart + move_window.y)
   837             self.RefreshScrollBar()
   868             self.RefreshScrollBars()
   838         event.Skip()
   869         event.Skip()
   839 
   870 
   840 #-------------------------------------------------------------------------------
   871 #-------------------------------------------------------------------------------
   841 #                          Keyboard event functions
   872 #                          Keyboard event functions
   842 #-------------------------------------------------------------------------------
   873 #-------------------------------------------------------------------------------
   843 
   874 
   844     def OnChar(self, event):
   875     def OnChar(self, event):
       
   876         xpos, ypos = self.GetScrollPos(wxHORIZONTAL), self.GetScrollPos(wxVERTICAL)
       
   877         xmax = self.GetScrollRange(wxHORIZONTAL) - self.GetScrollThumb(wxHORIZONTAL)
       
   878         ymax = self.GetScrollRange(wxVERTICAL) - self.GetScrollThumb(wxVERTICAL)
   845         keycode = event.GetKeyCode()
   879         keycode = event.GetKeyCode()
   846         if self.Scaling:
   880         if self.Scaling:
   847             scaling = self.Scaling
   881             scaling = self.Scaling
   848         else:
   882         else:
   849             scaling = (8, 8)
   883             scaling = (8, 8)
   850         if keycode == WXK_DELETE and self.SelectedElement:
   884         if keycode == WXK_DELETE and self.SelectedElement:
   851             self.SelectedElement.Clean()
   885             self.SelectedElement.Clean()
   852             self.SelectedElement.Delete()
   886             self.SelectedElement.Delete()
   853             self.SelectedElement = None
   887             self.SelectedElement = None
   854         elif keycode == WXK_LEFT and self.SelectedElement:
   888         elif keycode == WXK_LEFT:
   855             self.SelectedElement.Move(-scaling[0], 0)
   889             if event.ControlDown() and event.ShiftDown():
   856         elif keycode == WXK_RIGHT and self.SelectedElement:
   890                 self.Scroll(0, ypos)
   857             self.SelectedElement.Move(scaling[0], 0)
   891             elif event.ControlDown():
   858         elif keycode == WXK_UP and self.SelectedElement:
   892                 self.Scroll(max(0, xpos - 1), ypos)
   859             self.SelectedElement.Move(0, -scaling[1])
   893             elif self.SelectedElement:
   860         elif keycode == WXK_DOWN and self.SelectedElement:
   894                 self.SelectedElement.Move(-scaling[0], 0)
   861             self.SelectedElement.Move(0, scaling[1])
   895         elif keycode == WXK_RIGHT:
       
   896             if event.ControlDown() and event.ShiftDown():
       
   897                 self.Scroll(xmax, ypos)
       
   898             elif event.ControlDown():
       
   899                 self.Scroll(min(xpos + 1, xmax), ypos)
       
   900             elif self.SelectedElement:
       
   901                 self.SelectedElement.Move(scaling[0], 0)
       
   902         elif keycode == WXK_UP:
       
   903             if event.ControlDown() and event.ShiftDown():
       
   904                 self.Scroll(xpos, 0)
       
   905             elif event.ControlDown():
       
   906                 self.Scroll(xpos, max(0, ypos - 1))
       
   907             elif self.SelectedElement:
       
   908                 self.SelectedElement.Move(0, -scaling[1])
       
   909         elif keycode == WXK_DOWN:
       
   910             if event.ControlDown() and event.ShiftDown():
       
   911                 self.Scroll(xpos, ymax)
       
   912             elif event.ControlDown():
       
   913                 self.Scroll(xpos, min(ypos + 1, ymax))
       
   914             elif self.SelectedElement:
       
   915                 self.SelectedElement.Move(0, scaling[1])
   862         self.Refresh()
   916         self.Refresh()
   863         event.Skip()
       
   864 
   917 
   865 #-------------------------------------------------------------------------------
   918 #-------------------------------------------------------------------------------
   866 #                          Model adding functions
   919 #                          Model adding functions
   867 #-------------------------------------------------------------------------------
   920 #-------------------------------------------------------------------------------
   868 
   921 
   877                 block = FBD_Block(self, values["type"], values["name"], id, values["extension"], values["inputs"])
   930                 block = FBD_Block(self, values["type"], values["name"], id, values["extension"], values["inputs"])
   878             else:
   931             else:
   879                 block = FBD_Block(self, values["type"], "", id, values["extension"], values["inputs"])
   932                 block = FBD_Block(self, values["type"], "", id, values["extension"], values["inputs"])
   880             block.SetPosition(bbox.x, bbox.y)
   933             block.SetPosition(bbox.x, bbox.y)
   881             block.SetSize(values["width"], values["height"])
   934             block.SetSize(values["width"], values["height"])
   882             self.Blocks.append(block)
   935             self.AddBlock(block)
   883             self.Elements.append(block)
       
   884             self.Controler.AddCurrentElementEditingBlock(id)
   936             self.Controler.AddCurrentElementEditingBlock(id)
   885             self.RefreshBlockModel(block)
   937             self.RefreshBlockModel(block)
       
   938             self.RefreshScrollBars()
   886             self.Refresh()
   939             self.Refresh()
   887         dialog.Destroy()
   940         dialog.Destroy()
   888     
   941     
   889     def AddNewVariable(self, bbox):
   942     def AddNewVariable(self, bbox):
   890         dialog = VariablePropertiesDialog(self.Parent)
   943         dialog = VariablePropertiesDialog(self.Parent)
   902             id = self.GetNewId()
   955             id = self.GetNewId()
   903             values = dialog.GetValues()
   956             values = dialog.GetValues()
   904             variable = FBD_Variable(self, values["type"], values["name"], values["value_type"], id)
   957             variable = FBD_Variable(self, values["type"], values["name"], values["value_type"], id)
   905             variable.SetPosition(bbox.x, bbox.y)
   958             variable.SetPosition(bbox.x, bbox.y)
   906             variable.SetSize(values["width"], values["height"])
   959             variable.SetSize(values["width"], values["height"])
   907             self.Blocks.append(variable)
   960             self.AddBlock(variable)
   908             self.Elements.append(variable)
       
   909             self.Controler.AddCurrentElementEditingVariable(id, values["type"])
   961             self.Controler.AddCurrentElementEditingVariable(id, values["type"])
   910             self.RefreshVariableModel(variable)
   962             self.RefreshVariableModel(variable)
       
   963             self.RefreshScrollBars()
   911             self.Refresh()
   964             self.Refresh()
   912         dialog.Destroy()
   965         dialog.Destroy()
   913 
   966 
   914     def AddNewConnection(self, bbox):
   967     def AddNewConnection(self, bbox):
   915         dialog = ConnectionPropertiesDialog(self.Parent)
   968         dialog = ConnectionPropertiesDialog(self.Parent)
   918             id = self.GetNewId()
   971             id = self.GetNewId()
   919             values = dialog.GetValues()
   972             values = dialog.GetValues()
   920             connection = FBD_Connector(self, values["type"], values["name"], id)
   973             connection = FBD_Connector(self, values["type"], values["name"], id)
   921             connection.SetPosition(bbox.x, bbox.y)
   974             connection.SetPosition(bbox.x, bbox.y)
   922             connection.SetSize(values["width"], values["height"])
   975             connection.SetSize(values["width"], values["height"])
   923             self.Blocks.append(connection)
   976             self.AddBlock(connection)
   924             self.Elements.append(connection)
       
   925             self.Controler.AddCurrentElementEditingConnection(id, values["type"])
   977             self.Controler.AddCurrentElementEditingConnection(id, values["type"])
   926             self.RefreshConnectionModel(connection)
   978             self.RefreshConnectionModel(connection)
       
   979             self.RefreshScrollBars()
   927             self.Refresh()
   980             self.Refresh()
   928         dialog.Destroy()
   981         dialog.Destroy()
   929 
   982 
   930     def AddNewComment(self, bbox):
   983     def AddNewComment(self, bbox):
   931         dialog = wxTextEntryDialog(self.Parent, "Add a new comment", "Please enter comment text", "", wxOK|wxCANCEL|wxTE_MULTILINE)
   984         dialog = wxTextEntryDialog(self.Parent, "Add a new comment", "Please enter comment text", "", wxOK|wxCANCEL|wxTE_MULTILINE)
   934             id = self.GetNewId()
   987             id = self.GetNewId()
   935             comment = Comment(self, value, id)
   988             comment = Comment(self, value, id)
   936             comment.SetPosition(bbox.x, bbox.y)
   989             comment.SetPosition(bbox.x, bbox.y)
   937             min_width, min_height = comment.GetMinSize()
   990             min_width, min_height = comment.GetMinSize()
   938             comment.SetSize(max(min_width,bbox.width),max(min_height,bbox.height))
   991             comment.SetSize(max(min_width,bbox.width),max(min_height,bbox.height))
   939             self.Elements.append(comment)
   992             self.AddComment(comment)
   940             self.Controler.AddCurrentElementEditingComment(id)
   993             self.Controler.AddCurrentElementEditingComment(id)
   941             self.RefreshCommentModel(comment)
   994             self.RefreshCommentModel(comment)
       
   995             self.RefreshScrollBars()
   942             self.Refresh()
   996             self.Refresh()
   943         dialog.Destroy()
   997         dialog.Destroy()
   944 
   998 
   945     def AddNewContact(self, bbox):
   999     def AddNewContact(self, bbox):
   946         dialog = LDElementDialog(self.Parent, "contact")
  1000         dialog = LDElementDialog(self.Parent, "contact")
   957             id = self.GetNewId()
  1011             id = self.GetNewId()
   958             values = dialog.GetValues()
  1012             values = dialog.GetValues()
   959             contact = LD_Contact(self, values["type"], values["name"], id)
  1013             contact = LD_Contact(self, values["type"], values["name"], id)
   960             contact.SetPosition(bbox.x, bbox.y)
  1014             contact.SetPosition(bbox.x, bbox.y)
   961             contact.SetSize(values["width"], values["height"])
  1015             contact.SetSize(values["width"], values["height"])
   962             self.Blocks.append(contact)
  1016             self.AddBlock(contact)
   963             self.Elements.append(contact)
       
   964             self.Controler.AddCurrentElementEditingContact(id)
  1017             self.Controler.AddCurrentElementEditingContact(id)
   965             self.RefreshContactModel(contact)
  1018             self.RefreshContactModel(contact)
       
  1019             self.RefreshScrollBars()
   966             self.Refresh()
  1020             self.Refresh()
   967         dialog.Destroy()
  1021         dialog.Destroy()
   968 
  1022 
   969     def AddNewCoil(self, bbox):
  1023     def AddNewCoil(self, bbox):
   970         dialog = LDElementDialog(self.Parent, "coil")
  1024         dialog = LDElementDialog(self.Parent, "coil")
   984             id = self.GetNewId()
  1038             id = self.GetNewId()
   985             values = dialog.GetValues()
  1039             values = dialog.GetValues()
   986             coil = LD_Coil(self, values["type"], values["name"], id)
  1040             coil = LD_Coil(self, values["type"], values["name"], id)
   987             coil.SetPosition(bbox.x, bbox.y)
  1041             coil.SetPosition(bbox.x, bbox.y)
   988             coil.SetSize(values["width"], values["height"])
  1042             coil.SetSize(values["width"], values["height"])
   989             self.Blocks.append(coil)
  1043             self.AddBlock(coil)
   990             self.Elements.append(coil)
       
   991             self.Controler.AddCurrentElementEditingCoil(id)
  1044             self.Controler.AddCurrentElementEditingCoil(id)
   992             self.RefreshCoilModel(contact)
  1045             self.RefreshCoilModel(contact)
       
  1046             self.RefreshScrollBars()
   993             self.Refresh()
  1047             self.Refresh()
   994         dialog.Destroy()
  1048         dialog.Destroy()
   995 
  1049 
   996     def AddNewPowerRail(self, bbox):
  1050     def AddNewPowerRail(self, bbox):
   997         dialog = LDPowerRailDialog(self.Parent)
  1051         dialog = LDPowerRailDialog(self.Parent)
  1000             id = self.GetNewId()
  1054             id = self.GetNewId()
  1001             values = dialog.GetValues()
  1055             values = dialog.GetValues()
  1002             powerrail = LD_PowerRail(self, values["type"], id, [True for i in xrange(values["number"])])
  1056             powerrail = LD_PowerRail(self, values["type"], id, [True for i in xrange(values["number"])])
  1003             powerrail.SetPosition(bbox.x, bbox.y)
  1057             powerrail.SetPosition(bbox.x, bbox.y)
  1004             powerrail.SetSize(values["width"], values["height"])
  1058             powerrail.SetSize(values["width"], values["height"])
  1005             self.Blocks.append(powerrail)
  1059             self.AddBlock(powerrail)
  1006             self.Elements.append(powerrail)
       
  1007             self.Controler.AddCurrentElementEditingPowerRail(id, values["type"])
  1060             self.Controler.AddCurrentElementEditingPowerRail(id, values["type"])
  1008             self.RefreshPowerRailModel(powerrail)
  1061             self.RefreshPowerRailModel(powerrail)
       
  1062             self.RefreshScrollBars()
  1009             self.Refresh()
  1063             self.Refresh()
  1010         dialog.Destroy()
  1064         dialog.Destroy()
  1011 
  1065 
  1012     def AddNewTransition(self, bbox):
  1066     def AddNewTransition(self, bbox):
  1013         dialog = TransitionContentDialog(self.Parent)
  1067         dialog = TransitionContentDialog(self.Parent)
  1017             values = dialog.GetValues()
  1071             values = dialog.GetValues()
  1018             transition = SFC_Transition(self, values["type"], values["value"], id)
  1072             transition = SFC_Transition(self, values["type"], values["value"], id)
  1019             transition.SetPosition(bbox.x, bbox.y)
  1073             transition.SetPosition(bbox.x, bbox.y)
  1020             min_width, min_height = transition.GetMinSize()
  1074             min_width, min_height = transition.GetMinSize()
  1021             transition.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
  1075             transition.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
  1022             self.Blocks.append(transition)
  1076             self.AddBlock(transition)
  1023             self.Elements.append(transition)
       
  1024             self.Controler.AddCurrentElementEditingTransition(id)
  1077             self.Controler.AddCurrentElementEditingTransition(id)
  1025             self.RefreshTransitionModel(transition)
  1078             self.RefreshTransitionModel(transition)
       
  1079             self.RefreshScrollBars()
  1026             self.Refresh()
  1080             self.Refresh()
  1027         dialog.Destroy()
  1081         dialog.Destroy()
  1028 
  1082 
  1029     def AddNewDivergence(self, bbox):
  1083     def AddNewDivergence(self, bbox):
  1030         dialog = DivergenceCreateDialog(self.Parent)
  1084         dialog = DivergenceCreateDialog(self.Parent)
  1034             values = dialog.GetValues()
  1088             values = dialog.GetValues()
  1035             divergence = SFC_Divergence(self, values["type"], values["number"], id)
  1089             divergence = SFC_Divergence(self, values["type"], values["number"], id)
  1036             divergence.SetPosition(bbox.x, bbox.y)
  1090             divergence.SetPosition(bbox.x, bbox.y)
  1037             min_width, min_height = divergence.GetMinSize()
  1091             min_width, min_height = divergence.GetMinSize()
  1038             divergence.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
  1092             divergence.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
  1039             self.Blocks.append(divergence)
  1093             self.AddBlock(divergence)
  1040             self.Elements.append(divergence)
       
  1041             self.Controler.AddCurrentElementEditingDivergence(id, values["type"])
  1094             self.Controler.AddCurrentElementEditingDivergence(id, values["type"])
  1042             self.RefreshDivergenceModel(divergence)
  1095             self.RefreshDivergenceModel(divergence)
       
  1096             self.RefreshScrollBars()
  1043             self.Refresh()
  1097             self.Refresh()
  1044         dialog.Destroy()
  1098         dialog.Destroy()
  1045 
  1099 
  1046 
  1100 
  1047 #-------------------------------------------------------------------------------
  1101 #-------------------------------------------------------------------------------
  1060             if "name" in values:
  1114             if "name" in values:
  1061                 block.SetName(values["name"])
  1115                 block.SetName(values["name"])
  1062             block.SetSize(values["width"], values["height"])
  1116             block.SetSize(values["width"], values["height"])
  1063             block.SetType(values["type"], values["extension"])
  1117             block.SetType(values["type"], values["extension"])
  1064             self.RefreshBlockModel(block)
  1118             self.RefreshBlockModel(block)
       
  1119             self.RefreshScrollBars()
  1065             self.Refresh()
  1120             self.Refresh()
  1066         dialog.Destroy()
  1121         dialog.Destroy()
  1067 
  1122 
  1068     def EditVariableContent(self, variable):
  1123     def EditVariableContent(self, variable):
  1069         dialog = VariablePropertiesDialog(self.Parent)
  1124         dialog = VariablePropertiesDialog(self.Parent)
  1088             if old_type != values["type"]:
  1143             if old_type != values["type"]:
  1089                 id = variable.GetId()
  1144                 id = variable.GetId()
  1090                 self.Controler.RemoveCurrentElementEditingInstance(id)
  1145                 self.Controler.RemoveCurrentElementEditingInstance(id)
  1091                 self.Controler.AddCurrentElementEditingVariable(id, values["type"])
  1146                 self.Controler.AddCurrentElementEditingVariable(id, values["type"])
  1092             self.RefreshVariableModel(variable)
  1147             self.RefreshVariableModel(variable)
       
  1148             self.RefreshScrollBars()
  1093             self.Refresh()
  1149             self.Refresh()
  1094         dialog.Destroy()
  1150         dialog.Destroy()
  1095 
  1151 
  1096     def EditConnectionContent(self, connection):
  1152     def EditConnectionContent(self, connection):
  1097         dialog = ConnectionPropertiesDialog(self.Parent)
  1153         dialog = ConnectionPropertiesDialog(self.Parent)
  1107             if old_type != values["type"]:
  1163             if old_type != values["type"]:
  1108                 id = connection.GetId()
  1164                 id = connection.GetId()
  1109                 self.Controler.RemoveCurrentElementEditingInstance(id)
  1165                 self.Controler.RemoveCurrentElementEditingInstance(id)
  1110                 self.Controler.AddCurrentElementEditingConnection(id, values["type"])
  1166                 self.Controler.AddCurrentElementEditingConnection(id, values["type"])
  1111             self.RefreshConnectionModel(connection)
  1167             self.RefreshConnectionModel(connection)
       
  1168             self.RefreshScrollBars()
  1112             self.Refresh()
  1169             self.Refresh()
  1113         dialog.Destroy()
  1170         dialog.Destroy()
  1114 
  1171 
  1115     def EditContactContent(self, contact):
  1172     def EditContactContent(self, contact):
  1116         dialog = LDElementDialog(self.Parent, "contact")
  1173         dialog = LDElementDialog(self.Parent, "contact")
  1128             values = dialog.GetValues()
  1185             values = dialog.GetValues()
  1129             contact.SetName(values["name"])
  1186             contact.SetName(values["name"])
  1130             contact.SetType(values["type"])
  1187             contact.SetType(values["type"])
  1131             contact.SetSize(values["width"], values["height"])
  1188             contact.SetSize(values["width"], values["height"])
  1132             self.RefreshContactModel(contact)
  1189             self.RefreshContactModel(contact)
       
  1190             self.RefreshScrollBars()
  1133             self.Refresh()
  1191             self.Refresh()
  1134         dialog.Destroy()
  1192         dialog.Destroy()
  1135 
  1193 
  1136     def EditCoilContent(self, coil):
  1194     def EditCoilContent(self, coil):
  1137         dialog = LDElementDialog(self.Parent, "coil")
  1195         dialog = LDElementDialog(self.Parent, "coil")
  1152             values = dialog.GetValues()
  1210             values = dialog.GetValues()
  1153             coil.SetName(values["name"])
  1211             coil.SetName(values["name"])
  1154             coil.SetType(values["type"])
  1212             coil.SetType(values["type"])
  1155             coil.SetSize(values["width"], values["height"])
  1213             coil.SetSize(values["width"], values["height"])
  1156             self.RefreshContactModel(coil)
  1214             self.RefreshContactModel(coil)
       
  1215             self.RefreshScrollBars()
  1157             self.Refresh()
  1216             self.Refresh()
  1158         dialog.Destroy()
  1217         dialog.Destroy()
  1159 
  1218 
  1160     def EditPowerRailContent(self, powerrail):
  1219     def EditPowerRailContent(self, powerrail):
  1161         dialog = LDPowerRailDialog(self.Parent, powerrail.GetType(), len(powerrail.GetConnectors()))
  1220         dialog = LDPowerRailDialog(self.Parent, powerrail.GetType(), len(powerrail.GetConnectors()))
  1168             if old_type != values["type"]:
  1227             if old_type != values["type"]:
  1169                 id = powerrail.GetId()
  1228                 id = powerrail.GetId()
  1170                 self.Controler.RemoveCurrentElementEditingInstance(id)
  1229                 self.Controler.RemoveCurrentElementEditingInstance(id)
  1171                 self.Controler.AddCurrentElementEditingPowerRail(id, values["type"])
  1230                 self.Controler.AddCurrentElementEditingPowerRail(id, values["type"])
  1172             self.RefreshPowerRailModel(powerrail)
  1231             self.RefreshPowerRailModel(powerrail)
       
  1232             self.RefreshScrollBars()
  1173             self.Refresh()
  1233             self.Refresh()
  1174         dialog.Destroy()
  1234         dialog.Destroy()
  1175 
  1235 ##
  1176 
  1236 ##
  1177     def AddNewTransition(self, bbox):
  1237 ##    def AddNewTransition(self, bbox):
  1178         dialog = TransitionContentDialog(self.Parent)
  1238 ##        dialog = TransitionContentDialog(self.Parent)
  1179         dialog.SetTransitions(self.Controler.GetCurrentElementEditingTransitions())
  1239 ##        dialog.SetTransitions(self.Controler.GetCurrentElementEditingTransitions())
  1180         if dialog.ShowModal() == wxID_OK:
  1240 ##        if dialog.ShowModal() == wxID_OK:
  1181             id = self.GetNewId()
  1241 ##            id = self.GetNewId()
  1182             values = dialog.GetValues()
  1242 ##            values = dialog.GetValues()
  1183             transition = SFC_Transition(self, values["type"], values["value"], id)
  1243 ##            transition = SFC_Transition(self, values["type"], values["value"], id)
  1184             transition.SetPosition(bbox.x, bbox.y)
  1244 ##            transition.SetPosition(bbox.x, bbox.y)
  1185             min_width, min_height = transition.GetMinSize()
  1245 ##            min_width, min_height = transition.GetMinSize()
  1186             transition.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
  1246 ##            transition.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
  1187             self.Blocks.append(transition)
  1247 ##            self.Blocks.append(transition)
  1188             self.Elements.append(transition)
  1248 ##            self.Elements.append(transition)
  1189             self.Controler.AddCurrentElementEditingTransition(id)
  1249 ##            self.Controler.AddCurrentElementEditingTransition(id)
  1190             self.RefreshTransitionModel(transition)
  1250 ##            self.RefreshTransitionModel(transition)
  1191             self.Refresh()
  1251 ##            self.RefreshScrollBars()
  1192         dialog.Destroy()
  1252 ##            self.Refresh()
  1193 
  1253 ##        dialog.Destroy()
  1194     def AddNewDivergence(self, bbox):
  1254 ##
  1195         dialog = DivergenceCreateDialog(self.Parent)
  1255 ##    def AddNewDivergence(self, bbox):
  1196         dialog.SetMinSize((bbox.width, bbox.height))
  1256 ##        dialog = DivergenceCreateDialog(self.Parent)
  1197         if dialog.ShowModal() == wxID_OK:
  1257 ##        dialog.SetMinSize((bbox.width, bbox.height))
  1198             id = self.GetNewId()
  1258 ##        if dialog.ShowModal() == wxID_OK:
  1199             values = dialog.GetValues()
  1259 ##            id = self.GetNewId()
  1200             divergence = SFC_Divergence(self, values["type"], values["number"], id)
  1260 ##            values = dialog.GetValues()
  1201             divergence.SetPosition(bbox.x, bbox.y)
  1261 ##            divergence = SFC_Divergence(self, values["type"], values["number"], id)
  1202             min_width, min_height = divergence.GetMinSize()
  1262 ##            divergence.SetPosition(bbox.x, bbox.y)
  1203             divergence.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
  1263 ##            min_width, min_height = divergence.GetMinSize()
  1204             self.Blocks.append(divergence)
  1264 ##            divergence.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
  1205             self.Elements.append(divergence)
  1265 ##            self.Blocks.append(divergence)
  1206             self.Controler.AddCurrentElementEditingDivergence(id, values["type"])
  1266 ##            self.Elements.append(divergence)
  1207             self.RefreshDivergenceModel(divergence)
  1267 ##            self.Controler.AddCurrentElementEditingDivergence(id, values["type"])
  1208             self.Refresh()
  1268 ##            self.RefreshDivergenceModel(divergence)
  1209         dialog.Destroy()
  1269 ##            self.RefreshScrollBars()
       
  1270 ##            self.Refresh()
       
  1271 ##        dialog.Destroy()
  1210 
  1272 
  1211 #-------------------------------------------------------------------------------
  1273 #-------------------------------------------------------------------------------
  1212 #                          Model update functions
  1274 #                          Model update functions
  1213 #-------------------------------------------------------------------------------
  1275 #-------------------------------------------------------------------------------
  1214 
  1276 
  1333         for output in block.GetConnectors()["outputs"]:
  1395         for output in block.GetConnectors()["outputs"]:
  1334             for element in output.GetConnectedBlocks():
  1396             for element in output.GetConnectedBlocks():
  1335                 if element not in elements:
  1397                 if element not in elements:
  1336                     elements.append(element)
  1398                     elements.append(element)
  1337         block.Clean()
  1399         block.Clean()
  1338         self.Blocks.remove(block)
  1400         self.RemoveBlock(block)
  1339         self.Elements.remove(block)
       
  1340         self.Controler.RemoveCurrentElementEditingInstance(block.GetId())
  1401         self.Controler.RemoveCurrentElementEditingInstance(block.GetId())
  1341         for element in elements:
  1402         for element in elements:
  1342             element.RefreshModel()
  1403             element.RefreshModel()
  1343 
  1404 
  1344     def DeleteVariable(self, variable):
  1405     def DeleteVariable(self, variable):
  1346         if connectors["output"]:
  1407         if connectors["output"]:
  1347             elements = connectors["output"].GetConnectedBlocks()
  1408             elements = connectors["output"].GetConnectedBlocks()
  1348         else:
  1409         else:
  1349             elements = []
  1410             elements = []
  1350         variable.Clean()
  1411         variable.Clean()
  1351         self.Blocks.remove(variable)
  1412         self.RemoveBlock(variable)
  1352         self.Elements.remove(variable)
       
  1353         self.Controler.RemoveCurrentElementEditingInstance(variable.GetId())
  1413         self.Controler.RemoveCurrentElementEditingInstance(variable.GetId())
  1354         for element in elements:
  1414         for element in elements:
  1355             element.RefreshModel()
  1415             element.RefreshModel()
  1356 
  1416 
  1357     def DeleteConnection(self, connection):
  1417     def DeleteConnection(self, connection):
  1358         if connection.GetType() == CONTINUATION:
  1418         if connection.GetType() == CONTINUATION:
  1359             elements = connection.GetConnector().GetConnectedBlocks()
  1419             elements = connection.GetConnector().GetConnectedBlocks()
  1360         else:
  1420         else:
  1361             elements = []
  1421             elements = []
  1362         connection.Clean()
  1422         connection.Clean()
  1363         self.Blocks.remove(connection)
  1423         self.RemoveBlock(connection)
  1364         self.Elements.remove(connection)
       
  1365         self.Controler.RemoveCurrentElementEditingInstance(connection.GetId())
  1424         self.Controler.RemoveCurrentElementEditingInstance(connection.GetId())
  1366         for element in elements:
  1425         for element in elements:
  1367             element.RefreshModel()
  1426             element.RefreshModel()
  1368 
  1427 
  1369     def DeleteComment(self, comment):
  1428     def DeleteComment(self, comment):
  1370         self.Elements.remove(comment)
  1429         self.RemoveComment(comment)
  1371         self.Controler.RemoveCurrentElementEditingInstance(comment.GetId())
  1430         self.Controler.RemoveCurrentElementEditingInstance(comment.GetId())
  1372 
  1431 
  1373     def DeleteWire(self, wire):
  1432     def DeleteWire(self, wire):
  1374         if wire in self.Wires:
  1433         if wire in self.Wires:
  1375             connected = wire.GetConnected()
  1434             connected = wire.GetConnected()
  1376             wire.Clean()
  1435             wire.Clean()
  1377             self.Wires.remove(wire)
  1436             self.RemoveWire(wire)
  1378             self.Elements.remove(wire)
       
  1379             for connector in connected:
  1437             for connector in connected:
  1380                 connector.RefreshParentBlock()
  1438                 connector.RefreshParentBlock()
  1381 
  1439 
  1382     def DeleteContact(self, contact):
  1440     def DeleteContact(self, contact):
  1383         connectors = contact.GetConnectors()
  1441         connectors = contact.GetConnectors()
  1384         elements = connectors["output"].GetConnectedBlocks()
  1442         elements = connectors["output"].GetConnectedBlocks()
  1385         contact.Clean()
  1443         contact.Clean()
  1386         self.Blocks.remove(contact)
  1444         self.RemoveBlock(contact)
  1387         self.Elements.remove(contact)
       
  1388         self.Controler.RemoveCurrentElementEditingInstance(contact.GetId())
  1445         self.Controler.RemoveCurrentElementEditingInstance(contact.GetId())
  1389         for element in elements:
  1446         for element in elements:
  1390             element.RefreshModel()
  1447             element.RefreshModel()
  1391 
  1448 
  1392     def DeleteCoil(self, coil):
  1449     def DeleteCoil(self, coil):
  1393         connectors = coil.GetConnectors()
  1450         connectors = coil.GetConnectors()
  1394         elements = connectors["output"].GetConnectedBlocks()
  1451         elements = connectors["output"].GetConnectedBlocks()
  1395         coil.Clean()
  1452         coil.Clean()
  1396         self.Blocks.remove(coil)
  1453         self.RemoveBlock(coil)
  1397         self.Elements.remove(coil)
       
  1398         self.Controler.RemoveCurrentElementEditingInstance(coil.GetId())
  1454         self.Controler.RemoveCurrentElementEditingInstance(coil.GetId())
  1399         for element in elements:
  1455         for element in elements:
  1400             element.RefreshModel()
  1456             element.RefreshModel()
  1401 
  1457 
  1402     def DeletePowerRail(self, powerrail):
  1458     def DeletePowerRail(self, powerrail):
  1405             for connector in powerrail.GetConnectors():
  1461             for connector in powerrail.GetConnectors():
  1406                 for element in connector.GetConnectedBlocks():
  1462                 for element in connector.GetConnectedBlocks():
  1407                     if element not in elements:
  1463                     if element not in elements:
  1408                         elements.append(element)
  1464                         elements.append(element)
  1409         powerrrail.Clean()
  1465         powerrrail.Clean()
  1410         self.Blocks.remove(powerrrail)
  1466         self.RemoveBlock(powerrrail)
  1411         self.Elements.remove(powerrrail)
       
  1412         self.Controler.RemoveCurrentElementEditingInstance(powerrrail.GetId())
  1467         self.Controler.RemoveCurrentElementEditingInstance(powerrrail.GetId())
  1413         for element in elements:
  1468         for element in elements:
  1414             element.RefreshModel()
  1469             element.RefreshModel()
  1415 
  1470 
  1416     def DeleteStep(self, step):
  1471     def DeleteStep(self, step):
  1423         if connectors["action"]:
  1478         if connectors["action"]:
  1424             for element in connectors["action"].GetConnectedBlocks():
  1479             for element in connectors["action"].GetConnectedBlocks():
  1425                 if element not in elements:
  1480                 if element not in elements:
  1426                     elements.append(element)
  1481                     elements.append(element)
  1427         step.Clean()
  1482         step.Clean()
  1428         self.Blocks.remove(step)
  1483         self.RemoveBlock(step)
  1429         self.Elements.remove(step)
       
  1430         self.Controler.RemoveCurrentElementEditingInstance(step.GetId())
  1484         self.Controler.RemoveCurrentElementEditingInstance(step.GetId())
  1431         for element in elements:
  1485         for element in elements:
  1432             element.RefreshModel()
  1486             element.RefreshModel()
  1433             
  1487             
  1434     def DeleteTransition(self, transition):
  1488     def DeleteTransition(self, transition):
  1437         if connectors["output"]:
  1491         if connectors["output"]:
  1438             for element in connectors["output"].GetConnectedBlocks():
  1492             for element in connectors["output"].GetConnectedBlocks():
  1439                 if element not in elements:
  1493                 if element not in elements:
  1440                     elements.append(element)
  1494                     elements.append(element)
  1441         transition.Clean()
  1495         transition.Clean()
  1442         self.Blocks.remove(transition)
  1496         self.RemoveBlock(transition)
  1443         self.Elements.remove(transition)
       
  1444         self.Controler.RemoveCurrentElementEditingInstance(transition.GetId())
  1497         self.Controler.RemoveCurrentElementEditingInstance(transition.GetId())
  1445         for element in elements:
  1498         for element in elements:
  1446             element.RefreshModel()
  1499             element.RefreshModel()
  1447 
  1500 
  1448     def DeleteDivergence(self, divergence):
  1501     def DeleteDivergence(self, divergence):
  1451         for output in connectors["outputs"]:
  1504         for output in connectors["outputs"]:
  1452             for element in output.GetConnectedBlocks():
  1505             for element in output.GetConnectedBlocks():
  1453                 if element not in elements:
  1506                 if element not in elements:
  1454                     elements.append(element)
  1507                     elements.append(element)
  1455         divergence.Clean()
  1508         divergence.Clean()
  1456         self.Blocks.remove(divergence)
  1509         self.RemoveBlock(divergence)
  1457         self.Elements.remove(divergence)
       
  1458         self.Controler.RemoveCurrentElementEditingInstance(divergence.GetId())
  1510         self.Controler.RemoveCurrentElementEditingInstance(divergence.GetId())
  1459         for element in elements:
  1511         for element in elements:
  1460             element.RefreshModel()
  1512             element.RefreshModel()
  1461     
  1513     
  1462     def DeleteJump(self, jump):
  1514     def DeleteJump(self, jump):
  1463         jump.Clean()
  1515         jump.Clean()
  1464         self.Blocks.remove(jump)
  1516         self.RemoveBlock(jump)
  1465         self.Elements.remove(jump)
       
  1466         self.Controler.RemoveCurrentElementEditingInstance(jump.GetId())
  1517         self.Controler.RemoveCurrentElementEditingInstance(jump.GetId())
  1467     
  1518     
  1468     def DeleteActionBlock(self, actionblock):
  1519     def DeleteActionBlock(self, actionblock):
  1469         actionblock.Clean()
  1520         actionblock.Clean()
  1470         self.Blocks.remove(actionblock)
  1521         self.RemoveBlock(actionblock)
  1471         self.Elements.remove(actionblock)
       
  1472         self.Controler.RemoveCurrentElementEditingInstance(actionblock.GetId())
  1522         self.Controler.RemoveCurrentElementEditingInstance(actionblock.GetId())
  1473 
  1523 
  1474 
  1524 
  1475 #-------------------------------------------------------------------------------
  1525 #-------------------------------------------------------------------------------
  1476 #                            Editing functions
  1526 #                            Editing functions
  1488 #-------------------------------------------------------------------------------
  1538 #-------------------------------------------------------------------------------
  1489 #                            Drawing functions
  1539 #                            Drawing functions
  1490 #-------------------------------------------------------------------------------
  1540 #-------------------------------------------------------------------------------
  1491 
  1541 
  1492     def OnMoveWindow(self, event):
  1542     def OnMoveWindow(self, event):
  1493         self.RefreshScrollBar()
  1543         self.RefreshScrollBars()
  1494         event.Skip()
  1544         event.Skip()
  1495 
  1545 
  1496     def OnPaint(self, event):
  1546     def OnPaint(self, event):
  1497         dc = self.GetLogicalDC()
  1547         dc = self.GetLogicalDC()
  1498         dc.Clear()
  1548         dc.Clear()
  1501             width, height = dc.GetSize()
  1551             width, height = dc.GetSize()
  1502             for i in xrange(1, width / self.Scaling[0] + 1):
  1552             for i in xrange(1, width / self.Scaling[0] + 1):
  1503                 dc.DrawLine(i * self.Scaling[0], 0, i * self.Scaling[0], height)
  1553                 dc.DrawLine(i * self.Scaling[0], 0, i * self.Scaling[0], height)
  1504             for i in xrange(1, height / self.Scaling[1] + 1):
  1554             for i in xrange(1, height / self.Scaling[1] + 1):
  1505                 dc.DrawLine(0, i * self.Scaling[1], width, i * self.Scaling[1])
  1555                 dc.DrawLine(0, i * self.Scaling[1], width, i * self.Scaling[1])
       
  1556         for comment in self.Comments:
       
  1557             if comment != self.SelectedElement:
       
  1558                 comment.Draw(dc)
  1506         for wire in self.Wires:
  1559         for wire in self.Wires:
  1507             if wire != self.SelectedElement:
  1560             if wire != self.SelectedElement:
  1508                 wire.Draw(dc)
  1561                 wire.Draw(dc)
  1509         for element in self.Elements:
  1562         for block in self.Blocks:
  1510             if element not in self.Wires and element != self.SelectedElement:
  1563             if block != self.SelectedElement:
  1511                 element.Draw(dc)
  1564                 block.Draw(dc)
  1512         if self.SelectedElement:
  1565         if self.SelectedElement:
  1513             self.SelectedElement.Draw(dc)
  1566             self.SelectedElement.Draw(dc)
  1514         if self.rubberBand.IsShown():
  1567         if self.rubberBand.IsShown():
  1515             self.rubberBand.Draw()
  1568             self.rubberBand.Draw()
  1516         event.Skip()
  1569         event.Skip()