Router une piste avec l'API Python de pcbnew

Publié le 11 septembre 2026 par leZ

Créez une piste de cuivre entre deux points, avec une largeur définie, par script — avec pcbnew ou l'API IPC de KiCad.

Piste de cuivre de 0,25 mm sur F.Cu tracée par script Python pcbnew de (10, 20) à (40, 20) mm dans l'éditeur de PCB KiCad
La piste créée par le script, avec ses deux extrémités.

Router à la souris une nappe de pistes identiques (un bus de données, une série de connexions vers un connecteur) est répétitif et propice aux erreurs de largeur. Scripter la création de pistes garantit une largeur et un tracé reproductibles, point de départ de tout routeur automatique maison.

La piste (et une via) créées par script, filmées en direct dans KiCad (1 min 16) :

Créer la piste

On instancie un objet PCB_TRACK rattaché à la board, puis on l’ajoute :

import pcbnew

board = pcbnew.GetBoard()
from pcbnew import PCB_TRACK

track = PCB_TRACK(board)
board.Add(track)

Avec l’API IPC, on instancie un objet Track vierge ; il n’existe pas encore sur le board tant qu’il n’a pas été créé explicitement :

from kipy import KiCad
from kipy.board_types import Track

kicad = KiCad()
board = kicad.get_board()
track = Track()

Définir le tracé, la largeur et la couche

Le début et la fin de la piste se fixent en unités internes, la largeur et la couche séparément :

from pcbnew import VECTOR2I, FromMM, F_Cu

track.SetStart(VECTOR2I(FromMM(10), FromMM(20)))
track.SetEnd(VECTOR2I(FromMM(40), FromMM(20)))
track.SetWidth(FromMM(0.25))
track.SetLayer(F_Cu)

Le début et la fin se fixent en millimètres via Vector2.from_xy_mm, mais la largeur est un entier en nanomètres à convertir avec from_mm :

from kipy.geometry import Vector2
from kipy.util.units import from_mm

track.start = Vector2.from_xy_mm(10, 20)
track.end = Vector2.from_xy_mm(40, 20)
track.width = from_mm(0.25)
track.layer = board.get_layer_by_name("F.Cu")

⚠️ track.layer attend une valeur BoardLayer, pas une chaîne : track.layer = "F.Cu" lève une ValueError. get_layer_by_name fait la conversion.

Essayez ci-dessous : ajustez la longueur et la largeur pour voir la piste évoluer sur le PCB.

track.SetStart(VECTOR2I(FromMM(10), FromMM(20)))
track.SetEnd(VECTOR2I(FromMM(40), FromMM(20)))
track.SetWidth(FromMM(0.25))
40
0.25

Relier la piste à un net

Comme pour un via, la piste doit être rattachée à un net existant :

track.SetNet(board.FindNet("GND"))

Côté API IPC, le net se référence directement par son nom. C’est aussi à ce moment, une fois toutes les propriétés fixées, que la piste est réellement créée sur le board :

from kipy.board_types import Net

track.net = Net(name="GND")
board.create_items(track)

Pour aller plus loin

Ce squelette se généralise à une boucle qui relie automatiquement une série de pads entre eux — la base d’un petit routeur maison pour des topologies répétitives (bus, rangées de connecteurs), plutôt que de tracer chaque piste à la main.