Créer une zone de cuivre (plan de masse) avec l'API Python de pcbnew

Publié le 9 septembre 2026 par leZ

Générez une zone de cuivre reliée à un net et lancez son remplissage par script, avec pcbnew ou l'API IPC de KiCad.

Zone de cuivre GND rectangulaire de 50 × 30 mm remplie sur F.Cu, créée par script Python pcbnew dans KiCad
La zone de cuivre GND, remplie par ZONE_FILLER.

Un plan de masse dessiné et rempli à la souris doit être refait à chaque modification du routage. En scriptant la création et le remplissage de la zone, on obtient un plan de masse reproductible, régénérable en une seule commande après chaque changement.

Sept zones de cuivre de formes différentes (cercle, étoile, anneau avec un trou, plan de masse hachuré…) dessinées par script, filmées en direct dans KiCad, puis vérifiées par le DRC (1 min 26) :

Créer la zone

On instancie un objet ZONE, on choisit sa couche, puis on l’ajoute à la board :

import pcbnew

board = pcbnew.GetBoard()
from pcbnew import ZONE, F_Cu

zone = ZONE(board)
zone.SetLayer(F_Cu)
board.Add(zone)

Avec l’API IPC, on instancie un objet Zone vierge, puis on fixe son type (cuivre) :

from kipy import KiCad
from kipy.board_types import Zone, ZoneType

kicad = KiCad()
board = kicad.get_board()
zone = Zone()
zone.type = ZoneType.ZT_COPPER

Définir le contour

Le contour est un SHAPE_POLY_SET auquel on ajoute les sommets du polygone, en unités internes :

from pcbnew import SHAPE_POLY_SET, FromMM

outline = SHAPE_POLY_SET()
outline.NewOutline()
for x, y in [(0, 0), (50, 0), (50, 30), (0, 30)]:
    outline.Append(FromMM(x), FromMM(y))
zone.SetOutline(outline)

Côté API IPC, le contour se construit avec une PolyLine de nœuds (en nanomètres, convertis avec from_mm), enveloppée dans un PolygonWithHoles :

from kipy.geometry import PolyLine, PolyLineNode
from kipy.common_types import PolygonWithHoles
from kipy.util.units import from_mm

outline = PolyLine()
for x, y in [(0, 0), (50, 0), (50, 30), (0, 30), (0, 0)]:  # dernier point = fermeture de la boucle
    outline.append(PolyLineNode.from_xy(from_mm(x), from_mm(y)))

polygon = PolygonWithHoles()
polygon.outline = outline

zone.outline = polygon
zone.layers = [board.get_layer_by_name("F.Cu")]

Essayez ci-dessous : ajustez largeur et hauteur pour voir le contour de la zone évoluer sur le PCB.

outline.NewOutline()
for x, y in [(0, 0), (50, 0), (50, 30), (0, 30)]:
    outline.Append(FromMM(x), FromMM(y))
50
30
GND

Relier au net et remplir

On rattache la zone à un net, puis on déclenche le remplissage via ZONE_FILLER :

from pcbnew import ZONE_FILLER

zone.SetNet(board.FindNet("GND"))

filler = ZONE_FILLER(board)
filler.Fill(board.Zones())

Même principe pour le rattachement au net. C’est aussi à ce moment, une fois toutes les propriétés fixées, que la zone est réellement créée sur le board — le déclenchement programmatique du remplissage n’a pas de méthode confirmée côté API IPC à ce jour :

from kipy.board_types import Net

zone.net = Net(name="GND")
board.create_items(zone)

Pour aller plus loin

Ce squelette se réutilise pour générer un plan de masse complet par couche, découper des zones autour de composants sensibles, ou relancer automatiquement le remplissage après chaque modification de routage plutôt que de cliquer sur « Remplir toutes les zones » à la main.