Index: trunk/src/libcschem/cnc_any_obj.c =================================================================== --- trunk/src/libcschem/cnc_any_obj.c (revision 5357) +++ trunk/src/libcschem/cnc_any_obj.c (revision 5358) @@ -64,7 +64,7 @@ } -csch_chdr_t *csch_cobj_dup(csch_sheet_t *sheet, csch_cgrp_t *grp, const csch_chdr_t *src, int keep_id) +csch_chdr_t *csch_cobj_dup(csch_sheet_t *sheet, csch_cgrp_t *grp, const csch_chdr_t *src, int keep_id, int inst2spec) { void *dst; @@ -71,7 +71,7 @@ switch(src->type) { case CSCH_CTYPE_max: case CSCH_CTYPE_invalid: return NULL; - case CSCH_CTYPE_LINE: dst = csch_line_dup(sheet, grp, (const csch_line_t *)src, keep_id); break; + case CSCH_CTYPE_LINE: dst = csch_line_dup(sheet, grp, (const csch_line_t *)src, keep_id, inst2spec); 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_TEXT: dst = csch_text_dup(sheet, grp, (const csch_text_t *)src, keep_id); break; Index: trunk/src/libcschem/cnc_any_obj.h =================================================================== --- trunk/src/libcschem/cnc_any_obj.h (revision 5357) +++ trunk/src/libcschem/cnc_any_obj.h (revision 5358) @@ -30,7 +30,11 @@ #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, int keep_id); + +/* If inst2spec is true, take target groups transformations and modify dup'd + object's spec so that it ends up in the same installed coords */ +csch_chdr_t *csch_cobj_dup(csch_sheet_t *sheet, csch_cgrp_t *grp, const csch_chdr_t *src, int keep_id, int inst2spec); + void csch_cobj_update(csch_sheet_t *sheet, csch_chdr_t *src, int do_xform); void csch_cobj_attrib_copy_all(csch_sheet_t *sheet, csch_cgrp_t *dst, const csch_cgrp_t *src); Index: trunk/src/libcschem/cnc_grp.c =================================================================== --- trunk/src/libcschem/cnc_grp.c (revision 5357) +++ trunk/src/libcschem/cnc_grp.c (revision 5358) @@ -116,7 +116,7 @@ } for(e = htip_first(&src->id2obj); e != NULL; e = htip_next(&src->id2obj, e)) - csch_cobj_dup(sheet, dst, (csch_chdr_t *)e->value, 1); + csch_cobj_dup(sheet, dst, (csch_chdr_t *)e->value, 1, 0); if (copy_attr) csch_cobj_attrib_copy_all(sheet, dst, src); Index: trunk/src/libcschem/cnc_line.c =================================================================== --- trunk/src/libcschem/cnc_line.c (revision 5357) +++ trunk/src/libcschem/cnc_line.c (revision 5358) @@ -61,12 +61,28 @@ return line; } -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 *csch_line_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_line_t *src, int keep_id, int inst2spec) { csch_line_t *dst = csch_line_alloc(sheet, parent, CSCH_KEEP_OID(parent, src->hdr.oid)); - dst->inst = src->inst; - dst->spec = src->spec; + csch_chdr_copy_meta4dup(&dst->hdr, &src->hdr); + + if (inst2spec) { + g2d_xform_t mx; + g2d_vect_t v1 = src->inst.c.p1, v2 = src->inst.c.p2; + + csch_cgrp_inverse_matrix(&mx, parent); + v1 = g2d_xform_vect2vect(mx, v1); + v2 = g2d_xform_vect2vect(mx, v2); + dst->spec.p1 = v1; + dst->spec.p2 = v2; + csch_line_update(sheet, dst, 1); + } + else { + dst->inst = src->inst; + dst->spec = src->spec; + } + return dst; } @@ -212,7 +228,7 @@ static void line_copy(csch_sheet_t *sheet, csch_chdr_t *obj, csch_coord_t dx, csch_coord_t dy, int undoable) { - csch_line_t *line = csch_line_dup(sheet, obj->parent, (csch_line_t *)obj, 0); + csch_line_t *line = csch_line_dup(sheet, obj->parent, (csch_line_t *)obj, 0, 0); if (line != NULL) { line->spec.p1.x += dx; line->spec.p1.y += dy; line->spec.p2.x += dx; line->spec.p2.y += dy; Index: trunk/src/libcschem/cnc_line.h =================================================================== --- trunk/src/libcschem/cnc_line.h (revision 5357) +++ trunk/src/libcschem/cnc_line.h (revision 5358) @@ -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, int keep_id); +csch_line_t *csch_line_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_line_t *src, int keep_id, int inst2spec); 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/operation.c =================================================================== --- trunk/src/libcschem/operation.c (revision 5357) +++ trunk/src/libcschem/operation.c (revision 5358) @@ -141,7 +141,7 @@ csch_chdr_t *newo; TODO("undo problem: dup doesn't preserve oid and that may need to be undone"); - newo = csch_cobj_dup(sheet, dst, src, 0); + newo = csch_cobj_dup(sheet, dst, src, 0, 1); csch_cobj_update(sheet, newo, 0); csch_op_inserted(sheet, dst, newo); return newo; @@ -153,7 +153,7 @@ csch_op_remove(sheet, src); TODO("undo problem: dup doesn't preserve oid and that may need to be undone"); - newo = csch_cobj_dup(sheet, dst, src, 0); + newo = csch_cobj_dup(sheet, dst, src, 0, 1); csch_cobj_update(sheet, newo, 0); csch_op_inserted(sheet, dst, newo); }