Index: trunk/src/rotate.c =================================================================== --- trunk/src/rotate.c (revision 28047) +++ trunk/src/rotate.c (revision 28048) @@ -112,32 +112,31 @@ return obj; } -void *pcb_obj_rotate(int Type, void *Ptr1, void *Ptr2, void *Ptr3, pcb_coord_t X, pcb_coord_t Y, pcb_angle_t angle) +pcb_any_obj_t *pcb_obj_rotate(pcb_board_t *pcb, pcb_any_obj_t *obj, pcb_coord_t X, pcb_coord_t Y, pcb_angle_t angle) { - void *ptr2; int changed = 0; pcb_opctx_t ctx; - pcb_data_clip_inhibit_inc(PCB->Data); + pcb_data_clip_inhibit_inc(pcb->Data); /* setup default global identifiers */ - ctx.rotate.pcb = PCB; + ctx.rotate.pcb = pcb; ctx.rotate.angle = angle; ctx.rotate.center_x = X; ctx.rotate.center_y = Y; - pcb_event(&PCB->hidlib, PCB_EVENT_RUBBER_ROTATE, "ipppccip", Type, Ptr1, Ptr2, Ptr2, ctx.rotate.center_x, ctx.rotate.center_y, ctx.rotate.angle, &changed); + pcb_event(&pcb->hidlib, PCB_EVENT_RUBBER_ROTATE, "ipppccip", obj->type, obj->parent.any, obj, obj, ctx.rotate.center_x, ctx.rotate.center_y, ctx.rotate.angle, &changed); - if (Type != PCB_OBJ_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.angle); - ptr2 = pcb_object_operation(&RotateFunctions, &ctx, Type, Ptr1, Ptr2, Ptr3); - changed |= (ptr2 != NULL); + if (obj->type != PCB_OBJ_PSTK) /* padstack has its own way doing the rotation-undo */ + pcb_undo_add_obj_to_rotate(obj->type, obj->parent.any, obj, obj, ctx.rotate.center_x, ctx.rotate.center_y, ctx.rotate.angle); + obj = pcb_object_operation(&RotateFunctions, &ctx, obj->type, obj->parent.any, obj, obj); + changed |= (obj != NULL); if (changed) { pcb_draw(); pcb_undo_inc_serial(); } - pcb_data_clip_inhibit_dec(PCB->Data, 0); - return ptr2; + pcb_data_clip_inhibit_dec(pcb->Data, 0); + return obj; } void pcb_screen_obj_rotate90(pcb_coord_t X, pcb_coord_t Y, unsigned Steps) @@ -175,7 +174,7 @@ pcb_event(&PCB->hidlib, PCB_EVENT_RUBBER_LOOKUP_LINES, "ippp", type, ptr1, ptr2, ptr3); if (type == PCB_OBJ_SUBC) pcb_event(&PCB->hidlib, PCB_EVENT_RUBBER_LOOKUP_RATS, "ippp", type, ptr1, ptr2, ptr3); - pcb_obj_rotate(type, ptr1, ptr2, ptr3, X, Y, angle); + pcb_obj_rotate(PCB, obj, X, Y, angle); pcb_board_set_changed_flag(pcb_true); } } Index: trunk/src/rotate.h =================================================================== --- trunk/src/rotate.h (revision 28047) +++ trunk/src/rotate.h (revision 28048) @@ -57,9 +57,8 @@ case of buffer) */ pcb_any_obj_t *pcb_obj_rotate90(pcb_board_t *pcb, pcb_any_obj_t *obj, pcb_coord_t X, pcb_coord_t Y, unsigned Steps); -/* rotates an objects passed; - * the center of rotation is determined by the current cursor location */ -void *pcb_obj_rotate(int Type, void *Ptr1, void *Ptr2, void *Ptr3, pcb_coord_t X, pcb_coord_t Y, pcb_angle_t angle); +/* rotates obj by angle around X;Y. pcb is the current board if obj is on buffer */ +pcb_any_obj_t *pcb_obj_rotate(pcb_board_t *pcb, pcb_any_obj_t *obj, pcb_coord_t X, pcb_coord_t Y, pcb_angle_t angle); void pcb_screen_obj_rotate90(pcb_coord_t, pcb_coord_t, unsigned); void pcb_screen_obj_rotate(pcb_coord_t X, pcb_coord_t Y, pcb_angle_t angle); Index: trunk/src/undo_old.c =================================================================== --- trunk/src/undo_old.c (revision 28047) +++ trunk/src/undo_old.c (revision 28048) @@ -174,7 +174,7 @@ /* lookup entry by it's ID */ type = pcb_search_obj_by_id(PCB->Data, &ptr1, &ptr2, &ptr3, Entry->ID, Entry->Kind); if (type != PCB_OBJ_VOID) { - pcb_obj_rotate(type, ptr1, ptr2, ptr3, Entry->Data.Rotate.CenterX, Entry->Data.Rotate.CenterY, -(Entry->Data.Angle)); + pcb_obj_rotate(PCB, ptr2, Entry->Data.Rotate.CenterX, Entry->Data.Rotate.CenterY, -(Entry->Data.Angle)); Entry->Data.Angle = -(Entry->Data.Angle); return pcb_true; } Index: trunk/src_plugins/propedit/propsel.c =================================================================== --- trunk/src_plugins/propedit/propsel.c (revision 28047) +++ trunk/src_plugins/propedit/propsel.c (revision 28048) @@ -664,10 +664,10 @@ pcb_chg_obj_clear_size(PCB_OBJ_PSTK, ps, ps, NULL, st->c*2, st->c_absolute)) DONE; if (st->d_valid && (strcmp(pn, "rotation") == 0)) { if (st->d_absolute) { - if (pcb_obj_rotate(PCB_OBJ_PSTK, ps, ps, NULL, ps->x, ps->y, st->d - ps->rot)) DONE; + if (pcb_obj_rotate(st->pcb, (pcb_any_obj_t *)ps, ps->x, ps->y, st->d - ps->rot)) DONE; } else { - if (pcb_obj_rotate(PCB_OBJ_PSTK, ps, ps, NULL, ps->x, ps->y, st->d)) DONE; + if (pcb_obj_rotate(st->pcb, (pcb_any_obj_t *)ps, ps->x, ps->y, st->d)) DONE; } return; }