Index: trunk/src/obj_pstk.c =================================================================== --- trunk/src/obj_pstk.c (revision 12750) +++ trunk/src/obj_pstk.c (revision 12751) @@ -384,13 +384,13 @@ } -int pcb_pstk_near_box(pcb_pstk_t *ps, pcb_box_t *box) +int pcb_pstk_near_box(pcb_pstk_t *ps, pcb_box_t *box, pcb_layer_t *layer) { #warning padstack TODO: refine this: consider the shapes on the layers that are visible return (PCB_IS_BOX_NEGATIVE(box) ? PCB_BOX_TOUCHES_BOX(&ps->BoundingBox,box) : PCB_BOX_IN_BOX(&ps->BoundingBox,box)); } -int pcb_is_point_in_pstk(pcb_coord_t x, pcb_coord_t y, pcb_coord_t radius, pcb_pstk_t *ps) +int pcb_is_point_in_pstk(pcb_coord_t x, pcb_coord_t y, pcb_coord_t radius, pcb_pstk_t *ps, pcb_layer_t *layer) { #warning padstack TODO: refine this: consider the shapes on the layers that are visible return (x >= ps->BoundingBox.X1) && (y >= ps->BoundingBox.Y1) && (x <= ps->BoundingBox.X2) && (y <= ps->BoundingBox.Y2); Index: trunk/src/obj_pstk.h =================================================================== --- trunk/src/obj_pstk.h (revision 12750) +++ trunk/src/obj_pstk.h (revision 12751) @@ -52,6 +52,7 @@ #define PCB_PADSTACK_INVALID ((pcb_cardinal_t)(-1)) +#include "layer.h" #include "obj_common.h" #include "obj_pstk_shape.h" #include "vtpadstack_t.h" @@ -103,9 +104,9 @@ /* allocate the point array of a poly shape (single allocation for x and y) */ void pcb_pstk_shape_alloc_poly(pcb_pstk_poly_t *poly, int len); -/* geometry for select.c and search.c */ -int pcb_pstk_near_box(pcb_pstk_t *ps, pcb_box_t *box); -int pcb_is_point_in_pstk(pcb_coord_t x, pcb_coord_t y, pcb_coord_t radius, pcb_pstk_t *ps); +/* geometry for select.c and search.c; if layer is NULL, consider all shapes */ +int pcb_pstk_near_box(pcb_pstk_t *ps, pcb_box_t *box, pcb_layer_t *layer); +int pcb_is_point_in_pstk(pcb_coord_t x, pcb_coord_t y, pcb_coord_t radius, pcb_pstk_t *ps, pcb_layer_t *layer); /* Check if padstack has the proper clearance against polygon; returns 0 if everything's fine */ int pcb_pstk_drc_check_clearance(pcb_pstk_t *ps, pcb_poly_t *polygon, pcb_coord_t min_clr); Index: trunk/src/search.c =================================================================== --- trunk/src/search.c (revision 12750) +++ trunk/src/search.c (revision 12751) @@ -137,7 +137,7 @@ TEST_OBJST(i->objst, i->req_flag, g, ps, ps); - if (!pcb_is_point_in_pstk(PosX, PosY, SearchRadius, ps)) + if (!pcb_is_point_in_pstk(PosX, PosY, SearchRadius, ps, NULL)) return PCB_R_DIR_NOT_FOUND; *i->ptr1 = *i->ptr2 = *i->ptr3 = ps; return PCB_R_DIR_CANCEL; /* found, stop searching */ Index: trunk/src/select.c =================================================================== --- trunk/src/select.c (revision 12750) +++ trunk/src/select.c (revision 12751) @@ -492,7 +492,7 @@ PCB_PADSTACK_LOOP(pcb->Data); { - if (pcb_pstk_near_box(padstack, Box) + if (pcb_pstk_near_box(padstack, Box, NULL) && !PCB_FLAG_TEST(PCB_FLAG_LOCK, padstack) && PCB_FLAG_TEST(PCB_FLAG_SELECTED, padstack) != Flag) { append(PCB_TYPE_PSTK, padstack, padstack); @@ -531,7 +531,7 @@ case PCB_OBJ_POLY: return PCB_POLYGON_NEAR_BOX((pcb_poly_t *)obj, box); case PCB_OBJ_ARC: return PCB_ARC_NEAR_BOX((pcb_arc_t *)obj, box); case PCB_OBJ_PAD: return PCB_PAD_NEAR_BOX((pcb_pad_t *)obj, box); - case PCB_OBJ_PSTK: return pcb_pstk_near_box((pcb_pstk_t *)obj, box); + case PCB_OBJ_PSTK: return pcb_pstk_near_box((pcb_pstk_t *)obj, box, NULL); case PCB_OBJ_PIN: case PCB_OBJ_VIA: return PCB_VIA_OR_PIN_NEAR_BOX((pcb_pin_t *)obj, box); case PCB_OBJ_ELEMENT: return PCB_ELEMENT_NEAR_BOX((pcb_element_t *)obj, box);