diff --git a/doc/xschem_man/commands.html b/doc/xschem_man/commands.html index f81a7bb8..06b3db56 100644 --- a/doc/xschem_man/commands.html +++ b/doc/xschem_man/commands.html @@ -38,7 +38,6 @@ p{padding: 15px 30px 10px;} This list is available in XSCHEM in the Help menu
-
XSCHEM MOUSE BINDINGS
----------------------------------------------------------------------
LeftButton Clear selection and select a graphic object
@@ -145,8 +144,8 @@ ctrl 'e' Back to parent schematic
- 'e' Descend to schematic
alt 'e' Edit selected schematic in a new window
'\' Toggle Full screen
-shift 'F' Flip
-alt 'f' Flip objects around their anchor points
+shift 'F' Horizontal flip selected objects
+alt 'f' Horizontal flip selected objects around their anchor points
ctrl 'f' Find/select by substring or regexp
- 'f' Full zoom
shift+ctrl 'F' Zoom full selected elements
@@ -213,8 +212,10 @@ alt 'u' Align to current grid selected objects
shift 'U' Redo
- 'u' Undo
- 'v' Constrained vertical move/copy of objects
+shift 'V' Vertical flip selected objects
+alt 'v' Vertical flip selected objects around their anchor point
ctrl 'v' Paste from clipboard
-shift 'V' Toggle spice/vhdl/verilog netlist
+ctrl+shift 'V' Toggle spice/vhdl/verilog netlist
- 'w' Place wire
ctrl 'w' close current schematic
shift 'W' Place wire, snapping to closest pin or net endpoint
@@ -226,7 +227,7 @@ shift 'X' Highlight discrepancies between object ports and attache
shift 'Z' Zoom in
ctrl 'z' Zoom out
- '?' Help
-- '& Join / break / collapse wires
+- '&' Join / break / collapse wires
shift '*' Postscript/pdf print
ctr+shift '*' Xpm/png print
alt+shift '*' Svg print
diff --git a/doc/xschem_man/developer_info.html b/doc/xschem_man/developer_info.html
index 2be4f4ce..28dfab55 100644
--- a/doc/xschem_man/developer_info.html
+++ b/doc/xschem_man/developer_info.html
@@ -545,6 +545,7 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
+
@@ -689,6 +690,11 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
if x0, y0 not given use mouse coordinates
Flip selection horizontally, each object around its center
+ + Flip selection vertically around point x0 y0. + if x0, y0 not given use mouse coordinates+
+ Flip selection vertically, each object around its center
flatten to current level selected instance texts
@@ -1466,6 +1472,9 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
+
+
+
diff --git a/src/callback.c b/src/callback.c
index e756d96e..3f408b05 100644
--- a/src/callback.c
+++ b/src/callback.c
@@ -1793,7 +1793,7 @@ int rstate; /* (reduced state, without ShiftMask) */
new_rect(PLACE);
break;
}
- if(key=='V' && rstate == 0) /* toggle spice/vhdl netlist */
+ if(key=='V' && rstate == ControlMask) /* toggle spice/vhdl netlist */
{
xctx->netlist_type++; if(xctx->netlist_type==6) xctx->netlist_type=1;
set_tcl_netlist_type();
@@ -2311,6 +2311,55 @@ int rstate; /* (reduced state, without ShiftMask) */
}
break;
}
+ if(key=='V' && rstate == 0) /* vertical flip */
+ {
+ if(xctx->ui_state & STARTMOVE) {
+ move_objects(ROTATE,0,0,0);
+ move_objects(ROTATE,0,0,0);
+ move_objects(FLIP,0,0,0);
+ }
+ else if(xctx->ui_state & STARTCOPY) {
+ copy_objects(ROTATE);
+ copy_objects(ROTATE);
+ copy_objects(FLIP);
+ }
+ else {
+ rebuild_selected_array();
+ xctx->mx_double_save=xctx->mousex_snap;
+ xctx->my_double_save=xctx->mousey_snap;
+ move_objects(START,0,0,0);
+ move_objects(ROTATE,0,0,0);
+ move_objects(ROTATE,0,0,0);
+ move_objects(FLIP,0,0,0);
+ move_objects(END,0,0,0);
+ }
+ break;
+ }
+ if(key=='v' && EQUAL_MODMASK) /* vertical flip objects around their anchor points */
+ {
+ if(xctx->ui_state & STARTMOVE) {
+ move_objects(ROTATE|ROTATELOCAL,0,0,0);
+ move_objects(ROTATE|ROTATELOCAL,0,0,0);
+ move_objects(FLIP|ROTATELOCAL,0,0,0);
+ }
+ else if(xctx->ui_state & STARTCOPY) {
+ copy_objects(ROTATE|ROTATELOCAL);
+ copy_objects(ROTATE|ROTATELOCAL);
+ copy_objects(FLIP|ROTATELOCAL);
+ }
+ else {
+ rebuild_selected_array();
+ xctx->mx_double_save=xctx->mousex_snap;
+ xctx->my_double_save=xctx->mousey_snap;
+ move_objects(START,0,0,0);
+ move_objects(ROTATE|ROTATELOCAL,0,0,0);
+ move_objects(ROTATE|ROTATELOCAL,0,0,0);
+ move_objects(FLIP|ROTATELOCAL,0,0,0);
+ move_objects(END,0,0,0);
+ }
+ break;
+ }
+
if(key=='\\' && state==0) /* fullscreen */
{
diff --git a/src/keys.help b/src/keys.help
index 50961fc3..d7e58f84 100644
--- a/src/keys.help
+++ b/src/keys.help
@@ -104,8 +104,8 @@ ctrl 'e' Back to parent schematic
- 'e' Descend to schematic
alt 'e' Edit selected schematic in a new window
'\' Toggle Full screen
-shift 'F' Flip
-alt 'f' Flip objects around their anchor points
+shift 'F' Horizontal flip selected objects
+alt 'f' Horizontal flip selected objects around their anchor points
ctrl 'f' Find/select by substring or regexp
- 'f' Full zoom
shift+ctrl 'F' Zoom full selected elements
@@ -172,8 +172,10 @@ alt 'u' Align to current grid selected objects
shift 'U' Redo
- 'u' Undo
- 'v' Constrained vertical move/copy of objects
+shift 'V' Vertical flip selected objects
+alt 'v' Vertical flip selected objects around their anchor point
ctrl 'v' Paste from clipboard
-shift 'V' Toggle spice/vhdl/verilog netlist
+ctrl+shift 'V' Toggle spice/vhdl/verilog netlist
- 'w' Place wire
ctrl 'w' close current schematic
shift 'W' Place wire, snapping to closest pin or net endpoint
diff --git a/src/scheduler.c b/src/scheduler.c
index 176db083..9abe39b5 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -951,8 +951,8 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
else if(!strcmp(argv[1], "flip_in_place"))
{
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
- if(xctx->ui_state & STARTMOVE) move_objects(ROTATE|ROTATELOCAL,0,0,0);
- else if(xctx->ui_state & STARTCOPY) copy_objects(ROTATE|ROTATELOCAL);
+ if(xctx->ui_state & STARTMOVE) move_objects(FLIP|ROTATELOCAL,0,0,0);
+ else if(xctx->ui_state & STARTCOPY) copy_objects(FLIP|ROTATELOCAL);
else {
rebuild_selected_array();
move_objects(START,0,0,0);
@@ -962,6 +962,67 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
Tcl_ResetResult(interp);
}
+ /* flipv [x0 y0]
+ * Flip selection vertically around point x0 y0.
+ * if x0, y0 not given use mouse coordinates */
+ else if(!strcmp(argv[1], "flipv"))
+ {
+ double x0 = xctx->mousex_snap;
+ double y0 = xctx->mousey_snap;
+ if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
+ if(argc > 3) {
+ x0 = atof(argv[2]);
+ y0 = atof(argv[3]);
+ }
+ if(xctx->ui_state & STARTMOVE) {
+ move_objects(ROTATE,0,0,0);
+ move_objects(ROTATE,0,0,0);
+ move_objects(FLIP,0,0,0);
+ }
+ else if(xctx->ui_state & STARTCOPY) {
+ copy_objects(ROTATE);
+ copy_objects(ROTATE);
+ copy_objects(FLIP);
+ }
+ else {
+ rebuild_selected_array();
+ xctx->mx_double_save = xctx->mousex_snap = x0;
+ xctx->my_double_save = xctx->mousey_snap = y0;
+ move_objects(START,0,0,0);
+ move_objects(ROTATE,0, 0, 0);
+ move_objects(ROTATE,0, 0, 0);
+ move_objects(FLIP,0, 0, 0);
+ move_objects(END,0,0,0);
+ }
+ Tcl_ResetResult(interp);
+ }
+
+ /* flipv_in_place
+ * Flip selection vertically, each object around its center */
+ else if(!strcmp(argv[1], "flipv_in_place"))
+ {
+ if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
+ if(xctx->ui_state & STARTMOVE) {
+ move_objects(ROTATE|ROTATELOCAL,0,0,0);
+ move_objects(ROTATE|ROTATELOCAL,0,0,0);
+ move_objects(FLIP|ROTATELOCAL,0,0,0);
+ }
+ else if(xctx->ui_state & STARTCOPY) {
+ copy_objects(ROTATE|ROTATELOCAL);
+ copy_objects(ROTATE|ROTATELOCAL);
+ copy_objects(FLIP|ROTATELOCAL);
+ }
+ else {
+ rebuild_selected_array();
+ move_objects(START,0,0,0);
+ move_objects(ROTATE|ROTATELOCAL,0,0,0);
+ move_objects(ROTATE|ROTATELOCAL,0,0,0);
+ move_objects(FLIP|ROTATELOCAL,0,0,0);
+ move_objects(END,0,0,0);
+ }
+ Tcl_ResetResult(interp);
+ }
+
/* floaters_from_selected_inst
* flatten to current level selected instance texts */
else if(!strcmp(argv[1], "floaters_from_selected_inst"))
diff --git a/src/xschem.tcl b/src/xschem.tcl
index 0a880a57..0e62228e 100644
--- a/src/xschem.tcl
+++ b/src/xschem.tcl
@@ -3473,6 +3473,7 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}}
set file_dialog_globfilter *[.load.buttons_bot.entry get]*
if { $file_dialog_globfilter eq {**} } { set file_dialog_globfilter * }
setglob $file_dialog_dir1
+ .load.l.paneright.list yview moveto 1.0
}
# set to something different to any file to force a new placement in file_dialog_place_symbol
set file_dialog_retval { }
@@ -3626,6 +3627,7 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}}
if { [info exists file_dialog_yview]} {
.load.l.paneright.list yview moveto [lindex $file_dialog_yview 0]
}
+ focus .load.buttons_bot.entry
if {$loadfile != 2} {
tkwait window .load
xschem set semaphore [expr {[xschem get semaphore] -1}]
@@ -7027,19 +7029,19 @@ proc build_widgets { {topwin {} } } {
$topwin.menubar.option.menu.netlist add checkbutton -label "Split netlist" -variable split_files \
-accelerator {}
$topwin.menubar.option.menu.netlist add radiobutton -label "Spice netlist"\
- -variable netlist_type -value spice -accelerator {Shift+V} \
+ -variable netlist_type -value spice -accelerator {Ctrl+Shift+V} \
-command "xschem set netlist_type spice; xschem redraw"
$topwin.menubar.option.menu.netlist add radiobutton -label "VHDL netlist"\
- -variable netlist_type -value vhdl -accelerator {Shift+V} \
+ -variable netlist_type -value vhdl -accelerator {Ctrl+Shift+V} \
-command "xschem set netlist_type vhdl; xschem redraw"
$topwin.menubar.option.menu.netlist add radiobutton -label "Verilog netlist"\
- -variable netlist_type -value verilog -accelerator {Shift+V} \
+ -variable netlist_type -value verilog -accelerator {Ctrl+Shift+V} \
-command "xschem set netlist_type verilog; xschem redraw"
$topwin.menubar.option.menu.netlist add radiobutton -label "tEDAx netlist" \
- -variable netlist_type -value tedax -accelerator {Shift+V} \
+ -variable netlist_type -value tedax -accelerator {Ctrl+Shift+V} \
-command "xschem set netlist_type tedax; xschem redraw"
$topwin.menubar.option.menu.netlist add radiobutton -label "Symbol global attrs" \
- -variable netlist_type -value symbol -accelerator {Shift+V} \
+ -variable netlist_type -value symbol -accelerator {Ctrl+Shift+V} \
-command "xschem set netlist_type symbol; xschem redraw"
@@ -7067,11 +7069,15 @@ proc build_widgets { {topwin {} } } {
$topwin.menubar.edit.menu add command -label "Move objects adding wires to connected pins" \
-command "xschem move_objects kissing" -accelerator Shift+M
toolbar_add EditMove "xschem move_objects" "Move objects" $topwin
- $topwin.menubar.edit.menu add command -label "Flip in place selected objects" -state normal \
+ $topwin.menubar.edit.menu add command -label "Horizontal Flip in place selected objects" -state normal \
-command {xschem flip_in_place} -accelerator {Alt-F}
+ $topwin.menubar.edit.menu add command -label "Vertical Flip in place selected objects" -state normal \
+ -command {xschem flipv_in_place} -accelerator {Alt-V}
$topwin.menubar.edit.menu add command -label "Rotate in place selected objects" -state normal \
-command {xschem rotate_in_place} -accelerator {Alt-R}
- $topwin.menubar.edit.menu add command -label "Flip selected objects" -state normal \
+ $topwin.menubar.edit.menu add command -label "Vertical Flip selected objects" -state normal \
+ -command {xschem flipv} -accelerator {Shift-V}
+ $topwin.menubar.edit.menu add command -label "Horizontal Flip selected objects" -state normal \
-command {xschem flip} -accelerator {Shift-F}
$topwin.menubar.edit.menu add command -label "Rotate selected objects" -state normal \
-command {xschem rotate} -accelerator {Shift-R}