more flexibility in constrained move operations (draw wires, lines, copy/move), pressing h/v again toggles constrained / unsonstrained move

This commit is contained in:
Stefan Frederik 2021-01-05 01:24:45 +01:00
parent 8eb2147b18
commit ef1f297290
5 changed files with 95 additions and 100 deletions

View File

@ -25,24 +25,24 @@
void redraw_w_a_l_r_p_rubbers(void)
{
if(xctx->ui_state & STARTWIRE) {
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_wire(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
}
if(xctx->ui_state & STARTARC) {
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_arc(RUBBER, 0);
}
if(xctx->ui_state & STARTLINE) {
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_line(RUBBER);
}
if(xctx->ui_state & STARTRECT) new_rect(RUBBER);
if(xctx->ui_state & STARTPOLYGON) {
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_polygon(RUBBER);
}
}
@ -51,16 +51,16 @@ void start_line(double mx, double my)
{
xctx->last_command = STARTLINE;
if(xctx->ui_state & STARTLINE) {
if(!vertical_move) {
if(constrained_move != 2) {
xctx->mx_save = mx;
xctx->mx_double_save=xctx->mousex_snap;
}
if(!horizontal_move) {
if(constrained_move != 1) {
xctx->my_save = my;
xctx->my_double_save=xctx->mousey_snap;
}
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
} else {
xctx->mx_save = mx; xctx->my_save = my;
xctx->mx_double_save=xctx->mousex_snap;
@ -73,16 +73,16 @@ void start_wire(double mx, double my)
{
xctx->last_command = STARTWIRE;
if(xctx->ui_state & STARTWIRE) {
if(!vertical_move) {
if(constrained_move != 2) {
xctx->mx_save = mx;
xctx->mx_double_save=xctx->mousex_snap;
}
if(!horizontal_move) {
if(constrained_move != 1) {
xctx->my_save = my;
xctx->my_double_save=xctx->mousey_snap;
}
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
} else {
xctx->mx_save = mx; xctx->my_save = my;
xctx->mx_double_save=xctx->mousex_snap;
@ -247,13 +247,13 @@ int callback(int event, int mx, int my, KeySym key,
}
if(xctx->ui_state & STARTMOVE) {
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
move_objects(RUBBER,0,0,0);
}
if(xctx->ui_state & STARTCOPY) {
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
copy_objects(RUBBER);
}
@ -400,44 +400,46 @@ int callback(int event, int mx, int my, KeySym key,
}
if(key == 'h' && state == 0) {
/* horizontally constrained drag 20171023 */
if ( horizontal_move ) {
tcleval("set horizontal_move 0" );
if ( constrained_move == 1 ) {
tcleval("set constrained_move 0" );
constrained_move = 0;
} else {
tcleval("set horizontal_move 1" );
tcleval("xschem set horizontal_move");
tcleval("set constrained_move 1" );
constrained_move = 1;
}
if(xctx->ui_state & STARTWIRE) {
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_wire(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
}
if(xctx->ui_state & STARTLINE) {
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_line(RUBBER);
}
break;
}
if(key=='H' && state==ShiftMask) { /* attach labels to selected instances */
attach_labels_to_inst();
break;
attach_labels_to_inst();
break;
}
if(key == 'v' && state==0) {
/* vertically constrained drag 20171023 */
if ( vertical_move ) {
tcleval("set vertical_move 0" );
if ( constrained_move == 2 ) {
tcleval("set constrained_move 0" );
constrained_move = 0;
} else {
tcleval("set vertical_move 1" );
tcleval("xschem set vertical_move");
tcleval("set constrained_move 2" );
constrained_move = 2;
}
if(xctx->ui_state & STARTWIRE) {
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_wire(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
}
if(xctx->ui_state & STARTLINE) {
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_line(RUBBER);
}
break;
@ -534,15 +536,20 @@ int callback(int event, int mx, int my, KeySym key,
find_closest_net_or_symbol_pin(xctx->mousex, xctx->mousey, &x, &y);
new_wire(RUBBER, x, y);
new_wire(PLACE|END, x, y);
horizontal_move = vertical_move=0;
tcleval("set vertical_move 0; set horizontal_move 0" );
constrained_move=0;
tcleval("set constrained_move 0" );
}
break;
}
if(key == 'w'&& state==0) /* place wire. */
if(key == 'w' && state==0) /* place wire. */
{
int prev_state = xctx->ui_state;
if(xctx->semaphore >= 2) break;
start_wire(mx, my);
if(prev_state == STARTWIRE) {
tcleval("set constrained_move 0" );
constrained_move=0;
}
break;
}
if(key == XK_Return && (state == 0 ) && xctx->ui_state & STARTPOLYGON) { /* close polygon */
@ -553,10 +560,10 @@ int callback(int event, int mx, int my, KeySym key,
{
no_draw = 0;
if(xctx->semaphore >= 2) break;
tcleval("set vertical_move 0; set horizontal_move 0" );
tcleval("set constrained_move 0" );
constrained_move=0;
xctx->last_command=0;
manhattan_lines = 0;
horizontal_move = vertical_move = 0;
dbg(1, "callback(): Escape: ui_state=%ld\n", xctx->ui_state);
if(xctx->ui_state & STARTMOVE)
{
@ -1076,25 +1083,29 @@ int callback(int event, int mx, int my, KeySym key,
break;
}
if(key=='l' && state == ControlMask) { /* create schematic from selected symbol 20171004 */
if(xctx->semaphore >= 2) break;
create_sch_from_sym();
break;
}
if(key=='l' && state == 0) /* start line */
{
start_line(mx, my);
break;
int prev_state = xctx->ui_state;
start_line(mx, my);
if(prev_state == STARTLINE) {
tcleval("set constrained_move 0" );
constrained_move=0;
}
break;
}
if(key=='l' && state == Mod1Mask) { /* add pin label*/
place_net_label(1);
break;
place_net_label(1);
break;
}
if(key >= '0' && key <= '3' && state == 0) { /* Toggle pin logic level */
if(xctx->semaphore >= 2) break;
if(key == '3') logic_set(-1, 1);
else logic_set(key - '0', 1);
break;
if(xctx->semaphore >= 2) break;
if(key == '3') logic_set(-1, 1);
else logic_set(key - '0', 1);
break;
}
if(key=='L' && state == (Mod1Mask | ShiftMask)) { /* add pin label*/
place_net_label(0);
@ -1480,10 +1491,6 @@ int callback(int event, int mx, int my, KeySym key,
if(xctx->last_command == STARTWIRE) start_wire(mx, my);
break;
}
if(!(xctx->ui_state & STARTPOLYGON) && !(xctx->ui_state & STARTWIRE) && !(xctx->ui_state & STARTLINE) ) {
horizontal_move = vertical_move=0;
tcleval("set vertical_move 0; set horizontal_move 0" );
}
if(xctx->ui_state & MENUSTARTTEXT) {
place_text(1, xctx->mousex_snap, xctx->mousey_snap);
xctx->ui_state &=~MENUSTARTTEXT;
@ -1567,21 +1574,23 @@ int callback(int event, int mx, int my, KeySym key,
}
if(xctx->ui_state & STARTWIRE) {
if(persistent_command) {
if(!vertical_move) {
if(constrained_move != 2) {
xctx->mx_save = mx;
xctx->mx_double_save=xctx->mousex_snap;
}
if(!horizontal_move) {
if(constrained_move != 1) {
xctx->my_save = my;
xctx->my_double_save=xctx->mousey_snap;
}
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_wire(PLACE, xctx->mousex_snap, xctx->mousey_snap);
} else {
new_wire(PLACE|END, xctx->mousex_snap, xctx->mousey_snap);
}
constrained_move=0;
tcleval("set constrained_move 0" );
break;
}
if(xctx->ui_state & STARTARC) {
@ -1590,20 +1599,22 @@ int callback(int event, int mx, int my, KeySym key,
}
if(xctx->ui_state & STARTLINE) {
if(persistent_command) {
if(!vertical_move) {
if(constrained_move != 2) {
xctx->mx_save = mx;
xctx->mx_double_save=xctx->mousex_snap;
}
if(!horizontal_move) {
if(constrained_move == 1) {
xctx->my_save = my;
xctx->my_double_save=xctx->mousey_snap;
}
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_line(PLACE);
} else {
new_line(PLACE|END);
}
constrained_move=0;
tcleval("set constrained_move 0" );
break;
}
if(xctx->ui_state & STARTRECT) {
@ -1611,22 +1622,26 @@ int callback(int event, int mx, int my, KeySym key,
break;
}
if(xctx->ui_state & STARTPOLYGON) {
if(horizontal_move) xctx->mousey_snap = xctx->my_double_save;
if(vertical_move) xctx->mousex_snap = xctx->mx_double_save;
if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
new_polygon(ADD);
xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap;
horizontal_move = vertical_move=0;
tcleval("set vertical_move 0; set horizontal_move 0" );
constrained_move=0;
tcleval("set constrained_move 0" );
break;
}
if(xctx->ui_state & STARTMOVE) {
move_objects(END,0,0,0);
xctx->ui_state &=~START_SYMPIN;
constrained_move=0;
tcleval("set constrained_move 0" );
break;
}
if(xctx->ui_state & STARTCOPY) {
copy_objects(END);
constrained_move=0;
tcleval("set constrained_move 0" );
break;
}
if( !(xctx->ui_state & STARTSELECT) && !(xctx->ui_state & STARTWIRE) && !(xctx->ui_state & STARTLINE) ) {

View File

@ -211,9 +211,8 @@ int do_waves=0;
int netlist_count=0; /* netlist counter incremented at any cell being netlisted */
char hiersep[20]=".";
char bus_char[3] = {0, 0, 0};
int horizontal_move=0;
int vertical_move=0;
int pending_fullzoom=0;
int constrained_move = 0;
double color_dim=0.0;
int no_undo=0;
int enable_drill=0; /* pass net hilights through components with 'propag=' property set on pins */

View File

@ -2277,6 +2277,9 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
change_layer();
}
}
else if(!strcmp(argv[2],"constrained_move")) {
constrained_move = atoi(argv[3]);
}
else if(!strcmp(argv[2],"change_lw")) {
change_lw=atoi(argv[3]);
}
@ -2292,28 +2295,6 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
}
}
else if(!strcmp(argv[1],"set") && argc==3)
{
cmd_found = 1;
if(!strcmp(argv[2],"horizontal_move")) {
horizontal_move = atoi(tclgetvar("horizontal_move"));
if(horizontal_move) {
vertical_move=0;
tcleval("set vertical_move 0" );
}
}
else if(!strcmp(argv[2],"vertical_move")) {
vertical_move = atoi(tclgetvar("vertical_move"));
if(vertical_move) {
horizontal_move=0;
tcleval("set horizontal_move 0" );
}
}
else {
fprintf(errfp, "xschem set %s : invalid command.\n", argv[2]);
}
}
else if(!strcmp(argv[1],"set_different_tok") )
{
char *s = NULL;

View File

@ -763,9 +763,8 @@ extern int depth;
extern int *fill_type; /* 20171117 for every layer: 0: no fill, 1, solid fill, 2: stipple fill */
extern Tcl_Interp *interp;
extern double cadsnap;
extern int horizontal_move;
extern int vertical_move;
extern double *character[256];
extern int constrained_move;
extern int netlist_show;
extern int flat_netlist;
extern int netlist_type;

View File

@ -3470,8 +3470,7 @@ set_ne line_width 0
set_ne draw_window 0
set_ne incr_hilight 1
set_ne enable_stretch 0
set_ne horizontal_move 0 ; # 20171023
set_ne vertical_move 0 ; # 20171023
set_ne constrained_move 0
set_ne draw_grid 1
set_ne big_grid_points 0
set_ne snap 10
@ -3864,10 +3863,12 @@ if { ( $::OS== "Windows" || [string length [lindex [array get env DISPLAY] 1] ]
toolbar_create EditMove "xschem move_objects" "Move objects"
.menubar.edit.menu add command -label "Flip selected objects" -command "xschem flip" -accelerator {Alt-F}
.menubar.edit.menu add command -label "Rotate selected objects" -command "xschem rotate" -accelerator {Alt-R}
.menubar.edit.menu add checkbutton -label "Constrained Horizontal move" -variable horizontal_move \
-command "xschem set horizontal_move" -accelerator H
.menubar.edit.menu add checkbutton -label "Constrained Vertical move" -variable vertical_move \
-command "xschem set vertical_move" -accelerator V
.menubar.edit.menu add radiobutton -label "Unconstrained move" -variable constrained_move \
-value 0 -command {xschem set constrained_move 0}
.menubar.edit.menu add radiobutton -label "Constrained Horizontal move" -variable constrained_move \
-value 1 -accelerator H -command {xschem set constrained_move 1}
.menubar.edit.menu add radiobutton -label "Constrained Vertical move" -variable constrained_move \
-value 2 -accelerator V -command {xschem set constrained_move 2}
.menubar.edit.menu add command -label "Push schematic" -command "xschem descend" -accelerator E
toolbar_create EditPushSch "xschem move_objects" "Push schematic"
.menubar.edit.menu add command -label "Push symbol" -command "xschem descend_symbol" -accelerator I