Index: trunk/src/find_drc.c =================================================================== --- trunk/src/find_drc.c (revision 13141) +++ trunk/src/find_drc.c (revision 13142) @@ -629,7 +629,40 @@ if (!IsBad) { PCB_PADSTACK_LOOP(PCB->Data); { - if (pcb_pstk_drc_check_and_warn(padstack)) { + pcb_coord_t ring = 0, hole = 0; + pcb_poly_plows(PCB->Data, PCB_TYPE_PSTK, padstack, padstack, drc_callback); + if (IsBad) + break; + pcb_pstk_drc_check_and_warn(padstack, &ring, &hole); + if ((ring > 0) || (hole > 0)) { + pcb_undo_add_obj_to_flag(padstack); + PCB_FLAG_SET(TheFlag, padstack); + pcb_pstk_invalidate_draw(padstack); + if (ring) { + drcerr_count++; + SetThing(PCB_TYPE_VIA, padstack, padstack, padstack); + LocateError(&x, &y); + BuildObjectList(&object_count, &object_id_list, &object_type_list); + violation = pcb_drc_violation_new(_("padstack annular ring too small"), _("Annular rings that are too small may erode during etching,\n" "resulting in a broken connection"), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + pcb_true, /* MEASUREMENT OF ERROR KNOWN */ + ring, + PCB->minRing, object_count, object_id_list, object_type_list); + append_drc_violation(violation); + pcb_drc_violation_free(violation); + } + if (hole > 0) { + drcerr_count++; + SetThing(PCB_TYPE_VIA, padstack, padstack, padstack); + LocateError(&x, &y); + BuildObjectList(&object_count, &object_id_list, &object_type_list); + violation = pcb_drc_violation_new(_("Padstack drill size is too small"), _("Process rules dictate the minimum drill size which can be used"), x, y, 0, /* ANGLE OF ERROR UNKNOWN */ + pcb_true, /* MEASUREMENT OF ERROR KNOWN */ + hole, PCB->minDrill, object_count, object_id_list, object_type_list); + append_drc_violation(violation); + pcb_drc_violation_free(violation); + } + free(object_id_list); + free(object_type_list); if (!throw_drc_dialog()) { IsBad = pcb_true; break; @@ -639,7 +672,6 @@ PCB_END_LOOP; } - pcb_conn_lookup_uninit(); TheFlag = PCB_FLAG_FOUND; Bloat = 0; Index: trunk/src/obj_pstk.c =================================================================== --- trunk/src/obj_pstk.c (revision 13141) +++ trunk/src/obj_pstk.c (revision 13142) @@ -679,12 +679,31 @@ } -int pcb_pstk_drc_check_and_warn(pcb_pstk_t *ps) +static pcb_bool pcb_pstk_shape_hole_break(pcb_pstk_tshape_t *ts, pcb_coord_t min, pcb_coord_t *out) { #warning padstack TODO return 0; } +void pcb_pstk_drc_check_and_warn(pcb_pstk_t *ps, pcb_coord_t *err_minring, pcb_coord_t *err_minhole) +{ + pcb_pstk_proto_t *proto = pcb_pstk_get_proto(ps); + + if (proto->hdia >= 0) { + int n; + pcb_pstk_tshape_t *ts = pcb_pstk_get_tshape_(ps->parent.data, ps->proto, 0); + + for(n = 0; n < ts->len; n++) { + if (pcb_pstk_shape_hole_break(ts, 2 * PCB->minRing, &err_minring)) { + break; + } + } + } + + if ((proto->hdia > 0) && (proto->hdia < PCB->minDrill)) + *err_minhole = proto->hdia; +} + void pcb_pstk_mirror(pcb_pstk_t *ps, pcb_coord_t y_offs, int swap_side) { int xmirror = ps->xmirror; Index: trunk/src/obj_pstk.h =================================================================== --- trunk/src/obj_pstk.h (revision 13141) +++ trunk/src/obj_pstk.h (revision 13142) @@ -121,9 +121,10 @@ int pcb_pstk_drc_check_clearance(pcb_pstk_t *ps, pcb_poly_t *polygon, pcb_coord_t min_clr); /* Check all possible local drc errors regarding to pad stacks - errors that - depend only on the padstack, not on other objects. Return 0 if everything - was fine */ -int pcb_pstk_drc_check_and_warn(pcb_pstk_t *ps); + depend only on the padstack, not on other objects. load err_minring and + err_minhole with the relevant data for the report when ring or hole rules + are violated */ +void pcb_pstk_drc_check_and_warn(pcb_pstk_t *ps, pcb_coord_t *err_minring, pcb_coord_t *err_minhole); /* Generate poly->pa (which should be NULL at the time of call) */ void pcb_pstk_shape_update_pa(pcb_pstk_poly_t *poly);