Index: trunk/src/crosshair.h =================================================================== --- trunk/src/crosshair.h (revision 5292) +++ trunk/src/crosshair.h (revision 5293) @@ -51,6 +51,7 @@ *Ptr2, /* search.c */ *Ptr3; pcb_angle_t start_angle, delta_angle; + pcb_coord_t radius; } pcb_attached_object_t; typedef struct { Index: trunk/src/move.c =================================================================== --- trunk/src/move.c (revision 5292) +++ trunk/src/move.c (revision 5293) @@ -107,7 +107,11 @@ if (Type == PCB_TYPE_ARC_POINT) { /* moving the endpoint of an arc is not really a move, but a change of arc properties */ - pcb_arc_set_angles((pcb_layer_t *)Ptr1, (pcb_arc_t *)Ptr2, pcb_crosshair.AttachedObject.start_angle, pcb_crosshair.AttachedObject.delta_angle); + if (pcb_crosshair.AttachedObject.radius == 0) + pcb_arc_set_angles((pcb_layer_t *)Ptr1, (pcb_arc_t *)Ptr2, pcb_crosshair.AttachedObject.start_angle, pcb_crosshair.AttachedObject.delta_angle); + else + pcb_arc_set_radii((pcb_layer_t *)Ptr1, (pcb_arc_t *)Ptr2, pcb_crosshair.AttachedObject.radius, pcb_crosshair.AttachedObject.radius); + pcb_crosshair.AttachedObject.radius = 0; } else { pcb_undo_add_obj_to_move(Type, Ptr1, Ptr2, Ptr3, DX, DY); Index: trunk/src/obj_arc_ui.c =================================================================== --- trunk/src/obj_arc_ui.c (revision 5292) +++ trunk/src/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);