Revision: 54155
          http://brlcad.svn.sourceforge.net/brlcad/?rev=54155&view=rev
Author:   bob1961
Date:     2013-01-11 12:33:05 +0000 (Fri, 11 Jan 2013)
Log Message:
-----------
Added a snap-to-grid capability to Archer's sketcher.

Modified Paths:
--------------
    brlcad/trunk/src/tclscripts/archer/SketchEditFrame.tcl

Modified: brlcad/trunk/src/tclscripts/archer/SketchEditFrame.tcl
===================================================================
--- brlcad/trunk/src/tclscripts/archer/SketchEditFrame.tcl      2013-01-11 
03:55:02 UTC (rev 54154)
+++ brlcad/trunk/src/tclscripts/archer/SketchEditFrame.tcl      2013-01-11 
12:33:05 UTC (rev 54155)
@@ -62,9 +62,6 @@
        common pi2 [expr {4.0 * asin( 1.0 )}]
        common rad2deg  [expr {360.0 / $pi2}]
 
-       method set_scale {_sf}
-       method do_scale {_sf {_epsilon 0.000001}}
-       method do_translate {_dx _dy}
        method get_scale {}
        method get_tobase {}
        method get_vlist {}
@@ -99,6 +96,12 @@
        variable mBy ""
        variable mBz ""
 
+       variable mAnchorX 0
+       variable mAnchorY 0
+       variable mDrawGrid 0
+       variable mSnapGrid 0
+       variable mMajorGridSpacing 5
+       variable mMinorGridSpacing 0.5
        variable mPrevMouseX 0
        variable mPrevMouseY 0
        variable mCanvasCenterX 1
@@ -171,6 +174,7 @@
        method loadTables {_gdata}
        method redrawSegments {}
 
+       method build_grid {_x1 _y1 _x2 _y2 _final_sizing}
        method circle_3pt {_x1 _y1 _x2 _y2 _x3 _y3 _cx_out _cy_out}
        method clear_canvas_bindings {}
        method continue_circle {_segment _state _coord_type _mx _my}
@@ -182,6 +186,9 @@
        method create_bezier {}
        method create_circle {}
        method create_line {}
+       method do_scale {_sf _gflag _final {_epsilon 0.000001}}
+       method do_snap_sketch {_cx _cy}
+       method do_translate {_dx _dy _gflag _final}
        method delete_selected {}
        method end_arc {_mx _my}
        method end_arc_radius_adjust {_segment _mx _my}
@@ -190,9 +197,10 @@
        method fix_vertex_references {_unused_vindices}
        method handle_configure {}
        method handle_escape {}
-       method handle_scale {_mx _my}
-       method handle_translate {_mx _my}
+       method handle_scale {_mx _my _final}
+       method handle_translate {_mx _my _final}
        method item_pick_highlight {_mx _my}
+       method mouse_to_sketch {_mx _my}
        method next_bezier {_segment _mx _my}
        method pick_arbitrary {_mx _my}
        method pick_segment {_mx _my}
@@ -219,6 +227,9 @@
        method start_vert_pick {}
        method tag_selected_verts {}
        method unhighlight_selected {}
+       method updateGrid {}
+       method validateMajorGridSpacing {_spacing}
+       method validateMinorGridSpacing {_spacing}
        method validatePickTol {_tol}
        method vert_delete {_sx _sy}
        method vert_is_used {_vindex}
@@ -262,63 +273,6 @@
 
 
 
