Résoudre un nom de couche en ID par script avec l'API Python de pcbnew

Publié le 24 septembre 2026 par leZ

Convertissez un nom de couche (« F.Cu », « B.SilkS »...) en identifiant numérique par script, et inversement, avec pcbnew ou l'API IPC de KiCad — et les pièges des deux côtés.

Résolution du nom de couche F.Cu en identifiant avec pcbnew, et exception levée pour f.cu (sensible à la casse)
F.Cu donne l'ID 0 ; « f.cu » lève une exception.

SetLayer, SetLayerPair, LSET, zone.layers… presque toutes les méthodes de placement par couche attendent un identifiant numérique, pas une chaîne comme "F.Cu". Convertir un nom en ID est trivial en soi, mais mérite une petite fonction dédiée : une conversion ratée à cause d’une faute de frappe ou d’une casse incorrecte doit être détectée tout de suite, pas des heures plus tard en déboguant pourquoi une piste a atterri sur la mauvaise couche.

Résoudre le nom en ID

GetLayerID renvoie -1 si le nom n’est pas reconnu — silencieusement, sans lever d’exception. Autant l’envelopper dans une petite fonction qui échoue tout de suite :

def get_layer_id(board, layer_name):
    layer_id = board.GetLayerID(layer_name)
    if layer_id == -1:
        raise Exception(f"couche inconnue : {layer_name} (sensible à la casse)")
    return layer_id

f_cu = get_layer_id(board, "F.Cu")

⚠️ La recherche est sensible à la casse : "f.cu" renvoie aussi -1, exactement comme un nom qui n’existe pas.

get_layer_by_name est plus sournois : sur un nom inconnu, il ne lève pas d’exception et ne renvoie pas non plus BL_UNKNOWN — il renvoie silencieusement BL_UNDEFINED, une valeur de couche valide en apparence. Sans vérification explicite, un item assigné à cette couche se retrouve simplement… nulle part d’utile :

from kipy.board_types import BoardLayer

def get_layer_id(board, layer_name):
    layer_id = board.get_layer_by_name(layer_name)
    if layer_id == BoardLayer.BL_UNDEFINED:
        raise Exception(f"couche inconnue : {layer_name} (sensible à la casse)")
    return layer_id

f_cu = get_layer_id(board, "F.Cu")

⚠️ Testé : get_layer_by_name("NotALayer") ne lève rien et renvoie BL_UNDEFINED — le point le plus facile à rater des deux APIs si on ne vérifie pas la valeur de retour.

Et dans l’autre sens : ID vers nom

GetLayerName ne renvoie pas forcément "F.Cu" : c’est le nom d’affichage de cette board, qui peut avoir été personnalisé (un board 4 couches nommé “TOP”/“GND”/“PWR”/“BOTTOM” par exemple). Pour retrouver le nom canonique attendu par GetLayerID, il faut GetStandardLayerName :

board.GetLayerName(pcbnew.F_Cu)          # nom personnalisé de la board, ex. "TOP"
board.GetStandardLayerName(pcbnew.F_Cu)  # toujours "F.Cu"

Sur une board dont les couches n’ont jamais été renommées, les deux renvoient la même chose — le piège n’apparaît que sur des boards réelles avec des noms de couches personnalisés, ce qui est fréquent en entreprise.

Même subtilité côté IPC : get_layer_name renvoie le nom personnalisé de la board, pas le nom canonique. Contrairement à pcbnew, il n’existe pas d’équivalent confirmé à GetStandardLayerName — BoardLayer.Name(...) existe bien, mais renvoie l’identifiant Python de l’enum ("BL_F_Cu"), pas le format pointé ("F.Cu") attendu par get_layer_by_name :

from kipy.board_types import BoardLayer

board.get_layer_name(BoardLayer.BL_F_Cu)  # nom personnalisé de la board, ex. "TOP"
BoardLayer.Name(BoardLayer.BL_F_Cu)       # "BL_F_Cu" — pas réutilisable tel quel dans get_layer_by_name

Si vous avez besoin du nom canonique côté IPC, gardez plutôt votre propre correspondance nom ↔ constante BoardLayer dans votre script.

Pour aller plus loin

Cette petite fonction de résolution devient vite un utilitaire partagé par tous vos scripts dès qu’ils touchent plusieurs couches — c’est elle qui est réellement appelée derrière SetLayer, SetLayerPair (tuto via aveugle/enterré) ou zone.layers (tuto zone de cuivre) dans les autres tutoriels de ce site. Centraliser la vérification à un seul endroit évite de la ré-écrire (ou de l’oublier) dans chaque script.