File mttroot/mtt/bin/trans/struc2gnuplot_txt2wish artifact 79ab7375ab part of check-in 1ed51bc982


#! /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
# Next line replaces shell with wish\\
exec wish "\$0" "\$@"

## main window
wm title . "MTT Viewer: ${sys}"
set parameter ""
set windownum 0
set view outputs

# 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 plot file)" -underline 0   -command open_plotfile
.menubar.file.menu add command -label "Save  (Gnuplot plot file)" -underline 0   -command save_plotfile
.menubar.file.menu add separator
.menubar.file.menu add command -label "Print (PostScript file)"   -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 "Grid" -underline 0 -menu .menubar.edit.menu.grid
.menubar.edit.menu add cascade -label "Key"  -underline 0 -menu .menubar.edit.menu.key

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" }

menu .menubar.edit.menu.grid
.menubar.edit.menu.grid add command -label "Show Grid" -underline 0 -command { puts "set   grid  ; replot" }
.menubar.edit.menu.grid add command -label "Hide Grid" -underline 0 -command { puts "set nogrid  ; 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" }

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

# status bar
canvas .statusbar

radiobutton .statusbar.states  -text "States"      -value states  -variable view -command { .parameters.list configure -listvar xl }
radiobutton .statusbar.outputs -text "Outputs"     -value outputs -variable view -command { .parameters.list configure -listvar yl }

tk_optionMenu .statusbar.plot  plottype "Single Plot" "Multi Plot" "New Window"
checkbutton .statusbar.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 .statusbar.states  -expand false -fill x -side left
pack .statusbar.outputs -expand false -fill x -side left
pack .statusbar.plot    -expand false -fill x -side right
pack .statusbar.sort	-expand false -fill x -side right

## 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 }

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" {
    if ("\$sortorder"=="normal") {
	return [lsort -ascii \$list]
    }
    if ("\$sortorder"=="reverse") {
	return [reverse_sort \$list]
    }
}

EOF

## create states and outputs lists
gawk '
($1 == "state") {
    printf "lappend xl state:%s\n", $4
}
($1 == "output") {
    printf "lappend yl output:%s\n", $4
}' ${struc} >> ${out}

cat <<EOF >> ${out}
.parameters.list configure -listvar yl

pack .menubar			-expand false -fill x    -side top
pack .statusbar			-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
EOF

gawk '
BEGIN {
    print "proc \"plot\" \"title\" {";
}
($1 == "state") {
    printf "if (\"%s\"==\"state:%s\") { plot_var \"%s\" %d }\n", Title, $4, $4, $2+2+Ny;
}
($1 == "output") {
    printf "if (\"%s\"==\"output:%s\") { plot_var \"%s\" %d }\n", Title, $4, $4, $2+1;
}    
END {
    print  "}"
}
' Title=\$title Ny=${Ny} ${struc} >> ${out}


cat <<EOF >> ${out}

## call gnuplot
proc "plot_var" "title column" {
    puts "set term X11"
    global first_plot
    if {"\$first_plot" == 1} {
        set first_plot 0
        set plot "plot"
    } else {
	global plottype
	if {"\$plottype" == "Multi Plot"} {
	    set plot "replot"
	} elseif {"\$plottype" == "New Window"} {
	    global windownum
	    set windownum [ expr \$windownum + 1 ]
	    puts "set terminal x11 \$windownum"
	    set plot "plot"
	} else {
	    set plot "plot"
	}
    }
    puts "\$plot '${dat2}' using 1:\$column title '\$title' with lines"
}

## 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;
    if {"\$parameter"==""} {
	tk_dialog ".mtt_Print_Error" "Print Error" "Select a parameter!" "" "0" "Try Again"
    } else {
	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"
	    tk_dialog ".printed" "Graph Printed!" "PostScript saved as \$filename" "" "0" "Close"
	}
    }
}

# Defaults
puts "set key"
puts "set grid"
puts "set nopolar"
set first_plot 1

EOF
chmod +x ${out}


MTT: Model Transformation Tools
GitHub | SourceHut | Sourceforge | Fossil RSS ]