Via stitching : couvrir un plan de masse de vias avec l'API Python de KiCad

Publié le 18 octobre 2026 par leZ

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.

1076 vias de stitching GND posées par script Python sur une carte KiCad de 50 × 50 mm, sans via près des quatre trous de fixation
1 076 vias GND au pas de 1,4 mm, posées par script (KiCad 10, DRC : 0 erreur).

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

  1. Une grille régulière au pas choisi (ici 1,4 mm), centrée sur la carte.
  2. On ignore tout point trop proche d’un trou de fixation (ici 3,7 mm, soit le rayon de la pastille plus une marge).
  3. 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.

PITCH = 1.4   # mm
GUARD = 3.7   # mm, no via this close to a mounting hole
for x, y in grid(PITCH):
    if all(math.hypot(x - hx, y - hy) > GUARD for hx, hy in holes):
        add_via(x, y)          # → 0 vias
1.4
3.7
0 vias

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

Rendu 3D KiCad en gros plan d'un champ de vias de stitching sur un plan de masse
Gros plan du rendu 3D réel : un trou métallisé par via.

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.