Richard Suchenwirth 2003-07-01 - "Rulers" are popular mini-applications on
PocketPCs. Here's my take on the
iPaq - for other displays, you might have to fine-tune the ppmm (pixels per millimeter) variable. Besides cm (resolution 1/10, i.e. mm) and inch (resolution 1/16) scales, it allows pixel-precise measurements of small objects like coins, by placing them on screen, aligned to the red bar, and adjusting the black bar until it fits to about 1/100 in.
wm title . "Tcl/Tk rules!"
set ppmm 4.191
pack [canvas .c -width 235 -height 300 -borderwidth 0]
button .x -text X -command exit
.c create window 228 14 -window .x
set y0 288
.c create text 25 8 -text "cm"
.c create line 5 0 5 $y0
for {set mm 0} {$mm<70} {incr mm} {
set y [expr {$y0-$mm* $ppmm }]
if {$mm%10==0} {
set x1 15
.c create text 25 $y -text [expr $mm/10]
} elseif {$mm%10==5} {
set x1 15
} else {
set x1 10
}
.c create line 5 $y $x1 $y
}
.c create text 75 8 -text "inch"
.c create line 50 0 50 $y0
set ppi16 [expr $ppmm*25.4/16]
for {set i16 0} {$i16<48} {incr i16} {
set y [expr {$y0-$i16* $ppi16 }]
if {$i16%16==0} {
set x 63
.c create text 70 $y -text [expr $i16/16]
} elseif {$i16%8==0} {
set x 63
} elseif {$i16%4==0} {
set x 60
} elseif {$i16%2==0} {
set x 57
} else {set x 54}
.c create line 50 $y $x $y
}
#-------- Custom measure
.c create text 160 35 -text "
Custom measurements:
Place object on screen.
Align with red bar.
Tap for approximate top.
Fine-tune with <Up>/<Down>." -fill blue
proc redraw {} {
global toy ppmm ppi16 y0
.c delete to
.c create line 80 $toy 200 $toy -tag to
set dy [expr $y0-$toy]
set cm [format %.2f [expr $dy/$ppmm/10.]]
set in [format %.2f [expr $dy/$ppi16/16.]]
.c create text 130 80 -text "$cm cm/$in in." -tag to
}
.c create line 80 $y0 200 $y0 -fill red
set toy 120; redraw
bind .c <1> {set toy %y; redraw}
bind . <Up> {incr toy -1; redraw}
bind . <Down> {incr toy 1; redraw}
bind . <Return> {exec wish $argv0 &; exit}
wm geometry . +0+0