Index: plugins/rt_topo/crbs.c =================================================================== --- plugins/rt_topo/crbs.c (revision 1379) +++ plugins/rt_topo/crbs.c (revision 1380) @@ -120,6 +120,33 @@ return cpt; } +/* Return an existing point with the same net near x;y (max distance + is dist) or create a new point and return that if there was no match near */ +point_t *crbs_make_point_near(crbs_t *crbs, double x, double y, double cop, double clr, rtrnd_via_t *via, rtrnd_net_t *net, double dist) +{ + grbs_rtree_box_t bbox; + grbs_point_t *pt; + grbs_rtree_it_t it; + double dp2 = dist/2, dist2 = dist*dist, dx, dy; + + bbox.x1 = x - dp2; + bbox.y1 = y - dp2; + bbox.x2 = x + dp2; + bbox.y2 = y + dp2; + + for(pt = grbs_rtree_first(&it, &crbs->grbs.point_tree, &bbox); pt != NULL; pt = grbs_rtree_next(&it)) { + crbs_point_t *cpt = pt->user_data; + if (cpt->net != net) continue; + dx = pt->x - x; + dy = pt->y - y; + if ((dx*dx+dy*dy) > dist2) continue; + return cpt->cpt; + } + + /* nothing found near */ + return crbs_make_point(crbs, x, y, cop, clr, via, net); +} + static void crbs_init(crbs_t *crbs, rtrnd_t *ctx) { Index: plugins/rt_topo/crbs_cdt.c =================================================================== --- plugins/rt_topo/crbs_cdt.c (revision 1379) +++ plugins/rt_topo/crbs_cdt.c (revision 1380) @@ -92,8 +92,14 @@ ADD_C_EDGE(p1, p2); } -void rt_topo_crbs_cdt_init(rtrnd_t *ctx, rtrnd_layer_t *ly, crbs_t *crbs) +void rt_topo_crbs_cdt_init(rtrnd_t *ctx, crbs_t *crbs) { + cdt_t *cdt = &crbs->cdt; + cdt_init(cdt, ctx->board->hdr.bbox.x1, ctx->board->hdr.bbox.y1, ctx->board->hdr.bbox.x2, ctx->board->hdr.bbox.y2); +} + +void rt_topo_crbs_cdt_create_points(rtrnd_t *ctx, rtrnd_layer_t *ly, crbs_t *crbs) +{ rtrnd_any_obj_t *obj; rtrnd_via_t *via; rtrnd_rtree_it_t it; @@ -107,8 +113,6 @@ maxl2 = maxlen*maxlen; - cdt_init(cdt, ctx->board->hdr.bbox.x1, ctx->board->hdr.bbox.y1, ctx->board->hdr.bbox.x2, ctx->board->hdr.bbox.y2); - for(via = rtrnd_rtree_all_first(&it, &ctx->board->vias); via != NULL; via = rtrnd_rtree_all_next(&it)) crbs_make_point(crbs, via->x, via->y, via->dia/2, via->clearance, via, via->hdr.net); @@ -181,6 +185,13 @@ vtd0_uninit(&np); } +} + +void rt_topo_crbs_cdt_create_edges(rtrnd_t *ctx, rtrnd_layer_t *ly, crbs_t *crbs) +{ + cdt_t *cdt = &crbs->cdt; + long n; + for(n = 0; n < cdt->edges.used; n++) { edge_t *e = cdt->edges.array[n]; #warning TODO: use libualloc here Index: plugins/rt_topo/crbs_route.c =================================================================== --- plugins/rt_topo/crbs_route.c (revision 1379) +++ plugins/rt_topo/crbs_route.c (revision 1380) @@ -647,8 +647,10 @@ crbs.disable_concave = 1; crbs.enable_mid_virt = 0; crbs_init(&crbs, ctx); - rt_topo_crbs_cdt_init(ctx, ly, &crbs); + rt_topo_crbs_cdt_init(ctx, &crbs); + rt_topo_crbs_cdt_create_points(ctx, ly, &crbs); + rtrnd_layer_init(&ly_cdt, "laa"); strcpy(ly_cdt.color, "#888888"); rtrnd_layer_init(&ly_bnk, "laa"); @@ -659,8 +661,10 @@ for(t = gdl_first(tnl); t != NULL; t = t->link.next) { #warning TODO: use libualloc crbs_2net_t *ct = calloc(sizeof(crbs_2net_t), 1); - ct->cstart = cdt_insert_point(&crbs.cdt, t->x[0], t->y[0]); - ct->cend = cdt_insert_point(&crbs.cdt, t->x[1], t->y[1]); + rtrnd_net_t *net = ct->net; + + ct->cstart = crbs_make_point_near(&crbs, t->x[0], t->y[0], 0.001, 0.001, NULL, net, 0.5); + ct->cend = crbs_make_point_near(&crbs, t->x[1], t->y[1], 0.001, 0.001, NULL, net, 0.5); ct->tn = t; ct->net = t->net; gdl_append(&crbs.twonets, ct, link); @@ -667,6 +671,8 @@ crbs.max_ripup++; } + rt_topo_crbs_cdt_create_edges(ctx, ly, &crbs); + rt_topo_crbs_cdt_draw(ctx, &ly_cdt, &crbs.cdt); res = rt_topo_crbs_layer_(ctx, &crbs, ly, 0, &ly_cdt, &ly_bnk);