add new command `Shift-M`, move selected instances adding wires when separating overlapping instance pins (Connect by kissing)
This commit is contained in:
parent
43befd4e3e
commit
3b3e723f8f
|
|
@ -167,6 +167,7 @@ alt 'l' add lab_pin.sym to schematic
|
||||||
ctrl+shift 'o' Load most recent schematic
|
ctrl+shift 'o' Load most recent schematic
|
||||||
ctrl 'o' Load schematic
|
ctrl 'o' Load schematic
|
||||||
- 'm' Move selected obj.
|
- 'm' Move selected obj.
|
||||||
|
shift 'M' Move selected obj, insert wire when separating touching instance pins.
|
||||||
shift 'N' Top level only netlist
|
shift 'N' Top level only netlist
|
||||||
- 'n' Hierarchical Netlist
|
- 'n' Hierarchical Netlist
|
||||||
ctrl 'n' Clear schematic
|
ctrl 'n' Clear schematic
|
||||||
|
|
|
||||||
|
|
@ -2183,7 +2183,14 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key,
|
||||||
move_objects(START,0,0,0);
|
move_objects(START,0,0,0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if(key=='M' && state==ShiftMask && !(xctx->ui_state & (STARTMOVE | STARTCOPY))) /* move selection */
|
||||||
|
{
|
||||||
|
xctx->mx_double_save=xctx->mousex_snap;
|
||||||
|
xctx->my_double_save=xctx->mousey_snap;
|
||||||
|
tclsetintvar("connect_by_kissing", 2); /* 2 will be used to reset var to 0 at end of move */
|
||||||
|
move_objects(START,0,0,0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
if(key=='c' && state==0 && /* duplicate selection */
|
if(key=='c' && state==0 && /* duplicate selection */
|
||||||
!(xctx->ui_state & (STARTMOVE | STARTCOPY)))
|
!(xctx->ui_state & (STARTMOVE | STARTCOPY)))
|
||||||
{
|
{
|
||||||
|
|
|
||||||
10
src/check.c
10
src/check.c
|
|
@ -394,7 +394,7 @@ static int touches_inst_pin(double x, double y, int inst)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dbg(0, "touches_inst_pin(): %g %g : touches =%d on inst %d\n", x, y, touches, inst);
|
dbg(1, "touches_inst_pin(): %g %g : touches =%d on inst %d\n", x, y, touches, inst);
|
||||||
return touches;
|
return touches;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -440,7 +440,7 @@ void break_wires_at_pins(int remove)
|
||||||
xctx->wire[xctx->wires].end2 = 0;
|
xctx->wire[xctx->wires].end2 = 0;
|
||||||
xctx->wire[xctx->wires].x2=x0;
|
xctx->wire[xctx->wires].x2=x0;
|
||||||
xctx->wire[xctx->wires].y2=y0;
|
xctx->wire[xctx->wires].y2=y0;
|
||||||
xctx->wire[xctx->wires].sel=0;
|
xctx->wire[xctx->wires].sel=SELECTED;
|
||||||
xctx->wire[xctx->wires].prop_ptr=NULL;
|
xctx->wire[xctx->wires].prop_ptr=NULL;
|
||||||
my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].prop_ptr, xctx->wire[i].prop_ptr);
|
my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].prop_ptr, xctx->wire[i].prop_ptr);
|
||||||
if(!strcmp(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus",0), "true"))
|
if(!strcmp(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus",0), "true"))
|
||||||
|
|
@ -456,7 +456,7 @@ void break_wires_at_pins(int remove)
|
||||||
xctx->need_reb_sel_arr=1;
|
xctx->need_reb_sel_arr=1;
|
||||||
xctx->wires++;
|
xctx->wires++;
|
||||||
} else {
|
} else {
|
||||||
dbg(0, "break_wires_at_pins(): skipping wire creation on wire %d, end1=%d\n",
|
dbg(1, "break_wires_at_pins(): skipping wire creation on wire %d, end1=%d\n",
|
||||||
i, xctx->wire[xctx->wires].end1);
|
i, xctx->wire[xctx->wires].end1);
|
||||||
deleted_wire = 1;
|
deleted_wire = 1;
|
||||||
}
|
}
|
||||||
|
|
@ -471,7 +471,7 @@ void break_wires_at_pins(int remove)
|
||||||
/* mark for deletion only if no other nets attached */
|
/* mark for deletion only if no other nets attached */
|
||||||
xctx->wire[i].sel = SELECTED4; /* use a special flag to later delete these wires
|
xctx->wire[i].sel = SELECTED4; /* use a special flag to later delete these wires
|
||||||
* only and not other seleted wires */
|
* only and not other seleted wires */
|
||||||
dbg(0, "break_wires_at_pins(): mark wire %d for deletion: end2=%d\n", i, xctx->wire[i].end2);
|
dbg(1, "break_wires_at_pins(): mark wire %d for deletion: end2=%d\n", i, xctx->wire[i].end2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -521,7 +521,7 @@ void break_wires_at_pins(int remove)
|
||||||
xctx->wire[xctx->wires].y1=xctx->wire[i].y1;
|
xctx->wire[xctx->wires].y1=xctx->wire[i].y1;
|
||||||
xctx->wire[xctx->wires].x2=x0;
|
xctx->wire[xctx->wires].x2=x0;
|
||||||
xctx->wire[xctx->wires].y2=y0;
|
xctx->wire[xctx->wires].y2=y0;
|
||||||
xctx->wire[xctx->wires].sel=0;
|
xctx->wire[xctx->wires].sel=SELECTED;
|
||||||
xctx->wire[xctx->wires].prop_ptr=NULL;
|
xctx->wire[xctx->wires].prop_ptr=NULL;
|
||||||
my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].prop_ptr, xctx->wire[i].prop_ptr);
|
my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].prop_ptr, xctx->wire[i].prop_ptr);
|
||||||
if(!strcmp(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus",0), "true"))
|
if(!strcmp(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus",0), "true"))
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,7 @@ alt 'l' add lab_pin.sym to schematic
|
||||||
ctrl+shift 'o' Load most recent schematic
|
ctrl+shift 'o' Load most recent schematic
|
||||||
ctrl 'o' Load schematic
|
ctrl 'o' Load schematic
|
||||||
- 'm' Move selected obj.
|
- 'm' Move selected obj.
|
||||||
|
shift 'M' Move selected obj, insert wire when separating touching instance pins.
|
||||||
shift 'N' Top level only netlist
|
shift 'N' Top level only netlist
|
||||||
- 'n' Hierarchical Netlist
|
- 'n' Hierarchical Netlist
|
||||||
ctrl 'n' Clear schematic
|
ctrl 'n' Clear schematic
|
||||||
|
|
|
||||||
11
src/move.c
11
src/move.c
|
|
@ -1073,7 +1073,8 @@ void move_objects(int what, int merge, double dx, double dy)
|
||||||
xctx->rotatelocal=0;
|
xctx->rotatelocal=0;
|
||||||
xctx->deltax = xctx->deltay = 0.0;
|
xctx->deltax = xctx->deltay = 0.0;
|
||||||
rebuild_selected_array();
|
rebuild_selected_array();
|
||||||
if(tclgetboolvar("connect_by_kissing")) xctx->kissing = connect_by_kissing();
|
/* if connect_by_kissing==2 it was set in callback.c ('M' command) */
|
||||||
|
if(tclgetintvar("connect_by_kissing")) xctx->kissing = connect_by_kissing();
|
||||||
else xctx->kissing = 0;
|
else xctx->kissing = 0;
|
||||||
xctx->movelastsel = xctx->lastsel;
|
xctx->movelastsel = xctx->lastsel;
|
||||||
if(xctx->lastsel==1 && xctx->sel_array[0].type==ARC &&
|
if(xctx->lastsel==1 && xctx->sel_array[0].type==ARC &&
|
||||||
|
|
@ -1086,7 +1087,10 @@ void move_objects(int what, int merge, double dx, double dy)
|
||||||
}
|
}
|
||||||
if(what & ABORT) /* draw objects while moving */
|
if(what & ABORT) /* draw objects while moving */
|
||||||
{
|
{
|
||||||
if(xctx->kissing) pop_undo(0, 0);
|
if(xctx->kissing) {
|
||||||
|
pop_undo(0, 0);
|
||||||
|
if(tclgetintvar("connect_by_kissing") == 2) tclsetintvar("connect_by_kissing", 0);
|
||||||
|
}
|
||||||
draw_selection(xctx->gctiled,0);
|
draw_selection(xctx->gctiled,0);
|
||||||
xctx->move_rot=xctx->move_flip=0;
|
xctx->move_rot=xctx->move_flip=0;
|
||||||
xctx->deltax=xctx->deltay=0.;
|
xctx->deltax=xctx->deltay=0.;
|
||||||
|
|
@ -1119,6 +1123,9 @@ void move_objects(int what, int merge, double dx, double dy)
|
||||||
int firsti, firstw;
|
int firsti, firstw;
|
||||||
int floaters = there_are_floaters();
|
int floaters = there_are_floaters();
|
||||||
|
|
||||||
|
if(tclgetintvar("connect_by_kissing") == 2) {
|
||||||
|
tclsetintvar("connect_by_kissing", 0);
|
||||||
|
}
|
||||||
if(!floaters) bbox(START, 0.0 , 0.0 , 0.0 , 0.0);
|
if(!floaters) bbox(START, 0.0 , 0.0 , 0.0 , 0.0);
|
||||||
/* no undo push for MERGE ad PLACE, already done before */
|
/* no undo push for MERGE ad PLACE, already done before */
|
||||||
if( !xctx->kissing && !(xctx->ui_state & (STARTMERGE | PLACE_SYMBOL | PLACE_TEXT)) ) {
|
if( !xctx->kissing && !(xctx->ui_state & (STARTMERGE | PLACE_SYMBOL | PLACE_TEXT)) ) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue