Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 29148) +++ trunk/src/buffer.c (revision 29149) @@ -769,6 +769,7 @@ ctx.copy.DeltaX = X - PCB_PASTEBUFFER->X; ctx.copy.DeltaY = Y - PCB_PASTEBUFFER->Y; ctx.copy.from_outside = PCB_PASTEBUFFER->from_outside; + ctx.copy.keep_id = keep_id; /* paste all layers */ num_layers = PCB_PASTEBUFFER->Data->LayerN; @@ -794,10 +795,8 @@ { pcb_line_t *nline = pcb_lineop_copy(&ctx, destlayer, line); if (nline != NULL) { - if (keep_id) { - pcb_obj_change_id((pcb_any_obj_t *)nline, line->ID); + if (keep_id) pcb_extobj_float_geo((pcb_any_obj_t *)nline); - } changed = 1; } } @@ -806,10 +805,8 @@ { pcb_arc_t *narc = pcb_arcop_copy(&ctx, destlayer, arc); if (narc != NULL) { - if (keep_id) { - pcb_obj_change_id((pcb_any_obj_t *)narc, arc->ID); + if (keep_id) pcb_extobj_float_geo((pcb_any_obj_t *)narc); - } changed = 1; } } @@ -818,10 +815,8 @@ { pcb_text_t *ntext = pcb_textop_copy(&ctx, destlayer, text); if (ntext != NULL) { - if (keep_id) { - pcb_obj_change_id((pcb_any_obj_t *)ntext, text->ID); + if (keep_id) pcb_extobj_float_geo((pcb_any_obj_t *)ntext); - } changed = 1; } } @@ -830,10 +825,8 @@ { pcb_poly_t *npoly = pcb_polyop_copy(&ctx, destlayer, polygon); if (npoly != NULL) { - if (keep_id) { - pcb_obj_change_id((pcb_any_obj_t *)npoly, polygon->ID); + if (keep_id) pcb_extobj_float_geo((pcb_any_obj_t *)npoly); - } changed = 1; } } @@ -851,10 +844,8 @@ } nsubc = pcb_subcop_copy(&ctx, subc); if (nsubc != NULL) { - if (keep_id) { - pcb_obj_change_id((pcb_any_obj_t *)nsubc, subc->ID); + if (keep_id) pcb_extobj_float_geo((pcb_any_obj_t *)nsubc); - } changed = 1; } } @@ -882,10 +873,8 @@ pcb_pstk_t *nps; nps = pcb_pstkop_copy(&ctx, padstack); if (nps != NULL) { - if (keep_id) { - pcb_obj_change_id((pcb_any_obj_t *)nps, padstack->ID); + if (keep_id) pcb_extobj_float_geo((pcb_any_obj_t *)nps); - } changed = 1; } } Index: trunk/src/move.c =================================================================== --- trunk/src/move.c (revision 29148) +++ trunk/src/move.c (revision 29149) @@ -292,6 +292,7 @@ ctx.copy.DeltaX = DX; ctx.copy.DeltaY = DY; ctx.copy.from_outside = 0; + ctx.copy.keep_id = 0; /* the subroutines add the objects to the undo-list */ ptr = pcb_object_operation(&CopyFunctions, &ctx, Type, Ptr1, Ptr2, Ptr3); Index: trunk/src/obj_arc.c =================================================================== --- trunk/src/obj_arc.c (revision 29148) +++ trunk/src/obj_arc.c (revision 29149) @@ -600,6 +600,8 @@ Arc->Delta, Arc->Thickness, Arc->Clearance, pcb_flag_mask(Arc->Flags, PCB_FLAG_FOUND), pcb_true); if (!arc) return arc; + if (ctx->copy.keep_id) + arc->ID = Arc->ID; pcb_arc_copy_meta(arc, Arc); pcb_arc_invalidate_draw(Layer, arc); pcb_undo_add_obj_to_create(PCB_OBJ_ARC, Layer, arc, arc); Index: trunk/src/obj_line.c =================================================================== --- trunk/src/obj_line.c (revision 29148) +++ trunk/src/obj_line.c (revision 29149) @@ -566,6 +566,8 @@ Line->Point2.Y + ctx->copy.DeltaY, Line->Thickness, Line->Clearance, pcb_flag_mask(Line->Flags, PCB_FLAG_FOUND)); if (!line) return line; + if (ctx->copy.keep_id) + line->ID = Line->ID; pcb_line_copy_meta(line, Line); pcb_line_invalidate_draw(Layer, line); pcb_undo_add_obj_to_create(PCB_OBJ_LINE, Layer, line, line); Index: trunk/src/obj_poly.c =================================================================== --- trunk/src/obj_poly.c (revision 29148) +++ trunk/src/obj_poly.c (revision 29149) @@ -956,6 +956,8 @@ pcb_poly_t *polygon; polygon = pcb_poly_new(Layer, Polygon->Clearance, pcb_no_flags()); + if (ctx->copy.keep_id) + polygon->ID = Polygon->ID; pcb_poly_copy(polygon, Polygon, ctx->copy.DeltaX, ctx->copy.DeltaY); pcb_poly_copy_meta(polygon, Polygon); if (!Layer->polygon_tree) Index: trunk/src/obj_pstk_op.c =================================================================== --- trunk/src/obj_pstk_op.c (revision 29148) +++ trunk/src/obj_pstk_op.c (revision 29149) @@ -85,6 +85,8 @@ if (nps == NULL) return NULL; + if (ctx->copy.keep_id) + nps->ID = ps->ID; pcb_pstk_copy_meta(nps, ps); pcb_pstk_invalidate_draw(nps); pcb_undo_add_obj_to_create(PCB_OBJ_PSTK, data, nps, nps); Index: trunk/src/obj_subc.c =================================================================== --- trunk/src/obj_subc.c (revision 29148) +++ trunk/src/obj_subc.c (revision 29149) @@ -1136,7 +1136,7 @@ { pcb_subc_t *sc; - sc = pcb_subc_dup_at(PCB, PCB->Data, src, ctx->copy.DeltaX, ctx->copy.DeltaY, pcb_false); + sc = pcb_subc_dup_at(PCB, PCB->Data, src, ctx->copy.DeltaX, ctx->copy.DeltaY, ctx->copy.keep_id); pcb_undo_add_obj_to_create(PCB_OBJ_SUBC, sc, sc, sc); Index: trunk/src/obj_text.c =================================================================== --- trunk/src/obj_text.c (revision 29148) +++ trunk/src/obj_text.c (revision 29149) @@ -592,6 +592,8 @@ text = pcb_text_new(Layer, pcb_font(PCB, Text->fid, 1), Text->X + ctx->copy.DeltaX, Text->Y + ctx->copy.DeltaY, Text->rot, Text->Scale, Text->thickness, Text->TextString, pcb_flag_mask(Text->Flags, PCB_FLAG_FOUND)); + if (ctx->copy.keep_id) + text->ID = Text->ID; pcb_text_copy_meta(text, Text); pcb_text_invalidate_draw(Layer, text); pcb_undo_add_obj_to_create(PCB_OBJ_TEXT, Layer, text, text); Index: trunk/src/operation.h =================================================================== --- trunk/src/operation.h (revision 29148) +++ trunk/src/operation.h (revision 29149) @@ -76,6 +76,7 @@ pcb_board_t *pcb; pcb_coord_t DeltaX, DeltaY; /* movement vector */ int from_outside; + int keep_id; } pcb_opctx_copy_t; typedef struct {