Index: trunk/src/obj_arc_ui.c =================================================================== --- trunk/src/obj_arc_ui.c (revision 5281) +++ trunk/src/obj_arc_ui.c (revision 5282) @@ -26,15 +26,41 @@ /* Arc UI logics */ #include "config.h" +#include #include "obj_arc_ui.h" #include "obj_arc.h" #include "box.h" + #include void pcb_arc_ui_move_or_copy(pcb_crosshair_t *ch) { - fprintf(stderr, "Moving arc endpoint: not yet implemented\n"); + int *end_pt = ch->AttachedObject.Ptr3; + pcb_arc_t *arc = (pcb_arc_t *) pcb_crosshair.AttachedObject.Ptr2; + pcb_angle_t start = arc->StartAngle, delta = arc->Delta; + + if (end_pt == NULL) { + fprintf(stderr, "Moving arc endpoint: start point not yet implemented %p\n", end_pt); + } + else { + double new_delta, new_end = atan2(-(ch->Y - arc->Y), (ch->X - arc->X)) * 180.0 / M_PI + 180.0; + if (delta < 0) + new_end -= 360.0; + fprintf(stderr, "delta: %f abs-end: %f new-abs: %f new-delta: %f\n", delta, start+delta, new_end, new_end-start); + new_delta = new_end-start; + if (delta > 0) { + if (new_delta < 0) + new_delta += 360.0; + } + else { + if (new_delta > 0) + new_delta -= 360.0; + } + delta = new_delta; + } + + pcb_gui->draw_arc(ch->GC, arc->X, arc->Y, arc->Width, arc->Height, start, delta); } int pcb_obj_ui_arc_point_bbox(int Type, void *Ptr1, void *Ptr2, void *Ptr3, pcb_box_t *res)