Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 28728) +++ trunk/src/buffer.c (revision 28729) @@ -663,7 +663,7 @@ pcb_line_t *nline = pcb_lineop_copy(&ctx, destlayer, line); if (nline != NULL) { if (keep_id) - nline->ID = line->ID; + pcb_obj_change_id((pcb_any_obj_t *)nline, line->ID); changed = 1; } } @@ -673,7 +673,7 @@ pcb_arc_t *narc = pcb_arcop_copy(&ctx, destlayer, arc); if (narc != NULL) { if (keep_id) - narc->ID = arc->ID; + pcb_obj_change_id((pcb_any_obj_t *)narc, arc->ID); changed = 1; } } @@ -683,7 +683,7 @@ pcb_text_t *ntext = pcb_textop_copy(&ctx, destlayer, text); if (ntext != NULL) { if (keep_id) - ntext->ID = text->ID; + pcb_obj_change_id((pcb_any_obj_t *)ntext, text->ID); changed = 1; } } @@ -693,7 +693,7 @@ pcb_poly_t *npoly = pcb_polyop_copy(&ctx, destlayer, polygon); if (npoly != NULL) { if (keep_id) - npoly->ID = polygon->ID; + pcb_obj_change_id((pcb_any_obj_t *)npoly, polygon->ID); changed = 1; } } @@ -712,7 +712,7 @@ nsubc = pcb_subcop_copy(&ctx, subc); if (nsubc != NULL) { if (keep_id) - nsubc->ID = subc->ID; + pcb_obj_change_id((pcb_any_obj_t *)nsubc, subc->ID); changed = 1; } } @@ -741,7 +741,7 @@ nps = pcb_pstkop_copy(&ctx, padstack); if (nps != NULL) { if (keep_id) - nps->ID = padstack->ID; + pcb_obj_change_id((pcb_any_obj_t *)nps, padstack->ID); changed = 1; } } Index: trunk/src/obj_arc.c =================================================================== --- trunk/src/obj_arc.c (revision 28728) +++ trunk/src/obj_arc.c (revision 28729) @@ -394,7 +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; + if (ctx->buffer.keep_id) pcb_obj_change_id((pcb_any_obj_t *)a, Arc->ID); return a; } Index: trunk/src/obj_common.c =================================================================== --- trunk/src/obj_common.c (revision 28728) +++ trunk/src/obj_common.c (revision 28729) @@ -385,3 +385,20 @@ default: break; } } + +void pcb_obj_change_id(pcb_any_obj_t *obj, long int new_id) +{ + pcb_data_t *data; + + if (obj->parent_type == PCB_PARENT_DATA) + data = obj->parent.data; + else if (obj->parent_type == PCB_PARENT_LAYER) + data = obj->parent.layer->parent.data; + else + return; + + pcb_obj_id_del(data, obj); + obj->ID = new_id; + pcb_obj_id_reg(data, obj); +} + Index: trunk/src/obj_common.h =================================================================== --- trunk/src/obj_common.h (revision 28728) +++ trunk/src/obj_common.h (revision 28729) @@ -235,6 +235,8 @@ void pcb_obj_pre(pcb_any_obj_t *o); void pcb_obj_post(pcb_any_obj_t *o); +/* change the ID of an object already registered in the ID hash */ +void pcb_obj_change_id(pcb_any_obj_t *o, long int new_id); #define pcb_obj_id_reg(data, obj) \ do { \ Index: trunk/src/obj_line.c =================================================================== --- trunk/src/obj_line.c (revision 28728) +++ trunk/src/obj_line.c (revision 28729) @@ -435,7 +435,7 @@ Line->Point2.X, Line->Point2.Y, Line->Thickness, Line->Clearance, pcb_flag_mask(Line->Flags, PCB_FLAG_FOUND | ctx->buffer.extraflg)); pcb_line_copy_meta(line, Line); - if (ctx->buffer.keep_id) line->ID = Line->ID; + if (ctx->buffer.keep_id) pcb_obj_change_id((pcb_any_obj_t *)line, Line->ID); return line; } Index: trunk/src/obj_poly.c =================================================================== --- trunk/src/obj_poly.c (revision 28728) +++ trunk/src/obj_poly.c (revision 28729) @@ -515,7 +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; + if (ctx->buffer.keep_id) pcb_obj_change_id((pcb_any_obj_t *)polygon, 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 28728) +++ trunk/src/obj_pstk_op.c (revision 28729) @@ -37,7 +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; + if (ctx->buffer.keep_id) pcb_obj_change_id((pcb_any_obj_t *)p, ps->ID); return pcb_pstk_copy_meta(p, ps); } Index: trunk/src/obj_subc.c =================================================================== --- trunk/src/obj_subc.c (revision 28728) +++ trunk/src/obj_subc.c (revision 28729) @@ -1407,7 +1407,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, pcb_false); + nsc = pcb_subc_dup_at(NULL, ctx->buffer.dst, sc, 0, 0, ctx->buffer.keep_id); if (ctx->buffer.extraflg & PCB_FLAG_SELECTED) { pcb_undo_freeze_serial(); @@ -1417,8 +1417,6 @@ 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 28728) +++ trunk/src/obj_text.c (revision 28729) @@ -428,7 +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; + if (ctx->buffer.keep_id) pcb_obj_change_id((pcb_any_obj_t *)t, Text->ID); return t; }