Créer un via aveugle ou enterré avec l'API Python de pcbnew

Publié le 19 septembre 2026 par leZ

Faites passer un via d'un traversant classique à un via aveugle ou enterré, limité à certaines couches internes, par script — avec pcbnew ou l'API IPC de KiCad.

Via borgne de F.Cu vers In1.Cu sur une carte 4 couches, créée par script Python pcbnew dans KiCad
La via borgne, affichée avec les couleurs de F.Cu et In1.Cu.

Le tuto création de via crée un via traversant, qui perce la board de part en part. Sur une board multicouche, un via aveugle (d’une couche externe vers une couche interne) ou enterré (entre deux couches internes uniquement) permet de gagner de la densité de routage sans traverser toute l’épaisseur.

Choisir le type de via et sa paire de couches

SetViaType change le type, puis SetLayerPair définit les deux couches entre lesquelles le via est percé :

import pcbnew

board = pcbnew.GetBoard()
from pcbnew import PCB_VIA, VIATYPE_BLIND, VECTOR2I, FromMM, F_Cu, In1_Cu

via = PCB_VIA(board)
via.SetPosition(VECTOR2I(FromMM(30), FromMM(20)))
via.SetViaType(VIATYPE_BLIND)
via.SetLayerPair(F_Cu, In1_Cu)  # aveugle : d'une couche externe vers une couche interne
board.Add(via)

⚠️ Il n’existe pas de VIATYPE_BLIND_BURIED : pcbnew distingue toujours VIATYPE_BLIND et VIATYPE_BURIED.

Même logique, avec des propriétés dédiées au type et à la paire de couches — cette dernière se règle via le padstack, pas une propriété layer_pair directe. ViaType propose bien une valeur générique VT_BLIND_BURIED, mais elle ne survit pas au aller-retour serveur : KiCad la réévalue et la remplace silencieusement par VT_BLIND ou VT_BURIED selon la paire de couches réellement fournie. Autant utiliser directement la valeur précise, comme côté pcbnew :

from kipy import KiCad
from kipy.board_types import Via, ViaType
from kipy.geometry import Vector2

board = KiCad().get_board()

via = Via()
via.position = Vector2.from_xy_mm(30, 20)
via.type = ViaType.VT_BLIND
via.padstack.drill.start_layer = board.get_layer_by_name("F.Cu")
via.padstack.drill.end_layer = board.get_layer_by_name("In1.Cu")
board.create_items(via)

⚠️ Testé : assigner ViaType.VT_BLIND_BURIED puis relire le via créé renvoie VT_BLIND — pas d’erreur, mais la valeur qu’on a fixée n’est pas celle qui est réellement stockée. VT_BLIND et VT_BURIED, en revanche, persistent exactement tels qu’assignés.

Essayez ci-dessous : changez de type pour voir la coupe transversale du via évoluer selon les couches traversées.

via.SetViaType(VIATYPE_THROUGH)
via.SetLayerPair(F_Cu, B_Cu)
F.CuIn1.CuIn2.CuB.Cu

Pour aller plus loin

Un via enterré (entre deux couches internes, sans jamais atteindre F.Cu ni B.Cu) suit le même principe : il suffit de choisir une paire de couches internes, par exemple In1_Cu/In2_Cu (VIATYPE_BURIED côté pcbnew, ViaType.VT_BURIED côté IPC — vérifié sur une board 10 couches). Ces types de vias nécessitent généralement un empilement de couches (stackup) et un fabricant qui les supportent — vérifiez les règles de fabrication avant de vous en servir massivement.