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)): |