Index: obj_arc_ui.c =================================================================== --- obj_arc_ui.c (revision 5292) +++ obj_arc_ui.c (revision 5293) @@ -34,12 +34,18 @@ #include -void pcb_arc_ui_move_or_copy_angle(pcb_crosshair_t *ch) +static void draw_mark(pcb_hid_gc_t gc, const pcb_arc_t *arc) { + const pcb_coord_t mark = PCB_MM_TO_COORD(0.2); + pcb_gui->draw_line(gc, arc->X-mark, arc->Y, arc->X+mark, arc->Y); + pcb_gui->draw_line(gc, arc->X, arc->Y-mark, arc->X, arc->Y+mark); +} + +static void pcb_arc_ui_move_or_copy_angle(pcb_crosshair_t *ch) +{ 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; - pcb_coord_t mark = PCB_MM_TO_COORD(0.2); if (end_pt == NULL) { double end2, new_delta, new_start = atan2(-(ch->Y - arc->Y), (ch->X - arc->X)) * 180.0 / M_PI + 180.0; @@ -85,23 +91,36 @@ /* remember the result of the calculation so the actual move code can reuse them */ ch->AttachedObject.start_angle = start; ch->AttachedObject.delta_angle = delta; + ch->AttachedObject.radius = 0; pcb_gui->draw_arc(ch->GC, arc->X, arc->Y, arc->Width, arc->Height, start, delta); - pcb_gui->draw_line(ch->GC, arc->X-mark, arc->Y, arc->X+mark, arc->Y); - pcb_gui->draw_line(ch->GC, arc->X, arc->Y-mark, arc->X, arc->Y+mark); + draw_mark(ch->GC, arc); } void pcb_arc_ui_move_or_copy_endp(pcb_crosshair_t *ch) { int *end_pt = ch->AttachedObject.Ptr3; - pcb_arc_t *arc = (pcb_arc_t *) pcb_crosshair.AttachedObject.Ptr2; + pcb_arc_t arc2, *arc = (pcb_arc_t *) pcb_crosshair.AttachedObject.Ptr2; + pcb_coord_t ex, ey; + double dx, dy, d; + pcb_arc_get_end(arc, (end_pt != NULL), &ex, &ey); + + dx = (arc->X - ch->X); + dy = (arc->Y - ch->Y); + d = sqrt(dx*dx+dy*dy); + + ch->AttachedObject.radius = d; + + pcb_gui->draw_arc(ch->GC, arc->X, arc->Y, ch->AttachedObject.radius, ch->AttachedObject.radius, arc->StartAngle, arc->Delta); + + draw_mark(ch->GC, &arc2); } void pcb_arc_ui_move_or_copy(pcb_crosshair_t *ch) { - if (pcb_gui->control_is_pressed()) + if (pcb_gui->shift_is_pressed() || (ch->AttachedObject.radius != 0)) pcb_arc_ui_move_or_copy_endp(ch); else pcb_arc_ui_move_or_copy_angle(ch);