Index: trunk/src/change.c =================================================================== --- trunk/src/change.c (revision 3433) +++ trunk/src/change.c (revision 3434) @@ -2078,7 +2078,7 @@ } /* ---------------------------------------------------------------------- - * changes the size of all selected and visible object types + * changes the angle of all selected and visible object types * returns pcb_true if anything has changed */ pcb_bool ChangeSelectedAngle(int types, int is_start, Angle Difference, pcb_bool fixIt) @@ -2098,7 +2098,28 @@ return (change); } +/* ---------------------------------------------------------------------- + * changes the radius of all selected and visible object types + * returns pcb_true if anything has changed + */ +pcb_bool ChangeSelectedRadius(int types, int is_start, Angle Difference, pcb_bool fixIt) +{ + pcb_bool change = pcb_false; + /* setup identifiers */ + Absolute = (fixIt) ? Difference : 0; + Delta = Difference; + is_primary = is_start; + + change = SelectedOperation(&ChangeRadiusFunctions, pcb_false, types); + if (change) { + Draw(); + IncrementUndoSerialNumber(); + } + return (change); +} + + /* ---------------------------------------------------------------------- * sets the square-flag of all selected and visible pins or pads * returns pcb_true if anything has changed Index: trunk/src/change.h =================================================================== --- trunk/src/change.h (revision 3433) +++ trunk/src/change.h (revision 3434) @@ -111,8 +111,9 @@ void *ChangeObjectPinnum(int Type, void *Ptr1, void *Ptr2, void *Ptr3, char *Name); pcb_bool ChangeObjectRadius(int Type, void *Ptr1, void *Ptr2, void *Ptr3, int is_x, Coord r, pcb_bool absolute); pcb_bool ChangeObjectAngle(int Type, void *Ptr1, void *Ptr2, void *Ptr3, int is_start, Angle a, pcb_bool absolute); +pcb_bool ChangeSelectedAngle(int types, int is_start, Angle Difference, pcb_bool fixIt); +pcb_bool ChangeSelectedRadius(int types, int is_start, Angle Difference, pcb_bool fixIt); - /* Change the specified text on an element, either on the board (give PCB, PCB->Data) or in a buffer (give NULL, Buffer->Data). The old string is returned, and must be properly freed by the caller. */ Index: trunk/src/change_act.c =================================================================== --- trunk/src/change_act.c (revision 3433) +++ trunk/src/change_act.c (revision 3434) @@ -1374,9 +1374,9 @@ /* --------------------------------------------------------------------------- */ static const char changeangle_syntax[] = - "ChangeAngle(Object, start|delta|both, delta|style)\n" - "ChangeAngle(SelectedObjects|Selected, start|delta|both, delta|style)\n" - "ChangeAngle(SelectedArcs, start|delta|both, delta|style)\n"; + "ChangeAngle(Object, start|delta|both, delta)\n" + "ChangeAngle(SelectedObjects|Selected, start|delta|both, delta)\n" + "ChangeAngle(SelectedArcs, start|delta|both, delta)\n"; static const char changeangle_help[] = "Changes the start angle, delta angle or both angles of an arc."; static int ActionChangeAngle(int argc, const char **argv, Coord x, Coord y) { @@ -1402,8 +1402,7 @@ if (funcid == F_Object) type = SearchScreen(Crosshair.X, Crosshair.Y, CHANGESIZE_TYPES, &ptr1, &ptr2, &ptr3); -/* value = GetValue(delta, units, &absolute, NULL);*/ - { + { /* convert angle from string */ char *end; while(isspace(*delta)) delta++; value = strtod(delta, &end); @@ -1443,7 +1442,70 @@ return 0; } +/* --------------------------------------------------------------------------- */ +static const char changeradius_syntax[] = + "ChangeRadius(Object, width|x|height|y|both, delta)\n" + "ChangeRadius(SelectedObjects|Selected, width|x|height|y|both, delta)\n" + "ChangeRadius(SelectedArcs, width|x|height|y|both, delta)\n"; +static const char changeradius_help[] = "Changes the width or height (radius) of an arc."; +static int ActionChangeRadius(int argc, const char **argv, Coord x, Coord y) +{ + const char *function = ACTION_ARG(0); + const char *prim = ACTION_ARG(1); + const char *delta = ACTION_ARG(2); + const char *units = ACTION_ARG(3); + pcb_bool absolute; /* indicates if absolute size is given */ + double value; + int type = PCB_TYPE_NONE, which; + void *ptr1, *ptr2, *ptr3; + + if ((strcasecmp(prim, "width") == 0) || (strcasecmp(prim, "x") == 0)) which = 0; + else if ((strcasecmp(prim, "height") == 0) || (strcasecmp(prim, "y") == 0)) which = 1; + else if (strcasecmp(prim, "both") == 0) which = 2; + else { + Message(PCB_MSG_ERROR, "Second argument of ChangeRadius must be width, x, height, y or both\n"); + return -1; + } + + if (function && delta) { + int funcid = funchash_get(function, NULL); + + if (funcid == F_Object) + type = SearchScreen(Crosshair.X, Crosshair.Y, CHANGESIZE_TYPES, &ptr1, &ptr2, &ptr3); + + value = GetValue(delta, units, &absolute, NULL); + + switch (funcid) { + case F_Object: + { + if (type != PCB_TYPE_NONE) { + if (TEST_FLAG(PCB_FLAG_LOCK, (PinTypePtr) ptr2)) + Message(PCB_MSG_DEFAULT, _("Sorry, the object is locked\n")); + else { + if (ChangeObjectRadius(type, ptr1, ptr2, ptr3, which, value, absolute)) + SetChangedFlag(pcb_true); + } + } + break; + } + + case F_SelectedArcs: + if (ChangeSelectedRadius(PCB_TYPE_ARC, which, value, absolute)) + SetChangedFlag(pcb_true); + break; + + case F_Selected: + case F_SelectedObjects: + if (ChangeSelectedRadius(CHANGESIZE_TYPES, which, value, absolute)) + SetChangedFlag(pcb_true); + break; + } + } + return 0; +} + + /* --------------------------------------------------------------------------- */ HID_Action change_action_list[] = { @@ -1471,6 +1533,9 @@ {"ChangePinName", 0, ActionChangePinName, changepinname_help, changepinname_syntax} , + {"ChangeRadius", 0, ActionChangeRadius, + changeradius_help, changeradius_syntax} + , {"ChangeSize", 0, ActionChangeSize, changesize_help, changesize_syntax} ,