Index: trunk/src/obj_pstk.c =================================================================== --- trunk/src/obj_pstk.c (revision 20903) +++ trunk/src/obj_pstk.c (revision 20904) @@ -110,7 +110,7 @@ free(ps); } -pcb_pstk_t *pcb_pstk_new_tr(pcb_data_t *data, pcb_cardinal_t proto, pcb_coord_t x, pcb_coord_t y, pcb_coord_t clearance, pcb_flag_t Flags, double rot, int xmirror, int smirror) +pcb_pstk_t *pcb_pstk_new_tr(pcb_data_t *data, long int id, pcb_cardinal_t proto, pcb_coord_t x, pcb_coord_t y, pcb_coord_t clearance, pcb_flag_t Flags, double rot, int xmirror, int smirror) { pcb_pstk_t *ps; @@ -117,8 +117,11 @@ if (proto >= pcb_vtpadstack_proto_len(&data->ps_protos)) return NULL; - ps = pcb_pstk_alloc(data); + if (id <= 0) + id = pcb_create_ID_get(); + ps = pcb_pstk_alloc_id(data, id); + /* copy values */ ps->proto = proto; ps->x = x; @@ -134,9 +137,9 @@ return ps; } -pcb_pstk_t *pcb_pstk_new(pcb_data_t *data, pcb_cardinal_t proto, pcb_coord_t x, pcb_coord_t y, pcb_coord_t clearance, pcb_flag_t Flags) +pcb_pstk_t *pcb_pstk_new(pcb_data_t *data, long int id, pcb_cardinal_t proto, pcb_coord_t x, pcb_coord_t y, pcb_coord_t clearance, pcb_flag_t Flags) { - return pcb_pstk_new_tr(data, proto, x, y, clearance, Flags, 0, 0, 0); + return pcb_pstk_new_tr(data, id, proto, x, y, clearance, Flags, 0, 0, 0); } Index: trunk/src/obj_pstk.h =================================================================== --- trunk/src/obj_pstk.h (revision 20903) +++ trunk/src/obj_pstk.h (revision 20904) @@ -90,8 +90,8 @@ pcb_pstk_t *pcb_pstk_alloc(pcb_data_t *data); pcb_pstk_t *pcb_pstk_alloc_id(pcb_data_t *data, long int id); void pcb_pstk_free(pcb_pstk_t *ps); -pcb_pstk_t *pcb_pstk_new(pcb_data_t *data, pcb_cardinal_t proto, pcb_coord_t x, pcb_coord_t y, pcb_coord_t clearance, pcb_flag_t Flags); -pcb_pstk_t *pcb_pstk_new_tr(pcb_data_t *data, pcb_cardinal_t proto, pcb_coord_t x, pcb_coord_t y, pcb_coord_t clearance, pcb_flag_t Flags, double rot, int xmirror, int smirror); +pcb_pstk_t *pcb_pstk_new(pcb_data_t *data, long int id, pcb_cardinal_t proto, pcb_coord_t x, pcb_coord_t y, pcb_coord_t clearance, pcb_flag_t Flags); +pcb_pstk_t *pcb_pstk_new_tr(pcb_data_t *data, long int id, pcb_cardinal_t proto, pcb_coord_t x, pcb_coord_t y, pcb_coord_t clearance, pcb_flag_t Flags, double rot, int xmirror, int smirror); void pcb_pstk_add(pcb_data_t *data, pcb_pstk_t *ps); void pcb_pstk_bbox(pcb_pstk_t *ps); void pcb_pstk_copper_bbox(pcb_box_t *dst, pcb_pstk_t *ps); Index: trunk/src/obj_pstk_act.c =================================================================== --- trunk/src/obj_pstk_act.c (revision 20903) +++ trunk/src/obj_pstk_act.c (revision 20904) @@ -90,7 +90,7 @@ if (pid != PCB_PADSTACK_INVALID) { pcb_message(PCB_MSG_INFO, "Pad stack registered with ID %d\n", pid); - pcb_pstk_new(PCB_PASTEBUFFER->Data, pid, 0, 0, conf_core.design.clearance, pcb_flag_make(PCB_FLAG_CLEARLINE)); + pcb_pstk_new(PCB_PASTEBUFFER->Data, -1, pid, 0, 0, conf_core.design.clearance, pcb_flag_make(PCB_FLAG_CLEARLINE)); pcb_set_buffer_bbox(PCB_PASTEBUFFER); PCB_PASTEBUFFER->X = PCB_PASTEBUFFER->Y = 0; } @@ -200,7 +200,7 @@ return -1; } - ps = pcb_pstk_new(PCB->Data, pid, x, y, conf_core.design.clearance, pcb_no_flags()); + ps = pcb_pstk_new(PCB->Data, -1, pid, x, y, conf_core.design.clearance, pcb_no_flags()); if (ps == NULL) { pcb_message(PCB_MSG_ERROR, "Failed to place padstack\n"); return -1; Index: trunk/src/obj_pstk_op.c =================================================================== --- trunk/src/obj_pstk_op.c (revision 20903) +++ trunk/src/obj_pstk_op.c (revision 20904) @@ -36,7 +36,7 @@ return NULL; npid = pcb_pstk_proto_insert_dup(ctx->buffer.dst, proto, 1); - p = pcb_pstk_new_tr(ctx->buffer.dst, npid, ps->x, ps->y, ps->Clearance, pcb_flag_mask(ps->Flags, PCB_FLAG_FOUND | ctx->buffer.extraflg), ps->rot, ps->xmirror, ps->smirror); + 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); return pcb_pstk_copy_meta(p, ps); } @@ -80,7 +80,7 @@ return NULL; npid = pcb_pstk_proto_insert_dup(data, proto, 1); - nps = pcb_pstk_new_tr(data, npid, ps->x + ctx->copy.DeltaX, ps->y + ctx->copy.DeltaY, ps->Clearance, pcb_flag_mask(ps->Flags, PCB_FLAG_FOUND), ps->rot, ps->xmirror, ps->smirror); + nps = pcb_pstk_new_tr(data, -1, npid, ps->x + ctx->copy.DeltaX, ps->y + ctx->copy.DeltaY, ps->Clearance, pcb_flag_mask(ps->Flags, PCB_FLAG_FOUND), ps->rot, ps->xmirror, ps->smirror); if (nps == NULL) return NULL; Index: trunk/src/obj_subc.c =================================================================== --- trunk/src/obj_subc.c (revision 20903) +++ trunk/src/obj_subc.c (revision 20904) @@ -826,7 +826,7 @@ padstacklist_foreach(&src->data->padstack, &it, ps) { pcb_cardinal_t pid = pcb_pstk_proto_insert_dup(sc->data, pcb_pstk_get_proto(ps), 1); - nps = pcb_pstk_new_tr(sc->data, pid, ps->x+dx, ps->y+dy, ps->Clearance, ps->Flags, ps->rot, ps->xmirror, ps->smirror); + nps = pcb_pstk_new_tr(sc->data, -1, pid, ps->x+dx, ps->y+dy, ps->Clearance, ps->Flags, ps->rot, ps->xmirror, ps->smirror); pcb_pstk_copy_meta(nps, ps); MAYBE_KEEP_ID(nps, ps); if (nps != NULL) { Index: trunk/src_plugins/act_draw/act_draw.c =================================================================== --- trunk/src_plugins/act_draw/act_draw.c (revision 20903) +++ trunk/src_plugins/act_draw/act_draw.c (revision 20904) @@ -214,7 +214,7 @@ return 0; flags = pcb_strflg_s2f(sflg, flg_error, NULL, 0); - pstk = pcb_pstk_new(data, proto, x, y, cl, flags); + pstk = pcb_pstk_new(data, -1, proto, x, y, cl, flags); if (pstk != NULL) { res->type = FGW_LONG; Index: trunk/src_plugins/io_dsn/read.c =================================================================== --- trunk/src_plugins/io_dsn/read.c (revision 20903) +++ trunk/src_plugins/io_dsn/read.c (revision 20904) @@ -847,7 +847,7 @@ DSN_LOAD_COORDS_FMT(crd, ncoord, "XY", goto err_coord); pid = pcb_pstk_proto_insert_dup(subc->data, proto, 1); - pcb_pstk_new(subc->data, pid, crd[0], crd[1], conf_core.design.clearance/2, pcb_flag_make(PCB_FLAG_CLEARLINE)); + pcb_pstk_new(subc->data, -1, pid, crd[0], crd[1], conf_core.design.clearance/2, pcb_flag_make(PCB_FLAG_CLEARLINE)); } return 0; @@ -897,7 +897,7 @@ } pid = pcb_pstk_proto_insert_dup(subc->data, proto, 1); - ps = pcb_pstk_new(subc->data, pid, crd[0], crd[1], conf_core.design.clearance/2, pcb_flag_make(PCB_FLAG_CLEARLINE)); + ps = pcb_pstk_new(subc->data, -1, pid, crd[0], crd[1], conf_core.design.clearance/2, pcb_flag_make(PCB_FLAG_CLEARLINE)); if (ps != NULL) { if (rotang != 0.0) { ps->rot = rotang; @@ -1412,7 +1412,7 @@ DSN_LOAD_COORDS_FMT(crd, vnd->children->next, "xy", goto err_coord); pid = pcb_pstk_proto_insert_dup(ctx->pcb->Data, proto, 1); - if (pcb_pstk_new(ctx->pcb->Data, pid, crd[0], crd[1], conf_core.design.clearance/2, pcb_flag_make(PCB_FLAG_CLEARLINE)) == NULL) + if (pcb_pstk_new(ctx->pcb->Data, -1, pid, crd[0], crd[1], conf_core.design.clearance/2, pcb_flag_make(PCB_FLAG_CLEARLINE)) == NULL) pcb_message(PCB_MSG_ERROR, "Failed to create via - expect missing vias (at %ld:%ld)\n", (long)vnd->line, (long)vnd->col); return 0; @@ -1474,7 +1474,7 @@ pcb_pstk_proto_free_fields(&tpp); } - ps = pcb_pstk_new(ctx->pcb->Data, ctx->testpoint, crd[0], crd[1], 0, pcb_no_flags()); + ps = pcb_pstk_new(ctx->pcb->Data, -1, ctx->testpoint, crd[0], crd[1], 0, pcb_no_flags()); if (ps == NULL) { pcb_message(PCB_MSG_ERROR, "Failed to create testpoint (at %ld:%ld)\n", (long)tnd->line, (long)tnd->col); return 0; Index: trunk/src_plugins/io_lihata/read.c =================================================================== --- trunk/src_plugins/io_lihata/read.c (revision 20903) +++ trunk/src_plugins/io_lihata/read.c (revision 20904) @@ -1190,7 +1190,7 @@ if (err != 0) return -1; - p = pcb_pstk_new_compat_pad(subc->data, X1+dx, Y1+dy, X2+dx, Y2+dy, Thickness, Clearance, Mask, flg.f & PCB_FLAG_SQUARE, flg.f & PCB_FLAG_NOPASTE, (!!(flg.f & PCB_FLAG_ONSOLDER))); + p = pcb_pstk_new_compat_pad(subc->data, -1, X1+dx, Y1+dy, X2+dx, Y2+dy, Thickness, Clearance, Mask, flg.f & PCB_FLAG_SQUARE, flg.f & PCB_FLAG_NOPASTE, (!!(flg.f & PCB_FLAG_ONSOLDER))); if (Number != NULL) pcb_attribute_put(&p->Attributes, "term", Number); if (Name != NULL) Index: trunk/src_plugins/io_pcb/file.c =================================================================== --- trunk/src_plugins/io_pcb/file.c (revision 20903) +++ trunk/src_plugins/io_pcb/file.c (revision 20904) @@ -1076,7 +1076,7 @@ { pcb_pstk_t *p; - p = pcb_pstk_new_compat_pad(subc->data, X1, Y1, X2, Y2, Thickness, Clearance, Mask, Flags.f & PCB_FLAG_SQUARE, Flags.f & PCB_FLAG_NOPASTE, (!!(Flags.f & PCB_FLAG_ONSOLDER)) != yysubc_bottom); + p = pcb_pstk_new_compat_pad(subc->data, -1, X1, Y1, X2, Y2, Thickness, Clearance, Mask, Flags.f & PCB_FLAG_SQUARE, Flags.f & PCB_FLAG_NOPASTE, (!!(Flags.f & PCB_FLAG_ONSOLDER)) != yysubc_bottom); if (Number != NULL) pcb_attribute_put(&p->Attributes, "term", Number); if (Name != NULL) Index: trunk/src_plugins/lib_compat_help/pstk_compat.c =================================================================== --- trunk/src_plugins/lib_compat_help/pstk_compat.c (revision 20903) +++ trunk/src_plugins/lib_compat_help/pstk_compat.c (revision 20904) @@ -206,7 +206,7 @@ if (mask > 0) compat_shape_free(&mask_master); - return pcb_pstk_new(data, pid, x, y, clearance, pcb_flag_make(PCB_FLAG_CLEARLINE)); + return pcb_pstk_new(data, -1, pid, x, y, clearance, pcb_flag_make(PCB_FLAG_CLEARLINE)); } static pcb_pstk_compshape_t get_old_shape_square(pcb_coord_t *dia, const pcb_pstk_shape_t *shp) @@ -479,7 +479,7 @@ } } -pcb_pstk_t *pcb_pstk_new_compat_pad(pcb_data_t *data, pcb_coord_t x1, pcb_coord_t y1, pcb_coord_t x2, pcb_coord_t y2, pcb_coord_t thickness, pcb_coord_t clearance, pcb_coord_t mask, pcb_bool square, pcb_bool nopaste, pcb_bool onotherside) +pcb_pstk_t *pcb_pstk_new_compat_pad(pcb_data_t *data, long int id, pcb_coord_t x1, pcb_coord_t y1, pcb_coord_t x2, pcb_coord_t y2, pcb_coord_t thickness, pcb_coord_t clearance, pcb_coord_t mask, pcb_bool square, pcb_bool nopaste, pcb_bool onotherside) { pcb_layer_type_t side; pcb_pstk_proto_t proto; @@ -527,7 +527,7 @@ if (pid == PCB_PADSTACK_INVALID) return NULL; - return pcb_pstk_new(data, pid, cx, cy, clearance/2, pcb_flag_make(PCB_FLAG_CLEARLINE)); + return pcb_pstk_new(data, id, pid, cx, cy, clearance/2, pcb_flag_make(PCB_FLAG_CLEARLINE)); } Index: trunk/src_plugins/lib_compat_help/pstk_compat.h =================================================================== --- trunk/src_plugins/lib_compat_help/pstk_compat.h (revision 20903) +++ trunk/src_plugins/lib_compat_help/pstk_compat.h (revision 20904) @@ -19,8 +19,9 @@ /* Convert an existing padstack to old-style via and return broken down parameters */ pcb_bool pcb_pstk_export_compat_via(pcb_pstk_t *ps, pcb_coord_t *x, pcb_coord_t *y, pcb_coord_t *drill_dia, pcb_coord_t *pad_dia, pcb_coord_t *clearance, pcb_coord_t *mask, pcb_pstk_compshape_t *cshape, pcb_bool *plated); -/* Create a padstack that emulates an old-style pad - register proto as needed */ -pcb_pstk_t *pcb_pstk_new_compat_pad(pcb_data_t *data, pcb_coord_t x1, pcb_coord_t y1, pcb_coord_t x2, pcb_coord_t y2, pcb_coord_t thickness, pcb_coord_t clearance, pcb_coord_t mask, pcb_bool square, pcb_bool nopaste, pcb_bool onotherside); +/* Create a padstack that emulates an old-style pad - register proto as needed + If id <= 0, allocate an id automatically. */ +pcb_pstk_t *pcb_pstk_new_compat_pad(pcb_data_t *data, long int id, pcb_coord_t x1, pcb_coord_t y1, pcb_coord_t x2, pcb_coord_t y2, pcb_coord_t thickness, pcb_coord_t clearance, pcb_coord_t mask, pcb_bool square, pcb_bool nopaste, pcb_bool onotherside); /* Convert an existing padstack to old-style pad and return broken down parameters */ pcb_bool pcb_pstk_export_compat_pad(pcb_pstk_t *ps, pcb_coord_t *x1, pcb_coord_t *y1, pcb_coord_t *x2, pcb_coord_t *y2, pcb_coord_t *thickness, pcb_coord_t *clearance, pcb_coord_t *mask, pcb_bool *square, pcb_bool *nopaste); Index: trunk/src_plugins/lib_compat_help/pstk_help.c =================================================================== --- trunk/src_plugins/lib_compat_help/pstk_help.c (revision 20903) +++ trunk/src_plugins/lib_compat_help/pstk_help.c (revision 20904) @@ -50,7 +50,7 @@ pcb_pstk_proto_update(&proto); pid = pcb_pstk_proto_insert_dup(data, &proto, 1); - return pcb_pstk_new(data, pid, x, y, 0, pcb_flag_make(PCB_FLAG_CLEARLINE)); + return pcb_pstk_new(data, -1, pid, x, y, 0, pcb_flag_make(PCB_FLAG_CLEARLINE)); } pcb_layer_type_t lyts[] = { @@ -98,7 +98,7 @@ proto.hplated = plated; pid = pcb_pstk_proto_insert_or_free(data, &proto, quiet); if (pid != PCB_PADSTACK_INVALID) { - pcb_pstk_t *ps = pcb_pstk_new(data, pid, 0, 0, 0, pcb_flag_make(PCB_FLAG_CLEARLINE | PCB_FLAG_FOUND)); + pcb_pstk_t *ps = pcb_pstk_new(data, -1, pid, 0, 0, 0, pcb_flag_make(PCB_FLAG_CLEARLINE | PCB_FLAG_FOUND)); vtp0_append(objs, ps); if (term != NULL) pcb_attribute_put(&ps->Attributes, "term", term); @@ -311,7 +311,7 @@ if (pid == PCB_PADSTACK_INVALID) return NULL; - return pcb_pstk_new(data, pid, x, y, glob_clearance, pcb_flag_make(PCB_FLAG_CLEARLINE)); + return pcb_pstk_new(data, -1, pid, x, y, glob_clearance, pcb_flag_make(PCB_FLAG_CLEARLINE)); } void pcb_shape_rect(pcb_pstk_shape_t *shape, pcb_coord_t width, pcb_coord_t height)