Via stitching : couvrir un plan de masse de vias avec l'API Python de KiCad
Posez des centaines de vias GND sur un plan de masse par script, en évitant les trous de fixation : pas, distance de garde, pcbnew ou API IPC.

Le via stitching consiste à relier les plans de masse du dessus et du dessous par une forêt de vias : retour de courant plus court, bruit réduit, meilleur blindage. KiCad n’a pas d’outil intégré pour en poser des centaines d’un coup. Ce script le fait, en évitant automatiquement les trous de fixation. Tout le code a été exécuté sur une vraie carte KiCad 10 : 1 076 vias, DRC à 0 violation et 0 élément non connecté.
Le principe
- Une grille régulière au pas choisi (ici 1,4 mm), centrée sur la carte.
- On ignore tout point trop proche d’un trou de fixation (ici 3,7 mm, soit le rayon de la pastille plus une marge).
- On pose une via GND sur chaque point restant.
Le widget refait exactement ce calcul : jouez sur le pas et la garde pour voir combien de vias tiennent.
Calculer les points
import math
CX, CY, SIZE, PITCH, GUARD = 115.0, 105.0, 50.0, 1.4, 3.7 # mm
d = SIZE / 2 - 4.0
holes = [(CX + sx * d, CY + sy * d) for sx in (-1, 1) for sy in (-1, 1)]
n = int((SIZE - 2 * 1.6) / PITCH) # 1,6 mm de marge au bord
start = -n * PITCH / 2
points = [(CX + start + i * PITCH, CY + start + j * PITCH)
for i in range(n + 1) for j in range(n + 1)]
points = [(x, y) for x, y in points
if all(math.hypot(x - hx, y - hy) > GUARD for hx, hy in holes)]
Cette partie ne dépend d’aucune API : c’est du Python pur.
Poser les vias
import pcbnew
board = pcbnew.GetBoard()
gnd = board.FindNet("GND")
for x, y in points:
via = pcbnew.PCB_VIA(board)
via.SetPosition(pcbnew.VECTOR2I_MM(x, y))
via.SetWidth(via.TopLayer(), pcbnew.FromMM(0.6))
via.SetDrill(pcbnew.FromMM(0.3))
via.SetNet(gnd)
board.Add(via)
pcbnew.ZONE_FILLER(board).Fill(board.Zones())Testé : les 1 076 vias sont créées en 16 ms en headless. Remplissez les zones ensuite pour qu’elles se raccordent aux vias.
from kipy import KiCad
from kipy.board_types import Net, Via
from kipy.geometry import Vector2
from kipy.util.units import from_mm
board = KiCad().get_board()
vias = []
for x, y in points:
via = Via()
via.position = Vector2.from_xy_mm(x, y)
via.diameter = from_mm(0.6)
via.drill_diameter = from_mm(0.3)
via.net = Net(name="GND")
vias.append(via)
board.create_items(vias)Testé sous KiCad 10 : create_items() accepte la liste entière, en un seul aller-retour avec KiCad.
En 3D, chaque point est un vrai trou métallisé :

Les 1 076 vias posées en direct dans KiCad :
Pour aller plus loin
Pour une grille simple sans exclusion, voyez la grille de vias de stitching. Pour vérifier le résultat, comptez les vias par net, puis lancez le DRC avec kicad-cli en headless.