-::itcl::body SketchEditFrame::set_scale {_sf} {
-    set myscale $_sf
-    drawSegments
-}
-
-
-::itcl::body SketchEditFrame::do_scale {_sf {_epsilon 0.000001}} {
-    if {$_sf < $_epsilon} {
-       return
-    }
-
-    set myscale [expr {$myscale * $_sf}]
-    drawSegments
-
-    set mScrollCenterX [expr {$mScrollCenterX * $_sf}]
-    set mScrollCenterY [expr {$mScrollCenterY * $_sf}]
-
-    set x1 [expr {$mScrollCenterX - $mCanvasCenterX}]
-    if {[expr {$mCanvasWidth%2}]} {
-       set x2 [expr {$mScrollCenterX + $mCanvasCenterX + 1}]
-    } else {
-       set x2 [expr {$mScrollCenterX + $mCanvasCenterX}]
-    }
-
-    set y1 [expr {$mScrollCenterY - $mCanvasCenterY}]
-    if {[expr {$mCanvasHeight%2}]} {
-       set y2 [expr {$mScrollCenterY + $mCanvasCenterY + 1}]
-    } else {
-       set y2 [expr {$mScrollCenterY + $mCanvasCenterY}]
-    }
-
-    $itk_component(canvas) configure -scrollregion [list $x1 $y1 $x2 $y2]
-}
-
-
-::itcl::body SketchEditFrame::do_translate {_dx _dy} {
-    set mScrollCenterX [expr {$mScrollCenterX + $_dx}]
-    set mScrollCenterY [expr {$mScrollCenterY + $_dy}]
-
-    set x1 [expr {$mScrollCenterX - $mCanvasCenterX}]
-    if {[expr {$mCanvasWidth%2}]} {
-       set x2 [expr {$mScrollCenterX + $mCanvasCenterX + 1}]
-    } else {
-       set x2 [expr {$mScrollCenterX + $mCanvasCenterX}]
-    }
-
-    set y1 [expr {$mScrollCenterY - $mCanvasCenterY}]
-    if {[expr {$mCanvasHeight%2}]} {
-       set y2 [expr {$mScrollCenterY + $mCanvasCenterY + 1}]
-    } else {
-       set y2 [expr {$mScrollCenterY + $mCanvasCenterY}]
-    }
-
-    $itk_component(canvas) configure -scrollregion [list $x1 $y1 $x2 $y2]
-}
-
-
 ::itcl::body SketchEditFrame::get_scale {} {
     return $myscale
 }
@@ -666,6 +620,71 @@
        incr i
     }
 
+    itk_component add drawgridCB {
+       ::ttk::checkbutton $parent.drawgrid \
+           -text "Draw Grid" \
+           -variable [::itcl::scope mDrawGrid] \
+           -command [::itcl::code $this updateGrid]
+    } {}
+
+    itk_component add snapgridCB {
+       ::ttk::checkbutton $parent.snapgrid \
+           -text "Snap Grid" \
+           -variable [::itcl::scope mSnapGrid]
+    } {}
+
+    itk_component add anchorXL {
+       ::ttk::label $parent.anchorxL \
+           -anchor e \
+           -text "Anchor X (mm)"
+    } {}
+    itk_component add anchorXE {
+       ::ttk::entry $parent.anchorxE \
+           -width 12 \
+           -textvariable [::itcl::scope mAnchorX] \
+           -validate key \
+           -validatecommand  {::cadwidgets::Ged::validateDouble %P}
+    } {}
+
+    itk_component add anchorYL {
+       ::ttk::label $parent.anchoryL \
+           -anchor e \
+           -text "Anchor Y (mm)"
+    } {}
+    itk_component add anchorYE {
+       ::ttk::entry $parent.anchoryE \
+           -width 12 \
+           -textvariable [::itcl::scope mAnchorY] \
+           -validate key \
+           -validatecommand  {::cadwidgets::Ged::validateDouble %P}
+    } {}
+
+    itk_component add majorgridL {
+       ::ttk::label $parent.majorgridL \
+           -anchor e \
+           -text "Major Grid Spacing (ticks)"
+    } {}
+    itk_component add majorgridE {
+       ::ttk::entry $parent.majorgridE \
+           -width 12 \
+           -textvariable [::itcl::scope mMajorGridSpacing] \
+           -validate key \
+           -validatecommand [::itcl::code $this validateMajorGridSpacing %P]
+    } {}
+
+    itk_component add minorgridL {
+       ::ttk::label $parent.minorgridL \
+           -anchor e \
+           -text "Minor Grid Spacing (mm)"
+    } {}
+    itk_component add minorgridE {
+       ::ttk::entry $parent.minorgridE \
+           -width 12 \
+           -textvariable [::itcl::scope mMinorGridSpacing] \
+           -validate key \
+           -validatecommand [::itcl::code $this validateMinorGridSpacing %P]
+    } {}
+
     itk_component add picktolL {
        ::ttk::label $parent.picktolL \
            -anchor e \
@@ -682,9 +701,30 @@
     incr row
     grid rowconfigure $parent $row -weight 1
     incr row
-    grid $itk_component(picktolL) -column 0 -row $row -sticky e
+    grid $itk_component(drawgridCB) -column 0 -row $row -sticky w
+    incr row
+    grid $itk_component(snapgridCB) -column 0 -row $row -sticky w
+    incr row
+    grid $itk_component(anchorXL) -column 0 -row $row -sticky w
+    grid $itk_component(anchorXE) -column 1 -row $row -sticky ew
+    incr row
+    grid $itk_component(anchorYL) -column 0 -row $row -sticky w
+    grid $itk_component(anchorYE) -column 1 -row $row -sticky ew
+    incr row
+    grid $itk_component(majorgridL) -column 0 -row $row -sticky w
+    grid $itk_component(majorgridE) -column 1 -row $row -sticky ew
+    incr row
+    grid $itk_component(minorgridL) -column 0 -row $row -sticky w
+    grid $itk_component(minorgridE) -column 1 -row $row -sticky ew
+    incr row
+    grid $itk_component(picktolL) -column 0 -row $row -sticky w
     grid $itk_component(picktolE) -column 1 -row $row -sticky ew
     grid columnconfigure $parent 1 -weight 1
+
+    bind $itk_component(anchorXE) <Return> [::itcl::code $this updateGrid]
+    bind $itk_component(anchorYE) <Return> [::itcl::code $this updateGrid]
+    bind $itk_component(majorgridE) <Return> [::itcl::code $this updateGrid]
+    bind $itk_component(minorgridE) <Return> [::itcl::code $this updateGrid]
 }
 
 
