Index: trunk/src/obj_pstk.c =================================================================== --- trunk/src/obj_pstk.c (revision 20173) +++ trunk/src/obj_pstk.c (revision 20174) @@ -54,6 +54,22 @@ static const char core_pstk_cookie[] = "padstack"; +void pcb_pstk_reg(pcb_data_t *data, pcb_pstk_t *pstk) +{ + padstacklist_append(&data->padstack, pstk); + pcb_obj_id_reg(data, pstk); + PCB_SET_PARENT(pstk, data, data); +} + +void pcb_pstk_unreg(pcb_pstk_t *pstk) +{ + pcb_data_t *data = pstk->parent.data; + assert(pstk->parent_type == PCB_PARENT_DATA); + padstacklist_remove(pstk); + pcb_obj_id_del(data, pstk); + PCB_CLEAR_PARENT(pstk); +} + pcb_pstk_t *pcb_pstk_alloc(pcb_data_t *data) { pcb_pstk_t *ps; @@ -62,9 +78,8 @@ ps->protoi = -1; ps->type = PCB_OBJ_PSTK; ps->Attributes.post_change = pcb_obj_attrib_post_change; - PCB_SET_PARENT(ps, data, data); - padstacklist_append(&data->padstack, ps); + pcb_pstk_reg(data, ps); return ps; } @@ -71,7 +86,7 @@ void pcb_pstk_free(pcb_pstk_t *ps) { - padstacklist_remove(ps); + pcb_pstk_unreg(ps); free(ps->thermals.shape); free(ps); } Index: trunk/src/obj_pstk.h =================================================================== --- trunk/src/obj_pstk.h (revision 20173) +++ trunk/src/obj_pstk.h (revision 20174) @@ -95,6 +95,10 @@ void pcb_pstk_bbox(pcb_pstk_t *ps); void pcb_pstk_copper_bbox(pcb_box_t *dst, pcb_pstk_t *ps); +void pcb_pstk_reg(pcb_data_t *data, pcb_pstk_t *pstk); +void pcb_pstk_unreg(pcb_pstk_t *pstk); + + void pcb_pstk_pre(pcb_pstk_t *pstk); void pcb_pstk_post(pcb_pstk_t *pstk); Index: trunk/src/obj_pstk_op.c =================================================================== --- trunk/src/obj_pstk_op.c (revision 20173) +++ trunk/src/obj_pstk_op.c (revision 20174) @@ -53,10 +53,10 @@ pcb_poly_restore_to_poly(ctx->buffer.src, PCB_OBJ_PSTK, NULL, ps); pcb_r_delete_entry(ctx->buffer.src->padstack_tree, (pcb_box_t *)ps); - padstacklist_remove(ps); + pcb_pstk_unreg(ps); ps->proto = npid; ps->protoi = -1; /* only the canonical trshape got copied, not the transofrmed ones */ - padstacklist_append(&ctx->buffer.dst->padstack, ps); + pcb_pstk_reg(ctx->buffer.dst, ps); PCB_FLAG_CLEAR(PCB_FLAG_WARN | PCB_FLAG_FOUND, ps); @@ -66,7 +66,6 @@ pcb_r_insert_entry(ctx->buffer.dst->padstack_tree, (pcb_box_t *)ps); pcb_poly_clear_from_poly(ctx->buffer.dst, PCB_OBJ_PSTK, NULL, ps); - PCB_SET_PARENT(ps, data, ctx->buffer.dst); return ps; } Index: trunk/src/obj_subc.c =================================================================== --- trunk/src/obj_subc.c (revision 20173) +++ trunk/src/obj_subc.c (revision 20174) @@ -543,9 +543,8 @@ while((ps = padstacklist_first(&buffer->Data->padstack)) != NULL) { const pcb_pstk_proto_t *proto = pcb_pstk_get_proto(ps); - padstacklist_remove(ps); - padstacklist_append(&sc->data->padstack, ps); - PCB_SET_PARENT(ps, data, sc->data); + pcb_pstk_unreg(ps); + pcb_pstk_reg(sc->data, ps); PCB_FLAG_CLEAR(PCB_FLAG_WARN | PCB_FLAG_FOUND | PCB_FLAG_SELECTED, ps); ps->proto = pcb_pstk_proto_insert_dup(sc->data, proto, 1); ps->protoi = -1;