Repositionner des footprints en masse depuis un CSV avec l'API Python de pcbnew
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.

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.
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).