Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 28727) +++ trunk/src/buffer.c (revision 28728) @@ -129,11 +129,12 @@ } /* add (or move) selected */ -static void pcb_buffer_toss_selected(pcb_opfunc_t *fnc, pcb_board_t *pcb, pcb_buffer_t *Buffer, pcb_coord_t X, pcb_coord_t Y, pcb_bool LeaveSelected, pcb_bool on_locked_too) +static void pcb_buffer_toss_selected(pcb_opfunc_t *fnc, pcb_board_t *pcb, pcb_buffer_t *Buffer, pcb_coord_t X, pcb_coord_t Y, pcb_bool LeaveSelected, pcb_bool on_locked_too, pcb_bool keep_id) { pcb_opctx_t ctx; ctx.buffer.pcb = pcb; + ctx.buffer.keep_id = keep_id; /* switch crosshair off because adding objects to the pastebuffer * may change the 'valid' area for the cursor @@ -162,9 +163,9 @@ pcb_notify_crosshair_change(pcb_true); } -void pcb_buffer_add_selected(pcb_board_t *pcb, pcb_buffer_t *Buffer, pcb_coord_t X, pcb_coord_t Y, pcb_bool LeaveSelected) +void pcb_buffer_add_selected(pcb_board_t *pcb, pcb_buffer_t *Buffer, pcb_coord_t X, pcb_coord_t Y, pcb_bool LeaveSelected, pcb_bool keep_id) { - pcb_buffer_toss_selected(&AddBufferFunctions, pcb, Buffer, X, Y, LeaveSelected, pcb_false); + pcb_buffer_toss_selected(&AddBufferFunctions, pcb, Buffer, X, Y, LeaveSelected, pcb_false, keep_id); } static const char pcb_acts_LoadFootprint[] = "pcb_load_footprint(filename[,refdes,value])"; @@ -659,26 +660,42 @@ if (destlayer->meta.real.vis) { PCB_LINE_LOOP(sourcelayer); { - if (pcb_lineop_copy(&ctx, destlayer, line)) + pcb_line_t *nline = pcb_lineop_copy(&ctx, destlayer, line); + if (nline != NULL) { + if (keep_id) + nline->ID = line->ID; changed = 1; + } } PCB_END_LOOP; PCB_ARC_LOOP(sourcelayer); { - if (pcb_arcop_copy(&ctx, destlayer, arc)) + pcb_arc_t *narc = pcb_arcop_copy(&ctx, destlayer, arc); + if (narc != NULL) { + if (keep_id) + narc->ID = arc->ID; changed = 1; + } } PCB_END_LOOP; PCB_TEXT_LOOP(sourcelayer); { - if (pcb_textop_copy(&ctx, destlayer, text)) + pcb_text_t *ntext = pcb_textop_copy(&ctx, destlayer, text); + if (ntext != NULL) { + if (keep_id) + ntext->ID = text->ID; changed = 1; + } } PCB_END_LOOP; PCB_POLY_LOOP(sourcelayer); { - if (pcb_polyop_copy(&ctx, destlayer, polygon)) + pcb_poly_t *npoly = pcb_polyop_copy(&ctx, destlayer, polygon); + if (npoly != NULL) { + if (keep_id) + npoly->ID = polygon->ID; changed = 1; + } } PCB_END_LOOP; } @@ -687,12 +704,17 @@ /* paste subcircuits */ PCB_SUBC_LOOP(PCB_PASTEBUFFER->Data); { + pcb_subc_t *nsubc; if (pcb->is_footprint) { pcb_message(PCB_MSG_WARNING, "Can not paste subcircuit in the footprint edit mode\n"); break; } - pcb_subcop_copy(&ctx, subc); - changed = pcb_true; + nsubc = pcb_subcop_copy(&ctx, subc); + if (nsubc != NULL) { + if (keep_id) + nsubc->ID = subc->ID; + changed = 1; + } } PCB_END_LOOP; @@ -715,7 +737,13 @@ PCB_PADSTACK_LOOP(PCB_PASTEBUFFER->Data); { - pcb_pstkop_copy(&ctx, padstack); + pcb_pstk_t *nps; + nps = pcb_pstkop_copy(&ctx, padstack); + if (nps != NULL) { + if (keep_id) + nps->ID = padstack->ID; + changed = 1; + } } PCB_END_LOOP; } @@ -835,7 +863,7 @@ /* copies objects to paste buffer */ case F_AddSelected: - pcb_buffer_add_selected(PCB, PCB_PASTEBUFFER, 0, 0, pcb_false); + pcb_buffer_add_selected(PCB, PCB_PASTEBUFFER, 0, 0, pcb_false, pcb_false); if (pcb_data_is_empty(PCB_PASTEBUFFER->Data)) { pcb_message(PCB_MSG_WARNING, "Nothing buffer-movable is selected, nothing copied to the paste buffer\n"); goto error; @@ -844,7 +872,7 @@ /* moves objects to paste buffer: kept for compatibility with old menu files */ case F_MoveSelected: - pcb_buffer_add_selected(PCB, PCB_PASTEBUFFER, 0, 0, pcb_false); + pcb_buffer_add_selected(PCB, PCB_PASTEBUFFER, 0, 0, pcb_false, pcb_true); if (pcb_data_is_empty(PCB_PASTEBUFFER->Data)) { pcb_message(PCB_MSG_WARNING, "Nothing buffer-movable is selected, nothing moved to the paste buffer\n"); goto error; Index: trunk/src/buffer.h =================================================================== --- trunk/src/buffer.h (revision 28727) +++ trunk/src/buffer.h (revision 28728) @@ -50,7 +50,7 @@ void pcb_buffer_clear(pcb_board_t *pcb, pcb_buffer_t *Buffer); /* adds (copies) all selected and visible objects to the paste buffer */ -void pcb_buffer_add_selected(pcb_board_t *pcb, pcb_buffer_t *, pcb_coord_t, pcb_coord_t, pcb_bool); +void pcb_buffer_add_selected(pcb_board_t *pcb, pcb_buffer_t *Buffer, pcb_coord_t X, pcb_coord_t Y, pcb_bool LeaveSelected, pcb_bool keep_id); /* load a board into buffer parse the file with enabled 'PCB mode' */ pcb_bool pcb_buffer_load_layout(pcb_board_t *pcb, pcb_buffer_t *Buffer, const char *Filename, const char *fmt); Index: trunk/src/obj_arc.c =================================================================== --- trunk/src/obj_arc.c (revision 28727) +++ trunk/src/obj_arc.c (revision 28728) @@ -394,6 +394,7 @@ Arc->Thickness, Arc->Clearance, pcb_flag_mask(Arc->Flags, PCB_FLAG_FOUND | ctx->buffer.extraflg), pcb_false); pcb_arc_copy_meta(a, Arc); + if (ctx->buffer.keep_id) a->ID = Arc->ID; return a; } Index: trunk/src/obj_line.c =================================================================== --- trunk/src/obj_line.c (revision 28727) +++ trunk/src/obj_line.c (revision 28728) @@ -434,7 +434,9 @@ line = pcb_line_new(layer, Line->Point1.X, Line->Point1.Y, Line->Point2.X, Line->Point2.Y, Line->Thickness, Line->Clearance, pcb_flag_mask(Line->Flags, PCB_FLAG_FOUND | ctx->buffer.extraflg)); - return pcb_line_copy_meta(line, Line); + pcb_line_copy_meta(line, Line); + if (ctx->buffer.keep_id) line->ID = Line->ID; + return line; } /* moves a line between board and buffer */ Index: trunk/src/obj_poly.c =================================================================== --- trunk/src/obj_poly.c (revision 28727) +++ trunk/src/obj_poly.c (revision 28728) @@ -515,6 +515,7 @@ polygon = pcb_poly_new(layer, Polygon->Clearance, Polygon->Flags); pcb_poly_copy(polygon, Polygon, 0, 0); pcb_poly_copy_meta(polygon, Polygon); + if (ctx->buffer.keep_id) polygon->ID = Polygon->ID; /* Update the polygon r-tree. Unlike similarly named functions for * other objects, CreateNewPolygon does not do this as it creates a Index: trunk/src/obj_pstk_op.c =================================================================== --- trunk/src/obj_pstk_op.c (revision 28727) +++ trunk/src/obj_pstk_op.c (revision 28728) @@ -37,6 +37,7 @@ npid = pcb_pstk_proto_insert_dup(ctx->buffer.dst, proto, 1); p = pcb_pstk_new_tr(ctx->buffer.dst, -1, npid, ps->x, ps->y, ps->Clearance, pcb_flag_mask(ps->Flags, PCB_FLAG_FOUND | ctx->buffer.extraflg), ps->rot, ps->xmirror, ps->smirror); + if (ctx->buffer.keep_id) p->ID = ps->ID; return pcb_pstk_copy_meta(p, ps); } Index: trunk/src/obj_subc.c =================================================================== --- trunk/src/obj_subc.c (revision 28727) +++ trunk/src/obj_subc.c (revision 28728) @@ -1417,6 +1417,8 @@ pcb_undo_unfreeze_serial(); } + if (ctx->buffer.keep_id) nsc->ID = sc->ID; + return nsc; } Index: trunk/src/obj_text.c =================================================================== --- trunk/src/obj_text.c (revision 28727) +++ trunk/src/obj_text.c (revision 28728) @@ -428,6 +428,7 @@ pcb_text_t *t = pcb_text_new(layer, pcb_font(PCB, Text->fid, 1), Text->X, Text->Y, Text->rot, Text->Scale, Text->thickness, Text->TextString, pcb_flag_mask(Text->Flags, ctx->buffer.extraflg)); pcb_text_copy_meta(t, Text); + if (ctx->buffer.keep_id) t->ID = Text->ID; return t; } Index: trunk/src/operation.h =================================================================== --- trunk/src/operation.h (revision 28727) +++ trunk/src/operation.h (revision 28728) @@ -39,6 +39,7 @@ typedef struct { pcb_board_t *pcb; int extraflg; + unsigned keep_id:1; pcb_data_t *dst, *src; } pcb_opctx_buffer_t; Index: trunk/src/select_act.c =================================================================== --- trunk/src/select_act.c (revision 28727) +++ trunk/src/select_act.c (revision 28728) @@ -154,7 +154,7 @@ pcb_hid_get_coords("Select the Subcircuit's Origin (mark) Location", &x, &y, 0); x = pcb_grid_fit(x, PCB_ACT_HIDLIB->grid, PCB_ACT_HIDLIB->grid_ox); y = pcb_grid_fit(y, PCB_ACT_HIDLIB->grid, PCB_ACT_HIDLIB->grid_oy); - pcb_buffer_add_selected(PCB, PCB_PASTEBUFFER, x, y, pcb_true); + pcb_buffer_add_selected(PCB, PCB_PASTEBUFFER, x, y, pcb_true, pcb_false); pcb_undo_save_serial(); pcb_remove_selected(pcb_false); pcb_subc_convert_from_buffer(PCB_PASTEBUFFER); Index: trunk/src/tool_arrow.c =================================================================== --- trunk/src/tool_arrow.c (revision 28727) +++ trunk/src/tool_arrow.c (revision 28728) @@ -74,7 +74,7 @@ pcb_tool_note.Buffer = conf_core.editor.buffer_number; pcb_buffer_set_number(PCB_MAX_BUFFER - 1); pcb_buffer_clear(pcb, PCB_PASTEBUFFER); - pcb_buffer_add_selected(pcb, PCB_PASTEBUFFER, pcb_tool_note.X, pcb_tool_note.Y, pcb_true); + pcb_buffer_add_selected(pcb, PCB_PASTEBUFFER, pcb_tool_note.X, pcb_tool_note.Y, pcb_true, pcb_false); pcb_undo_save_serial(); pcb_remove_selected(pcb_false); pcb_tool_save(hl); Index: trunk/src_plugins/extedit/extedit.c =================================================================== --- trunk/src_plugins/extedit/extedit.c (revision 28727) +++ trunk/src_plugins/extedit/extedit.c (revision 28728) @@ -203,7 +203,7 @@ else if ((argc > 1) && (pcb_strcasecmp(cmd, "selected") == 0)) { pcb_buffer_set_number(bn); pcb_buffer_clear(PCB, PCB_PASTEBUFFER); - pcb_buffer_add_selected(PCB, PCB_PASTEBUFFER, pcb_crosshair.X, pcb_crosshair.Y, pcb_false); + pcb_buffer_add_selected(PCB, PCB_PASTEBUFFER, pcb_crosshair.X, pcb_crosshair.Y, pcb_false, pcb_false); pastex = pcb_crosshair.X; pastey = pcb_crosshair.Y; del_selected = 1;