Index: trunk/src/layer.c =================================================================== --- trunk/src/layer.c (revision 19120) +++ trunk/src/layer.c (revision 19121) @@ -293,6 +293,42 @@ return layer->meta.bound.type; } +int pcb_layer_purpose(pcb_board_t *pcb, pcb_layer_id_t layer_idx, const char **out) +{ + pcb_layergrp_t *grp; + + if (layer_idx & PCB_LYT_UI) + return PCB_LYT_UI | PCB_LYT_VIRTUAL; + + if ((layer_idx >= PCB_LAYER_VIRT_MIN) && (layer_idx <= PCB_LAYER_VIRT_MAX)) { + if (out != NULL) + *out = pcb_virt_layers[layer_idx - PCB_LAYER_VIRT_MIN].purpose; + return pcb_virt_layers[layer_idx - PCB_LAYER_VIRT_MIN].purpi; + } + + if ((layer_idx < 0) || (layer_idx >= pcb->Data->LayerN)) { + if (out != NULL) + *out = NULL; + return -1; + } + + grp = pcb_get_layergrp(pcb, layer_idx); + + if (out != NULL) { + if (grp == NULL) { + *out = NULL; + return -1; + } + *out = grp->purpose; + return grp->purpi; + } + + if (grp == NULL) + return -1; + + return grp->purpi; +} + #define APPEND(n) \ do { \ if (res != NULL) { \ Index: trunk/src/layer.h =================================================================== --- trunk/src/layer.h (revision 19120) +++ trunk/src/layer.h (revision 19121) @@ -222,6 +222,11 @@ unsigned int pcb_layer_flags(pcb_board_t *pcb, pcb_layer_id_t layer_idx); unsigned int pcb_layer_flags_(pcb_layer_t *layer); +/* Return the purpi of the group of a layer; if out is not NULL, also copy + a pointer to the purpose string there (valid until a layer change) */ +int pcb_layer_purpose(pcb_board_t *pcb, pcb_layer_id_t layer_idx, const char **out); + + /* map bits of a layer type (call cb for each bit set); return number of bits found. */ int pcb_layer_type_map(pcb_layer_type_t type, void *ctx, void (*cb)(void *ctx, pcb_layer_type_t bit, const char *name, int class, const char *class_name));