Index: trunk/src/libcschem/cnc_any_obj.c =================================================================== --- trunk/src/libcschem/cnc_any_obj.c (revision 1483) +++ trunk/src/libcschem/cnc_any_obj.c (revision 1484) @@ -56,20 +56,20 @@ } -csch_chdr_t *csch_cobj_dup(csch_sheet_t *sheet, csch_cgrp_t *grp, const csch_chdr_t *src) +csch_chdr_t *csch_cobj_dup(csch_sheet_t *sheet, csch_cgrp_t *grp, const csch_chdr_t *src, int keep_id) { void *dst; switch(src->type) { case CSCH_CTYPE_invalid: return NULL; - case CSCH_CTYPE_LINE: dst = csch_line_dup(sheet, grp, (const csch_line_t *)src); break; - case CSCH_CTYPE_ARC: dst = csch_arc_dup(sheet, grp, (const csch_arc_t *)src); break; - case CSCH_CTYPE_POLY: dst = csch_cpoly_dup(sheet, grp, (const csch_cpoly_t *)src); break; - case CSCH_CTYPE_BITMAP: dst = csch_cbitmap_dup(sheet, grp, (const csch_cbitmap_t *)src); break; + case CSCH_CTYPE_LINE: dst = csch_line_dup(sheet, grp, (const csch_line_t *)src, keep_id); break; + case CSCH_CTYPE_ARC: dst = csch_arc_dup(sheet, grp, (const csch_arc_t *)src, keep_id); break; + case CSCH_CTYPE_POLY: dst = csch_cpoly_dup(sheet, grp, (const csch_cpoly_t *)src, keep_id); break; + case CSCH_CTYPE_BITMAP: dst = csch_cbitmap_dup(sheet, grp, (const csch_cbitmap_t *)src, keep_id); break; case CSCH_CTYPE_CONN: abort(); case CSCH_CTYPE_GRP: - case CSCH_CTYPE_GRP_REF: dst = csch_cgrp_dup(sheet, grp, (const csch_cgrp_t *)src); break; - case CSCH_CTYPE_PEN: dst = csch_pen_dup(sheet, grp, (const csch_cpen_t *)src); break; + case CSCH_CTYPE_GRP_REF: dst = csch_cgrp_dup(sheet, grp, (const csch_cgrp_t *)src, keep_id); break; + case CSCH_CTYPE_PEN: dst = csch_pen_dup(sheet, grp, (const csch_cpen_t *)src); break; /* id is name and is always kept */ } return dst; } Index: trunk/src/libcschem/cnc_any_obj.h =================================================================== --- trunk/src/libcschem/cnc_any_obj.h (revision 1483) +++ trunk/src/libcschem/cnc_any_obj.h (revision 1484) @@ -27,7 +27,7 @@ #include "concrete.h" void csch_cobj_free(csch_chdr_t *obj); -csch_chdr_t *csch_cobj_dup(csch_sheet_t *sheet, csch_cgrp_t *grp, const csch_chdr_t *src); +csch_chdr_t *csch_cobj_dup(csch_sheet_t *sheet, csch_cgrp_t *grp, const csch_chdr_t *src, int keep_id); void csch_cobj_update(csch_sheet_t *sheet, csch_chdr_t *src, int do_xform); int csch_cobj_attrib_set(csch_sheet_t *sheet, csch_chdr_t *obj, int prio, const char *key, const char *val, const csch_source_arg_t source); void csch_cobj_attrib_copy_all(csch_sheet_t *sheet, csch_chdr_t *dst, const csch_chdr_t *src); Index: trunk/src/libcschem/cnc_arc.c =================================================================== --- trunk/src/libcschem/cnc_arc.c (revision 1483) +++ trunk/src/libcschem/cnc_arc.c (revision 1484) @@ -48,7 +48,7 @@ return arc; } -csch_arc_t *csch_arc_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_arc_t *src) +csch_arc_t *csch_arc_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_arc_t *src, int keep_id) { csch_arc_t *dst = csch_arc_alloc(sheet, parent, src->hdr.oid); dst->inst = src->inst; Index: trunk/src/libcschem/cnc_arc.h =================================================================== --- trunk/src/libcschem/cnc_arc.h (revision 1483) +++ trunk/src/libcschem/cnc_arc.h (revision 1484) @@ -43,7 +43,7 @@ } csch_arc_t; csch_arc_t *csch_arc_alloc(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); -csch_arc_t *csch_arc_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_arc_t *src); +csch_arc_t *csch_arc_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_arc_t *src, int keep_id); void csch_arc_free(csch_arc_t *arc); csch_arc_t *csch_arc_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid); void csch_arc_update(csch_sheet_t *sheet, csch_arc_t *arc, int do_xform); Index: trunk/src/libcschem/cnc_bitmap.c =================================================================== --- trunk/src/libcschem/cnc_bitmap.c (revision 1483) +++ trunk/src/libcschem/cnc_bitmap.c (revision 1484) @@ -43,7 +43,7 @@ return bitmap; } -csch_cbitmap_t *csch_cbitmap_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cbitmap_t *src) +csch_cbitmap_t *csch_cbitmap_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cbitmap_t *src, int keep_id) { csch_cbitmap_t *dst = csch_cbitmap_alloc(sheet, parent, src->hdr.oid); dst->inst_x1 = src->inst_x1; Index: trunk/src/libcschem/cnc_bitmap.h =================================================================== --- trunk/src/libcschem/cnc_bitmap.h (revision 1483) +++ trunk/src/libcschem/cnc_bitmap.h (revision 1484) @@ -42,7 +42,7 @@ } csch_cbitmap_t; csch_cbitmap_t *csch_cbitmap_alloc(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); -csch_cbitmap_t *csch_cbitmap_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cbitmap_t *src); +csch_cbitmap_t *csch_cbitmap_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cbitmap_t *src, int keep_id); void csch_cbitmap_free(csch_cbitmap_t *bitmap); csch_cbitmap_t *csch_cbitmap_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid); Index: trunk/src/libcschem/cnc_grp.c =================================================================== --- trunk/src/libcschem/cnc_grp.c (revision 1483) +++ trunk/src/libcschem/cnc_grp.c (revision 1484) @@ -85,13 +85,13 @@ { htip_entry_t *e; for(e = htip_first(&src->id2obj); e != NULL; e = htip_next(&src->id2obj, e)) - csch_cobj_dup(sheet, dst, (csch_chdr_t *)e->value); + csch_cobj_dup(sheet, dst, (csch_chdr_t *)e->value, 1); if (copy_attr) csch_cobj_attrib_copy_all(sheet, &dst->hdr, &src->hdr); return dst; } -csch_cgrp_t *csch_cgrp_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cgrp_t *src) +csch_cgrp_t *csch_cgrp_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cgrp_t *src, int keep_id) { csch_cgrp_t *dst; if (src->hdr.type == CSCH_CTYPE_GRP) { Index: trunk/src/libcschem/cnc_grp.h =================================================================== --- trunk/src/libcschem/cnc_grp.h (revision 1483) +++ trunk/src/libcschem/cnc_grp.h (revision 1484) @@ -47,7 +47,7 @@ /*** standard calls on group refs ***/ csch_cgrp_t *csch_cgrp_ref_alloc(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); -csch_cgrp_t *csch_cgrp_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cgrp_t *src); +csch_cgrp_t *csch_cgrp_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cgrp_t *src, int keep_id); void csch_cgrp_ref_free(csch_cgrp_t *grp); void csch_cgrp_ref_update(csch_sheet_t *sheet, csch_cgrp_t *grpref, int do_xform); Index: trunk/src/libcschem/cnc_line.c =================================================================== --- trunk/src/libcschem/cnc_line.c (revision 1483) +++ trunk/src/libcschem/cnc_line.c (revision 1484) @@ -48,7 +48,7 @@ return line; } -csch_line_t *csch_line_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_line_t *src) +csch_line_t *csch_line_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_line_t *src, int keep_id) { csch_line_t *dst = csch_line_alloc(sheet, parent, src->hdr.oid); dst->inst = src->inst; Index: trunk/src/libcschem/cnc_line.h =================================================================== --- trunk/src/libcschem/cnc_line.h (revision 1483) +++ trunk/src/libcschem/cnc_line.h (revision 1484) @@ -40,7 +40,7 @@ } csch_line_t; csch_line_t *csch_line_alloc(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); -csch_line_t *csch_line_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_line_t *src); +csch_line_t *csch_line_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_line_t *src, int keep_id); void csch_line_free(csch_line_t *line); csch_line_t *csch_line_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid); void csch_line_update(csch_sheet_t *sheet, csch_line_t *line, int do_xform); Index: trunk/src/libcschem/cnc_poly.c =================================================================== --- trunk/src/libcschem/cnc_poly.c (revision 1483) +++ trunk/src/libcschem/cnc_poly.c (revision 1484) @@ -52,7 +52,7 @@ return poly; } -csch_cpoly_t *csch_cpoly_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cpoly_t *src) +csch_cpoly_t *csch_cpoly_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cpoly_t *src, int keep_id) { csch_cpoly_t *dst = csch_cpoly_alloc(sheet, parent, src->hdr.oid); long n; Index: trunk/src/libcschem/cnc_poly.h =================================================================== --- trunk/src/libcschem/cnc_poly.h (revision 1483) +++ trunk/src/libcschem/cnc_poly.h (revision 1484) @@ -40,7 +40,7 @@ } csch_cpoly_t; csch_cpoly_t *csch_cpoly_alloc(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); -csch_cpoly_t *csch_cpoly_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cpoly_t *src); +csch_cpoly_t *csch_cpoly_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cpoly_t *src, int keep_id); void csch_cpoly_free(csch_cpoly_t *poly); csch_cpoly_t *csch_cpoly_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid); void csch_poly_update(csch_sheet_t *sheet, csch_cpoly_t *poly, int do_xform); Index: trunk/src/libcschem/operation.c =================================================================== --- trunk/src/libcschem/operation.c (revision 1483) +++ trunk/src/libcschem/operation.c (revision 1484) @@ -117,7 +117,8 @@ csch_chdr_t *newo; csch_op_remove(sheet, src); - newo = csch_cobj_dup(sheet, dst, src); +TODO("undo problem: dup doesn't preserve oid and that may need to be undone"); + newo = csch_cobj_dup(sheet, dst, src, 0); csch_cobj_update(sheet, newo, 0); csch_op_inserted(sheet, dst, newo); }