Artifact b464ba8f0b010b204f3b16e4c98a98cb6fcbd1580ff779621838cfae7d2ecbbe:
- Executable file
mttroot/mtt/bin/trans/struc2gnuplot_txt2wish
— part of check-in
[ca4fee02c1]
at
2004-01-21 15:53:29
on branch origin/master
— Added support for zoomable gnuplot (3.8):
allows co-ordinates to be obtained with the mouse, sections to be zoomed
and 3D plots to be rotated by dragging.Added menu item to change data styles to dots, points or lines (default). (user: geraint@users.sourceforge.net, size: 18824) [annotate] [blame] [check-ins using] [more...]
#! /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 "Data style" -underline 0 -menu .menubar.edit.menu.datastyle
.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 { do_cmd "set nopolar ; replot" }
.menubar.edit.menu.axes add command -label "Polar" -underline 0 -command { do_cmd "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 { do_cmd "set xrange \[[get_value "X axis range? min:max" "*:*"]\] ; replot" }
.menubar.edit.menu.axes.range add command -label "Set Y" -underline 4 -command { do_cmd "set yrange \[[get_value "Y axis range? min:max" "*:*"]\] ; replot" }
.menubar.edit.menu.axes.range add command -label "Set Z" -underline 4 -command { do_cmd "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 { do_cmd "set dgrid3d ; set contour ; replot" }
.menubar.edit.menu.contour add command -label "Hide Contour" -underline 0 -command { do_cmd "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 { do_cmd "set surface ; replot" }
.menubar.edit.menu.contour.surface add command -label "Hide Surface" -underline 0 -command { do_cmd "set nosurface ; replot" }
menu .menubar.edit.menu.datastyle
.menubar.edit.menu.datastyle add command -label "Dots" -underline 0 -command { do_cmd "set data style dots ; replot" }
.menubar.edit.menu.datastyle add command -label "Lines" -underline 0 -command { do_cmd "set data style lines ; replot" }
.menubar.edit.menu.datastyle add command -label "Points" -underline 0 -command { do_cmd "set data style points ; replot" }
menu .menubar.edit.menu.grid
.menubar.edit.menu.grid add cascade -label "Show Grid" -underline 0 -menu .menubar.edit.menu.grid.show
.menubar.edit.menu.grid add cascade -label "Hide Grid" -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 { do_cmd "set grid xtics ytics ztics ; replot" }
.menubar.edit.menu.grid.show add command -label "Show X ticks" -underline 5 -command { do_cmd "set grid xtics ; replot" }
.menubar.edit.menu.grid.show add command -label "Show Y ticks" -underline 5 -command { do_cmd "set grid ytics ; replot" }
.menubar.edit.menu.grid.show add command -label "Show Z ticks" -underline 5 -command { do_cmd "set grid ztics ; replot" }
menu .menubar.edit.menu.grid.hide
.menubar.edit.menu.grid.hide add command -label "Hide all ticks" -underline 5 -command { do_cmd "set grid noxtics noytics noztics ; replot" }
.menubar.edit.menu.grid.hide add command -label "Hide X ticks" -underline 5 -command { do_cmd "set grid noxtics ; replot" }
.menubar.edit.menu.grid.hide add command -label "Hode Y ticks" -underline 5 -command { do_cmd "set grid noytics ; replot" }
.menubar.edit.menu.grid.hide add command -label "Hide Z ticks" -underline 5 -command { do_cmd "set grid noztics ; replot" }
menu .menubar.edit.menu.key
.menubar.edit.menu.key add command -label "Show Key" -underline 0 -command { do_cmd "set key ; replot" }
.menubar.edit.menu.key add command -label "Hide Key" -underline 0 -command { do_cmd "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 { do_cmd "set key left ; replot" }
.menubar.edit.menu.key.posn add command -label "Right" -underline 0 -command { do_cmd "set key right ; replot" }
.menubar.edit.menu.key.posn add command -label "Top" -underline 0 -command { do_cmd "set key top ; replot" }
.menubar.edit.menu.key.posn add command -label "Bottom" -underline 0 -command { do_cmd "set key bottom ; replot" }
.menubar.edit.menu.key.posn add command -label "Outside" -underline 0 -command { do_cmd "set key outside ; replot" }
.menubar.edit.menu.key.posn add command -label "Below" -underline 3 -command { do_cmd "set key below ; replot" }
menu .menubar.edit.menu.time
.menubar.edit.menu.time add command -label "Show Timestamp" -underline 0 -command { do_cmd "set timestamp ; replot" }
.menubar.edit.menu.time add command -label "Hide Timestamp" -underline 0 -command { do_cmd "set notimestamp ; replot" }
menubutton .menubar.tool -text "Tools" -underline 0 -menu .menubar.tool.menu
menu .menubar.tool.menu
.menubar.tool.menu add cascade -label "gnuplot command" -underline 0 -menu .menubar.tool.menu.gcmd
.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.gcmd
.menubar.tool.menu.gcmd add command -label "Show Command" -underline 0 -command show_gnuplot_prompt
.menubar.tool.menu.gcmd add command -label "Hide Command" -underline 0 -command hide_gnuplot_prompt
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 true -fill x -side right
pack .plotbar.plot -expand true -fill x -side right
pack .plotbar.select -expand true -fill x -side right
# button bar
canvas .buttonbar
button .buttonbar.replot -text "Refresh" -relief raised -command { do_cmd "replot" }
button .buttonbar.newwin -text "New Plot" -relief raised -command {
set windownum [expr 1 + \$windownum]
do_cmd "set term x11 \$windownum"
}
pack .buttonbar.newwin -expand true -side right -fill x
pack .buttonbar.replot -expand true -side right -fill x
# 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 -fill x -expand true
pack .rotationbar.zrot -side left -fill x -expand true
.rotationbar.xrot set 30
.rotationbar.zrot set 60
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 .listbar -expand false -fill x -side top
pack .rotationbar -expand false -fill x -side bottom
pack .plotbar -expand false -fill x -side bottom
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 {
do_cmd "set xlabel '\$xtitle'"
do_cmd "set ylabel '\$ytitle'"
do_cmd "set nokey"
do_cmd "plot '${dat2}' using \$xcolumn:\$ycolumn title 'y:\$ytitle x:\$xtitle' "
}
Multi {
do_cmd "set xlabel ''"
do_cmd "set ylabel ''"
do_cmd "set key"
if {"\$lastplot" != "2D"} {
do_cmd "plot '${dat2}' using \$xcolumn:\$ycolumn title 'y:\$ytitle x:\$xtitle' "
} else {
do_cmd "replot '${dat2}' using \$xcolumn:\$ycolumn title 'y:\$ytitle x:\$xtitle' "
}
}
}
}
3D {
enable_rotationbar
switch -- \$plottype {
Single {
do_cmd "set xlabel '\$xtitle'"
do_cmd "set ylabel '\$ytitle'"
do_cmd "set zlabel '\$ztitle'"
do_cmd "set nokey"
do_cmd "splot '${dat2}' using \$xcolumn:\$ycolumn:\$zcolumn title 'z:\$ztitle y:\$ytitle x:\$xtitle' "
}
Multi {
do_cmd "set xlabel ''"
do_cmd "set ylabel ''"
do_cmd "set zlabel ''"
do_cmd "set key"
if {"\$lastplot" != "3D"} {
do_cmd "splot '${dat2}' using \$xcolumn:\$ycolumn:\$zcolumn title 'z:\$ztitle y:\$ytitle x:\$xtitle' "
} else {
do_cmd "replot '${dat2}' using \$xcolumn:\$ycolumn:\$zcolumn title 'z:\$ztitle y:\$ytitle x:\$xtitle' "
}
}
}
}
}
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} {*}}
}
]
do_cmd "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} {*}}
}
]
do_cmd "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 != ""} {
do_cmd "set term postscript"
do_cmd "set output '\$filename'"
do_cmd "replot"
do_cmd "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 {
do_cmd "set view \$val,,, ; replot"
}
zrot {
do_cmd "set view ,\$val,, ; replot"
}
}
}
proc "show_gnuplot_prompt" "" {
global gnuplot_command
destroy .gcmd
canvas .gcmd
label .gcmd.l -text ">"
entry .gcmd.e -textvariable gnuplot_command
button .gcmd.b -text "<-" -relief flat -command { set gnuplot_command "" }
pack .gcmd.b -side right
pack .gcmd.l -side left
pack .gcmd.e -side top -fill x -expand true
pack .gcmd -expand false -fill x -side bottom -before .rotationbar
focus .gcmd.e
bind .gcmd.e <<Return>> {
do_cmd "[.gcmd.e get]"
}
}
proc "hide_gnuplot_prompt" "" {
destroy .gcmd
}
proc "do_cmd" "string" {
global gnuplot_command
set gnuplot_command "\$string"
puts "\$string"
}
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"
do_cmd "set mouse"
do_cmd "set timestamp"
do_cmd "set grid"
do_cmd "set nopolar"
do_cmd "set term X11 0"
do_cmd "set key"
do_cmd "set data style lines"
EOF
chmod +x ${out}