@@ -821,7 +861,7 @@
 
 
 ::itcl::body SketchEditFrame::drawSegments {} {
-    $itk_component(canvas) delete all
+    $itk_component(canvas) delete segs verts
     drawVertices
     set first 1
     foreach seg $mSegments {
@@ -908,12 +948,13 @@
 
 ::itcl::body SketchEditFrame::initCanvas {_gdata} {
     $::ArcherCore::application setCanvas $itk_component(canvas)
+    ::update idletasks
 
+    set myscale 1.0
     set mSegments {}
     set mVL {}
     set mSL {}
     set needs_saving 0
-    $itk_component(canvas) delete all
     initSketchData $_gdata
     createSegments
     drawSegments
@@ -923,9 +964,7 @@
     set mPrevEditMode 0
     set mLastIndex -1
 
-    update idletasks
-
-    set min_max [$itk_component(canvas) bbox all]
+    set min_max [$itk_component(canvas) bbox segs verts]
     set tmp_scale1 [expr double($mCanvasWidth) / ([lindex $min_max 2] - 
[lindex $min_max 0] + 2.0 * $vert_radius)]
     if {$tmp_scale1 < 0.0} {
        set tmp_scale1 [expr -$tmp_scale1]
@@ -937,12 +976,14 @@
     }
 
     if {$tmp_scale1 < $tmp_scale2} {
-       do_scale $tmp_scale1
+       set scale $tmp_scale1
     } else {
-       do_scale $tmp_scale2
+       set scale $tmp_scale2
     }
 
+    do_scale $scale 0 0
     initScrollRegion
+    do_scale 1.0 1 1
 }
 
 
@@ -956,7 +997,7 @@
 
 
 ::itcl::body SketchEditFrame::initScrollRegion {} {
-    set bbox [$itk_component(canvas) bbox all]
+    set bbox [$itk_component(canvas) bbox segs verts]
     set x1 [lindex $bbox 0]
     set y1 [lindex $bbox 1]
     set x2 [lindex $bbox 2]
@@ -1058,6 +1099,88 @@
 }
 
 
+::itcl::body SketchEditFrame::build_grid {_x1 _y1 _x2 _y2 _final} {
+    # delete previous grid
+    $itk_component(canvas) delete grid
+
+    if {!$mDrawGrid} {
+       return
+    }
+
+    set spacing [expr {$mMinorGridSpacing * $myscale}]
+    if {$spacing < 4} {
+       return
+    }
+
+    set major_spacing [expr {$spacing * $mMajorGridSpacing}]
+
+    set anchor_snap [do_snap_sketch $mAnchorX $mAnchorY]
+    set anchor_snap_x [lindex $anchor_snap 0]
+    set anchor_snap_y [lindex $anchor_snap 1]
+
+    set snap_1 [do_snap_sketch [expr {$_x1 / $myscale}] [expr {$_y1 / 
$myscale}]]
+    set snap_1_x [lindex $snap_1 0]
+    set snap_1_y [lindex $snap_1 1]
+
+    set xsteps [expr {abs(round(($snap_1_x - $anchor_snap_x) / 
double($mMinorGridSpacing)))}]
+    set ysteps [expr {abs(round(($snap_1_y - $anchor_snap_y) / 
double($mMinorGridSpacing)))}]
+
+    set xsteps [expr {$xsteps%$mMajorGridSpacing}]
+    if {$xsteps} {
+       set xsteps [expr {($mMajorGridSpacing - $xsteps)}]
+       set start_x [expr {($snap_1_x * $myscale) - ($xsteps * 
$mMinorGridSpacing * $myscale)}]
+    } else {
+       set start_x [expr {$snap_1_x * $myscale}]
+    }
+
+    set ysteps [expr {$ysteps%$mMajorGridSpacing}]
+    if {$ysteps} {
+       set ysteps [expr {$mMajorGridSpacing - $ysteps}]
+       set start_y [expr {($snap_1_y * $myscale) - ($ysteps * 
$mMinorGridSpacing * $myscale)}]
+    } else {
+       set start_y [expr {$snap_1_y * $myscale}]
+    }
+
+    set snap_2 [do_snap_sketch [expr {$_x2 / $myscale}] [expr {$_y2 / 
$myscale}]]
+    set end_x [expr {[lindex $snap_2 0] * $myscale}]
+    set end_y [expr {[lindex $snap_2 1] * $myscale}]
+
+    if {$_final} {
+       # Draw the rows
+       for {set y $start_y} {$y <= $end_y} {set y [expr {$y + 
$major_spacing}]} {
+           for {set x $start_x} {$x <= $end_x} {set x [expr {$x + $spacing}]} {
+               set x1 [expr {$x - 1}]
+               set y1 [expr {$y - 1}]
+               set x2 [expr {$x + 1}]
+               set y2 [expr {$y + 1}]
+               $itk_component(canvas) create oval $x $y $x $y -fill black 
-tags grid
+           }
+       }
+
+       # Draw the columns
+       for {set x $start_x} {$x <= $end_x} {set x [expr {$x + 
$major_spacing}]} {
+           set row 0
+           for {set y $start_y} {$y <= $end_y} {set y [expr {$y + $spacing}]} {
+               if {[expr {$row%$mMajorGridSpacing}]} {
+                   $itk_component(canvas) create oval $x $y $x $y -fill black 
-tags grid
+               }
+               incr row
+           }
+       }
+    } else {
+       # Draw the rows
+       for {set y $start_y} {$y <= $end_y} {set y [expr {$y + 
$major_spacing}]} {
+           $itk_component(canvas) create line $start_x $y $end_x $y -fill 
black -tags grid
+       }
+
+       # Draw the columns
+       for {set x $start_x} {$x <= $end_x} {set x [expr {$x + 
$major_spacing}]} {
+           $itk_component(canvas) create line $x $start_y $x $end_y -fill 
black -tags grid
+       }
+    }
+}
+
+
 ::itcl::body SketchEditFrame::circle_3pt {_x1 _y1 _x2 _y2 _x3 _y3 _cx_out 
_cy_out} {
     # find the center of a circle that passes through three points
     # return the center in "cx_out cy_out"
@@ -1191,13 +1314,16 @@
 ::itcl::body SketchEditFrame::continue_circle_pick {_segment _mx _my} {
     set index [pick_vertex $_mx $_my]
     if {$index == -1} {
-       set ex [expr {[$itk_component(canvas) canvasx $_mx] / $myscale}]
-       set ey [expr {-[$itk_component(canvas) canvasy $_my] / $myscale}]
+       set elist [mouse_to_sketch $_mx $_my]
+       set ex [lindex $elist 0]
+       set ey [lindex $elist 1]
 
        if {$index1 == $index2} {
            # need to create a new vertex
            set index1 [llength $mVL]
            lappend mVL "$ex $ey"
+       } else {
+           set mVL [lreplace $mVL $index1 $index1 "$ex $ey"]
        }
     } else {
        if {$index != $index1} {
@@ -1254,7 +1380,6 @@
 
     $itk_component(canvas) delete ::SketchEditFrame::$_segment
     $_segment draw ""
-#    $itk_component(canvas) configure -scrollregion [$itk_component(canvas) 
bbox all]
 
     if {$_state == 2} {
        $itk_component(canvas) configure -cursor crosshair
@@ -1276,9 +1401,16 @@
            $itk_component(canvas) configure -cursor {}
        }
 
-       set ex [expr {[$itk_component(canvas) canvasx $_mx] / $myscale}]
-       set ey [expr {-[$itk_component(canvas) canvasy $_my] / $myscale}]
-
+       # If it's a button press
+       if {$_state == 1} {
+           set ex [expr {[$itk_component(canvas) canvasx $_mx] / $myscale}]
+           set ey [expr {-[$itk_component(canvas) canvasy $_my] / $myscale}]
+       } else {
+           set slist [mouse_to_sketch $_mx $_my]
+           set ex [lindex $slist 0]
+           set ey [lindex $slist 1]
+       }
+       
        if {$index1 != $index2} {
            if {!$mIgnoreMotion} {
                # Update the vertex
@@ -1303,6 +1435,15 @@
                    set mVL [lreplace $mVL end end]
                }
            }
+       } elseif {$_state == 2} {
+           set slist [mouse_to_sketch $_mx $_my]
+           set ex [lindex $slist 0]
+           set ey [lindex $slist 1]
+
+           if {!$mIgnoreMotion} {
+               # Update the vertex
+               set mVL [lreplace $mVL $index2 $index2 "$ex $ey"]
+           }
        }
     }
 
@@ -1360,17 +1501,41 @@
     }
     $itk_component(canvas) move moving $dx $dy
 
+    set ids [$itk_component(canvas) find withtag moving]
+    set len [llength $ids]
+    if {$len == 0} {
+       # This should not happen
+       return
+    }
+
     # actually move the vertices in the vertex list
-    set ids [$itk_component(canvas) find withtag moving]
-    foreach id $ids {
-       set tags [$itk_component(canvas) gettags $id]
+    if {$_state != 0 && $len == 1} {
+       set tags [$itk_component(canvas) gettags $ids]
        set index [string range [lindex $tags 0] 1 end]
-       set new_coords [$itk_component(canvas) coords $id]
+       set new_coords [$itk_component(canvas) coords $ids]
        set new_x [expr ([lindex $new_coords 0] + [lindex $new_coords 2])/(2.0 
* $myscale)]
        set new_y [expr -([lindex $new_coords 1] + [lindex $new_coords 3])/(2.0 
* $myscale)]
-       set mVL [lreplace $mVL $index $index [concat $new_x $new_y]]
+
+       if {$mSnapGrid} {
+           set mVL [lreplace $mVL $index $index [do_snap_sketch $new_x $new_y]]
+       } else {
+           set mVL [lreplace $mVL $index $index "$new_x $new_y"]
+       }
+
+       drawVertices
+    } else {
+       foreach id $ids {
+           set tags [$itk_component(canvas) gettags $id]
+           set index [string range [lindex $tags 0] 1 end]
+           set new_coords [$itk_component(canvas) coords $id]
+           set new_x [expr ([lindex $new_coords 0] + [lindex $new_coords 
2])/(2.0 * $myscale)]
+           set new_y [expr -([lindex $new_coords 1] + [lindex $new_coords 
3])/(2.0 * $myscale)]
+           set mVL [lreplace $mVL $index $index "$new_x $new_y"]
+       }
     }
+
     redrawSegments
+
     if {$_state == 0} {
        set move_start_x $x
        set move_start_y $y
@@ -1464,6 +1629,73 @@
 }
 
 
+::itcl::body SketchEditFrame::do_scale {_sf _gflag _final {_epsilon 0.000001}} 
{
+    if {$_sf < $_epsilon} {
+       return
+    }
+
+    set myscale [expr {$myscale * $_sf}]
+    drawSegments
+
+    set mScrollCenterX [expr {$mScrollCenterX * $_sf}]
+    set mScrollCenterY [expr {$mScrollCenterY * $_sf}]
+
+    set x1 [expr {$mScrollCenterX - $mCanvasCenterX}]
+    if {[expr {$mCanvasWidth%2}]} {
+       set x2 [expr {$mScrollCenterX + $mCanvasCenterX + 1}]
+    } else {
+       set x2 [expr {$mScrollCenterX + $mCanvasCenterX}]
+    }
+
+    set y1 [expr {$mScrollCenterY - $mCanvasCenterY}]
+    if {[expr {$mCanvasHeight%2}]} {
+       set y2 [expr {$mScrollCenterY + $mCanvasCenterY + 1}]
+    } else {
+       set y2 [expr {$mScrollCenterY + $mCanvasCenterY}]
+    }
+
+    $itk_component(canvas) configure -scrollregion [list $x1 $y1 $x2 $y2]
+
+    if {$_gflag} {
+       build_grid $x1 $y1 $x2 $y2 $_final
+    }
+}
+
+
+::itcl::body SketchEditFrame::do_snap_sketch {_x _y} {
+    set snap_x [expr {round(($_x - $mAnchorX) / double($mMinorGridSpacing)) * 
$mMinorGridSpacing + $mAnchorX}]
+    set snap_y [expr {round(($_y - $mAnchorY) / double($mMinorGridSpacing)) * 
$mMinorGridSpacing + $mAnchorY}]
+
+    return [format "%g %g" $snap_x $snap_y]
+}
+
+
+::itcl::body SketchEditFrame::do_translate {_dx _dy _gflag _final} {
+    set mScrollCenterX [expr {$mScrollCenterX + $_dx}]
+    set mScrollCenterY [expr {$mScrollCenterY + $_dy}]
+    
+    set x1 [expr {$mScrollCenterX - $mCanvasCenterX}]
+    if {[expr {$mCanvasWidth%2}]} {
+       set x2 [expr {$mScrollCenterX + $mCanvasCenterX + 1}]
+    } else {
+       set x2 [expr {$mScrollCenterX + $mCanvasCenterX}]
+    }
+
+    set y1 [expr {$mScrollCenterY - $mCanvasCenterY}]
+    if {[expr {$mCanvasHeight%2}]} {
+       set y2 [expr {$mScrollCenterY + $mCanvasCenterY + 1}]
+    } else {
+       set y2 [expr {$mScrollCenterY + $mCanvasCenterY}]
+    }
+
+    $itk_component(canvas) configure -scrollregion [list $x1 $y1 $x2 $y2]
+
+    if {$_gflag} {
+       build_grid $x1 $y1 $x2 $y2 $_final
+    }
+}
+
+
 ::itcl::body SketchEditFrame::delete_selected {} {
     set selected [$itk_component(canvas) find withtag selected]
     set slist {}
@@ -1511,8 +1743,9 @@
 ::itcl::body SketchEditFrame::end_arc {_mx _my} {
     set index [pick_vertex $_mx $_my]
     if {$index == -1} {
-       set ex [expr {[$itk_component(canvas) canvasx $_mx] / $myscale}]
-       set ey [expr {-[$itk_component(canvas) canvasy $_my] / $myscale}]
+       set elist [mouse_to_sketch $_mx $_my]
+       set ex [lindex $elist 0]
+       set ey [lindex $elist 1]
 
        set index [llength $mVL]
        lappend mVL "$ex $ey"
@@ -1580,9 +1813,10 @@
 
 ::itcl::body SketchEditFrame::end_arc_radius_adjust {_segment _mx _my} {
     # screen coordinates
-#    show_coords $_mx $_my
-    set sx [expr {[$itk_component(canvas) canvasx $_mx] / $myscale}]
-    set sy [expr {-[$itk_component(canvas) canvasy $_my] / $myscale}]
+    #show_coords $_mx $_my
+    set slist [mouse_to_sketch $_mx $_my]
+    set sx [lindex $slist 0]
+    set sy [lindex $slist 1]
     set cx 0.0
     set cy 0.0
 
@@ -1681,7 +1915,7 @@
 }
 
 
-::itcl::body SketchEditFrame::handle_scale {_mx _my} {
+::itcl::body SketchEditFrame::handle_scale {_mx _my _final} {
     set dx [expr {$_mx - $mPrevMouseX}]
     set dy [expr {$mPrevMouseY - $_my}]
 
@@ -1696,18 +1930,18 @@
        set sf [expr {1.0 + $sdy}]
     }
 
-    do_scale $sf
+    do_scale $sf 1 $_final
 }
 
 
-::itcl::body SketchEditFrame::handle_translate {_mx _my} {
+::itcl::body SketchEditFrame::handle_translate {_mx _my _final} {
     set dx [expr {$mPrevMouseX - $_mx}]
     set dy [expr {$mPrevMouseY - $_my}]
 
     set mPrevMouseX $_mx
     set mPrevMouseY $_my
 
-    do_translate $dx $dy
+    do_translate $dx $dy 1 $_final
 }
 
 
@@ -1756,6 +1990,18 @@
 }
 
 
+::itcl::body SketchEditFrame::mouse_to_sketch {_mx _my} {
+    set x [expr {[$itk_component(canvas) canvasx $_mx] / $myscale}]
+    set y [expr {-[$itk_component(canvas) canvasy $_my] / $myscale}]
+
+    if {$mSnapGrid} {
+       return [do_snap_sketch $x $y]
+    }
+
+    return "$x $y"
+}
+
+
 ::itcl::body SketchEditFrame::next_bezier {_segment _mx _my} {
     set index [pick_vertex $_mx $_my]
     if {$index != -1} {
@@ -1767,8 +2013,9 @@
     } else {
        # screen coords
        #show_coords $_mx $_my
-       set sx [expr {[$itk_component(canvas) canvasx $_mx] / $myscale}]
-       set sy [expr {-[$itk_component(canvas) canvasy $_my] / $myscale}]
+       set slist [mouse_to_sketch $_mx $_my]
+       set sx [lindex $slist 0]
+       set sy [lindex $slist 1]
 
        if {[llength $bezier_indices] == 2 && [lindex $bezier_indices 0] == 
[lindex $bezier_indices 1]} {
            set bezier_indices [lindex $bezier_indices 0]
@@ -1918,6 +2165,7 @@
 
 
 ::itcl::body SketchEditFrame::setup_move_arbitrary {} {
+    handle_escape
     set mEditMode $moveArbitrary
     $itk_component(canvas) configure -cursor crosshair
 
@@ -2016,8 +2264,9 @@
        } else {
            # screen coords
            #show_coords $_mx $_my
-           set sx [expr {[$itk_component(canvas) canvasx $_mx] / $myscale}]
-           set sy [expr {-[$itk_component(canvas) canvasy $_my] / $myscale}]
+           set slist [mouse_to_sketch $_mx $_my]
+           set sx [lindex $slist 0]
+           set sy [lindex $slist 1]
 
            set index1 [llength $mVL]
            lappend mVL "$sx $sy"
@@ -2044,8 +2293,9 @@
     } else {
        # screen coords
        #show_coords $_mx $_my
-       set sx [expr {[$itk_component(canvas) canvasx $_mx] / $myscale}]
-       set sy [expr {-[$itk_component(canvas) canvasy $_my] / $myscale}]
+       set slist [mouse_to_sketch $_mx $_my]
+       set sx [lindex $slist 0]
+       set sy [lindex $slist 1]
 
 
        if {$mLastIndex != -1} {
@@ -2080,8 +2330,9 @@
        if {$_coord_type == 1} {
            # screen coords
            #show_coords $_mx $_my
-           set sx [expr {[$itk_component(canvas) canvasx $_mx] / $myscale}]
-           set sy [expr {-[$itk_component(canvas) canvasy $_my] / $myscale}]
+           set slist [mouse_to_sketch $_mx $_my]
+           set sx [lindex $slist 0]
+           set sy [lindex $slist 1]
        } elseif {$_coord_type == 0} {
            # model coords
            set sx $x_coord
@@ -2131,11 +2382,9 @@
        } else {
            # screen coords
            #show_coords $_mx $_my
-           set sx [expr {[$itk_component(canvas) canvasx $_mx] / $myscale}]
-           set sy [expr {-[$itk_component(canvas) canvasy $_my] / $myscale}]
 
            set index1 [llength $mVL]
-           lappend mVL "$sx $sy"
+           lappend mVL [mouse_to_sketch $_mx $_my]
        }
 
        set index2 $index1
@@ -2230,14 +2479,16 @@
 ::itcl::body SketchEditFrame::start_scale {_mx _my} {
     set mPrevMouseX $_mx
     set mPrevMouseY $_my
-    bind $itk_component(canvas) <Lock-Control-Shift-B1-Motion> [::itcl::code 
$this handle_scale %x %y]
+    bind $itk_component(canvas) <Lock-Control-Shift-B1-Motion> [::itcl::code 
$this handle_scale %x %y 0]
+    bind $itk_component(canvas) <Lock-Control-Shift-ButtonRelease-1> 
[::itcl::code $this handle_scale %x %y 1]
 }
 
 
 ::itcl::body SketchEditFrame::start_translate {_mx _my} {
     set mPrevMouseX $_mx
     set mPrevMouseY $_my
-    bind $itk_component(canvas) <Lock-Shift-B1-Motion> [::itcl::code $this 
handle_translate %x %y]
+    bind $itk_component(canvas) <Lock-Shift-B1-Motion> [::itcl::code $this 
handle_translate %x %y 0]
+    bind $itk_component(canvas) <Lock-Shift-ButtonRelease-1> [::itcl::code 
$this handle_translate %x %y 1]
 }
 
 
@@ -2299,6 +2550,53 @@
 }
 
 
+::itcl::body SketchEditFrame::updateGrid {} {
+    if {$mAnchorX != "" &&
+       $mAnchorY != "" &&
+       $mMajorGridSpacing != "" &&
+       $mMajorGridSpacing != "0" &&
+       $mMinorGridSpacing != "" &&
+       $mMinorGridSpacing != "0"} {
+       do_scale 1.0 1 1
+    }
+}
+
+
+::itcl::body SketchEditFrame::validateMajorGridSpacing {_spacing} {
+    if {![::cadwidgets::Ged::validateDigit $_spacing]} {
+       return 0
+    }
+
+    if {$_spacing == ""} {
+       return 1
+    }
+
+    if {$_spacing == 0} {
+       return 0
+    }
+
+    return 1
+}
+
+
+::itcl::body SketchEditFrame::validateMinorGridSpacing {_spacing} {
+    if {![::cadwidgets::Ged::validateDouble $_spacing]} {
+       return 0
+    }
+
+    if {$_spacing == "" || $_spacing == "."} {
+       return 1
+    }
+
+    if {$_spacing == "-" ||
+       $_spacing < 0} {
+       return 0
+    }
+
+    return 1
+}
+
+
 ::itcl::body SketchEditFrame::validatePickTol {_tol} {
     if {$_tol == "."} {
        set mPickTol $_tol
@@ -2380,6 +2678,7 @@
     foreach vert $mVL {
        append out " { [expr {$tobase * [lindex $vert 0]}] [expr {$tobase * 
[lindex $vert 1]}] }"
     }
+
     append out " } SL {"
     foreach seg $mSegments {
        append out " [$seg serialize $tobase] "

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Master HTML5, CSS3, ASP.NET, MVC, AJAX, Knockout.js, Web API and
much more. Get web development skills now with LearnDevNow -
350+ hours of step-by-step video tutorials by Microsoft MVPs and experts.
SALE $99.99 this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122812
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to