Index: trunk/src/obj_pstk_op.c =================================================================== --- trunk/src/obj_pstk_op.c (revision 12776) +++ trunk/src/obj_pstk_op.c (revision 12777) @@ -169,3 +169,21 @@ PCB_FLAG_CHANGE(ctx->chgflag.how, ctx->chgflag.flag, ps); return ps; } + +void *pcb_pstkop_rotate90(pcb_opctx_t *ctx, pcb_pstk_t *ps) +{ + double rot = ps->rot; + + rot += (double)ctx->rotate.number * 90.0; + + if ((rot > 360.0) || (rot < -360.0)) + rot = fmod(rot, 360.0); + + if ((rot == 360.0) || (rot == -360.0)) + rot = 0; + + if (pcb_pstk_change_instance(ps, NULL, NULL, &rot, NULL) == 0) + return ps; + return NULL; +} + Index: trunk/src/obj_pstk_op.h =================================================================== --- trunk/src/obj_pstk_op.h (revision 12776) +++ trunk/src/obj_pstk_op.h (revision 12777) @@ -38,11 +38,11 @@ void *pcb_pstkop_change_flag(pcb_opctx_t *ctx, pcb_pstk_t *ps); +void *pcb_pstkop_rotate90(pcb_opctx_t *ctx, pcb_pstk_t *ps); + /*** TODO: unimplemented ones ***/ void *pcb_pstkop_change_size(pcb_opctx_t *ctx, pcb_pstk_t *ps); void *pcb_pstkop_change_2nd_size(pcb_opctx_t *ctx, pcb_pstk_t *ps); void *pcb_pstkop_change_clear_size(pcb_opctx_t *ctx, pcb_pstk_t *ps); - -void *pcb_pstkop_rotate90(pcb_opctx_t *ctx, pcb_pstk_t *ps); Index: trunk/src/rotate.c =================================================================== --- trunk/src/rotate.c (revision 12776) +++ trunk/src/rotate.c (revision 12777) @@ -45,6 +45,7 @@ #include "conf_core.h" #include "compat_nls.h" #include "obj_all_op.h" +#include "obj_pstk_op.h" #include "obj_line_draw.h" #include "obj_rat_draw.h" @@ -67,7 +68,7 @@ NULL, NULL, pcb_subcop_rotate90, - NULL /* padstack */ + pcb_pstkop_rotate90 }; /* --------------------------------------------------------------------------- @@ -96,7 +97,8 @@ pcb_event(PCB_EVENT_RUBBER_ROTATE90, "ipppccip", Type, Ptr1, Ptr2, Ptr2, ctx.rotate.center_x, ctx.rotate.center_y, ctx.rotate.number, &changed); - pcb_undo_add_obj_to_rotate(Type, Ptr1, Ptr2, Ptr3, ctx.rotate.center_x, ctx.rotate.center_y, ctx.rotate.number); + if (Type != PCB_TYPE_PSTK) /* padstack has its own way doing the rotation-undo */ + pcb_undo_add_obj_to_rotate(Type, Ptr1, Ptr2, Ptr3, ctx.rotate.center_x, ctx.rotate.center_y, ctx.rotate.number); ptr2 = pcb_object_operation(&Rotate90Functions, &ctx, Type, Ptr1, Ptr2, Ptr3); changed |= (ptr2 != NULL); if (changed) { Index: trunk/src/rotate.h =================================================================== --- trunk/src/rotate.h (revision 12776) +++ trunk/src/rotate.h (revision 12777) @@ -52,7 +52,7 @@ } \ } while(0) -#define PCB_ROTATE_TYPES (PCB_TYPE_ELEMENT | PCB_TYPE_SUBC | PCB_TYPE_TEXT | PCB_TYPE_ELEMENT_NAME | PCB_TYPE_ARC | PCB_TYPE_LINE_POINT | PCB_TYPE_LINE) +#define PCB_ROTATE_TYPES (PCB_TYPE_PSTK | PCB_TYPE_ELEMENT | PCB_TYPE_SUBC | PCB_TYPE_TEXT | PCB_TYPE_ELEMENT_NAME | PCB_TYPE_ARC | PCB_TYPE_LINE_POINT | PCB_TYPE_LINE) void *pcb_obj_rotate90(int, void *, void *, void *, pcb_coord_t, pcb_coord_t, unsigned); void pcb_screen_obj_rotate90(pcb_coord_t, pcb_coord_t, unsigned);