Index: trunk/src/libcschem/cnc_any_obj.c =================================================================== --- trunk/src/libcschem/cnc_any_obj.c (revision 602) +++ trunk/src/libcschem/cnc_any_obj.c (revision 603) @@ -53,3 +53,21 @@ } } + +csch_chdr_t *csch_obj_dup(csch_sheet_t *sheet, csch_cgrp_t *grp, const csch_chdr_t *src) +{ + 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_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: abort(); + } + return dst; +} Index: trunk/src/libcschem/cnc_arc.c =================================================================== --- trunk/src/libcschem/cnc_arc.c (revision 602) +++ trunk/src/libcschem/cnc_arc.c (revision 603) @@ -44,6 +44,16 @@ return arc; } +csch_arc_t *csch_arc_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_arc_t *src) +{ + csch_arc_t *dst = csch_arc_alloc(sheet, parent, src->hdr.oid); + dst->inst = src->inst; + dst->spec = src->spec; + return dst; +} + + + void csch_arc_free(csch_arc_t *arc) { csch_cobj_uninit(&arc->hdr); Index: trunk/src/libcschem/cnc_arc.h =================================================================== --- trunk/src/libcschem/cnc_arc.h (revision 602) +++ trunk/src/libcschem/cnc_arc.h (revision 603) @@ -43,6 +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); 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); Index: trunk/src/libcschem/cnc_bitmap.c =================================================================== --- trunk/src/libcschem/cnc_bitmap.c (revision 602) +++ trunk/src/libcschem/cnc_bitmap.c (revision 603) @@ -43,6 +43,21 @@ return bitmap; } +csch_cbitmap_t *csch_cbitmap_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cbitmap_t *src) +{ + csch_cbitmap_t *dst = csch_line_alloc(sheet, parent, src->hdr.oid); + dst->inst_x1 = src->inst_x1; + dst->inst_y1 = src->inst_y1; + dst->spec_x1 = src->spec_x1; + dst->spec_y1 = src->spec_y1; + dst->sx = src->sx; + dst->sy = src->sy; + dst->transp = src->transp; +#warning TODO: copy or reference the pixmap? + return dst; +} + + void csch_cbitmap_free(csch_cbitmap_t *bitmap) { csch_cobj_uninit(&bitmap->hdr); Index: trunk/src/libcschem/cnc_bitmap.h =================================================================== --- trunk/src/libcschem/cnc_bitmap.h (revision 602) +++ trunk/src/libcschem/cnc_bitmap.h (revision 603) @@ -40,6 +40,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); 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 602) +++ trunk/src/libcschem/cnc_grp.c (revision 603) @@ -53,6 +53,30 @@ return csch_cgrp_init(sheet, grp, parent, oid); } +csch_cgrp_t *csch_cgrp_dup_into(csch_sheet_t *sheet, csch_cgrp_t *dst, const csch_cgrp_t *src) +{ + htip_entry_t *e; + for(e = htip_first(&src->id2obj); e != NULL; e = htip_next(&src->id2obj, e)) + csch_obj_dup(sheet, dst, (csch_chdr_t *)e->value); + return dst; +} + +csch_cgrp_t *csch_cgrp_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cgrp_t *src) +{ + csch_cgrp_t *dst; + if (src->hdr.type == CSCH_CTYPE_GRP) { + dst = csch_cgrp_alloc(sheet, parent, src->hdr.oid); + dst->data.grp = src->data.grp; + } + else { + dst = csch_cgrp_ref_alloc(sheet, parent, src->hdr.oid); + dst->data.ref = src->data.ref; + } + return csch_cgrp_dup_into(sheet, dst, src); +} + + + void csch_cgrp_free(csch_cgrp_t *grp) { csch_cobj_uninit(&grp->hdr); @@ -99,6 +123,7 @@ return grp; } + void csch_cgrp_ref_free(csch_cgrp_t *grpref) { assert(grpref->hdr.type == CSCH_CTYPE_GRP_REF); @@ -138,8 +163,8 @@ assert(grpref->hdr.type == CSCH_CTYPE_GRP_REF); csch_cgrp_ref_clean(sheet, grpref); + csch_cgrp_dup_into(sheet, grpref, grp); for(e = htip_first(&grp->id2obj); e != NULL; e = htip_next(&grp->id2obj, e)) { - csch_chdr_t *o = e->value; #warning TODO: do the matrix transformation on each obj and create them } } Index: trunk/src/libcschem/cnc_line.c =================================================================== --- trunk/src/libcschem/cnc_line.c (revision 602) +++ trunk/src/libcschem/cnc_line.c (revision 603) @@ -45,6 +45,16 @@ return line; } + +csch_line_t *csch_line_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_line_t *src) +{ + csch_line_t *dst = csch_line_alloc(sheet, parent, src->hdr.oid); + dst->inst = src->inst; + dst->spec = src->spec; + return dst; +} + + void csch_line_free(csch_line_t *line) { csch_cobj_uninit(&line->hdr); Index: trunk/src/libcschem/cnc_line.h =================================================================== --- trunk/src/libcschem/cnc_line.h (revision 602) +++ trunk/src/libcschem/cnc_line.h (revision 603) @@ -40,6 +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); 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_line_t *line, int do_xform); Index: trunk/src/libcschem/cnc_poly.c =================================================================== --- trunk/src/libcschem/cnc_poly.c (revision 602) +++ trunk/src/libcschem/cnc_poly.c (revision 603) @@ -43,6 +43,14 @@ return poly; } +csch_cpoly_t *csch_cpoly_dup(csch_sheet_t *sheet, csch_cgrp_t *parent, const csch_cpoly_t *src) +{ + csch_cpoly_t *dst = csch_cpoly_alloc(sheet, parent, src->hdr.oid); +#warning TODO: copy the outline (for transformations) + return dst; +} + + void csch_cpoly_free(csch_cpoly_t *poly) { csch_cobj_uninit(&poly->hdr); Index: trunk/src/libcschem/cnc_poly.h =================================================================== --- trunk/src/libcschem/cnc_poly.h (revision 602) +++ trunk/src/libcschem/cnc_poly.h (revision 603) @@ -38,6 +38,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); 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);