Repositionner des footprints en masse depuis un CSV avec l'API Python de pcbnew

Publié le 22 septembre 2026 par leZ

Lisez une liste de références et de coordonnées depuis un fichier CSV, puis repositionnez tous les footprints correspondants en un seul script — avec pcbnew ou l'API IPC de KiCad.

Avant / après : U1 et R1 repositionnés depuis un fichier CSV (U1 en (20, 15) à 0°, R1 en (48, 15) à 90°) dans KiCad
Les empreintes avant, puis placées selon le CSV.

En venant d’Eagle ou de Fusion 360, on a souvent l’habitude de préparer un tableau de coordonnées dans un tableur puis de le rejouer en une fois pour repositionner tous les composants d’un coup, plutôt que de les déplacer un par un à la souris. Le même besoin se scripte facilement avec KiCad à partir d’un CSV : référence, position X/Y et rotation, en une seule passe.

Le format du CSV

Une ligne par footprint à replacer, avec sa référence et sa position en millimètres :

ref,x_mm,y_mm,rotation_deg
U1,20,15,0
R1,48,15,90
C1,48,30,90

Lire le fichier

Cette étape est la même quelle que soit l’API KiCad ensuite : le module csv de la bibliothèque standard suffit, pas besoin d’installer quoi que ce soit :

import csv

with open("placements.csv") as f:
    rows = list(csv.DictReader(f))

Repositionner chaque footprint

Ce script tourne entièrement headless (voir le tuto d’installation) : LoadBoard ouvre le fichier .kicad_pcb en mémoire sans lancer KiCad, puis SaveBoard écrit le résultat — pratique pour rejouer un placement complet en une seule commande :

import pcbnew

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

for row in rows:
    fp = board.FindFootprintByReference(row["ref"])
    if fp is None:
        continue
    fp.SetPosition(pcbnew.VECTOR2I(pcbnew.FromMM(float(row["x_mm"])), pcbnew.FromMM(float(row["y_mm"]))))
    fp.SetOrientationDegrees(float(row["rotation_deg"]))

pcbnew.SaveBoard("my_board.kicad_pcb", board)

Le même code fonctionne aussi tel quel depuis la console de script de KiCad : remplacez juste les deux lignes LoadBoard/SaveBoard par board = pcbnew.GetBoard(), comme dans le tuto placement d’un footprint.

Côté API IPC (le paquet kipy), les modifications se groupent dans un commit explicite, ce qui permet de tout annuler d’un coup avec Ctrl+Z si le résultat ne convient pas :

from kipy import KiCad
from kipy.geometry import Angle, Vector2

board = KiCad().get_board()
footprints = board.get_footprints()
commit = board.begin_commit()

updated = []
for row in rows:
    fp = next((f for f in footprints if f.reference_field.text.value == row["ref"]), None)
    if fp is None:
        continue
    fp.position = Vector2.from_xy_mm(float(row["x_mm"]), float(row["y_mm"]))
    fp.orientation = Angle.from_degrees(float(row["rotation_deg"]))
    updated.append(fp)

board.update_items(updated)
board.push_commit(commit, "Move footprints via script")

Essayez ci-dessous : changez les positions X/Y de chaque référence pour voir les trois footprints se replacer sur le PCB, comme si vous éditiez les lignes du CSV.

for row in rows:
    fp = board.FindFootprintByReference(row["ref"])
    fp.SetPosition(VECTOR2I(FromMM(20), FromMM(15)))
U1
R1
C1
U1R1C1

Pour aller plus loin

Cette approche se généralise à n’importe quelle source externe de coordonnées — export d’un outil de panélisation, d’un autre outil ECAO, ou d’un tableur maison — tant qu’elle produit une référence et une position par ligne. Ajoutez une colonne layer au CSV si vous devez aussi basculer certains footprints en face arrière (voir le tuto sur le flip de footprint).