#! /bin/sh
# -*-tcl-*-
sys=$1
out=${sys}_gnuplot.wish
struc=${sys}_struc.txt
dat2=${sys}_odes.dat2
Nx=`mtt_getsize ${sys} x`
Ny=`mtt_getsize ${sys} y`
## write header
cat <<EOF > ${out}
#!/bin/sh
# -*-tcl-*- Next line replaces shell with wish\\
exec wish "\$0" "\$@"
## main window
wm title . "MTT Viewer: ${sys}"
# menu bar
canvas .menubar
menubutton .menubar.file -text "File" -underline 0 -menu .menubar.file.menu
menu .menubar.file.menu
.menubar.file.menu add command -label "Open (Gnuplot template)" -underline 0 -command open_plotfile
.menubar.file.menu add command -label "Save (Gnuplot template)" -underline 0 -command save_plotfile
.menubar.file.menu add separator
.menubar.file.menu add command -label "Print (PostScript)" -underline 0 -command print_postscript
.menubar.file.menu add separator
.menubar.file.menu add command -label "Quit" -underline 0 -command exit
menubutton .menubar.edit -text "Edit" -underline 0 -menu .menubar.edit.menu
menu .menubar.edit.menu
.menubar.edit.menu add cascade -label "Axes" -underline 0 -menu .menubar.edit.menu.axes
.menubar.edit.menu add cascade -label "Contour (3D)" -underline 0 -menu .menubar.edit.menu.contour
.menubar.edit.menu add cascade -label "Grid" -underline 0 -menu .menubar.edit.menu.grid
.menubar.edit.menu add cascade -label "Key" -underline 0 -menu .menubar.edit.menu.key
.menubar.edit.menu add cascade -label "Timestamp" -underline 0 -menu .menubar.edit.menu.time
menu .menubar.edit.menu.axes
.menubar.edit.menu.axes add command -label "Cartesian" -underline 0 -command { puts "set nopolar ; replot" }
.menubar.edit.menu.axes add command -label "Polar" -underline 0 -command { puts "set polar ; replot" }
.menubar.edit.menu.axes add cascade -label "Ranges" -underline 0 -menu .menubar.edit.menu.axes.range
menu .menubar.edit.menu.axes.range
.menubar.edit.menu.axes.range add command -label "Set X" -underline 4 -command { puts "set xrange \[[get_value "X axis range? min:max" "*:*"]\] ; replot" }
.menubar.edit.menu.axes.range add command -label "Set Y" -underline 4 -command { puts "set yrange \[[get_value "Y axis range? min:max" "*:*"]\] ; replot" }
.menubar.edit.menu.axes.range add command -label "Set Z" -underline 4 -command { puts "set zrange \[[get_value "Z axis range? min:max" "*:*"]\] ; replot" }
menu .menubar.edit.menu.contour
.menubar.edit.menu.contour add command -label "Show Contour" -underline 0 -command { puts "set dgrid3d ; set contour ; replot" }
.menubar.edit.menu.contour add command -label "Hide Contour" -underline 0 -command { puts "set nodgrid3d ; set nocontour ; replot" }
.menubar.edit.menu.contour add cascade -label "Surface" -underline 0 -menu .menubar.edit.menu.contour.surface
menu .menubar.edit.menu.contour.surface
.menubar.edit.menu.contour.surface add command -label "Show Surface" -underline 0 -command { puts "set surface ; replot" }
.menubar.edit.menu.contour.surface add command -label "Hide Surface" -underline 0 -command { puts "set nosurface ; replot" }
menu .menubar.edit.menu.grid
.menubar.edit.menu.grid add cascade -label "Show" -underline 0 -menu .menubar.edit.menu.grid.show
.menubar.edit.menu.grid add cascade -label "Hide" -underline 0 -menu .menubar.edit.menu.grid.hide
menu .menubar.edit.menu.grid.show
.menubar.edit.menu.grid.show add command -label "Show all ticks" -underline 5 -command { puts "set grid xtics ytics ztics ; replot" }
.menubar.edit.menu.grid.show add command -label "Show X ticks" -underline 5 -command { puts "set grid xtics ; replot" }
.menubar.edit.menu.grid.show add command -label "Show Y ticks" -underline 5 -command { puts "set grid ytics ; replot" }
.menubar.edit.menu.grid.show add command -label "Show Z ticks" -underline 5 -command { puts "set grid ztics ; replot" }
menu .menubar.edit.menu.grid.hide
.menubar.edit.menu.grid.hide add command -label "Hide all ticks" -underline 5 -command { puts "set grid noxtics noytics noztics ; replot" }
.menubar.edit.menu.grid.hide add command -label "Hide X ticks" -underline 5 -command { puts "set grid noxtics ; replot" }
.menubar.edit.menu.grid.hide add command -label "Hode Y ticks" -underline 5 -command { puts "set grid noytics ; replot" }
.menubar.edit.menu.grid.hide add command -label "Hide Z ticks" -underline 5 -command { puts "set grid noztics ; replot" }
menu .menubar.edit.menu.key
.menubar.edit.menu.key add command -label "Show Key" -underline 0 -command { puts "set key ; replot" }
.menubar.edit.menu.key add command -label "Hide Key" -underline 0 -command { puts "set nokey ; replot" }
.menubar.edit.menu.key add cascade -label "Position" -underline 0 -menu .menubar.edit.menu.key.posn
menu .menubar.edit.menu.key.posn
.menubar.edit.menu.key.posn add command -label "Left" -underline 0 -command { puts "set key left ; replot" }
.menubar.edit.menu.key.posn add command -label "Right" -underline 0 -command { puts "set key right ; replot" }
.menubar.edit.menu.key.posn add command -label "Top" -underline 0 -command { puts "set key top ; replot" }
.menubar.edit.menu.key.posn add command -label "Bottom" -underline 0 -command { puts "set key bottom ; replot" }
.menubar.edit.menu.key.posn add command -label "Outside" -underline 0 -command { puts "set key outside ; replot" }
.menubar.edit.menu.key.posn add command -label "Below" -underline 3 -command { puts "set key below ; replot" }
menu .menubar.edit.menu.time
.menubar.edit.menu.time add command -label "Show Timestamp" -underline 0 -command { puts "set timestamp ; replot" }
.menubar.edit.menu.time add command -label "Hide Timestamp" -underline 0 -command { puts "set notimestamp ; replot" }
menubutton .menubar.tool -text "Tools" -underline 0 -menu .menubar.tool.menu
menu .menubar.tool.menu
.menubar.tool.menu add cascade -label "Sort List" -underline 0 -menu .menubar.tool.menu.sort
.menubar.tool.menu add command -label "X-MTT" -underline 0 -command { exec xmtt & }
menu .menubar.tool.menu.sort
.menubar.tool.menu.sort add command -label "Left to Right" -underline 0 -command {
set sortorder "normal"
set xl [sort_list \$xl \$sortorder ]
set yl [sort_list \$yl \$sortorder ]
}
.menubar.tool.menu.sort add command -label "Right to Left" -underline 0 -command {
set sortorder "reverse"
set xl [sort_list \$xl \$sortorder]
set yl [sort_list \$yl \$sortorder]
}
button .menubar.quit -text "Quit" -relief flat -command exit
pack .menubar.file -expand false -fill x -side left
pack .menubar.edit -expand false -fill x -side left
pack .menubar.tool -expand false -fill x -side left
pack .menubar.quit -expand false -fill x -side right
# list bar
canvas .listbar
radiobutton .listbar.states -text "States" -value states -variable view -command { .parameters.list configure -listvar xl }
radiobutton .listbar.outputs -text "Outputs" -value outputs -variable view -command { .parameters.list configure -listvar yl }
checkbutton .listbar.sort -text "Toggle Sort" -relief flat -indicatoron false -onvalue "reverse" -offvalue "normal" -variable sortorder -command {
set xl [sort_list \$xl \$sortorder ]
set yl [sort_list \$yl \$sortorder ]
}
pack .listbar.states -expand false -fill x -side left
pack .listbar.outputs -expand false -fill x -side left
pack .listbar.sort -expand false -fill x -side right
# side bar
canvas .plotbar
tk_optionMenu .plotbar.select select "Select X" "Select Y" "Select Z"
tk_optionMenu .plotbar.dim dimension "2D" "3D"
tk_optionMenu .plotbar.plot plottype "Single" "Multi"
pack .plotbar.dim -expand false -fill x -side right
pack .plotbar.plot -expand false -fill x -side right
pack .plotbar.select -expand false -fill x -side right
# button bar
canvas .buttonbar
button .buttonbar.replot -text "Refresh" -relief raised -command { puts "replot" }
button .buttonbar.newwin -text "New Plot" -relief raised -command {
set windownum [expr 1 + \$windownum]
puts "set term x11 \$windownum"
}
pack .buttonbar.newwin -expand false -side right
pack .buttonbar.replot -expand false -side right
# rotation bar
canvas .rotationbar
scale .rotationbar.xrot -label "Rotate X" -orient h -from "0" -to "180" -command { do_rotate_3d "xrot" }
scale .rotationbar.zrot -label "Rotate Z" -orient h -from "0" -to "360" -command { do_rotate_3d "zrot" }
pack .rotationbar.xrot -side left
pack .rotationbar.zrot -side left
.rotationbar.xrot set 30
.rotationbar.zrot set 60
pack .rotationbar -expand false -fill x -side bottom
proc "enable_rotationbar" "" {
}
proc "disable_rotationbar" "" {
}
## parameter list canvas
canvas .parameters
listbox .parameters.list -background oldlace -foreground black
scrollbar .parameters.yscrollbar -orient v
## configure scrollbars
.parameters.yscrollbar configure -command ".parameters.list yview"
.parameters.list configure -yscrollcommand ".parameters.yscrollbar set"
## bind lists
bind .parameters.list <<ListboxSelect>> {
set parameter [ .parameters.list get anchor ]
plot \$parameter
set select "Select Y"
}
proc "reverse_name" "name" {
set delim "_"
set split_name [split \$name \$delim]
set reversed_name [lindex \$split_name 0]
for {set i 1} {\$i<[llength \$split_name]} {incr i} {
set reversed_name [lindex \$split_name \$i]\$delim\$reversed_name
}
return \$reversed_name
}
proc "reverse_sort" "list" {
set temp_list {}
set delim " "
foreach name [split \$list \$delim] {
set temp_list \$temp_list\$delim[reverse_name \$name]
}
set temp_list [lsort -ascii \$temp_list]
set list {}
foreach name [split \$temp_list \$delim] {
set list \$list\$delim[reverse_name \$name]
}
return \$list
}
proc "sort_list" "list sortorder" {
switch -- \$sortorder {
normal { return [lsort -ascii \$list] }
reverse { return [reverse_sort \$list] }
}
}
EOF
## create states and outputs lists
gawk '
($1 == "state") {
printf "lappend xl %s\n", $4
}
($1 == "output") {
printf "lappend yl %s\n", $4
}' ${struc} >> ${out}
cat <<EOF >> ${out}
lappend xl Time
lappend yl Time
.parameters.list configure -listvar yl
pack .menubar -expand false -fill x -side top
pack .plotbar -expand false -fill x -side bottom
pack .listbar -expand false -fill x -side top
pack .buttonbar -expand false -fill x -side bottom
pack .parameters.yscrollbar -expand false -fill y -side right
pack .parameters.list -expand true -fill both -side left
pack .parameters -expand true -fill both
## map names to column numbers
proc "get_state_column" "title" {
switch -- \$title {
EOF
gawk '($1 == "state") {
printf "\t\t%s\t{ return %d }\n", $4, $2+2+Ny;
}
' Ny=${Ny} ${struc} >> ${out}
cat <<EOF >> ${out}
}
}
proc "get_output_column" "title" {
switch -- \$title {
EOF
gawk '($1 == "output") {
printf "\t\t%s\t{ return %d }\n", $4, $2+1;
}
' Title=\$title Ny=${Ny} ${struc} >> ${out}
cat <<EOF >> ${out}
}
}
proc "plot" "title" {
global dimension
global select
global view
global xcolumn
global ycolumn
global zcolumn
global xtitle
global ytitle
global ztitle
if {"\$title" == "Time"} {
set column 1
} else {
switch -- \$view {
states { set column [get_state_column \$title] }
outputs { set column [get_output_column \$title] }
}
}
switch -- \$select {
"Select X" {
set xcolumn \$column
set xtitle \$title
}
"Select Y" {
set ycolumn \$column
set ytitle \$title
}
"Select Z" {
set zcolumn \$column
set ztitle \$title
set dimension "3D"
}
}
plot_var
}
## call gnuplot
proc "plot_var" "" {
global xcolumn
global ycolumn
global zcolumn
global xtitle
global ytitle
global ztitle
global dimension
global plottype
global lastplot
switch -- \$dimension {
2D {
disable_rotationbar
switch -- \$plottype {
Single {
puts "set xlabel '\$xtitle'"
puts "set ylabel '\$ytitle'"
puts "set nokey"
puts "plot '${dat2}' using \$xcolumn:\$ycolumn title 'y:\$ytitle x:\$xtitle' with lines"
}
Multi {
puts "set xlabel ''"
puts "set ylabel ''"
puts "set key"
if {"\$lastplot" != "2D"} {
puts "plot '${dat2}' using \$xcolumn:\$ycolumn title 'y:\$ytitle x:\$xtitle' with lines"
} else {
puts "replot '${dat2}' using \$xcolumn:\$ycolumn title 'y:\$ytitle x:\$xtitle' with lines"
}
}
}
}
3D {
enable_rotationbar
switch -- \$plottype {
Single {
puts "set xlabel '\$xtitle'"
puts "set ylabel '\$ytitle'"
puts "set zlabel '\$ztitle'"
puts "set nokey"
puts "splot '${dat2}' using \$xcolumn:\$ycolumn:\$zcolumn title 'z:\$ztitle y:\$ytitle x:\$xtitle' with lines"
}
Multi {
puts "set xlabel ''"
puts "set ylabel ''"
puts "set zlabel ''"
puts "set key"
if {"\$lastplot" != "3D"} {
puts "splot '${dat2}' using \$xcolumn:\$ycolumn:\$zcolumn title 'z:\$ztitle y:\$ytitle x:\$xtitle' with lines"
} else {
puts "replot '${dat2}' using \$xcolumn:\$ycolumn:\$zcolumn title 'z:\$ztitle y:\$ytitle x:\$xtitle' with lines"
}
}
}
}
}
set lastplot \$dimension
}
## open gnuplot plot file
proc "open_plotfile" "" {
global parameter
if {"\$parameter"==""} {
set name "${sys}.plt"
} else {
set name "\$parameter.plt"
}
set filename [tk_getOpenFile\
-initialdir ".."\
-initialfile "\$name"\
-defaultextension ".plt"\
-filetypes {
{{Gnuplot} {.plt}}
{{All files} {*}}
}
]
puts "load '\$filename'"
}
## save gnuplot plot file
proc "save_plotfile" "" {
global parameter
if {"\$parameter"==""} {
set name "${sys}.plt"
} else {
set name "\$parameter.plt"
}
set filename [tk_getSaveFile\
-initialdir ".."\
-initialfile "\$name"\
-defaultextension ".plt"\
-filetypes {
{{Gnuplot} {.plt}}
{{All files} {*}}
}
]
puts "save '\$filename'"
}
## print output to postscript
proc "print_postscript" "" {
global parameter
global windownum
set filename [tk_getSaveFile\
-initialdir ".."\
-initialfile "\$parameter.ps"\
-defaultextension ".ps"\
-filetypes {
{{Postscript} {.ps}}
{{All files} {*}}
}
]
if {\$filename != ""} {
puts "set term postscript"
puts "set output '\$filename'"
puts "replot"
puts "set term x11 \$windownum"
tk_dialog ".printed" "Graph Printed!" "PostScript saved as \$filename" "" "0" "Close"
}
}
proc "get_value" "string initial" {
frame .f
frame .f.buttons
global get_value_retval
global get_value_status
set get_value_retval ""
set get_value_status ""
button .f.buttons.ok -text "ok" -command {
set get_value_status "ok"
set get_value_retval [.f.entry get ]
destroy .f
}
button .f.buttons.cancel -text "Cancel" -command {
set get_value_status "cancel"
destroy .f
}
entry .f.entry
label .f.label -text "\$string"
.f.entry insert 0 "\$initial"
bind .f.entry <<Return>> {
set get_value_status "ok"
set get_value_retval [.f.entry get ]
destroy .f
}
pack .f.buttons.ok -side left -expand false
pack .f.buttons.cancel -side left -expand false
pack .f.label -side top -expand false
pack .f.entry -side top -expand false
pack .f.buttons -side top -expand false
place .f -in .parameters -relx 0 -rely 0 -relwidth 1 -relheight 1 -anchor nw -bordermode outside
tkwait variable get_value_retval
if {"\$get_value_status" == "ok"} {
return "\$get_value_retval"
} else {
return ""
}
}
proc "get_scale" "string min max" {
frame .f
frame .f.buttons
global get_scale_retval
global get_scale_status
set get_scale_retval ""
set get_scale_status ""
button .f.buttons.ok -text "ok" -command {
set get_scale_status "ok"
set get_scale_retval [.f.scale get ]
destroy .f
}
button .f.buttons.cancel -text "Cancel" -command {
set get_scale_status "cancel"
destroy .f
}
scale .f.scale -orient h -label "\$string" -from "\$min" -to "\$max"
pack .f.buttons.ok -side left -expand false
pack .f.buttons.cancel -side left -expand false
pack .f.scale -side top -expand false
pack .f.buttons -side top -expand false
place .f -in .parameters -relx 0 -rely 0 -relwidth 1 -relheight 1 -anchor nw -bordermode outside
tkwait variable get_value_retval
if {"\$get_scale_status" == "ok"} {
return "\$get_scale_retval"
} else {
return ""
}
}
proc "do_rotate_3d" "var val" {
switch -- \$var {
xrot {
puts "set view \$val,,, ; replot"
}
zrot {
puts "set view ,\$val,, ; replot"
}
}
}
event add <<Return>> <Return>
# Defaults
set parameter ""
set windownum 0
set view outputs
set lastplot ""
set select "Select Y"
set xcolumn 1 ; set xtitle "Time"
set ycolumn 1 ; set ytitle "Time"
set zcolumn 1 ; set ztitle "Time"
puts "set timestamp"
puts "set grid"
puts "set nopolar"
puts "set term X11 0"
puts "set key"
EOF
chmod +x ${out}