Index: src/libgrbs/route.h =================================================================== --- src/libgrbs/route.h (revision 1307) +++ src/libgrbs/route.h (revision 1308) @@ -2,6 +2,10 @@ grbs_arc_t *grbs_path_realize(grbs_t *grbs, grbs_2net_t *tn, grbs_addr_t *addr, int reverse); int grbs_path_validate(grbs_t *grbs, grbs_2net_t *tn, grbs_addr_t *prev_addr, grbs_addr_t *addr, grbs_addr_t *next_addr); +/* rip-up: remove an address or a whole 2net (and free address(es)) */ +void grbs_path_remove_addr(grbs_t *grbs, grbs_addr_t *addr); +void grbs_path_remove_arc(grbs_t *grbs, grbs_arc_t *arc); +void grbs_path_remove_2net(grbs_t *grbs, grbs_2net_t *tn); /* Free all addresses and reset all temporary arcs */ void grbs_path_cleanup_by_tn(grbs_t *grbs, grbs_2net_t *tn); /* faster */ Index: src/libgrbs/route_remove.c =================================================================== --- src/libgrbs/route_remove.c (revision 1307) +++ src/libgrbs/route_remove.c (revision 1308) @@ -1,3 +1,13 @@ +#define GRBS_ROUTE_REMOVE_TRACE + +#undef tprinf +#ifdef GRBS_ROUTE_REMOVE_TRACE +#include +#define tprintf printf +#else +#define tprintf grbs_nullprintf +#endif + /* Calculate the minimum r for the lowest concave orbit from the highest convex arc */ static double shrink_get_highest_convex(grbs_t *grbs, grbs_arc_t *conc_sentinel, double *highest_copper, double *highest_clearance) @@ -64,7 +74,7 @@ } newr = prevr + prev_copper + next->copper + GRBS_MAX(prev_clearance, next->clearance); /* new arc added on top of the previous */ - tprintf("newr=%f != %f (prev=%f/%f next=%f/%f)\n", newr, narcr, prev_copper, prev_clearance, next->copper, next->clearance); + tprintf("remove: newr=%f != %f (prev=%f/%f next=%f/%f)\n", newr, narcr, prev_copper, prev_clearance, next->copper, next->clearance); if (newr != narcr) { narc_oldr = narcr; narcr = newr; /* may replace an arc with smaller or larger spacing reqs... */ @@ -80,18 +90,24 @@ return narcr; } -void grbs_path_remove(grbs_t *grbs, grbs_addr_t *addr) + +static void grbs_path_remove_incident(grbs_t *grbs, grbs_arc_t *arc) { - grbs_arc_t *arc, *narc, *a, *first; +#warning TODO +} + +void grbs_path_remove_arc(grbs_t *grbs, grbs_arc_t *arc) +{ + grbs_arc_t *narc, *a, *first; + int rev = 1, need_narc_post_update = 0; + double narcr, narc_oldr; grbs_point_t *pt; - int rev = 1, need_narc_post_update = 0, type = (addr->type & 0x0F), is_concave = (type == ADDR_ARC_CONCAVE); - double narcr, narc_oldr; + int is_concave = arc->concave; - switch(type) { - case ADDR_ARC_CONVEX: - case ADDR_ARC_CONCAVE: - arc = addr->obj.arc; - assert(arc->new_in_use); + if (arc->r == 0) { + grbs_path_remove_incident(grbs, arc); + return; + } pt = arc->parent_pt; first = gdl_first(&pt->arcs[is_concave][arc->segi]); @@ -116,12 +132,37 @@ } #endif +} + + +void grbs_path_remove_addr(grbs_t *grbs, grbs_addr_t *addr) +{ + int type = (addr->type & 0x0F); + grbs_point_t *pt; + + switch(type) { + case ADDR_ARC_CONVEX: + case ADDR_ARC_CONCAVE: + grbs_path_remove_arc(grbs, addr->obj.arc); break; case ADDR_POINT: pt = addr->obj.pt; +#warning TODO: probably nothing to do break; default: abort(); } } + + + +void grbs_path_remove_2net(grbs_t *grbs, grbs_2net_t *tn) +{ + grbs_arc_t *n, *next; + for(n = gdl_first(&tn->arcs); n != NULL; n = next) { + next = gdl_next(&tn->arcs, n); + grbs_path_remove_arc(grbs, n); + } +} + Index: src/libgrbs/tester.c =================================================================== --- src/libgrbs/tester.c (revision 1307) +++ src/libgrbs/tester.c (revision 1308) @@ -450,6 +450,19 @@ return res; } +static int cmd_2net_del(char *args) +{ + char *name = args; + grbs_2net_t *tn; + + shift_name(args, 0); + obj_by_name(tn, name, "No such two-net"); + + grbs_path_remove_2net(&ctx, tn); + forget(name); + return 0; +} + static int cmd_2net_append(char *args) { char *name = args; @@ -565,6 +578,7 @@ if (strcmp(cmd, "draw") == 0) return cmd_draw(args); if (strcmp(cmd, "dump") == 0) return cmd_dump(args); if (strcmp(cmd, "2net_new") == 0) return cmd_2net_new(args); + if (strcmp(cmd, "2net_del") == 0) return cmd_2net_del(args); if (strcmp(cmd, "2net_append") == 0) return cmd_2net_append(args); if (strcmp(cmd, "2net_cleanup") == 0) return cmd_2net_cleanup(args); if (strcmp(cmd, "geo_bicycle") == 0) return cmd_geo_bicycle(args);