summaryrefslogtreecommitdiff
path: root/blt/demos/stripchart1.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'blt/demos/stripchart1.tcl')
-rwxr-xr-xblt/demos/stripchart1.tcl405
1 files changed, 405 insertions, 0 deletions
diff --git a/blt/demos/stripchart1.tcl b/blt/demos/stripchart1.tcl
new file mode 100755
index 00000000000..2dd7e54c568
--- /dev/null
+++ b/blt/demos/stripchart1.tcl
@@ -0,0 +1,405 @@
+#!../src/bltwish
+
+package require BLT
+# --------------------------------------------------------------------------
+# Starting with Tcl 8.x, the BLT commands are stored in their own
+# namespace called "blt". The idea is to prevent name clashes with
+# Tcl commands and variables from other packages, such as a "table"
+# command in two different packages.
+#
+# You can access the BLT commands in a couple of ways. You can prefix
+# all the BLT commands with the namespace qualifier "blt::"
+#
+# blt::graph .g
+# blt::table . .g -resize both
+#
+# or you can import all the command into the global namespace.
+#
+# namespace import blt::*
+# graph .g
+# table . .g -resize both
+#
+# --------------------------------------------------------------------------
+if { $tcl_version >= 8.0 } {
+ namespace import blt::*
+ namespace import -force blt::tile::*
+}
+source scripts/demo.tcl
+
+# ----------------------------------------------------------------------
+# EXAMPLE: simple driver for stripchart widget
+# ----------------------------------------------------------------------
+# Michael J. McLennan
+# mmclennan@lucent.com
+# Bell Labs Innovations for Lucent Technologies
+# ======================================================================
+# Copyright (c) 1996 Lucent Technologies
+# ======================================================================
+
+option add *x.range 20.0
+option add *x.shiftBy 15.0
+option add *bufferElements no
+option add *bufferGraph yes
+option add *symbol triangle
+option add *Axis.lineWidth 1
+option add *pixels 1.25m
+#option add *PlotPad 25
+option add *Stripchart.width 6i
+#option add *Smooth quadratic
+#option add *Stripchart.invertXY yes
+#option add *x.descending yes
+
+# ----------------------------------------------------------------------
+# USAGE: random ?<max>? ?<min>?
+#
+# Returns a random number in the range <min> to <max>.
+# If <min> is not specified, the default is 0; if max is not
+# specified, the default is 1.
+# ----------------------------------------------------------------------
+
+proc random {{max 1.0} {min 0.0}} {
+ global randomSeed
+
+ set randomSeed [expr (7141*$randomSeed+54773) % 259200]
+ set num [expr $randomSeed/259200.0*($max-$min)+$min]
+ return $num
+}
+set randomSeed 14823
+
+# ----------------------------------------------------------------------
+
+toplevel .addSource
+wm title .addSource "Add Source"
+wm group .addSource .
+wm withdraw .addSource
+wm protocol .addSource WM_DELETE_WINDOW {.addSource.controls.cancel invoke}
+
+frame .addSource.info
+pack .addSource.info -expand yes -fill both -padx 4 -pady 4
+label .addSource.info.namel -text "Name:"
+entry .addSource.info.name
+label .addSource.info.maxl -text "Maximum:"
+entry .addSource.info.max
+label .addSource.info.minl -text "Minimum:"
+entry .addSource.info.min
+table .addSource.info \
+ .addSource.info.namel 0,0 -anchor e \
+ .addSource.info.name 0,1 -fill x \
+ .addSource.info.maxl 1,0 -anchor e \
+ .addSource.info.max 1,1 -fill x \
+ .addSource.info.minl 2,0 -anchor e \
+ .addSource.info.min 2,1 -fill x
+
+frame .addSource.color
+pack .addSource.color -padx 8 -pady 4
+frame .addSource.color.sample -width 30 -height 30 -borderwidth 2 -relief raised
+pack .addSource.color.sample -side top -fill both
+scale .addSource.color.r -label "Red" -orient vertical \
+ -from 100 -to 0 -command source_color
+pack .addSource.color.r -side left -fill y
+scale .addSource.color.g -label "Green" -orient vertical \
+ -from 100 -to 0 -command source_color
+pack .addSource.color.g -side left -fill y
+scale .addSource.color.b -label "Blue" -orient vertical \
+ -from 100 -to 0 -command source_color
+pack .addSource.color.b -side left -fill y
+
+proc source_color {args} {
+ set r [expr round(2.55*[.addSource.color.r get])]
+ set g [expr round(2.55*[.addSource.color.g get])]
+ set b [expr round(2.55*[.addSource.color.b get])]
+ set color [format "#%2.2x%2.2x%2.2x" $r $g $b]
+ .addSource.color.sample configure -background $color
+}
+source_color
+
+frame .addSource.sep -borderwidth 1 -height 2 -relief sunken
+pack .addSource.sep -fill x -pady 4
+
+frame .addSource.controls
+pack .addSource.controls -fill x -padx 4 -pady 4
+button .addSource.controls.ok -text "OK" -command {
+ wm withdraw .addSource
+ set name [.addSource.info.name get]
+ set color [.addSource.color.sample cget -background]
+ set max [.addSource.info.max get]
+ set min [.addSource.info.min get]
+ if {[catch {source_create $name $color $min $max} err] != 0} {
+ puts "error: $err"
+ }
+}
+pack .addSource.controls.ok -side left -expand yes -padx 4
+button .addSource.controls.cancel -text "Cancel" -command {
+ wm withdraw .addSource
+}
+pack .addSource.controls.cancel -side left -expand yes -padx 4
+
+set useAxes y
+
+proc source_create {name color min max} {
+ global sources
+
+ if {[info exists sources($name-controls)]} {
+ error "source \"$name\" already exists"
+ }
+ if {$max <= $min} {
+ error "bad range: $min - $max"
+ }
+
+ set unique 0
+ set win ".sources.nb.s[incr unique]"
+ while {[winfo exists $win]} {
+ set win ".sources.nb.s[incr unique]"
+ }
+
+ set xvname "xvector$unique"
+ set yvname "yvector$unique"
+ set wvname "wvector$unique"
+ global $xvname $yvname $wvname
+# catch { $xvname delete }
+# catch { $yvname delete }
+# catch { $wvname delete }
+ vector $xvname $yvname $wvname
+
+ if {$xvname == "xvector1"} {
+ $xvname append 0
+ } else {
+ xvector1 variable thisVec
+ $xvname append $thisVec(end)
+ }
+ $yvname append [random $max $min]
+ $wvname append 0
+
+ catch {.sc element delete $name}
+ .sc element create $name -x $xvname -y $yvname -color $color
+ if { $name != "default" } {
+ .sc axis create $name -title $name \
+ -limitscolor $color -limitsformat "%4.4g" -rotate 0 \
+ -titlecolor ${color}
+ .sc element configure $name -mapy $name
+ global useAxes
+ lappend useAxes $name
+ set count 0
+if 1 {
+ set yUse {}
+ set y2Use {}
+ foreach axis $useAxes {
+ if { $count & 1 } {
+ lappend yUse $axis
+ } else {
+ lappend y2Use $axis
+ }
+ incr count
+ }
+ .sc y2axis use $y2Use
+ .sc yaxis use $yUse
+} else {
+ .sc yaxis use $useAxes
+}
+ }
+ .sc axis configure y -rotate 0
+ set cwin .sources.choices.rb$unique
+ radiobutton $cwin -text $name \
+ -variable choices -value $win -command "
+ foreach w \[pack slaves .sources.nb\] {
+ pack forget \$w
+ }
+ pack $win -fill both
+ "
+ pack $cwin -anchor w
+
+ frame $win
+ pack $win -fill x
+ label $win.limsl -text "Limits:"
+ entry $win.lims
+ bind $win.lims <KeyPress-Return> "
+ .sc yaxis configure -limits {%%g}
+ "
+ label $win.smoothl -text "Smooth:"
+ frame $win.smooth
+ radiobutton $win.smooth.linear -text "Linear" \
+ -variable smooth -value linear -command "
+ .sc element configure $name -smooth linear
+ "
+ pack $win.smooth.linear -side left
+ radiobutton $win.smooth.step -text "Step" \
+ -variable smooth -value step -command "
+ .sc element configure $name -smooth step
+ "
+ pack $win.smooth.step -side left
+ radiobutton $win.smooth.natural -text "Natural" \
+ -variable smooth -value natural -command "
+ .sc element configure $name -smooth natural
+ "
+ pack $win.smooth.natural -side left
+ label $win.ratel -text "Sampling Rate:"
+ scale $win.rate -orient horizontal -from 10 -to 1000
+
+ table $win \
+ $win.smoothl 0,0 -anchor e \
+ $win.smooth 0,1 -fill x -padx 4 \
+ $win.limsl 1,0 -anchor e \
+ $win.lims 1,1 -fill x -padx 4 \
+ $win.ratel 2,0 -anchor e \
+ $win.rate 2,1 -fill x -padx 2
+
+ if {$unique != 1} {
+ button $win.del -text "Delete" -command [list source_delete $name]
+ pack $win.del -anchor w
+ table $win $win.del 3,1 -anchor e -padx 4 -pady 4
+ }
+
+ $win.rate set 100
+ catch {$win.smooth.[.sc element cget $name -smooth] invoke} mesg
+
+ set sources($name-choice) $cwin
+ set sources($name-controls) $win
+ set sources($name-stream) [after 100 [list source_event $name 100]]
+ set sources($name-x) $xvname
+ set sources($name-y) $yvname
+ set sources($name-w) $wvname
+ set sources($name-max) $max
+ set sources($name-min) $min
+ set sources($name-steady) [random $max $min]
+
+ $cwin invoke
+}
+
+proc source_delete {name} {
+ global sources
+
+ after cancel $sources($name-stream)
+ destroy $sources($name-choice)
+ destroy $sources($name-controls)
+ unset sources($name-controls)
+
+ set first [lindex [pack slaves .sources.choices] 0]
+ $first invoke
+}
+
+proc source_event {name delay} {
+ global sources
+
+ set xv $sources($name-x)
+ set yv $sources($name-y)
+ set wv $sources($name-w)
+ global $xv $yv $wv
+
+ $xv variable x
+ set x(++end) [expr $x(end) + 0.001 * $delay]
+
+ $yv variable y
+ if {[random] > 0.97} {
+ set y(++end) [random $sources($name-max) $sources($name-min)]
+ } else {
+ set y(++end) [expr $y(end)+0.1*($sources($name-steady)-$y(end))]
+ }
+ set val [random]
+ if {$val > 0.95} {
+ $wv append 2
+ } elseif {$val > 0.8} {
+ $wv append 1
+ } else {
+ $wv append 0
+ }
+ #$wv notify now
+ if { [$xv length] > 100 } {
+ $xv delete 0
+ $yv delete 0
+ $wv delete 0
+ }
+ update
+ set win $sources($name-controls)
+ set delay [$win.rate get]
+ set sources($name-stream) [after $delay [list source_event $name $delay]]
+}
+
+# ----------------------------------------------------------------------
+frame .mbar -borderwidth 2 -relief raised
+pack .mbar -fill x
+
+menubutton .mbar.main -text "Main" -menu .mbar.main.m
+pack .mbar.main -side left -padx 4
+menu .mbar.main.m
+.mbar.main.m add command -label "Add Source..." -command {
+ set x [expr [winfo rootx .]+50]
+ set y [expr [winfo rooty .]+50]
+ wm geometry .addSource +$x+$y
+ wm deiconify .addSource
+}
+.mbar.main.m add separator
+.mbar.main.m add command -label "Quit" -command exit
+
+menubutton .mbar.prefs -text "Preferences" -menu .mbar.prefs.m
+pack .mbar.prefs -side left -padx 4
+
+menu .mbar.prefs.m
+.mbar.prefs.m add cascade -label "Warning Symbol" -menu .mbar.prefs.m.wm
+menu .mbar.prefs.m.wm
+.mbar.prefs.m add cascade -label "Error Symbol" -menu .mbar.prefs.m.em
+menu .mbar.prefs.m.em
+
+foreach sym {square circle diamond plus cross triangle} {
+ .mbar.prefs.m.wm add radiobutton -label $sym \
+ -variable warningsym -value $sym \
+ -command {.sc pen configure "warning" -symbol $warningsym}
+
+ .mbar.prefs.m.em add radiobutton -label $sym \
+ -variable errorsym -value $sym \
+ -command {.sc pen configure "error" -symbol $errorsym}
+}
+catch {.mbar.prefs.m.wm invoke "circle"}
+catch {.mbar.prefs.m.em invoke "cross"}
+
+# ----------------------------------------------------------------------
+stripchart .sc -title "Stripchart"
+pack .sc -expand yes -fill both
+
+.sc xaxis configure -title "Time (s)" -autorange 2.0 -shiftby 0.5
+.sc yaxis configure -title "Samples"
+
+frame .sources
+pack .sources -fill x -padx 10 -pady 4
+frame .sources.nb -borderwidth 2 -relief sunken
+pack .sources.nb -side right -expand yes -fill both -padx 4 -pady 4
+label .sources.title -text "Sources:"
+pack .sources.title -side top -anchor w -padx 4
+frame .sources.choices -borderwidth 2 -relief groove
+pack .sources.choices -expand yes -fill both -padx 4 -pady 4
+
+source_create default red 0 10
+source_create temp blue3 0 10
+source_create pressure green3 0 200
+source_create volume orange3 0 1020
+source_create power yellow3 0 0.01999
+source_create work magenta3 0 10
+
+Blt_ZoomStack .sc
+
+.sc axis bind Y <Enter> {
+ set axis [%W axis get current]
+ set detail [%W axis get detail]
+ if { $detail == "line" } {
+ %W axis configure $axis -background grey
+ }
+}
+.sc axis bind Y <Leave> {
+ set axis [%W axis get current]
+ %W axis configure $axis -background ""
+}
+
+.sc axis bind Y <ButtonPress-1> {
+ set axis [%W axis get current]
+# scan [%W axis limits $axis] "%%g %%g" min max
+# set min [expr $min + (($max - $min) * 0.1)]
+# set max [expr $max - (($max - $min) * 0.1)]
+# %W axis configure $axis -min $min -max $max
+ %W axis configure $axis -logscale yes
+}
+
+.sc axis bind Y <ButtonPress-3> {
+ set axis [%W axis get current]
+# %W axis configure $axis -min {} -max {}
+ %W axis configure $axis -logscale no
+}
+