Index: trunk/src/plugins/rt_topo/crbs.c =================================================================== --- trunk/src/plugins/rt_topo/crbs.c (revision 1363) +++ trunk/src/plugins/rt_topo/crbs.c (revision 1364) @@ -123,14 +123,23 @@ #include GRBS_ADDR_HASH(htad_hash); -void crbs_make_point(crbs_t *crbs, double x, double y, double cop, double clr, rtrnd_via_t *via) +point_t *crbs_make_point(crbs_t *crbs, double x, double y, double cop, double clr, rtrnd_via_t *via) { grbs_point_t *gpt; point_t *cpt; crbs_point_t *p; + cpt = cdt_insert_point(&crbs->cdt, x, y); + if (cpt->data != NULL) { /* already initialized */ + p = cpt->data; + if (cop > p->gpt->copper) + p->gpt->copper = cop; + if (clr > p->gpt->clearance) + p->gpt->clearance = clr; + return cpt; + } + p = crbs_point_new(crbs); - cpt = cdt_insert_point(&crbs->cdt, x, y); cpt->data = p; gpt = grbs_point_new(&crbs->grbs, x, y, cop, clr); gpt->user_data = p; @@ -140,6 +149,8 @@ p->cpt = cpt; p->gpt = gpt; p->obj = via; + + return cpt; } static void crbs_init(crbs_t *crbs, rtrnd_t *ctx) Index: trunk/src/plugins/rt_topo/crbs.h =================================================================== --- trunk/src/plugins/rt_topo/crbs.h (revision 1363) +++ trunk/src/plugins/rt_topo/crbs.h (revision 1364) @@ -67,7 +67,7 @@ extern grbs_2net_t tn_unknown; /* create a new point (e.g. for a via) in the triangulation and in grbs */ -void crbs_make_point(crbs_t *crbs, double x, double y, double cop, double clr, rtrnd_via_t *via); +point_t *crbs_make_point(crbs_t *crbs, double x, double y, double cop, double clr, rtrnd_via_t *via); #define DIST_HEUR_MULT 1000.0 Index: trunk/src/plugins/rt_topo/crbs_cdt.c =================================================================== --- trunk/src/plugins/rt_topo/crbs_cdt.c (revision 1363) +++ trunk/src/plugins/rt_topo/crbs_cdt.c (revision 1364) @@ -84,6 +84,7 @@ edge_t *e; long n; double maxl2, maxlen = (rt_topo_cfg.wire_thick + rt_topo_cfg.wire_clr/2) * 50; /* split long constrained edges so that no segment is longer than this value */ + double cop, clr; maxl2 = maxlen*maxlen; @@ -95,15 +96,20 @@ for(obj = rtrnd_rtree_all_first(&it, &ly->objs); obj != NULL; obj = rtrnd_rtree_all_next(&it)) { switch(obj->hdr.type) { case RTRND_LINE: - p1 = cdt_insert_point(&crbs->cdt, obj->line.cline.p1.x, obj->line.cline.p1.y); - p2 = cdt_insert_point(&crbs->cdt, obj->line.cline.p2.x, obj->line.cline.p2.y); - long_constrained_edge(&crbs->cdt, p1, p2, maxl2, maxlen, obj); + cop = obj->line.thickness/2; + clr = obj->line.clearance; + p1 = crbs_make_point(crbs, obj->line.cline.p1.x, obj->line.cline.p1.y, cop, clr, NULL); + if ((obj->line.cline.p1.x != obj->line.cline.p2.x) || (obj->line.cline.p1.y != obj->line.cline.p2.y)) { + p2 = crbs_make_point(crbs, obj->line.cline.p2.x, obj->line.cline.p2.y, cop, clr, NULL); + long_constrained_edge(&crbs->cdt, p1, p2, maxl2, maxlen, obj); + } break; case RTRND_POLY: + clr = 0/*obj->poly.clearance*/; v = gdl_last(&obj->poly.rtpoly.lst); - p2 = cdt_insert_point(&crbs->cdt, v->x, v->y); + p2 = crbs_make_point(crbs, v->x, v->y, 0, clr, NULL); for(v = gdl_first(&obj->poly.rtpoly.lst); v != NULL; v = gdl_next(&obj->poly.rtpoly.lst, v)) { - p1 = cdt_insert_point(&crbs->cdt, v->x, v->y); + p1 = crbs_make_point(crbs, v->x, v->y, 0, clr, NULL); long_constrained_edge(&crbs->cdt, p1, p2, maxl2, maxlen, obj); p2 = p1; }