Index: trunk/src_plugins/rbs_routing/seq.c =================================================================== --- trunk/src_plugins/rbs_routing/seq.c (revision 38867) +++ trunk/src_plugins/rbs_routing/seq.c (revision 38868) @@ -271,13 +271,36 @@ return res; } +void rbsr_seq_step_back(rbsr_seq_t *rbsq) +{ + grbs_point_t *start; + if (rbsq->used <= 1) + return; + + /* fallback for undoing the first seg., when rbsr_seq_redraw() won't fill + it in: revert to start from the starting obj */ + start = rbsq->path[0].pt; + rbsq->rlast_x = RBSR_G2R(start->x); + rbsq->rlast_y = RBSR_G2R(start->y); + + /* remove the last segment from path and reset "consider" */ + rbsq->used--; + rbsq->consider.dir = RBS_ADIR_invalid; + rbsr_seq_redraw(rbsq); + + /* update routing-from coords for the tool code */ + rbsq->last_x = rbsq->rlast_x; + rbsq->last_y = rbsq->rlast_y; +} + void rbsr_seq_end(rbsr_seq_t *rbsq) { pcb_layer_t *ly = pcb_get_layer(rbsq->map.pcb->Data, rbsq->map.lid); /* tune existing objects and install new objects */ - rbsr_install_2net(ly, rbsq->tn); + if (rbsq->used > 0) + rbsr_install_2net(ly, rbsq->tn); rbsr_map_uninit(&rbsq->map); } Index: trunk/src_plugins/rbs_routing/seq.h =================================================================== --- trunk/src_plugins/rbs_routing/seq.h (revision 38867) +++ trunk/src_plugins/rbs_routing/seq.h (revision 38868) @@ -39,4 +39,5 @@ int rbsr_seq_consider(rbsr_seq_t *rbss, rnd_coord_t tx, rnd_coord_t ty, int *need_redraw_out); rbsr_seq_accept_t rbsr_seq_accept(rbsr_seq_t *rbss); +void rbsr_seq_step_back(rbsr_seq_t *rbsq); Index: trunk/src_plugins/rbs_routing/tool_seq.c =================================================================== --- trunk/src_plugins/rbs_routing/tool_seq.c (revision 38867) +++ trunk/src_plugins/rbs_routing/tool_seq.c (revision 38868) @@ -115,9 +115,30 @@ void pcb_tool_seq_escape(rnd_design_t *hl) { - rnd_tool_select_by_name(hl, "arrow"); + if (pcb_crosshair.AttachedLine.State == PCB_CH_STATE_SECOND) { + seq.used = 0; /* do not create any object */ + rbsr_seq_end(&seq); + pcb_crosshair.AttachedLine.State = PCB_CH_STATE_FIRST; + } + else + rnd_tool_select_by_name(hl, "arrow"); } +rnd_bool pcb_tool_seq_undo_act(rnd_design_t *hl) +{ + if (pcb_crosshair.AttachedLine.State != PCB_CH_STATE_SECOND) + return rnd_true; + + if (seq.used <= 1) + pcb_tool_seq_escape(hl); /* undo starting click: return to STATE_FIRST */ + else + rbsr_seq_step_back(&seq); + + rnd_gui->invalidate_all(rnd_gui); + return rnd_false; +} + + /* XPM */ static const char *seq_icon[] = { /* columns rows colors chars-per-pixel */ @@ -160,8 +181,8 @@ NULL, pcb_tool_seq_adjust_attached_objects, pcb_tool_seq_draw_attached, - NULL, /* pcb_tool_seq_undo_act, */ - NULL, /* pcb_tool_seq_redo_act, */ + pcb_tool_seq_undo_act, + NULL, /*pcb_tool_seq_redo_act,*/ pcb_tool_seq_escape, PCB_TLF_RAT