Index: trunk/src/crosshair.c =================================================================== --- trunk/src/crosshair.c (revision 32127) +++ trunk/src/crosshair.c (revision 32128) @@ -485,7 +485,7 @@ { pcb_poly_t *polygon; rnd_point_t *point; - rnd_cardinal_t point_idx, prev, next; + rnd_cardinal_t point_idx, prev, next, prev2, next2; rnd_coord_t px, py, x, y, nx, ny; polygon = (pcb_poly_t *) pcb_crosshair.AttachedObject.Ptr2; @@ -501,13 +501,17 @@ nx = polygon->Points[next].X; ny = polygon->Points[next].Y; if (modifier) { - rnd_coord_t ppx, ppy, nnx, nny; + rnd_coord_t ppx, ppy, nnx, nny, ox[2], oy[2]; - prev = pcb_poly_contour_prev_point(polygon, prev); - next = pcb_poly_contour_next_point(polygon, next); - ppx = polygon->Points[prev].X; ppy = polygon->Points[prev].Y; - nnx = polygon->Points[next].X; nny = polygon->Points[next].Y; + pcb_crosshair.edit_poly_point_extra.active = 1; + pcb_crosshair.edit_poly_point_extra.point[0] = &polygon->Points[prev]; + pcb_crosshair.edit_poly_point_extra.point[1] = &polygon->Points[next]; + prev2 = pcb_poly_contour_prev_point(polygon, prev); + next2 = pcb_poly_contour_next_point(polygon, next); + ppx = polygon->Points[prev2].X; ppy = polygon->Points[prev2].Y; + nnx = polygon->Points[next2].X; nny = polygon->Points[next2].Y; + perp_extend(ppx, ppy, &px, &py, x, y, dx, dy); perp_extend(nnx, nny, &nx, &ny, x, y, dx, dy); @@ -514,7 +518,14 @@ /* draw the extra two segments on prev-prev and next-next */ rnd_render->draw_line(pcb_crosshair.GC, ppx, ppy, px, py); rnd_render->draw_line(pcb_crosshair.GC, nnx, nny, nx, ny); + + pcb_crosshair.edit_poly_point_extra.dx[0] = px - polygon->Points[prev].X; + pcb_crosshair.edit_poly_point_extra.dy[0] = py - polygon->Points[prev].Y; + pcb_crosshair.edit_poly_point_extra.dx[1] = nx - polygon->Points[next].X; + pcb_crosshair.edit_poly_point_extra.dy[1] = ny - polygon->Points[next].Y; } + else + pcb_crosshair.edit_poly_point_extra.active = 0; /* draw the two segments */ rnd_render->draw_line(pcb_crosshair.GC, px, py, x, y); Index: trunk/src/crosshair.h =================================================================== --- trunk/src/crosshair.h (revision 32127) +++ trunk/src/crosshair.h (revision 32128) @@ -75,6 +75,13 @@ int drags_len, drags_current; rnd_coord_t dragx, dragy; /* the point where drag started */ + /* tool-specific temporary storage */ + struct { + int active; + rnd_point_t *point[2]; + rnd_coord_t dx[2], dy[2]; + } edit_poly_point_extra; + /* cached tool IDs */ int tool_arrow, tool_line, tool_move, tool_arc, tool_poly, tool_poly_hole; } pcb_crosshair_t; Index: trunk/src_plugins/tool_std/tool_move.c =================================================================== --- trunk/src_plugins/tool_std/tool_move.c (revision 32127) +++ trunk/src_plugins/tool_std/tool_move.c (revision 32128) @@ -90,8 +90,27 @@ pcb_gfx_resize_move_corner(gfx, point_idx, dx, dy, 1); } else if ((dx != 0) || (dy != 0)) { - pcb_any_obj_t *newo = pcb_move_obj_and_rubberband(pcb_crosshair.AttachedObject.Type, pcb_crosshair.AttachedObject.Ptr1, pcb_crosshair.AttachedObject.Ptr2, pcb_crosshair.AttachedObject.Ptr3, dx, dy); - pcb_extobj_float_geo(newo); + pcb_any_obj_t *newo; + + if ((pcb_crosshair.AttachedObject.Type == PCB_OBJ_POLY_POINT) && pcb_crosshair.edit_poly_point_extra.active) { + int n; + + /* when modifier was pressed during the moving of a polygon point: + angle-keeping move; this is really just moving 3 points in a batch */ + pcb_undo_freeze_serial(); + newo = pcb_move_obj_and_rubberband(pcb_crosshair.AttachedObject.Type, pcb_crosshair.AttachedObject.Ptr1, pcb_crosshair.AttachedObject.Ptr2, pcb_crosshair.AttachedObject.Ptr3, dx, dy); + pcb_extobj_float_geo(newo); + for(n = 0; n < 2; n++) { + newo = pcb_move_obj_and_rubberband(PCB_OBJ_POLY_POINT, pcb_crosshair.AttachedObject.Ptr1, pcb_crosshair.AttachedObject.Ptr2, pcb_crosshair.edit_poly_point_extra.point[n], pcb_crosshair.edit_poly_point_extra.dx[n], pcb_crosshair.edit_poly_point_extra.dy[n]); + pcb_extobj_float_geo(newo); + } + pcb_undo_unfreeze_serial(); + } + else { + newo = pcb_move_obj_and_rubberband(pcb_crosshair.AttachedObject.Type, pcb_crosshair.AttachedObject.Ptr1, pcb_crosshair.AttachedObject.Ptr2, pcb_crosshair.AttachedObject.Ptr3, dx, dy); + pcb_extobj_float_geo(newo); + } + if (!pcb_marked.user_placed) pcb_crosshair_set_local_ref(0, 0, rnd_false); pcb_subc_as_board_update(PCB);