Index: src/action.c =================================================================== --- src/action.c (revision 1095) +++ src/action.c (revision 1096) @@ -1716,174 +1716,6 @@ return 0; } -/* --------------------------------------------------------------------------- */ - -static const char minmaskgap_syntax[] = "MinMaskGap(delta)\n" "MinMaskGap(Selected, delta)"; - -static const char minmaskgap_help[] = "Ensures the mask is a minimum distance from pins and pads."; - -/* %start-doc actions MinMaskGap - -Checks all specified pins and/or pads, and increases the mask if -needed to ensure a minimum distance between the pin or pad edge and -the mask edge. - -%end-doc */ - -static int ActionMinMaskGap(int argc, char **argv, Coord x, Coord y) -{ - char *function = ARG(0); - char *delta = ARG(1); - char *units = ARG(2); - bool absolute; - Coord value; - int flags; - - if (!function) - return 1; - if (strcasecmp(function, "Selected") == 0) - flags = SELECTEDFLAG; - else { - units = delta; - delta = function; - flags = 0; - } - value = 2 * GetValue(delta, units, &absolute); - - SaveUndoSerialNumber(); - ELEMENT_LOOP(PCB->Data); - { - PIN_LOOP(element); - { - if (!TEST_FLAGS(flags, pin)) - continue; - if (pin->Mask < pin->Thickness + value) { - ChangeObjectMaskSize(PIN_TYPE, element, pin, 0, pin->Thickness + value, 1); - RestoreUndoSerialNumber(); - } - } - END_LOOP; - PAD_LOOP(element); - { - if (!TEST_FLAGS(flags, pad)) - continue; - if (pad->Mask < pad->Thickness + value) { - ChangeObjectMaskSize(PAD_TYPE, element, pad, 0, pad->Thickness + value, 1); - RestoreUndoSerialNumber(); - } - } - END_LOOP; - } - END_LOOP; - VIA_LOOP(PCB->Data); - { - if (!TEST_FLAGS(flags, via)) - continue; - if (via->Mask && via->Mask < via->Thickness + value) { - ChangeObjectMaskSize(VIA_TYPE, via, 0, 0, via->Thickness + value, 1); - RestoreUndoSerialNumber(); - } - } - END_LOOP; - RestoreUndoSerialNumber(); - IncrementUndoSerialNumber(); - return 0; -} - -/* --------------------------------------------------------------------------- */ - -static const char mincleargap_syntax[] = "MinClearGap(delta)\n" "MinClearGap(Selected, delta)"; - -static const char mincleargap_help[] = "Ensures that polygons are a minimum distance from objects."; - -/* %start-doc actions MinClearGap - -Checks all specified objects, and increases the polygon clearance if -needed to ensure a minimum distance between their edges and the -polygon edges. - -%end-doc */ - -static int ActionMinClearGap(int argc, char **argv, Coord x, Coord y) -{ - char *function = ARG(0); - char *delta = ARG(1); - char *units = ARG(2); - bool absolute; - Coord value; - int flags; - - if (!function) - return 1; - if (strcasecmp(function, "Selected") == 0) - flags = SELECTEDFLAG; - else { - units = delta; - delta = function; - flags = 0; - } - value = 2 * GetValue(delta, units, &absolute); - - SaveUndoSerialNumber(); - ELEMENT_LOOP(PCB->Data); - { - PIN_LOOP(element); - { - if (!TEST_FLAGS(flags, pin)) - continue; - if (pin->Clearance < value) { - ChangeObjectClearSize(PIN_TYPE, element, pin, 0, value, 1); - RestoreUndoSerialNumber(); - } - } - END_LOOP; - PAD_LOOP(element); - { - if (!TEST_FLAGS(flags, pad)) - continue; - if (pad->Clearance < value) { - ChangeObjectClearSize(PAD_TYPE, element, pad, 0, value, 1); - RestoreUndoSerialNumber(); - } - } - END_LOOP; - } - END_LOOP; - VIA_LOOP(PCB->Data); - { - if (!TEST_FLAGS(flags, via)) - continue; - if (via->Clearance < value) { - ChangeObjectClearSize(VIA_TYPE, via, 0, 0, value, 1); - RestoreUndoSerialNumber(); - } - } - END_LOOP; - ALLLINE_LOOP(PCB->Data); - { - if (!TEST_FLAGS(flags, line)) - continue; - if (line->Clearance < value) { - ChangeObjectClearSize(LINE_TYPE, layer, line, 0, value, 1); - RestoreUndoSerialNumber(); - } - } - ENDALL_LOOP; - ALLARC_LOOP(PCB->Data); - { - if (!TEST_FLAGS(flags, arc)) - continue; - if (arc->Clearance < value) { - ChangeObjectClearSize(ARC_TYPE, layer, arc, 0, value, 1); - RestoreUndoSerialNumber(); - } - } - ENDALL_LOOP; - RestoreUndoSerialNumber(); - IncrementUndoSerialNumber(); - return 0; -} - /* --------------------------------------------------------------------------- * no operation, just for testing purposes * syntax: Bell(volume) @@ -2071,12 +1903,6 @@ {"ExecuteFile", 0, ActionExecuteFile, executefile_help, executefile_syntax} , - {"MinMaskGap", 0, ActionMinMaskGap, - minmaskgap_help, minmaskgap_syntax} - , - {"MinClearGap", 0, ActionMinClearGap, - mincleargap_help, mincleargap_syntax} - , #ifdef BA_TODO {"Renumber", 0, ActionRenumber, renumber_help, renumber_syntax} Index: src/object_act.c =================================================================== --- src/object_act.c (revision 1095) +++ src/object_act.c (revision 1096) @@ -814,7 +814,175 @@ return 0; } +/* --------------------------------------------------------------------------- */ +static const char minmaskgap_syntax[] = "MinMaskGap(delta)\n" "MinMaskGap(Selected, delta)"; + +static const char minmaskgap_help[] = "Ensures the mask is a minimum distance from pins and pads."; + +/* %start-doc actions MinMaskGap + +Checks all specified pins and/or pads, and increases the mask if +needed to ensure a minimum distance between the pin or pad edge and +the mask edge. + +%end-doc */ + +static int ActionMinMaskGap(int argc, char **argv, Coord x, Coord y) +{ + char *function = ARG(0); + char *delta = ARG(1); + char *units = ARG(2); + bool absolute; + Coord value; + int flags; + + if (!function) + return 1; + if (strcasecmp(function, "Selected") == 0) + flags = SELECTEDFLAG; + else { + units = delta; + delta = function; + flags = 0; + } + value = 2 * GetValue(delta, units, &absolute); + + SaveUndoSerialNumber(); + ELEMENT_LOOP(PCB->Data); + { + PIN_LOOP(element); + { + if (!TEST_FLAGS(flags, pin)) + continue; + if (pin->Mask < pin->Thickness + value) { + ChangeObjectMaskSize(PIN_TYPE, element, pin, 0, pin->Thickness + value, 1); + RestoreUndoSerialNumber(); + } + } + END_LOOP; + PAD_LOOP(element); + { + if (!TEST_FLAGS(flags, pad)) + continue; + if (pad->Mask < pad->Thickness + value) { + ChangeObjectMaskSize(PAD_TYPE, element, pad, 0, pad->Thickness + value, 1); + RestoreUndoSerialNumber(); + } + } + END_LOOP; + } + END_LOOP; + VIA_LOOP(PCB->Data); + { + if (!TEST_FLAGS(flags, via)) + continue; + if (via->Mask && via->Mask < via->Thickness + value) { + ChangeObjectMaskSize(VIA_TYPE, via, 0, 0, via->Thickness + value, 1); + RestoreUndoSerialNumber(); + } + } + END_LOOP; + RestoreUndoSerialNumber(); + IncrementUndoSerialNumber(); + return 0; +} + +/* --------------------------------------------------------------------------- */ + +static const char mincleargap_syntax[] = "MinClearGap(delta)\n" "MinClearGap(Selected, delta)"; + +static const char mincleargap_help[] = "Ensures that polygons are a minimum distance from objects."; + +/* %start-doc actions MinClearGap + +Checks all specified objects, and increases the polygon clearance if +needed to ensure a minimum distance between their edges and the +polygon edges. + +%end-doc */ + +static int ActionMinClearGap(int argc, char **argv, Coord x, Coord y) +{ + char *function = ARG(0); + char *delta = ARG(1); + char *units = ARG(2); + bool absolute; + Coord value; + int flags; + + if (!function) + return 1; + if (strcasecmp(function, "Selected") == 0) + flags = SELECTEDFLAG; + else { + units = delta; + delta = function; + flags = 0; + } + value = 2 * GetValue(delta, units, &absolute); + + SaveUndoSerialNumber(); + ELEMENT_LOOP(PCB->Data); + { + PIN_LOOP(element); + { + if (!TEST_FLAGS(flags, pin)) + continue; + if (pin->Clearance < value) { + ChangeObjectClearSize(PIN_TYPE, element, pin, 0, value, 1); + RestoreUndoSerialNumber(); + } + } + END_LOOP; + PAD_LOOP(element); + { + if (!TEST_FLAGS(flags, pad)) + continue; + if (pad->Clearance < value) { + ChangeObjectClearSize(PAD_TYPE, element, pad, 0, value, 1); + RestoreUndoSerialNumber(); + } + } + END_LOOP; + } + END_LOOP; + VIA_LOOP(PCB->Data); + { + if (!TEST_FLAGS(flags, via)) + continue; + if (via->Clearance < value) { + ChangeObjectClearSize(VIA_TYPE, via, 0, 0, value, 1); + RestoreUndoSerialNumber(); + } + } + END_LOOP; + ALLLINE_LOOP(PCB->Data); + { + if (!TEST_FLAGS(flags, line)) + continue; + if (line->Clearance < value) { + ChangeObjectClearSize(LINE_TYPE, layer, line, 0, value, 1); + RestoreUndoSerialNumber(); + } + } + ENDALL_LOOP; + ALLARC_LOOP(PCB->Data); + { + if (!TEST_FLAGS(flags, arc)) + continue; + if (arc->Clearance < value) { + ChangeObjectClearSize(ARC_TYPE, layer, arc, 0, value, 1); + RestoreUndoSerialNumber(); + } + } + ENDALL_LOOP; + RestoreUndoSerialNumber(); + IncrementUndoSerialNumber(); + return 0; +} + + HID_Action object_action_list[] = { {"Attributes", 0, ActionAttributes, attributes_help, attributes_syntax} @@ -839,6 +1007,12 @@ , {"RipUp", 0, ActionRipUp, ripup_help, ripup_syntax} + , + {"MinMaskGap", 0, ActionMinMaskGap, + minmaskgap_help, minmaskgap_syntax} + , + {"MinClearGap", 0, ActionMinClearGap, + mincleargap_help, mincleargap_syntax} }; REGISTER_ACTIONS(object_action_list)