editors/LDViewer.py
changeset 1847 6198190bc121
parent 1832 0f1081928d65
child 1850 614396cbffbf
equal deleted inserted replaced
1846:14b40afccd69 1847:6198190bc121
    43                 if "inputs" in connectors:
    43                 if "inputs" in connectors:
    44                     input_connectors = connectors["inputs"]
    44                     input_connectors = connectors["inputs"]
    45                 if "input" in connectors:
    45                 if "input" in connectors:
    46                     input_connectors = [connectors["input"]]
    46                     input_connectors = [connectors["input"]]
    47             for connector in input_connectors:
    47             for connector in input_connectors:
    48                 for wire, handle in connector.GetWires():
    48                 for wire, _handle in connector.GetWires():
    49                     next = wire.EndConnected.GetParentBlock()
    49                     next = wire.EndConnected.GetParentBlock()
    50                     if not isinstance(next, LD_PowerRail) and next not in block_list:
    50                     if not isinstance(next, LD_PowerRail) and next not in block_list:
    51                         block_list.append(next)
    51                         block_list.append(next)
    52                         next_list.append(next)
    52                         next_list.append(next)
    53         current_list = next_list
    53         current_list = next_list
   114             if "inputs" in connectors:
   114             if "inputs" in connectors:
   115                 input_connectors = connectors["inputs"]
   115                 input_connectors = connectors["inputs"]
   116             if "input" in connectors:
   116             if "input" in connectors:
   117                 input_connectors = [connectors["input"]]
   117                 input_connectors = [connectors["input"]]
   118         for connector in input_connectors:
   118         for connector in input_connectors:
   119             for wire, handle in connector.GetWires():
   119             for wire, _handle in connector.GetWires():
   120                 next = wire.EndConnected.GetParentBlock()
   120                 next = wire.EndConnected.GetParentBlock()
   121                 if isinstance(next, LD_PowerRail) and next.GetType() == LEFTRAIL or next in stop_list:
   121                 if isinstance(next, LD_PowerRail) and next.GetType() == LEFTRAIL or next in stop_list:
   122                     # for remove in element_tree[element]["children"]:
   122                     # for remove in element_tree[element]["children"]:
   123                     #     RemoveElement(remove, element_tree)
   123                     #     RemoveElement(remove, element_tree)
   124                     # element_tree[element]["children"] = ["stop"]
   124                     # element_tree[element]["children"] = ["stop"]
   222 
   222 
   223                 element = self.FindElementById(instance["id"])
   223                 element = self.FindElementById(instance["id"])
   224                 element_connectors = element.GetConnectors()
   224                 element_connectors = element.GetConnectors()
   225                 self.Rungs[rungs[0]].SelectElement(element)
   225                 self.Rungs[rungs[0]].SelectElement(element)
   226                 for connector in element_connectors["inputs"]:
   226                 for connector in element_connectors["inputs"]:
   227                     for wire, num in connector.GetWires():
   227                     for wire, _num in connector.GetWires():
   228                         self.Rungs[rungs[0]].SelectElement(wire)
   228                         self.Rungs[rungs[0]].SelectElement(wire)
   229                 wx.CallAfter(self.RefreshPosition, element)
   229                 wx.CallAfter(self.RefreshPosition, element)
   230             elif instance["type"] in ["contact", "coil"]:
   230             elif instance["type"] in ["contact", "coil"]:
   231                 rungs = []
   231                 rungs = []
   232                 for link in instance["inputs"][0]["links"]:
   232                 for link in instance["inputs"][0]["links"]:
   240                         % instance["id"])
   240                         % instance["id"])
   241 
   241 
   242                 element = self.FindElementById(instance["id"])
   242                 element = self.FindElementById(instance["id"])
   243                 element_connectors = element.GetConnectors()
   243                 element_connectors = element.GetConnectors()
   244                 self.Rungs[rungs[0]].SelectElement(element)
   244                 self.Rungs[rungs[0]].SelectElement(element)
   245                 for wire, num in element_connectors["inputs"][0].GetWires():
   245                 for wire, _num in element_connectors["inputs"][0].GetWires():
   246                     self.Rungs[rungs[0]].SelectElement(wire)
   246                     self.Rungs[rungs[0]].SelectElement(wire)
   247                 wx.CallAfter(self.RefreshPosition, element)
   247                 wx.CallAfter(self.RefreshPosition, element)
   248             elif instance["type"] == "comment":
   248             elif instance["type"] == "comment":
   249                 element = self.FindElementById(instance["id"])
   249                 element = self.FindElementById(instance["id"])
   250                 pos = element.GetPosition()
   250                 pos = element.GetPosition()
   694             for block in blocks:
   694             for block in blocks:
   695                 connectors = block.GetConnectors()
   695                 connectors = block.GetConnectors()
   696                 block_infos = {"lefts": [], "rights": []}
   696                 block_infos = {"lefts": [], "rights": []}
   697                 block_infos.update(connectors)
   697                 block_infos.update(connectors)
   698                 for connector in block_infos["inputs"]:
   698                 for connector in block_infos["inputs"]:
   699                     for wire, handle in connector.GetWires():
   699                     for wire, _handle in connector.GetWires():
   700                         found = False
   700                         found = False
   701                         for infos in blocks_infos:
   701                         for infos in blocks_infos:
   702                             if wire.EndConnected in infos["outputs"]:
   702                             if wire.EndConnected in infos["outputs"]:
   703                                 for left_element in infos["lefts"]:
   703                                 for left_element in infos["lefts"]:
   704                                     if left_element not in block_infos["lefts"]:
   704                                     if left_element not in block_infos["lefts"]:
   711                                 left_index.append(wire.EndConnected.GetWireIndex(wire))
   711                                 left_index.append(wire.EndConnected.GetWireIndex(wire))
   712                             else:
   712                             else:
   713                                 index = left_elements.index(wire.EndConnected)
   713                                 index = left_elements.index(wire.EndConnected)
   714                                 left_index[index] = max(left_index[index], wire.EndConnected.GetWireIndex(wire))
   714                                 left_index[index] = max(left_index[index], wire.EndConnected.GetWireIndex(wire))
   715                 for connector in block_infos["outputs"]:
   715                 for connector in block_infos["outputs"]:
   716                     for wire, handle in connector.GetWires():
   716                     for wire, _handle in connector.GetWires():
   717                         found = False
   717                         found = False
   718                         for infos in blocks_infos:
   718                         for infos in blocks_infos:
   719                             if wire.StartConnected in infos["inputs"]:
   719                             if wire.StartConnected in infos["inputs"]:
   720                                 for right_element in infos["rights"]:
   720                                 for right_element in infos["rights"]:
   721                                     if right_element not in block_infos["rights"]:
   721                                     if right_element not in block_infos["rights"]:
   860                         left_elements.reverse()
   860                         left_elements.reverse()
   861                         right_elements.reverse()
   861                         right_elements.reverse()
   862                         for i, left_element in enumerate(left_elements):
   862                         for i, left_element in enumerate(left_elements):
   863                             for j, right_element in enumerate(right_elements):
   863                             for j, right_element in enumerate(right_elements):
   864                                 exist = False
   864                                 exist = False
   865                                 for wire, handle in right_element.GetWires():
   865                                 for wire, _handle in right_element.GetWires():
   866                                     exist |= wire.EndConnected == left_element
   866                                     exist |= wire.EndConnected == left_element
   867                                 if not exist:
   867                                 if not exist:
   868                                     new_wire = Wire(self)
   868                                     new_wire = Wire(self)
   869                                     wires.append(new_wire)
   869                                     wires.append(new_wire)
   870                                     right_element.InsertConnect(right_index[j] + 1, (new_wire, 0), False)
   870                                     right_element.InsertConnect(right_index[j] + 1, (new_wire, 0), False)
   912         else:
   912         else:
   913             rungindex = self.FindRung(contact)
   913             rungindex = self.FindRung(contact)
   914             rung = self.Rungs[rungindex]
   914             rung = self.Rungs[rungindex]
   915             old_bbox = rung.GetBoundingBox()
   915             old_bbox = rung.GetBoundingBox()
   916             connectors = contact.GetConnectors()
   916             connectors = contact.GetConnectors()
   917             input_wires = [wire for wire, handle in connectors["inputs"][0].GetWires()]
   917             input_wires = [wire for wire, _handle in connectors["inputs"][0].GetWires()]
   918             output_wires = [wire for wire, handle in connectors["outputs"][0].GetWires()]
   918             output_wires = [wire for wire, _handle in connectors["outputs"][0].GetWires()]
   919             left_elements = [(wire.EndConnected, wire.EndConnected.GetWireIndex(wire)) for wire in input_wires]
   919             left_elements = [(wire.EndConnected, wire.EndConnected.GetWireIndex(wire)) for wire in input_wires]
   920             right_elements = [(wire.StartConnected, wire.StartConnected.GetWireIndex(wire)) for wire in output_wires]
   920             right_elements = [(wire.StartConnected, wire.StartConnected.GetWireIndex(wire)) for wire in output_wires]
   921             for wire in input_wires:
   921             for wire in input_wires:
   922                 wire.Clean()
   922                 wire.Clean()
   923                 rung.SelectElement(wire)
   923                 rung.SelectElement(wire)
   932             right_elements.reverse()
   932             right_elements.reverse()
   933             powerrail = len(left_elements) == 1 and isinstance(left_elements[0][0].GetParentBlock(), LD_PowerRail)
   933             powerrail = len(left_elements) == 1 and isinstance(left_elements[0][0].GetParentBlock(), LD_PowerRail)
   934             for left_element, left_index in left_elements:
   934             for left_element, left_index in left_elements:
   935                 for right_element, right_index in right_elements:
   935                 for right_element, right_index in right_elements:
   936                     wire_removed = []
   936                     wire_removed = []
   937                     for wire, handle in right_element.GetWires():
   937                     for wire, _handle in right_element.GetWires():
   938                         if wire.EndConnected == left_element:
   938                         if wire.EndConnected == left_element:
   939                             wire_removed.append(wire)
   939                             wire_removed.append(wire)
   940                         elif isinstance(wire.EndConnected.GetParentBlock(), LD_PowerRail) and powerrail:
   940                         elif isinstance(wire.EndConnected.GetParentBlock(), LD_PowerRail) and powerrail:
   941                             left_powerrail = wire.EndConnected.GetParentBlock()
   941                             left_powerrail = wire.EndConnected.GetParentBlock()
   942                             index = left_powerrail.GetConnectorIndex(wire.EndConnected)
   942                             index = left_powerrail.GetConnectorIndex(wire.EndConnected)
   969             self.RefreshRungs(new_bbox.height - old_bbox.height, rungindex + 1)
   969             self.RefreshRungs(new_bbox.height - old_bbox.height, rungindex + 1)
   970             self.SelectedElement = None
   970             self.SelectedElement = None
   971 
   971 
   972     def RecursiveDeletion(self, element, rung):
   972     def RecursiveDeletion(self, element, rung):
   973         connectors = element.GetConnectors()
   973         connectors = element.GetConnectors()
   974         input_wires = [wire for wire, handle in connectors["inputs"][0].GetWires()]
   974         input_wires = [wire for wire, _handle in connectors["inputs"][0].GetWires()]
   975         left_elements = [wire.EndConnected for wire in input_wires]
   975         left_elements = [wire.EndConnected for wire in input_wires]
   976         rung.SelectElement(element)
   976         rung.SelectElement(element)
   977         element.Clean()
   977         element.Clean()
   978         for wire in input_wires:
   978         for wire in input_wires:
   979             wire.Clean()
   979             wire.Clean()
   999             for element in rung.GetElements():
   999             for element in rung.GetElements():
  1000                 if isinstance(element, LD_Coil):
  1000                 if isinstance(element, LD_Coil):
  1001                     nbcoils += 1
  1001                     nbcoils += 1
  1002             if nbcoils > 1:
  1002             if nbcoils > 1:
  1003                 connectors = coil.GetConnectors()
  1003                 connectors = coil.GetConnectors()
  1004                 output_wires = [wire for wire, handle in connectors["outputs"][0].GetWires()]
  1004                 output_wires = [wire for wire, _handle in connectors["outputs"][0].GetWires()]
  1005                 right_elements = [wire.StartConnected for wire in output_wires]
  1005                 right_elements = [wire.StartConnected for wire in output_wires]
  1006                 for wire in output_wires:
  1006                 for wire in output_wires:
  1007                     wire.Clean()
  1007                     wire.Clean()
  1008                     self.Wires.remove(wire)
  1008                     self.Wires.remove(wire)
  1009                     self.Elements.remove(wire)
  1009                     self.Elements.remove(wire)
  1014                         if len(right_element.GetWires()) == 0:
  1014                         if len(right_element.GetWires()) == 0:
  1015                             index = right_block.GetConnectorIndex(right_element)
  1015                             index = right_block.GetConnectorIndex(right_element)
  1016                             right_block.DeleteConnector(index)
  1016                             right_block.DeleteConnector(index)
  1017                             powerrail_connectors = right_block.GetConnectors()
  1017                             powerrail_connectors = right_block.GetConnectors()
  1018                             for connector in powerrail_connectors["inputs"]:
  1018                             for connector in powerrail_connectors["inputs"]:
  1019                                 for wire, handle in connector.GetWires():
  1019                                 for wire, _handle in connector.GetWires():
  1020                                     block = wire.EndConnected.GetParentBlock()
  1020                                     block = wire.EndConnected.GetParentBlock()
  1021                                     endpoint = wire.EndConnected.GetPosition(False)
  1021                                     endpoint = wire.EndConnected.GetPosition(False)
  1022                                     startpoint = connector.GetPosition(False)
  1022                                     startpoint = connector.GetPosition(False)
  1023                                     block.Move(0, startpoint.y - endpoint.y)
  1023                                     block.Move(0, startpoint.y - endpoint.y)
  1024                                     self.RefreshPosition(block)
  1024                                     self.RefreshPosition(block)
  1079                             index = left_block.GetConnectorIndex(left_element)
  1079                             index = left_block.GetConnectorIndex(left_element)
  1080                             left_block.DeleteConnector(index)
  1080                             left_block.DeleteConnector(index)
  1081                     else:
  1081                     else:
  1082                         connectors = left_block.GetConnectors()
  1082                         connectors = left_block.GetConnectors()
  1083                         for connector in connectors["outputs"]:
  1083                         for connector in connectors["outputs"]:
  1084                             for wire, handle in connector.GetWires():
  1084                             for wire, _handle in connector.GetWires():
  1085                                 self.RefreshPosition(wire.StartConnected.GetParentBlock())
  1085                                 self.RefreshPosition(wire.StartConnected.GetParentBlock())
  1086                 for right_element in right_elements:
  1086                 for right_element in right_elements:
  1087                     self.RefreshPosition(right_element.GetParentBlock())
  1087                     self.RefreshPosition(right_element.GetParentBlock())
  1088                 rung.RefreshBoundingBox()
  1088                 rung.RefreshBoundingBox()
  1089                 new_bbox = rung.GetBoundingBox()
  1089                 new_bbox = rung.GetBoundingBox()
  1105         position = element.GetPosition()
  1105         position = element.GetPosition()
  1106         maxx = 0
  1106         maxx = 0
  1107         onlyone = []
  1107         onlyone = []
  1108         for connector in connectors["inputs"]:
  1108         for connector in connectors["inputs"]:
  1109             onlyone.append(len(connector.GetWires()) == 1)
  1109             onlyone.append(len(connector.GetWires()) == 1)
  1110             for wire, handle in connector.GetWires():
  1110             for wire, _handle in connector.GetWires():
  1111                 onlyone[-1] &= len(wire.EndConnected.GetWires()) == 1
  1111                 onlyone[-1] &= len(wire.EndConnected.GetWires()) == 1
  1112                 leftblock = wire.EndConnected.GetParentBlock()
  1112                 leftblock = wire.EndConnected.GetParentBlock()
  1113                 pos = leftblock.GetPosition()
  1113                 pos = leftblock.GetPosition()
  1114                 size = leftblock.GetSize()
  1114                 size = leftblock.GetSize()
  1115                 maxx = max(maxx, pos[0] + size[0])
  1115                 maxx = max(maxx, pos[0] + size[0])
  1126         position = element.GetPosition()
  1126         position = element.GetPosition()
  1127 
  1127 
  1128         # Extract blocks connected to inputs
  1128         # Extract blocks connected to inputs
  1129         blocks = []
  1129         blocks = []
  1130         for i, connector in enumerate(connectors["inputs"]):
  1130         for i, connector in enumerate(connectors["inputs"]):
  1131             for j, (wire, handle) in enumerate(connector.GetWires()):
  1131             for j, (wire, _handle) in enumerate(connector.GetWires()):
  1132                 blocks.append(wire.EndConnected.GetParentBlock())
  1132                 blocks.append(wire.EndConnected.GetParentBlock())
  1133 
  1133 
  1134         for i, connector in enumerate(connectors["inputs"]):
  1134         for i, connector in enumerate(connectors["inputs"]):
  1135             startpoint = connector.GetPosition(False)
  1135             startpoint = connector.GetPosition(False)
  1136             previous_blocks = []
  1136             previous_blocks = []
  1137             block_list = []
  1137             block_list = []
  1138             start_offset = 0
  1138             start_offset = 0
  1139             if not onlyone[i]:
  1139             if not onlyone[i]:
  1140                 middlepoint = maxx + LD_WIRE_SIZE
  1140                 middlepoint = maxx + LD_WIRE_SIZE
  1141             for j, (wire, handle) in enumerate(connector.GetWires()):
  1141             for j, (wire, _handle) in enumerate(connector.GetWires()):
  1142                 block = wire.EndConnected.GetParentBlock()
  1142                 block = wire.EndConnected.GetParentBlock()
  1143                 if isinstance(element, LD_PowerRail):
  1143                 if isinstance(element, LD_PowerRail):
  1144                     pos = block.GetPosition()
  1144                     pos = block.GetPosition()
  1145                     size = leftblock.GetSize()
  1145                     size = leftblock.GetSize()
  1146                     movex = position[0] - LD_WIRE_SIZE - size[0] - pos[0]
  1146                     movex = position[0] - LD_WIRE_SIZE - size[0] - pos[0]
  1180                 ExtractNextBlocks(block, block_list)
  1180                 ExtractNextBlocks(block, block_list)
  1181 
  1181 
  1182         element.RefreshModel(False)
  1182         element.RefreshModel(False)
  1183         if recursive:
  1183         if recursive:
  1184             for connector in connectors["outputs"]:
  1184             for connector in connectors["outputs"]:
  1185                 for wire, handle in connector.GetWires():
  1185                 for wire, _handle in connector.GetWires():
  1186                     self.RefreshPosition(wire.StartConnected.GetParentBlock())
  1186                     self.RefreshPosition(wire.StartConnected.GetParentBlock())
  1187 
  1187 
  1188     def RefreshRungs(self, movey, fromidx):
  1188     def RefreshRungs(self, movey, fromidx):
  1189         if movey != 0:
  1189         if movey != 0:
  1190             for i in xrange(fromidx, len(self.Rungs)):
  1190             for i in xrange(fromidx, len(self.Rungs)):