Index: trunk/src/layer_grp.c =================================================================== --- trunk/src/layer_grp.c (revision 10445) +++ trunk/src/layer_grp.c (revision 10446) @@ -699,7 +699,36 @@ return 0; } +pcb_layergrp_id_t pcb_layergrp_step(pcb_board_t *pcb, pcb_layergrp_id_t gid, int steps, pcb_layer_type_t mask) +{ + int d, cnt; + if (gid < 0) + return -1; + + if (steps == 0) + return gid; + + if (steps < 0) { + d = -1; + steps = -steps; + } + else + d = 1; + + for(gid += d;; gid += d) { + if ((gid < 0) || (gid >= pcb->LayerGroups.len)) + return -1; + if ((pcb->LayerGroups.grp[gid].type & mask) == mask) { + steps--; + if (steps == 0) + return gid; + } + } + return -1; +} + + static pcb_layergrp_id_t pcb_layergrp_get_cached(pcb_board_t *pcb, pcb_layer_id_t *cache, unsigned int loc, unsigned int typ) { pcb_layergrp_t *g; Index: trunk/src/layer_grp.h =================================================================== --- trunk/src/layer_grp.h (revision 10445) +++ trunk/src/layer_grp.h (revision 10446) @@ -121,7 +121,12 @@ mask is PCB_LYT_COPPER -> *diff is the copper index of the internal layer from top */ int pcb_layergrp_dist(pcb_board_t *pcb, pcb_layergrp_id_t gid1, pcb_layergrp_id_t gid2, pcb_layer_type_t mask, int *diff); +/* walk the given amount steps on the stack among layer groups matching mask. + A negative step goes upward. + Typical use: "return the 2nd copper layer below this one" */ +pcb_layergrp_id_t pcb_layergrp_step(pcb_board_t *pcb, pcb_layergrp_id_t gid, int steps, pcb_layer_type_t mask); + /* Enable/disable inhibition of layer changed events during layer group updates */ void pcb_layergrp_inhibit_inc(void); void pcb_layergrp_inhibit_dec(void);