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"
 
 
 
+
 
 
    
  • abort_operation
  • @@ -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_in_place
  •     Flip selection horizontally, each object around its center 
    +
  • flipv [x0 y0]
  • +   Flip selection vertically around point x0 y0. 
    +   if x0, y0 not given use mouse coordinates 
    +
  • flipv_in_place
  • +   Flip selection vertically, each object around its center 
  • floaters_from_selected_inst
  •     flatten to current level selected instance texts 
  • fullscreen
  • @@ -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}