Router une piste à angle droit avec l'API Python de pcbnew

Publié le 17 septembre 2026 par leZ

Créez une piste avec un coude à angle droit entre deux points non alignés, par script — avec pcbnew ou l'API IPC de KiCad.

Piste coudée à angle droit composée de deux segments, de (10, 15) à (25, 15) puis jusqu'à (25, 35) mm, créée en Python
Deux segments qui partagent le point (25, 15).

Le tuto routage de piste trace un segment unique en ligne droite. Dès que le point de départ et le point d’arrivée ne sont pas alignés, il faut au moins deux segments reliés par un coude — la base de tout algorithme de routage un peu plus élaboré qu’une ligne directe.

Créer les deux segments

Le second segment démarre exactement où le premier se termine — c’est ce point partagé qui forme le coude :

import pcbnew

board = pcbnew.GetBoard()
from pcbnew import PCB_TRACK, VECTOR2I, FromMM, F_Cu

track1 = PCB_TRACK(board)
track1.SetStart(VECTOR2I(FromMM(10), FromMM(15)))
track1.SetEnd(VECTOR2I(FromMM(25), FromMM(15)))
track1.SetWidth(FromMM(0.25))
track1.SetLayer(F_Cu)
board.Add(track1)

track2 = PCB_TRACK(board)
track2.SetStart(VECTOR2I(FromMM(25), FromMM(15)))
track2.SetEnd(VECTOR2I(FromMM(25), FromMM(35)))
track2.SetWidth(FromMM(0.25))
track2.SetLayer(F_Cu)
board.Add(track2)

Même logique, en créant deux objets Track distincts qui partagent un point. La largeur est un entier en nanomètres, convertie avec from_mm :

from kipy import KiCad
from kipy.board_types import Track
from kipy.geometry import Vector2
from kipy.util.units import from_mm

board = KiCad().get_board()

track1 = Track()
track1.start = Vector2.from_xy_mm(10, 15)
track1.end = Vector2.from_xy_mm(25, 15)
track1.width = from_mm(0.25)
track1.layer = board.get_layer_by_name("F.Cu")

track2 = Track()
track2.start = Vector2.from_xy_mm(25, 15)
track2.end = Vector2.from_xy_mm(25, 35)
track2.width = from_mm(0.25)
track2.layer = board.get_layer_by_name("F.Cu")

board.create_items([track1, track2])

⚠️ .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 : déplacez le coude pour voir les deux segments se réajuster.

track1.SetStart(VECTOR2I(FromMM(10), FromMM(15)))
track1.SetEnd(VECTOR2I(FromMM(25), FromMM(15)))

track2.SetStart(VECTOR2I(FromMM(25), FromMM(15)))
track2.SetEnd(VECTOR2I(FromMM(25), FromMM(35)))
25

Pour aller plus loin

Ce squelette à deux segments se généralise à un chemin en zigzag arbitraire en bouclant sur une liste de points intermédiaires, chaque segment reliant le point précédent au suivant — la base d’un mini-routeur qui évite des obstacles simples.