Index: trunk/src/find.h =================================================================== --- trunk/src/find.h (revision 31447) +++ trunk/src/find.h (revision 31448) @@ -47,6 +47,7 @@ rnd_coord_t bloat; /* perform intersection tests with one object bloated up by this amount (can be negative for shrinking) */ unsigned ignore_clearance:1; /* a flag dictated clearance is no excuse for intersection - useful for overlap calculation between objects on different layers */ unsigned allow_noncopper_pstk:1;/* when 1, even non-copper shapes of padstacks will "conduct" in a pstk-pstk check (useful for the drc) */ + unsigned pstk_anylayer:1; /* when 1, check every shape of the padstack for intersection, don't require it to be on the same layer */ /* high level (ignored by isc calls): */ unsigned stay_layergrp:1; /* do not leave the layer (no padstack hop) */ @@ -105,7 +106,7 @@ rnd_bool pcb_isc_arc_polyarea(const pcb_find_t *ctx, pcb_arc_t *Arc, rnd_polyarea_t *pa); rnd_bool pcb_isc_line_poly(const pcb_find_t *ctx, pcb_line_t *Line, pcb_poly_t *Polygon); rnd_bool pcb_isc_poly_poly(const pcb_find_t *ctx, pcb_poly_t *P1, pcb_poly_t *P2); -rnd_bool_t pcb_isc_pstk_line(const pcb_find_t *ctx, pcb_pstk_t *ps, pcb_line_t *line); +rnd_bool_t pcb_isc_pstk_line(const pcb_find_t *ctx, pcb_pstk_t *ps, pcb_line_t *line, rnd_bool anylayer); /* Return whether obj is marked as already visited by the current search context */ #define PCB_FIND_IS_MARKED(ctx, obj) PCB_DFLAG_TEST(&((obj)->Flags), (ctx)->mark) Index: trunk/src/find_any_isect.c =================================================================== --- trunk/src/find_any_isect.c (revision 31447) +++ trunk/src/find_any_isect.c (revision 31448) @@ -33,7 +33,7 @@ rnd_bool pcb_isc_text_text(const pcb_find_t *ctx, pcb_text_t *a, pcb_text_t *b) { return rnd_false; } rnd_bool pcb_isc_text_poly(const pcb_find_t *ctx, pcb_text_t *a, pcb_poly_t *b) { return rnd_false; } rnd_bool pcb_isc_text_arc(const pcb_find_t *ctx, pcb_text_t *a, pcb_arc_t *b) { return rnd_false; } -rnd_bool pcb_isc_text_pstk(const pcb_find_t *ctx, pcb_text_t *a, pcb_pstk_t *b) { return rnd_false; } +rnd_bool pcb_isc_text_pstk(const pcb_find_t *ctx, pcb_text_t *a, pcb_pstk_t *b, rnd_bool anylayer) { return rnd_false; } rnd_bool pcb_intersect_obj_obj(const pcb_find_t *ctx, pcb_any_obj_t *a, pcb_any_obj_t *b) { @@ -56,7 +56,7 @@ case PCB_OBJ_POLY: return pcb_isc_line_poly(ctx, (pcb_line_t *)a, (pcb_poly_t *)b); case PCB_OBJ_ARC: return pcb_isc_line_arc(ctx, (pcb_line_t *)a, (pcb_arc_t *)b); /* case PCB_OBJ_GFX: return pcb_isc_line_gfx(ctx, (pcb_line_t *)a, (pcb_gfx_t *)b);*/ - case PCB_OBJ_PSTK: return pcb_isc_pstk_line(ctx, (pcb_pstk_t *)b, (pcb_line_t *)a); + case PCB_OBJ_PSTK: return pcb_isc_pstk_line(ctx, (pcb_pstk_t *)b, (pcb_line_t *)a, ctx->pstk_anylayer); case PCB_OBJ_RAT: return pcb_isc_rat_line(ctx, (pcb_rat_t *)b, (pcb_line_t *)a); default:; } @@ -69,7 +69,7 @@ case PCB_OBJ_POLY: return pcb_isc_text_poly(ctx, (pcb_text_t *)a, (pcb_poly_t *)b); case PCB_OBJ_ARC: return pcb_isc_text_arc(ctx, (pcb_text_t *)a, (pcb_arc_t *)b); /* case PCB_OBJ_GFX: return pcb_isc_text_gfx(ctx, (pcb_text_t *)a, (pcb_gfx_t *)b);*/ - case PCB_OBJ_PSTK: return pcb_isc_text_pstk(ctx, (pcb_text_t *)a, (pcb_pstk_t *)b); + case PCB_OBJ_PSTK: return pcb_isc_text_pstk(ctx, (pcb_text_t *)a, (pcb_pstk_t *)b, ctx->pstk_anylayer); case PCB_OBJ_RAT: return rnd_false; /* text is invisible to find for now */ default:; } @@ -83,7 +83,7 @@ case PCB_OBJ_POLY: return pcb_isc_poly_poly(ctx, (pcb_poly_t *)a, (pcb_poly_t *)b); case PCB_OBJ_ARC: return pcb_isc_arc_poly(ctx, (pcb_arc_t *)b, (pcb_poly_t *)a); /* case PCB_OBJ_GFX: return pcb_isc_gfx_poly(ctx, (pcb_gfx_t *)b, (pcb_poly_t *)a);*/ - case PCB_OBJ_PSTK: return pcb_isc_pstk_poly(ctx, (pcb_pstk_t *)b, (pcb_poly_t *)a); + case PCB_OBJ_PSTK: return pcb_isc_pstk_poly(ctx, (pcb_pstk_t *)b, (pcb_poly_t *)a, ctx->pstk_anylayer); case PCB_OBJ_RAT: return pcb_isc_rat_poly(ctx, (pcb_rat_t *)b, (pcb_poly_t *)a); default:; } @@ -96,7 +96,7 @@ case PCB_OBJ_POLY: return pcb_isc_arc_poly(ctx, (pcb_arc_t *)a, (pcb_poly_t *)b); case PCB_OBJ_ARC: return pcb_isc_arc_arc(ctx, (pcb_arc_t *)a, (pcb_arc_t *)b); /* case PCB_OBJ_GFX: return pcb_isc_gfx_arc(ctx, (pcb_gfx_t *)a, (pcb_arc_t *)b);*/ - case PCB_OBJ_PSTK: return pcb_isc_pstk_arc(ctx, (pcb_pstk_t *)b, (pcb_arc_t *)a); + case PCB_OBJ_PSTK: return pcb_isc_pstk_arc(ctx, (pcb_pstk_t *)b, (pcb_arc_t *)a, ctx->pstk_anylayer); case PCB_OBJ_RAT: return pcb_isc_rat_arc(ctx, (pcb_rat_t *)b, (pcb_arc_t *)a); default:; } @@ -117,12 +117,12 @@ case PCB_OBJ_PSTK: switch(b->type) { case PCB_OBJ_VOID: return rnd_false; - case PCB_OBJ_LINE: return pcb_isc_pstk_line(ctx, (pcb_pstk_t *)a, (pcb_line_t *)b); - case PCB_OBJ_TEXT: return pcb_isc_text_pstk(ctx, (pcb_text_t *)b, (pcb_pstk_t *)a); - case PCB_OBJ_POLY: return pcb_isc_pstk_poly(ctx, (pcb_pstk_t *)a, (pcb_poly_t *)b); - case PCB_OBJ_ARC: return pcb_isc_pstk_arc(ctx, (pcb_pstk_t *)a, (pcb_arc_t *)b); -/* case PCB_OBJ_GFX: return pcb_isc_pstk_gfx(ctx, (pcb_pstk_t *)a, (pcb_gfx_t *)b);*/ - case PCB_OBJ_PSTK: return pcb_isc_pstk_pstk(ctx, (pcb_pstk_t *)a, (pcb_pstk_t *)b); + case PCB_OBJ_LINE: return pcb_isc_pstk_line(ctx, (pcb_pstk_t *)a, (pcb_line_t *)b, ctx->pstk_anylayer); + case PCB_OBJ_TEXT: return pcb_isc_text_pstk(ctx, (pcb_text_t *)b, (pcb_pstk_t *)a, ctx->pstk_anylayer); + case PCB_OBJ_POLY: return pcb_isc_pstk_poly(ctx, (pcb_pstk_t *)a, (pcb_poly_t *)b, ctx->pstk_anylayer); + case PCB_OBJ_ARC: return pcb_isc_pstk_arc(ctx, (pcb_pstk_t *)a, (pcb_arc_t *)b, ctx->pstk_anylayer); +/* case PCB_OBJ_GFX: return pcb_isc_pstk_gfx(ctx, (pcb_pstk_t *)a, (pcb_gfx_t *)b, ctx->pstk_anylayer);*/ + case PCB_OBJ_PSTK: return pcb_isc_pstk_pstk(ctx, (pcb_pstk_t *)a, (pcb_pstk_t *)b, ctx->pstk_anylayer); case PCB_OBJ_RAT: return pcb_isc_pstk_rat(ctx, (pcb_pstk_t *)a, (pcb_rat_t *)b); default:; } Index: trunk/src/find_geo.c =================================================================== --- trunk/src/find_geo.c (revision 31447) +++ trunk/src/find_geo.c (revision 31448) @@ -928,7 +928,7 @@ return rnd_false; } -rnd_bool_t pcb_isc_pstk_line(const pcb_find_t *ctx, pcb_pstk_t *ps, pcb_line_t *line) +rnd_bool_t pcb_isc_pstk_line(const pcb_find_t *ctx, pcb_pstk_t *ps, pcb_line_t *line, rnd_bool anylayer) { pcb_pstk_shape_t *shape; pcb_pstk_proto_t *proto; @@ -998,7 +998,7 @@ return rnd_false; } -RND_INLINE rnd_bool_t pcb_isc_pstk_arc(const pcb_find_t *ctx, pcb_pstk_t *ps, pcb_arc_t *arc) +RND_INLINE rnd_bool_t pcb_isc_pstk_arc(const pcb_find_t *ctx, pcb_pstk_t *ps, pcb_arc_t *arc, rnd_bool anylayer) { pcb_pstk_shape_t *shape; pcb_pstk_proto_t *proto; @@ -1095,7 +1095,7 @@ return rnd_false; } -RND_INLINE rnd_bool_t pcb_isc_pstk_poly(const pcb_find_t *ctx, pcb_pstk_t *ps, pcb_poly_t *poly) +RND_INLINE rnd_bool_t pcb_isc_pstk_poly(const pcb_find_t *ctx, pcb_pstk_t *ps, pcb_poly_t *poly, rnd_bool anylayer) { pcb_pstk_shape_t *shape; pcb_pstk_proto_t *proto; @@ -1204,7 +1204,7 @@ return rnd_false; } -RND_INLINE rnd_bool_t pcb_isc_pstk_pstk(const pcb_find_t *ctx, pcb_pstk_t *ps1, pcb_pstk_t *ps2) +RND_INLINE rnd_bool_t pcb_isc_pstk_pstk(const pcb_find_t *ctx, pcb_pstk_t *ps1, pcb_pstk_t *ps2, rnd_bool anylayer) { pcb_layer_t *ly; pcb_pstk_proto_t *proto1, *proto2; Index: trunk/src/obj_line_drcenf.c =================================================================== --- trunk/src/obj_line_drcenf.c (revision 31447) +++ trunk/src/obj_line_drcenf.c (revision 31448) @@ -200,7 +200,7 @@ pcb_pstk_t *ps = (pcb_pstk_t *)b; struct drc_info *i = (struct drc_info *)cl; - if (!PCB_FLAG_TEST(PCB_FLAG_FOUND, ps) && pcb_isc_pstk_line(pcb_find0, ps, i->line)) + if (!PCB_FLAG_TEST(PCB_FLAG_FOUND, ps) && pcb_isc_pstk_line(pcb_find0, ps, i->line, rnd_false)) longjmp(i->env, 1); return RND_R_DIR_FOUND_CONTINUE; } Index: trunk/src_plugins/djopt/djopt.c =================================================================== --- trunk/src_plugins/djopt/djopt.c (revision 31447) +++ trunk/src_plugins/djopt/djopt.c (revision 31448) @@ -896,7 +896,7 @@ int th = djmax(p->BoundingBox.X2 - p->BoundingBox.X1, p->BoundingBox.Y2 - p->BoundingBox.Y1); th /= 2; if (dist(l->s->x, l->s->y, c->x, c->y) > th - && dist(l->e->x, l->e->y, c->x, c->y) > th && pcb_isc_pstk_line(pcb_find0, p, l->line)) { + && dist(l->e->x, l->e->y, c->x, c->y) > th && pcb_isc_pstk_line(pcb_find0, p, l->line, rnd_false)) { return split_line(l, c); } } Index: trunk/src_plugins/puller/puller.c =================================================================== --- trunk/src_plugins/puller/puller.c (revision 31447) +++ trunk/src_plugins/puller/puller.c (revision 31448) @@ -747,7 +747,7 @@ /* See if the line passes through this pin - if so, split it into two lines so they can be pulled independently. */ - if (pcb_isc_pstk_line(pcb_find0, pin, line)) { + if (pcb_isc_pstk_line(pcb_find0, pin, line, rnd_false)) { #if TRACE1 rnd_printf("splitting line %#mD-%#mD because it passes through pin %#mD r%d\n", line->Point1.X, line->Point1.Y, line->Point2.X, line->Point2.Y, pin->x, pin->y, pin->Thickness / 2);