Index: trunk/src_plugins/rbs_routing/stretch.c =================================================================== --- trunk/src_plugins/rbs_routing/stretch.c (revision 38810) +++ trunk/src_plugins/rbs_routing/stretch.c (revision 38811) @@ -214,7 +214,17 @@ int rbsr_stretch_line_to_coords(rbsr_stretch_t *rbss, rnd_coord_t tx, rnd_coord_t ty) { grbs_addr_t *a1, *a2; - if (rbss->via != NULL) { + int new_via = (rbss->via == NULL); + + if (new_via) + rbss->via = grbs_point_new(&rbss->map.grbs, RBSR_R2G(tx), RBSR_R2G(ty), RBSR_R2G(RND_MM_TO_COORD(2.1)), RBSR_R2G(RND_MM_TO_COORD(0.1))); + + if (rbss->snap == NULL) + rbss->snap = grbs_snapshot_save(&rbss->map.grbs); + else + grbs_snapshot_restore(rbss->snap); + + if (!new_via) { int seg; grbs_point_unreg(&rbss->map.grbs, rbss->via); @@ -235,9 +245,8 @@ grbs_clean_unused_sentinel(&rbss->map.grbs, rbss->via); } - else - rbss->via = grbs_point_new(&rbss->map.grbs, RBSR_R2G(tx), RBSR_R2G(ty), RBSR_R2G(RND_MM_TO_COORD(2.1)), RBSR_R2G(RND_MM_TO_COORD(0.1))); + a1 = grbs_path_next(&rbss->map.grbs, rbss->tn, &rbss->from, rbss->via, GRBS_ADIR_CONVEX_CW); if (a1 == NULL) { rnd_message(RND_MSG_ERROR, "rbsr_stretch_line_to_coord(): failed to route to a1\n"); Index: trunk/src_plugins/rbs_routing/stretch.h =================================================================== --- trunk/src_plugins/rbs_routing/stretch.h (revision 38810) +++ trunk/src_plugins/rbs_routing/stretch.h (revision 38811) @@ -1,3 +1,5 @@ +#include + typedef struct rbsr_stretch_s { rbsr_map_t map; grbs_addr_t from, to; @@ -5,6 +7,8 @@ grbs_point_t *via; + grbs_snapshot_t *snap; + htpp_t removes; /* key: pcb_any_obj_t *; value: NULL; list of pcb-rnd objects to remove when the grbs route is copied back */ } rbsr_stretch_t;