Ajouter un via de changement de couche au milieu d'un routage avec l'API Python de pcbnew

Publié le 18 septembre 2026 par leZ

Faites passer une piste de la face avant à la face arrière via un via placé au milieu du routage, par script — avec pcbnew ou l'API IPC de KiCad.

Changement de couche par script : piste sur F.Cu, via en (30, 20) mm, puis piste sur B.Cu dans KiCad
Piste F.Cu (rouge), via, puis piste B.Cu (bleue).

Router entièrement sur une seule couche n’est pas toujours possible : il faut parfois traverser vers l’autre face pour contourner un obstacle. La transition se fait avec un via placé exactement au point où une piste se termine et où la suivante commence, sur l’autre couche.

Router, traverser, puis continuer sur l’autre couche

Le via se positionne au point de jonction entre les deux segments, chacun sur sa propre couche :

import pcbnew

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

track1 = PCB_TRACK(board)
track1.SetStart(VECTOR2I(FromMM(10), FromMM(20)))
track1.SetEnd(VECTOR2I(FromMM(30), FromMM(20)))
track1.SetLayer(F_Cu)
board.Add(track1)

via = PCB_VIA(board)
via.SetPosition(VECTOR2I(FromMM(30), FromMM(20)))
via.SetWidth(via.TopLayer(), FromMM(0.6))
via.SetDrill(FromMM(0.3))
board.Add(via)

track2 = PCB_TRACK(board)
track2.SetStart(VECTOR2I(FromMM(30), FromMM(20)))
track2.SetEnd(VECTOR2I(FromMM(50), FromMM(20)))
track2.SetLayer(B_Cu)
board.Add(track2)

Même structure : deux pistes sur des couches différentes, reliées par un via à leur point commun. Le diamètre et le perçage du via sont des nanomètres bruts à convertir avec from_mm ; les trois objets sont neufs, donc créés sur le board en un seul appel create_items :

from kipy import KiCad
from kipy.board_types import Track, Via
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, 20)
track1.end = Vector2.from_xy_mm(30, 20)
track1.layer = board.get_layer_by_name("F.Cu")

via = Via()
via.position = Vector2.from_xy_mm(30, 20)
via.diameter = from_mm(0.6)
via.drill_diameter = from_mm(0.3)

track2 = Track()
track2.start = Vector2.from_xy_mm(30, 20)
track2.end = Vector2.from_xy_mm(50, 20)
track2.layer = board.get_layer_by_name("B.Cu")

board.create_items([track1, via, 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.

Pour aller plus loin

Ce motif — piste, via, piste — est la brique de base de tout routeur qui doit alterner entre couches pour éviter les obstacles ou équilibrer la densité de cuivre entre le dessus et le dessous de la board.