refactor: remove redundant junction processing from wire connectivity

Shared-endpoint adjacency already connects all wires meeting at the same
point, making explicit junction handling a no-op duplicate.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Eugene Mikhantyev
2026-03-14 16:20:11 +00:00
parent f120034846
commit de0eca2ed7

View File

@@ -36,30 +36,14 @@ def _parse_wires(schematic) -> List[List[Tuple[int, int]]]:
return all_wires return all_wires
def _parse_junctions(schematic) -> List[Tuple[int, int]]:
"""Extract junction points from a schematic object as IU tuples.
Junctions may be exposed via schematic.junction (kicad-skip attribute) or
might not exist. Handle both cases gracefully.
"""
junctions = []
if not hasattr(schematic, 'junction'):
return junctions
for junc in schematic.junction:
try:
if hasattr(junc, 'at') and hasattr(junc.at, 'value'):
junctions.append(_to_iu(float(junc.at.value[0]), float(junc.at.value[1])))
except (IndexError, TypeError, ValueError):
continue
return junctions
def _build_adjacency( def _build_adjacency(
all_wires: List[List[Tuple[int, int]]], all_wires: List[List[Tuple[int, int]]],
junctions: List[Tuple[int, int]],
) -> Tuple[List[Set[int]], Dict[Tuple[int, int], Set[int]]]: ) -> Tuple[List[Set[int]], Dict[Tuple[int, int], Set[int]]]:
"""Build wire adjacency using exact IU coordinate matching. """Build wire adjacency using exact IU coordinate matching.
Wires that share an endpoint are adjacent — this naturally handles
junctions since all wires meeting at the same point get connected.
Returns a tuple of: Returns a tuple of:
- adjacency: list of sets, one per wire, containing adjacent wire indices - adjacency: list of sets, one per wire, containing adjacent wire indices
- iu_to_wires: dict mapping each IU endpoint to the set of wire indices - iu_to_wires: dict mapping each IU endpoint to the set of wire indices
@@ -80,15 +64,6 @@ def _build_adjacency(
if a != b: if a != b:
adjacency[a].add(b) adjacency[a].add(b)
# Junctions: connect all wires that have an endpoint at the junction IU point
for junc_iu in junctions:
wire_set = iu_to_wires.get(junc_iu, set())
wire_list = list(wire_set)
for a in wire_list:
for b in wire_list:
if a != b:
adjacency[a].add(b)
return adjacency, iu_to_wires return adjacency, iu_to_wires
@@ -194,8 +169,7 @@ def get_wire_connections(schematic, schematic_path: str, x_mm: float, y_mm: floa
if not all_wires: if not all_wires:
return {"pins": [], "wires": []} return {"pins": [], "wires": []}
junctions = _parse_junctions(schematic) adjacency, iu_to_wires = _build_adjacency(all_wires)
adjacency, iu_to_wires = _build_adjacency(all_wires, junctions)
visited, net_points = _find_connected_wires(x_mm, y_mm, all_wires, iu_to_wires, adjacency) visited, net_points = _find_connected_wires(x_mm, y_mm, all_wires, iu_to_wires, adjacency)
if visited is None: if visited is None: