#!/usr/local/bin/g -file

#
# barbView.t
#
# look at a couple of weather windbarb's and change their attributes
#

proc windBarb {speed direction {color white}} {
    g_pushmatrix; 

    # should redo the numbers below so we do not have to do this
    g_identtrans
    g_getgp xs ys
    g_translate $xs $ys
    g_scale .05 .05

    ## if {$color=="black"} { set color white }
    g_color $color

    # If missing speed use a default of 1
    if {$speed<0} {
	set speed 1
	set nospeed 1
    } else {
	set nospeed 0
    }

    # If missing speed & direction get out
    if {$direction<0} {
	if {$nospeed} {
	    return
	}
	set nodir 1
	set direction 270
    } else {
	set nodir 0
    }
    g_rotate [expr 90-$direction] z

    # If speed is zero, then just give a marker
    if {$speed==0} {
	g_circle 0 0 3
	return
    }

    # First draw the flags, since they are area fills
    set x 10.0
    set speed [expr $speed+2]

    g_polyfill 1

    # units of 100 are drawn as sqaures
    while {$speed>=100} {
	set speed [expr $speed-100]
	g_makepoly
	    g_draw $x 0.0
	    g_draw $x 3.0
	    g_draw [expr $x-3.0] 3.0
	    g_draw [expr $x-3.0] 0.0
	g_closepoly
	set x [expr $x-5.0]
    }

    if {$speed>=50} {
	set speed [expr $speed-50]
	g_makepoly
	    g_draw $x 0.0
	    g_draw [expr $x+0.5] 3.0
	    g_draw [expr $x-1.5] 0.0
	g_closepoly
	set x [expr $x-3.0]
    }

    ## g_lineattr solid

    # Draw Shaft
    g_move 0.0 0.0
    g_draw 10.0 0.0

    # Draw missing direction
    if {$nodir} {
	g_draw 3.0 0.0
	g_draw 1.5 1.5
	g_draw 4.5 -1.5
	g_draw 3.0 0.0
	g_draw 1.5 -1.5
	g_draw 4.5 1.5
	g_draw 3.0 0.0
    } 
    
    # Draw missing speed
    if {$nospeed} {
	g_draw 8.5 1.5
	g_draw 11.5 -1.5
	g_draw 10.0 0.0
	g_draw 8.5 -1.5
	g_draw 11.5 1.5
	return
    } 

    while {$speed >= 10} {
	set speed [expr $speed-10]
	g_draw $x 0.0
	g_draw [expr $x+2.0] 3.0
	if {$speed >= 5} {
	    g_draw $x 0.0 
	}
	set x [expr $x-1.5]
    }

    if {$speed >= 5} {
	g_draw $x 0.0
	g_draw [expr $x+1.0] 1.5
    }

    g_popmatrix
}

proc barbPaint {item} {
    global $item
    g_color black; g_clear
    g_move -.25 -.25
    windBarb [set [set item](Speed)] [set [set item](Direction)]
    g_move .25 .25
    windBarb [set [set item](Speed)] [set [set item](Direction)]
}

proc barbRepaint {item newtag newval} {
    global $item
    set [set item]($newtag) $newval
    .$item paint
}

proc makeBarbGraphic {parent item speed dir} {
    global $item
    set [set item](Speed) $speed
    set [set item](Direction) $dir
    if {$parent=="."} { set prefix "" } else { set prefix $parent }

    graphic $prefix.$item \
	-bg black \
	-command "barbPaint $item" \
	-squareaspect false \
	-relief flat -borderwidth 2 \
	-geometry 300x150

    scale $prefix.Speed \
	-orient horizontal \
	-from -1 -to 250 \
	-tickinterval 50 \
	-label Speed \
	-command  "barbRepaint $item Speed"

    scale $prefix.Direction \
	-orient horizontal \
	-from -1 -to 360 \
	-tickinterval 45 \
	-label Direction \
	-command  "barbRepaint $item Direction"

    foreach w "$item Speed Direction" {
	pack append $parent $prefix.$w {top fill expand}
    }
}

wm title . "weather wind barb Viewer"
makeBarbGraphic . barbOne 10 45
