Skip to content

Instantly share code, notes, and snippets.

@devilholk
Created April 25, 2021 01:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save devilholk/2c722341f22528ef0902f500ac4b0867 to your computer and use it in GitHub Desktop.
Save devilholk/2c722341f22528ef0902f500ac4b0867 to your computer and use it in GitHub Desktop.
Script for pcbnew to connect unconnected vias to closest pads (currently according to a filter on line 50 - just serves as example)
import pcbnew
from dataclasses import dataclass
@dataclass
class local_pad_representation:
pad: object = None
footprint: object = None
pos: object = None
friendly_name: str = None
@dataclass
class local_via_representation:
via: object = None
net: object = None
net_code: int = None
pos: object = None
def get_pad_list(board):
pad_list = list()
for pad in board.GetPads():
footprint = pad.GetParent()
pad_list.append(local_pad_representation(
pad,
footprint,
pad.GetPosition(),
f'{footprint.GetReference()}-{pad.GetName()}',
))
return pad_list
def get_via_list(board):
via_list = list()
for track in board.Tracks():
if isinstance(track, pcbnew.VIA):
via_list.append(
local_via_representation(
track,
track.GetNet(),
track.GetNet().GetNetCode(),
track.GetPosition(),
)
)
return via_list
def get_sq_distance(delta):
return delta.x ** 2 + delta.y ** 2
def test1(board):
pad_list = [pr for pr in get_pad_list(board) if pr.footprint.GetReference().startswith('RN') or pr.footprint.GetReference().startswith('TVS')]
via_list = [v for v in get_via_list(board) if v.net_code == 0]
for via in via_list:
closest_length = 0
closest_pad = None
for p_index, pad in enumerate(pad_list):
distance = get_sq_distance(via.pos - pad.pos)
if closest_pad is None or distance < closest_length:
closest_length = distance
closest_pad = pad
print(f'Closest {via.pos} - {closest_pad.friendly_name}: {closest_length}')
via.via.SetNetCode(closest_pad.pad.GetNetCode())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment