Index: oldactions.c =================================================================== --- oldactions.c (revision 31215) +++ oldactions.c (revision 31216) @@ -371,6 +371,94 @@ return 1; } +static const char pcb_acts_MinClearGap[] = "MinClearGap(delta)\n" "MinClearGap(Selected, delta)"; +static const char pcb_acth_MinClearGap[] = "Ensures that polygons are a minimum distance from objects."; +/* DOC: mincleargap.html */ +static void minclr(pcb_data_t *data, rnd_coord_t value, int flags) +{ + PCB_SUBC_LOOP(data); + { + if (!PCB_FLAGS_TEST(flags, subc)) + continue; + minclr(subc->data, value, 0); + } + PCB_END_LOOP; + + PCB_PADSTACK_LOOP(data); + { + if (!PCB_FLAGS_TEST(flags, padstack)) + continue; + if (padstack->Clearance < value) { + pcb_chg_obj_clear_size(PCB_OBJ_PSTK, padstack, 0, 0, value, 1); + pcb_undo_restore_serial(); + } + } + PCB_END_LOOP; + + PCB_LINE_ALL_LOOP(data); + { + if (!PCB_FLAGS_TEST(flags, line)) + continue; + if ((line->Clearance != 0) && (line->Clearance < value)) { + pcb_chg_obj_clear_size(PCB_OBJ_LINE, layer, line, 0, value, 1); + pcb_undo_restore_serial(); + } + } + PCB_ENDALL_LOOP; + PCB_ARC_ALL_LOOP(data); + { + if (!PCB_FLAGS_TEST(flags, arc)) + continue; + if ((arc->Clearance != 0) && (arc->Clearance < value)) { + pcb_chg_obj_clear_size(PCB_OBJ_ARC, layer, arc, 0, value, 1); + pcb_undo_restore_serial(); + } + } + PCB_ENDALL_LOOP; + PCB_POLY_ALL_LOOP(data); + { + if (!PCB_FLAGS_TEST(flags, polygon)) + continue; + if ((polygon->Clearance != 0) && (polygon->Clearance < value)) { + pcb_chg_obj_clear_size(PCB_OBJ_POLY, layer, polygon, 0, value, 1); + pcb_undo_restore_serial(); + } + } + PCB_ENDALL_LOOP; +} + +static fgw_error_t pcb_act_MinClearGap(fgw_arg_t *res, int argc, fgw_arg_t *argv) +{ + pcb_board_t *pcb = PCB_ACT_BOARD; + const char *function; + const char *delta = NULL; + const char *units = NULL; + rnd_bool absolute; + rnd_coord_t value; + int flags; + + RND_ACT_CONVARG(1, FGW_STR, MinClearGap, function = argv[1].val.str); + RND_ACT_MAY_CONVARG(2, FGW_STR, MinClearGap, delta = argv[2].val.str); + RND_ACT_MAY_CONVARG(3, FGW_STR, MinClearGap, delta = argv[3].val.str); + + if (rnd_strcasecmp(function, "Selected") == 0) + flags = PCB_FLAG_SELECTED; + else { + units = delta; + delta = function; + flags = 0; + } + value = 2 * rnd_get_value(delta, units, &absolute, NULL); + + pcb_undo_save_serial(); + minclr(pcb->Data, value, flags); + pcb_undo_restore_serial(); + pcb_undo_inc_serial(); + RND_ACT_IRES(0); + return 0; +} + + rnd_action_t oldactions_action_list[] = { {"DumpLibrary", pcb_act_DumpLibrary, pcb_acth_DumpLibrary, pcb_acts_DumpLibrary}, {"Bell", pcb_act_Bell, pcb_acth_Bell, pcb_acts_Bell}, @@ -391,6 +479,7 @@ /* deprecated actions */ {"ToggleHideName", pcb_act_ToggleHideName, 0, 0}, {"MinMaskGap", pcb_act_MinMaskGap, 0, 0}, + {"MinClearGap", pcb_act_MinClearGap, pcb_acth_MinClearGap, pcb_acts_MinClearGap}, {"ChangeHole", pcb_act_ChangeHole, 0, 0}, {"ChangePaste", pcb_act_ChangePaste, 0, 0}, {"ChangeSquare", pcb_act_ChangeSquare, 0, 0},