Index: trunk/src/obj_subc.c =================================================================== --- trunk/src/obj_subc.c (revision 31845) +++ trunk/src/obj_subc.c (revision 31846) @@ -868,12 +868,12 @@ } -pcb_subc_t *pcb_subc_dup_at(pcb_board_t *pcb, pcb_data_t *dst, const pcb_subc_t *src, rnd_coord_t dx, rnd_coord_t dy, rnd_bool keep_ids) +pcb_subc_t *pcb_subc_dup_at(pcb_board_t *pcb, pcb_data_t *dst, const pcb_subc_t *src, rnd_coord_t dx, rnd_coord_t dy, rnd_bool keep_ids, rnd_bool undoable) { pcb_board_t *src_pcb; int n; pcb_subc_t *sc = pcb_subc_alloc(); - int undoable_psproto = dst->parent_type == PCB_PARENT_BOARD; + int undoable_psproto = (undoable && (dst->parent_type == PCB_PARENT_BOARD)); if (keep_ids) sc->ID = src->ID; @@ -1055,7 +1055,7 @@ pcb_subc_t *pcb_subc_dup(pcb_board_t *pcb, pcb_data_t *dst, pcb_subc_t *src) { - return pcb_subc_dup_at(pcb, dst, src, 0, 0, rnd_false); + return pcb_subc_dup_at(pcb, dst, src, 0, 0, rnd_false, rnd_true); } void pcb_subc_bbox(pcb_subc_t *sc) @@ -1210,7 +1210,7 @@ { pcb_subc_t *sc; - sc = pcb_subc_dup_at(PCB, PCB->Data, src, ctx->copy.DeltaX, ctx->copy.DeltaY, ctx->copy.keep_id); + sc = pcb_subc_dup_at(PCB, PCB->Data, src, ctx->copy.DeltaX, ctx->copy.DeltaY, ctx->copy.keep_id, rnd_true); pcb_undo_add_obj_to_create(PCB_OBJ_SUBC, sc, sc, sc); @@ -1582,7 +1582,7 @@ void *pcb_subcop_add_to_buffer(pcb_opctx_t *ctx, pcb_subc_t *sc) { pcb_subc_t *nsc; - nsc = pcb_subc_dup_at(NULL, ctx->buffer.dst, sc, 0, 0, ctx->buffer.keep_id); + nsc = pcb_subc_dup_at(NULL, ctx->buffer.dst, sc, 0, 0, ctx->buffer.keep_id, rnd_true); if (ctx->buffer.extraflg & PCB_FLAG_SELECTED) { pcb_undo_freeze_serial(); @@ -2356,7 +2356,7 @@ } - placed = pcb_subc_dup_at(pcb, data, src, ox - osx, oy - osy, 0); + placed = pcb_subc_dup_at(pcb, data, src, ox - osx, oy - osy, 0, rnd_true); pcb_subc_get_side(placed, &src_on_bottom); { /* copy attributes */ Index: trunk/src/obj_subc.h =================================================================== --- trunk/src/obj_subc.h (revision 31845) +++ trunk/src/obj_subc.h (revision 31846) @@ -193,7 +193,7 @@ /* Copy non-layer, non-geometrical metadata (e.g. attributes) */ pcb_subc_t *pcb_subc_copy_meta(pcb_subc_t *dst, const pcb_subc_t *src); -pcb_subc_t *pcb_subc_dup_at(pcb_board_t *pcb, pcb_data_t *dst, const pcb_subc_t *src, rnd_coord_t dx, rnd_coord_t dy, rnd_bool keep_ids); +pcb_subc_t *pcb_subc_dup_at(pcb_board_t *pcb, pcb_data_t *dst, const pcb_subc_t *src, rnd_coord_t dx, rnd_coord_t dy, rnd_bool keep_ids, rnd_bool undoable); /* Replace dst with a copy of src in place (preserving location and orientation and attributes. If add_undo is true, add the old subc del and the new subc Index: trunk/src_plugins/dialogs/dlg_library.c =================================================================== --- trunk/src_plugins/dialogs/dlg_library.c (revision 31845) +++ trunk/src_plugins/dialogs/dlg_library.c (revision 31846) @@ -150,7 +150,7 @@ gds_init(&tmp); if (sc != NULL) { - ctx->sc = pcb_subc_dup_at(ctx->prev_pcb, ctx->prev_pcb->Data, sc, 0, 0, 1); + ctx->sc = pcb_subc_dup_at(ctx->prev_pcb, ctx->prev_pcb->Data, sc, 0, 0, 1, rnd_false); pcb_data_bbox(&bbox, ctx->sc->data, 0); rnd_dad_preview_zoomto(&ctx->dlg[ctx->wpreview], &bbox); } Index: trunk/src_plugins/export_xy/xy.c =================================================================== --- trunk/src_plugins/export_xy/xy.c (revision 31845) +++ trunk/src_plugins/export_xy/xy.c (revision 31846) @@ -300,7 +300,7 @@ return; } - sc_rot0 = pcb_subc_dup_at(NULL, tmp, ctx->subc, 0, 0, 0); + sc_rot0 = pcb_subc_dup_at(NULL, tmp, ctx->subc, 0, 0, 0, rnd_false); ang = ctx->theta / RND_RAD_TO_DEG; pcb_subc_rotate(sc_rot0, 0, 0, cos(ang), sin(ang), ctx->theta); Index: trunk/src_plugins/io_dsn/read.c =================================================================== --- trunk/src_plugins/io_dsn/read.c (revision 31845) +++ trunk/src_plugins/io_dsn/read.c (revision 31846) @@ -1564,7 +1564,7 @@ return -1; } - nsc = pcb_subc_dup_at(ctx->pcb, ctx->pcb->Data, subc, crd[0], crd[1], 0); + nsc = pcb_subc_dup_at(ctx->pcb, ctx->pcb->Data, subc, crd[0], crd[1], 0, rnd_false); rnd_attribute_put(&nsc->Attributes, "refdes", refdes); if (mirror_first) { Index: trunk/src_plugins/io_eagle/read.c =================================================================== --- trunk/src_plugins/io_eagle/read.c (revision 31845) +++ trunk/src_plugins/io_eagle/read.c (revision 31846) @@ -1438,7 +1438,7 @@ back = 1; } - new_subc = pcb_subc_dup_at(st->pcb, st->pcb->Data, subc, x, y, rnd_false); + new_subc = pcb_subc_dup_at(st->pcb, st->pcb->Data, subc, x, y, rnd_false, rnd_false); new_subc->Flags = pcb_no_flags(); new_subc->ID = pcb_create_ID_get(); Index: trunk/src_plugins/lib_netmap/placement.c =================================================================== --- trunk/src_plugins/lib_netmap/placement.c (revision 31845) +++ trunk/src_plugins/lib_netmap/placement.c (revision 31846) @@ -48,7 +48,7 @@ if (!htscp_has(&ctx->subcs, subc)) { pcb_host_trans_t tr; pcb_data_t *oldhack; - pcb_subc_t *proto = pcb_subc_dup_at(ctx->pcb, &ctx->data, subc, 0, 0, 0); /* do not keep IDs because that fools pstk parent logic */ + pcb_subc_t *proto = pcb_subc_dup_at(ctx->pcb, &ctx->data, subc, 0, 0, 0, rnd_true); /* do not keep IDs because that fools pstk parent logic */ pcb_subc_get_host_trans(subc, &tr, 1); oldhack = pcb_pstk_data_hack;