Créer une zone d'interdiction de routage (keepout) avec l'API Python de pcbnew
Créez par script une zone keepout (keep-out) : ni piste, ni via, ni cuivre, autour d'un connecteur ou d'une antenne, avec pcbnew ou l'API IPC.

Une zone d’interdiction (keepout) empêche pistes, vias et remplissage de cuivre d’empiéter sur une région précise — typiquement autour d’un connecteur mécanique, d’une antenne, ou d’une découpe de board. Elle se construit comme une zone de cuivre classique, avec des drapeaux d’interdiction en plus.
Créer une zone de type “rule area”
SetIsRuleArea(True) transforme la zone en zone de règle plutôt qu’en zone de cuivre remplie, puis chaque drapeau active une interdiction spécifique :
import pcbnew
board = pcbnew.GetBoard()
from pcbnew import ZONE, F_Cu
zone = ZONE(board)
zone.SetIsRuleArea(True)
zone.SetLayer(F_Cu)
zone.SetDoNotAllowTracks(True)
zone.SetDoNotAllowVias(True)
zone.SetDoNotAllowZoneFills(True)
board.Add(zone)⚠️ Il n’existe pas de SetDoNotAllowCopperPour : c’est SetDoNotAllowZoneFills qui bloque le remplissage de cuivre.
Avec l’API IPC, on instancie un objet Zone vierge, on lui donne le type ZT_RULE_AREA, puis on déclare les mêmes interdictions. Ces drapeaux n’ont pas encore de propriété dédiée dans le client Python — on passe par .proto, qui donne un accès direct au message protobuf sous-jacent :
from kipy import KiCad
from kipy.board_types import Zone, ZoneType
kicad = KiCad()
board = kicad.get_board()
zone = Zone()
zone.type = ZoneType.ZT_RULE_AREA
zone.proto.rule_area_settings.keepout_tracks = True
zone.proto.rule_area_settings.keepout_vias = True
zone.proto.rule_area_settings.keepout_copper = True⚠️ Comme pour le dégagement thermique, ces drapeaux n’existent que via .proto — il n’y a pas de raccourci zone.keepout_tracks direct dans le client Python actuel, et lui assigner une valeur ne lève aucune erreur tout en ne servant à rien.
Définir le contour
Le contour se construit exactement comme pour une zone de cuivre classique :
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)Là aussi, même logique que pour la zone de cuivre standard : une PolyLine de nœuds enveloppée dans un PolygonWithHoles. C’est à ce moment, une fois toutes les propriétés fixées, que la zone est créée sur le board :
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")]
board.create_items(zone)Essayez ci-dessous : ajustez largeur et hauteur pour voir la zone d’interdiction évoluer sur le PCB.
Pour aller plus loin
La même mécanique sert à protéger une zone de montage mécanique, à garder une antenne dégagée de tout plan de masse, ou à interdire le routage sous un connecteur à travers plusieurs zones de règle empilées sur les couches concernées.