Index: trunk/src/obj_pstk.h =================================================================== --- trunk/src/obj_pstk.h (revision 22095) +++ trunk/src/obj_pstk.h (revision 22096) @@ -173,10 +173,11 @@ void pcb_pstk_shape_update_pa(pcb_pstk_poly_t *poly); /* Insert proto into the cache of data; if it's already in, return the existing - ID, else dup it and insert it. WARNING: make sure - pcb_pstk_proto_update() was called on proto some point in time before this - call, esle the hash is invalid */ + ID, else dup it and insert it. The forcedup variant always dups. + WARNING: make sure pcb_pstk_proto_update() was called on proto some point + in time before this call, esle the hash is invalid. */ pcb_cardinal_t pcb_pstk_proto_insert_dup(pcb_data_t *data, const pcb_pstk_proto_t *proto, int quiet); +pcb_cardinal_t pcb_pstk_proto_insert_forcedup(pcb_data_t *data, const pcb_pstk_proto_t *proto, int quiet); /* Change the non-NULL hole properties of a padstack proto; undoable. Returns 0 on success. */ Index: trunk/src/obj_pstk_proto.c =================================================================== --- trunk/src/obj_pstk_proto.c (revision 22095) +++ trunk/src/obj_pstk_proto.c (revision 22096) @@ -691,12 +691,12 @@ return n; } -pcb_cardinal_t pcb_pstk_proto_insert_dup(pcb_data_t *data, const pcb_pstk_proto_t *proto, int quiet) +static pcb_cardinal_t pcb_pstk_proto_insert_dup_(pcb_data_t *data, const pcb_pstk_proto_t *proto, int quiet, int forcedup) { - pcb_cardinal_t n, first_free; + pcb_cardinal_t n, first_free = PCB_PADSTACK_INVALID; n = pcb_pstk_proto_insert_try(data, proto, &first_free); - if (n != PCB_PADSTACK_INVALID) + if ((n != PCB_PADSTACK_INVALID) && (!forcedup)) return n; /* already in cache */ /* no match, have to register a new one, which is a dup of the original */ @@ -717,6 +717,17 @@ return n; } +pcb_cardinal_t pcb_pstk_proto_insert_dup(pcb_data_t *data, const pcb_pstk_proto_t *proto, int quiet) +{ + return pcb_pstk_proto_insert_dup_(data, proto, quiet, 0); +} + +pcb_cardinal_t pcb_pstk_proto_insert_forcedup(pcb_data_t *data, const pcb_pstk_proto_t *proto, int quiet) +{ + return pcb_pstk_proto_insert_dup_(data, proto, quiet, 1); +} + + pcb_cardinal_t pcb_pstk_proto_replace(pcb_data_t *data, pcb_cardinal_t proto_id, const pcb_pstk_proto_t *src) { pcb_pstk_proto_t *dst;