Charger une board et l'inventorier en une passe avec l'API Python de pcbnew

Publié le 23 septembre 2026 par leZ

Chargez un fichier .kicad_pcb et listez footprints, zones, pistes, vias, textes et nets en une seule passe, par script — avec pcbnew ou l'API IPC de KiCad.

Sortie réelle du script d'inventaire pcbnew : nombre d'empreintes, de zones, de textes, de segments, de vias et de nets
L'inventaire d'une board de démo, en une passe.

Avant d’écrire le moindre script de modification, il faut souvent d’abord lire la board : combien de footprints, quelles zones, combien de vias, sur quels nets. C’est la première chose que fait quasiment tout script de validation, d’audit ou de CI — charger le fichier une fois, puis garder sous la main des listes déjà triées par type plutôt que de reparcourir la board à chaque fois qu’on a besoin d’une information.

Charger le fichier

LoadBoard charge un .kicad_pcb en mémoire sans lancer KiCad, exactement comme dans le tuto d’installation :

import pcbnew

board = pcbnew.LoadBoard("ma_carte.kicad_pcb")

Avec l’API IPC, on se connecte à une instance déjà ouverte — ou on en démarre une headless (voir le tuto d’installation pour le détail des deux méthodes) :

from kipy import KiCad

board = KiCad().get_board()

Lister footprints, zones et textes

Chaque catégorie d’objet a sa propre méthode sur la board :

footprints = board.Footprints()
zones = board.Zones()
texts = [d for d in board.Drawings() if isinstance(d, pcbnew.PCB_TEXT)]

print(f"{len(footprints)} footprints, {len(zones)} zones, {len(texts)} textes")

Il n’y a pas de méthode Texts() dédiée : le texte fait partie des dessins génériques renvoyés par Drawings() (avec les traits de silkscreen, les contours…), d’où le filtre sur PCB_TEXT.

Même principe, avec une méthode dédiée par catégorie — get_text() couvre ici directement le texte, sans filtre à écrire :

footprints = board.get_footprints()
zones = board.get_zones()
texts = board.get_text()

print(f"{len(footprints)} footprints, {len(zones)} zones, {len(texts)} textes")

Séparer les pistes des vias

Tracks() renvoie un mélange de pistes (PCB_TRACK) et de vias (PCB_VIA, qui hérite de PCB_TRACK) — comme dans le tuto audit des vias, il faut trier avec isinstance :

tracks = board.Tracks()
segments = [t for t in tracks if not isinstance(t, pcbnew.PCB_VIA)]
vias = [t for t in tracks if isinstance(t, pcbnew.PCB_VIA)]

print(f"{len(segments)} segments de piste, {len(vias)} vias")

Côté API IPC, la séparation est déjà faite : get_tracks() ne renvoie que des pistes (et arcs de piste), les vias ont leur propre méthode get_vias() — pas de filtre isinstance à écrire :

segments = board.get_tracks()
vias = board.get_vias()

print(f"{len(segments)} segments de piste, {len(vias)} vias")

Lister les nets et l’origine de grille

Les nets se récupèrent sur la board, l’origine de grille sur ses réglages de conception :

nets = board.GetNetsByName()
origin = board.GetDesignSettings().GetGridOrigin()

print(f"{len(nets)} nets, origine de grille {pcbnew.ToMM(origin)} mm")

Même logique, avec get_origin qui attend un type d’origine — BOT_GRID pour l’origine de grille (il existe aussi BOT_DRILL pour l’origine de perçage/placement) :

from kipy.board import BoardOriginType
from kipy.util.units import to_mm

nets = board.get_nets()
origin = board.get_origin(BoardOriginType.BOT_GRID)

print(f"{len(nets)} nets, origine de grille ({to_mm(origin.x)}, {to_mm(origin.y)}) mm")

Pour aller plus loin

Ce squelette — charger une fois, garder les listes triées par catégorie sous la main — est la base de toute classe “wrapper board” réutilisable : au lieu de répéter ces appels dans chaque script, on les regroupe dans le constructeur d’une petite classe Pcb, et le reste du script travaille sur pcb.footprints, pcb.vias, pcb.nets sans jamais retoucher board.Footprints() ou board.get_footprints() directement. C’est aussi le point de départ naturel d’un script d’audit ou de validation avant export (voir le tuto audit des vias pour un exemple de filtre appliqué à une seule catégorie).