Revision: 54134
http://brlcad.svn.sourceforge.net/brlcad/?rev=54134&view=rev
Author: bob1961
Date: 2013-01-04 13:18:03 +0000 (Fri, 04 Jan 2013)
Log Message:
-----------
Added the ability to scale and translate the view in 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-04
10:19:33 UTC (rev 54133)
+++ brlcad/trunk/src/tclscripts/archer/SketchEditFrame.tcl 2013-01-04
13:18:03 UTC (rev 54134)
@@ -62,7 +62,9 @@
common pi2 [expr {4.0 * asin( 1.0 )}]
common rad2deg [expr {360.0 / $pi2}]
- method do_scale {_sf}
+ 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 {}
@@ -97,12 +99,21 @@
variable mBy ""
variable mBz ""
+ variable mPrevMouseX 0
+ variable mPrevMouseY 0
+ variable mCanvasCenterX 1
+ variable mCanvasCenterY 1
+ variable mCanvasHeight 1
+ variable mCanvasInvWidth 1
+ variable mCanvasWidth 1
variable mDetailMode 0
variable mPickTol 11
variable mLastIndex -1
variable mEscapeCreate 1
variable mCallingFromEndBezier 0
variable myscale 1.0
+ variable mScrollCenterX 0
+ variable mScrollCenterY 0
variable vert_radius 3
variable tobase 1.0
variable tolocal 1.0
@@ -155,6 +166,7 @@
method highlightCurrentSketchElements {}
method initCanvas {_gdata}
method initPointHighlight {}
+ method initScrollRegion {}
method initSketchData {_gdata}
method loadTables {_gdata}
method redrawSegments {}
@@ -174,11 +186,12 @@
method end_arc {_mx _my}
method end_arc_radius_adjust {_segment _mx _my}
method end_bezier {_segment _cflag}
- method escape_arc {}
- method escape_bezier {_segment}
- method escape_line {}
+ method end_scale {}
method fix_vertex_references {_unused_vindices}
+ method handle_configure {}
method handle_escape {}
+ method handle_scale {_mx _my}
+ method handle_translate {_mx _my}
method item_pick_highlight {_mx _my}
method next_bezier {_segment _mx _my}
method pick_arbitrary {_mx _my}
@@ -200,7 +213,9 @@
method start_move_segment {_sx _sy _rflag}
method start_move_selected {_sx _sy}
method start_move_selected2 {_sx _sy}
+ method start_scale {_mx _my}
method start_seg_pick {}
+ method start_translate {_mx _my}
method start_vert_pick {}
method tag_selected_verts {}
method unhighlight_selected {}
@@ -230,6 +245,7 @@
bind $itk_component(canvas) <Enter> {::focus %W}
bind $itk_component(canvas) <Escape> [::itcl::code $this handle_escape]
+ bind $itk_component(canvas) <Configure> [::itcl::code $this
handle_configure]
set tolocal [$::ArcherCore::application gedCmd base2local]
set tobase [expr {1.0 / $tolocal}]
@@ -246,14 +262,63 @@
-::itcl::body SketchEditFrame::do_scale {_sf} {
+::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}]
- $itk_component(canvas) scale all 0 0 $_sf $_sf
drawSegments
-# $itk_component(canvas) configure -scrollregion [$itk_component(canvas)
bbox all]
+
+ 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
}
@@ -859,18 +924,25 @@
set mLastIndex -1
update idletasks
- set canv_height [winfo height $itk_component(canvas)]
- set canv_width [winfo width $itk_component(canvas)]
+
set min_max [$itk_component(canvas) bbox all]
- set tmp_scale1 [expr double($canv_width) / ([lindex $min_max 2] - [lindex
$min_max 0] + 2.0 * $vert_radius)]
- if { $tmp_scale1 < 0.0 } {set tmp_scale1 [expr -$tmp_scale1] }
- set tmp_scale2 [expr double($canv_height) / ([lindex $min_max 3] - [lindex
$min_max 1] + 2.0 * $vert_radius)]
- if { $tmp_scale2 < 0.0 } {set tmp_scale2 [expr -$tmp_scale2] }
- if { $tmp_scale1 < $tmp_scale2 } {
+ 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]
+ }
+
+ set tmp_scale2 [expr double($mCanvasHeight) / ([lindex $min_max 3] -
[lindex $min_max 1] + 2.0 * $vert_radius)]
+ if {$tmp_scale2 < 0.0} {
+ set tmp_scale2 [expr -$tmp_scale2]
+ }
+
+ if {$tmp_scale1 < $tmp_scale2} {
do_scale $tmp_scale1
} else {
do_scale $tmp_scale2
}
+
+ initScrollRegion
}
@@ -883,6 +955,60 @@
}
+::itcl::body SketchEditFrame::initScrollRegion {} {
+ set bbox [$itk_component(canvas) bbox all]
+ set x1 [lindex $bbox 0]
+ set y1 [lindex $bbox 1]
+ set x2 [lindex $bbox 2]
+ set y2 [lindex $bbox 3]
+ set dx [expr {abs($x2 - $x1)}]
+ set dy [expr {abs($y2 - $y1)}]
+ if {$dx <= $mCanvasWidth} {
+ set extra [expr {$mCanvasWidth - $dx}]
+ set leftover [expr {int($extra * 0.5)}]
+ set x1 [expr {$x1 - $leftover}]
+ if {[expr {$extra%2}]} {
+ set x2 [expr {$x2 + $leftover + 1}]
+ } else {
+ set x2 [expr {$x2 + $leftover}]
+ }
+ } else {
+ set short [expr {$dx - $mCanvasWidth}]
+ set required [expr {int($short * 0.5)}]
+ set x1 [expr {$x1 + $required}]
+ if {[expr {$short%2}]} {
+ set x2 [expr {$x2 - $required - 1}]
+ } else {
+ set x2 [expr {$x2 - $required}]
+ }
+ }
+
+ if {$dy <= $mCanvasHeight} {
+ set extra [expr {$mCanvasHeight - $dy}]
+ set leftover [expr {int($extra * 0.5)}]
+ set y1 [expr {$y1 - $leftover}]
+ if {[expr {$extra%2}]} {
+ set y2 [expr {$y2 + $leftover + 1}]
+ } else {
+ set y2 [expr {$y2 + $leftover}]
+ }
+ } else {
+ set short [expr {$dy - $mCanvasHeight}]
+ set required [expr {int($short * 0.5)}]
+ set y1 [expr {$y1 + $required}]
+ if {[expr {$short%2}]} {
+ set y2 [expr {$y2 - $required - 1}]
+ } else {
+ set y2 [expr {$y2 - $required}]
+ }
+ }
+
+ $itk_component(canvas) configure -scrollregion [list $x1 $y1 $x2 $y2]
+ set mScrollCenterX [expr {$x2 - int(($x2 - $x1) * 0.5)}]
+ set mScrollCenterY [expr {$y2 - int(($y2 - $y1) * 0.5)}]
+}
+
+
::itcl::body SketchEditFrame::initSketchData {_gdata} {
foreach {key value} $_gdata {
switch $key {
@@ -991,12 +1117,14 @@
bind $itk_component(canvas) <d> [::itcl::code $this delete_selected]
bind $itk_component(canvas) <Delete> [::itcl::code $this delete_selected]
+ bind $itk_component(canvas) <Lock-Control-Shift-ButtonPress-1>
[::itcl::code $this start_scale %x %y]
+ bind $itk_component(canvas) <Lock-Shift-ButtonPress-1> [::itcl::code $this
start_translate %x %y]
+ bind $itk_component(canvas) <ButtonRelease-1> [::itcl::code $this
end_scale]
+ bind $itk_component(canvas) <Control-Shift-B1-Motion> {}
bind $itk_component(canvas) <B1-Motion> {}
bind $itk_component(canvas) <ButtonPress-1> {}
bind $itk_component(canvas) <Shift-ButtonPress-1> {}
- bind $itk_component(canvas) <ButtonRelease-1> {}
- bind $itk_component(canvas) <Shift-ButtonRelease-1> {}
- bind $itk_component(canvas) <Control-Shift-ButtonPress-1> {}
+ bind $itk_component(canvas) <Control-Alt-ButtonPress-1> {}
bind $itk_component(canvas) <ButtonRelease-2> {}
@@ -1053,6 +1181,9 @@
create_circle
drawVertices
write_sketch_to_db
+
+ bind $itk_component(canvas) <B1-Motion> {}
+ bind $itk_component(canvas) <ButtonRelease-1> [::itcl::code $this
end_scale]
}
}
@@ -1129,6 +1260,9 @@
$itk_component(canvas) configure -cursor crosshair
create_line
write_sketch_to_db
+
+ bind $itk_component(canvas) <B1-Motion> {}
+ bind $itk_component(canvas) <ButtonRelease-1> [::itcl::code $this
end_scale]
}
drawVertices
@@ -1243,6 +1377,9 @@
} else {
$itk_component(canvas) configure -cursor crosshair
write_sketch_to_db
+
+ bind $itk_component(canvas) <B1-Motion> {}
+ bind $itk_component(canvas) <ButtonRelease-1> [::itcl::code $this
end_scale]
}
}
@@ -1348,7 +1485,7 @@
set svlist {}
foreach item $slist {
set index [lsearch $mSegments $item]
- set mSegments lreplace $mSegments $index $index]
+ set mSegments [lreplace $mSegments $index $index]
$itk_component(canvas) delete $item
eval lappend svlist [$item get_verts]
@@ -1490,9 +1627,17 @@
$itk_component(canvas) configure -cursor crosshair
drawSegments
write_sketch_to_db
+
+ bind $itk_component(canvas) <B1-Motion> {}
+ bind $itk_component(canvas) <ButtonRelease-1> [::itcl::code $this
end_scale]
}
+::itcl::body SketchEditFrame::end_scale {} {
+ bind $itk_component(canvas) <Control-Shift-B1-Motion> {}
+}
+
+
::itcl::body SketchEditFrame::fix_vertex_references {_unused_vindices} {
foreach seg $mSegments {
$seg fix_vertex_reference $_unused_vindices
@@ -1501,6 +1646,15 @@
}
+::itcl::body SketchEditFrame::handle_configure {} {
+ set mCanvasHeight [winfo height $itk_component(canvas)]
+ set mCanvasWidth [winfo width $itk_component(canvas)]
+ set mCanvasInvWidth [expr {1.0 / double($mCanvasWidth)}]
+ set mCanvasCenterX [expr {int($mCanvasWidth * 0.5)}]
+ set mCanvasCenterY [expr {int($mCanvasHeight * 0.5)}]
+}
+
+
::itcl::body SketchEditFrame::handle_escape {} {
switch -- $mEditMode \
$moveArbitrary {
@@ -1527,6 +1681,36 @@
}
+::itcl::body SketchEditFrame::handle_scale {_mx _my} {
+ set dx [expr {$_mx - $mPrevMouseX}]
+ set dy [expr {$mPrevMouseY - $_my}]
+
+ set mPrevMouseX $_mx
+ set mPrevMouseY $_my
+
+ set sdx [expr {$mCanvasInvWidth * $dx * 2.0}]
+ set sdy [expr {$mCanvasInvWidth * $dy * 2.0}]
+ if {[expr {abs($sdx) > abs($sdy)}]} {
+ set sf [expr {1.0 + $sdx}]
+ } else {
+ set sf [expr {1.0 + $sdy}]
+ }
+
+ do_scale $sf
+}
+
+
+::itcl::body SketchEditFrame::handle_translate {_mx _my} {
+ set dx [expr {$mPrevMouseX - $_mx}]
+ set dy [expr {$mPrevMouseY - $_my}]
+
+ set mPrevMouseX $_mx
+ set mPrevMouseY $_my
+
+ do_translate $dx $dy
+}
+
+
::itcl::body SketchEditFrame::item_pick_highlight {_mx _my} {
set item [pick_arbitrary $_mx $_my]
if {$item == -1} return
@@ -1747,10 +1931,9 @@
clear_canvas_bindings
bind $itk_component(canvas) <ButtonPress-1> [::itcl::code $this
start_move_arbitrary %x %y 0]
-# bind $itk_component(canvas) <Shift-ButtonPress-1> [::itcl::code $this
seg_pick_highlight %x %y]
bind $itk_component(canvas) <Control-ButtonPress-1> [::itcl::code $this
start_move_selected %x %y]
bind $itk_component(canvas) <Shift-ButtonPress-1> [::itcl::code $this
start_move_selected2 %x %y]
- bind $itk_component(canvas) <r><ButtonPress-1> [::itcl::code $this
start_move_segment %x %y 1]
+ bind $itk_component(canvas) <Control-Alt-ButtonPress-1> [::itcl::code
$this start_move_segment %x %y 1]
set mPrevEditMode $mEditMode
}
@@ -2044,14 +2227,28 @@
}
+::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]
+}
+
+
+::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]
+}
+
+
::itcl::body SketchEditFrame::start_seg_pick {} {
$itk_component(canvas) dtag moving moving
unhighlight_selected
clear_canvas_bindings
bind $itk_component(canvas) <ButtonPress-1> [::itcl::code $this
seg_pick_highlight %x %y]
- bind $itk_component(canvas) <Shift-ButtonPress-1> [::itcl::code $this
seg_delete %x %y 0]
- bind $itk_component(canvas) <Control-Shift-ButtonPress-1> [::itcl::code
$this seg_delete %x %y 1]
+# bind $itk_component(canvas) <Shift-ButtonPress-1> [::itcl::code $this
seg_delete %x %y 0]
+# bind $itk_component(canvas) <Control-Shift-ButtonPress-1> [::itcl::code
$this seg_delete %x %y 1]
}
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