目次
前
全ソースコード(グラフ拡張版)
グラフの機能を拡張したソースコードは、以下。
#!/usr/local/bin/wish
. configure -width 350 -height 250
wm title . "Profiler Controller <COSMO Technical Laboratry>"
wm resizable . 0 0
# initialize file name
set theFileName "unknown"
set tFileName $theFileName
set cTimeV 0:00
set cTempV ""
set xexe_temp(P0) 20
set xexe_temp(P1) 120
set xexe_temp(P2) 120
set xexe_temp(P3) 210
set xexe_temp(P4) 210
set xexe_temp(P5) 20
set xexe_time(P0) 0:00
set xexe_time(P1) 1:00
set xexe_time(P2) 2:00
set xexe_time(P3) 3:00
set xexe_time(P4) 4:00
set xexe_time(P5) 5:00
set eflag 0
set elast 0
set ecnt 0
# temperature difference
set xdif ""
# time interval
set tdif ""
# displacement
set ddif ""
# boundary (teparature)
set bdif ""
# path
set cPathV ""
#
set beginTime 0
set currentTime 100
#**************
# define label
#**************
label .lblTTemp -font {{MS ゴシック} 16} -width 16 -text "Temperature"
label .lblTTime -font {{MS ゴシック} 16} -width 16 -text "Time"
label .lblTTempUnit -font {{MS ゴシック} 16} -width 10 -text "celcius(C)"
label .lblTTimeUnit -font {{MS ゴシック} 16} -width 10 -text "(mm:ss)"
label .lblP0 -font {{MS ゴシック} 14 italic} -width 10 -text "P0"
label .lblP1 -font {{MS ゴシック} 14 italic} -width 10 -text "P1"
label .lblP2 -font {{MS ゴシック} 14 italic} -width 10 -text "P2"
label .lblP3 -font {{MS ゴシック} 14 italic} -width 10 -text "P3"
label .lblP4 -font {{MS ゴシック} 14 italic} -width 10 -text "P4"
label .lblP5 -font {{MS ゴシック} 14 italic} -width 10 -text "P5"
label .lblFileName -font {{MS ゴシック} 16} -width 10 -text "FileName"
label .lblHandling -font {{MS ゴシック} 14 bold} -width 10 -text "HANDLING"
label .lblPath -font {{MS ゴシック} 14 bold} -width 10 -text "PATH"
label .lblCTime -font {{MS ゴシック} 14 bold} -width 16 -text "Time"
label .lblCTemp -font {{MS ゴシック} 14 bold} -width 16 -text "Temperature"
label .lblCPathV -font {{MS ゴシック} 14 bold} -width 10 -textvariable cPathV -bg lightgreen
label .lblCTimeV -font {{MS ゴシック} 14 bold} -width 10 -textvariable cTimeV -bg yellow
label .lblCTempV -font {{MS ゴシック} 14 bold} -width 10 -textvariable cTempV -bg cyan
#**************
# define entry
#**************
entry .edtP0Temp -font {{MS ゴシック} 12 bold} -textvariable xexe_temp(P0) -width 10 -bg cyan
entry .edtP1Temp -font {{MS ゴシック} 12 bold} -textvariable xexe_temp(P1) -width 10 -bg cyan
entry .edtP2Temp -font {{MS ゴシック} 12 bold} -textvariable xexe_temp(P2) -width 10 -bg cyan
entry .edtP3Temp -font {{MS ゴシック} 12 bold} -textvariable xexe_temp(P3) -width 10 -bg cyan
entry .edtP4Temp -font {{MS ゴシック} 12 bold} -textvariable xexe_temp(P4) -width 10 -bg cyan
entry .edtP5Temp -font {{MS ゴシック} 12 bold} -textvariable xexe_temp(P5) -width 10 -bg cyan
entry .edtP0Time -font {{MS ゴシック} 12 bold} -textvariable xexe_time(P0) -width 10 -bg yellow
entry .edtP1Time -font {{MS ゴシック} 12 bold} -textvariable xexe_time(P1) -width 10 -bg yellow
entry .edtP2Time -font {{MS ゴシック} 12 bold} -textvariable xexe_time(P2) -width 10 -bg yellow
entry .edtP3Time -font {{MS ゴシック} 12 bold} -textvariable xexe_time(P3) -width 10 -bg yellow
entry .edtP4Time -font {{MS ゴシック} 12 bold} -textvariable xexe_time(P4) -width 10 -bg yellow
entry .edtP5Time -font {{MS ゴシック} 12 bold} -textvariable xexe_time(P5) -width 10 -bg yellow
entry .edtFileName -font {{MS ゴシック} 14 bold} -width 10 -bg green -textvariable tFileName
#***************
# define button
#***************
button .btnLoad -font {{MS ゴシック} 16 bold} -bg gray -text "Load" -width 10 -command "fload"
button .btnSave -font {{MS ゴシック} 16 bold} -bg gray -text "Save" -width 10 -command "fsave"
button .btnExecute -font {{MS ゴシック} 16 bold} -bg gray -text "Exec" -width 10 -command "fexec"
button .btnCancel -font {{MS ゴシック} 16 bold} -bg gray -text "Cancel" -width 10 -command "fcancel"
button .btnClear -font {{MS ゴシック} 16 bold} -bg gray -text "Clear" -width 10 -command "clrParameters"
button .btnDraw -font {{MS ゴシック} 16 bold} -bg gray -text "Draw" -width 10 -command "xdrawexe"
button .btnErase -font {{MS ゴシック} 16 bold} -bg gray -text "Erase" -width 10 -command "xerase"
button .btnExit -font {{MS ゴシック} 16 bold} -bg gray -text "exit" -width 10 -command "exit"
#***************
# define canvas
#***************
canvas .cscreen -width 350 -height 300 -bg white
#***************
# sub procedure
#***************
proc fload {} {
#
global tFileName xexe_temp xexe_time
#
set theFileName [tk_getOpenFile -filetypes {{"profile code file" {.txt}}}]
# show file name
set xtmp [split $theFileName /]
set cFileName [lindex $xtmp end]
set tFileName [lindex [split $cFileName .] 0]
# open
set fd_in [open $theFileName "r"]
# read context
set i 0
while { [gets $fd_in sbuf] >= 0 } {
# separate hash item
set iname [lindex $sbuf 0]
set itemp [lindex $sbuf 1]
set itime [lindex $sbuf end]
# store
set xexe_temp($iname) $itemp
set xexe_time($iname) $itime
# increment
incr i
}
# close
close $fd_in
}
proc fsave {} {
#
global tFileName xexe_temp xexe_time
#
if { $tFileName == "" } {
tk_messageBox -message "not entry File Name" -type ok
} else {
# create file name
set cFileName "$tFileName.txt"
# open
set fd_out [open $cFileName "w"]
# store
for {set i 0} {$i < 6} {incr i} {
# get items
set xfirst [format "P%1d" $i]
set xsecond $xexe_temp($xfirst)
set xthird $xexe_time($xfirst)
# concatenate
set xtmp "$xfirst $xsecond $xthird"
# save
puts $fd_out $xtmp
}
# close
close $fd_out
}
}
proc fexec {} {
#
global eflag elast ecnt xexe_temp xexe_time xdif tdif ddif bdif
# judge
set xp0 [calc_time $xexe_time(P0)]
set xp1 [calc_time $xexe_time(P1)]
set xp2 [calc_time $xexe_time(P2)]
set xp3 [calc_time $xexe_time(P3)]
set xp4 [calc_time $xexe_time(P4)]
set xp5 [calc_time $xexe_time(P5)]
#tk_messageBox -message "$xp0 $xp1 $xp2 $xp3 $xp4 $xp5" -type ok
set xflag 0
if { $xp0 > $xp1 } {
incr xflag
}
if { $xp1 > $xp2 } {
incr xflag
}
if { $xp2 > $xp3 } {
incr xflag
}
if { $xp3 > $xp4 } {
incr xflag
}
if { $xp4 > $xp5 } {
incr xflag
}
# message
if { $xflag > 0 } {
tk_messageBox -message "Time incorrect !" -type ok
} else {
# draw graph
xdrawexe
# last count
set elast $xp5
# clear counter
set ecnt 0
# calculate (temperature)
set xtmp "$xexe_temp(P0) $xexe_temp(P1)"
set xtmp "$xtmp $xexe_temp(P2) $xexe_temp(P3)"
set xtmp "$xtmp $xexe_temp(P4) $xexe_temp(P5)"
set ytmp "0 $xtmp"
set result ""
for {set i 1} {$i < 6} {incr i} {
set xx [lindex $xtmp $i]
set yy [lindex $ytmp $i]
set r [expr $xx - $yy]
set result "$result $r"
}
set xdif $result
# calculate (time)
set xtmp "$xp0 $xp1 $xp2 $xp3 $xp4 $xp5"
set ytmp "0 $xtmp"
set result ""
for {set i 1} {$i < 6} {incr i} {
set xx [lindex $xtmp $i]
set yy [lindex $ytmp $i]
set r [expr $xx - $yy]
set result "$result $r"
}
set tdif $result
# calculate boundary
set sum 0
set bdif "0"
for {set i 0} {$i < 4} {incr i} {
set xx [lindex $tdif $i]
set sum [expr $sum + $xx]
set bdif "$bdif $sum"
}
# calculate displacement
set result ""
for {set i 0} {$i < 5} {incr i} {
set xx [lindex $xdif $i]
set yy [lindex $tdif $i]
set r [format "%0.1f" [expr ($xx * 1.0) / $yy]]
set result "$result $r"
}
set ddif $result
# enable
set eflag 1
set ecnt 0
# get now time
set beginTime [clock clicks -milliseconds]
# loop
show_time
}
}
proc fcancel {} {
#
global eflag
# desable
set eflag 0
}
proc which_range {x} {
#
global bdif
# separate
set b0 [lindex $bdif 0]
set b1 [lindex $bdif 1]
set b2 [lindex $bdif 2]
set b3 [lindex $bdif 3]
set b4 [lindex $bdif 4]
#tk_messageBox -message "$b0 $b1 $b2 $b3 $b4" -type ok
# judge
set result 4
if { $b0 <= $x && $x < $b1 } {
set result 0
}
if { $b1 <= $x && $x < $b2 } {
set result 1
}
if { $b2 <= $x && $x < $b3 } {
set result 2
}
if { $b3 <= $x && $x <= $b4 } {
set result 3
}
return $result
}
proc conv_time {x} {
# default
set result "0:00"
# quotient
set q [expr $x / 60]
# residue
set r [expr $x % 60]
#
set result [format "%d:%02d" $q $r]
return $result
}
proc calc_time {x} {
# separate
set stmp [split $x :]
# calculate
set result [expr [lindex $stmp 0] * 60 + [lindex $stmp end]]
return $result
}
proc draw_hand {} {
#
global cPathV cTimeV cTempV eflag xexe_temp ecnt ddif bdif
# show
if { $eflag == 1 } {
# judge block
set bb [which_range $ecnt]
set bbx [format "P%d" $bb]
# path
set cPathV [format "P%d -> P%d" $bb [expr $bb+1]]
# start value
set beginv $xexe_temp($bbx)
# displacement
set dispx [lindex $ddif $bb]
set dispy [lindex $bdif $bb]
#tk_messageBox -message "$beginv $bb $bbx $dispx $dispy" -type ok
# calculate
set ctemp [expr $beginv + $dispx * ($ecnt - $dispy)]
set ctemp [expr int($ctemp)]
set cTempV [format "%d" $ctemp]
# time
set cTimeV [conv_time $ecnt]
} else {
set cPathV ""
set cTimeV "0:00"
set cTempV ""
}
}
proc show_time {} {
#
global ecnt eflag elast beginTime currentTime
# get current time
set currentTime [clock clicks -milliseconds]
# judge
if { [expr $currentTime - $beginTime] > 999 } {
# update
set beginTime $currentTime
# show
draw_hand
# handlign
if { $eflag == 1 } {
incr ecnt
# ? complete
if { $ecnt >= $elast } {
set eflag 0
}
}
}
# 200ms
after 200 show_time
}
proc clrParameters {} {
#
global tFileName xexe_temp xexe_time
# file name
set tFileName "unknown"
# temperature
set xexe_temp(P0) 20
set xexe_temp(P1) 20
set xexe_temp(P2) 20
set xexe_temp(P3) 20
set xexe_temp(P4) 20
set xexe_temp(P5) 20
# time
set xexe_time(P0) 0:00
set xexe_time(P1) 0:00
set xexe_time(P2) 0:00
set xexe_time(P3) 0:00
set xexe_time(P4) 0:00
set xexe_time(P5) 0:00
}
proc xerase {} {
.cscreen delete all
}
proc xdrawexe {} {
#
global xexe_temp xexe_time
# clear all items
xerase
# initialize location
set xbegin 0
set xlast 350
set xdelta 50
set ybegin 0
set ylast 300
set ydelta 50
# middle line
for { set i 0 } { $i < 7 } {incr i} {
.cscreen create line $xbegin [expr $i*$ydelta] $xlast [expr $i*$ydelta] -fill green
.cscreen create line [expr $i*$xdelta] $ybegin [expr $i*$xdelta] $ylast -fill green
}
# time
set tP0 [calc_time $xexe_time(P0)]
set tP1 [calc_time $xexe_time(P1)]
set tP2 [calc_time $xexe_time(P2)]
set tP3 [calc_time $xexe_time(P3)]
set tP4 [calc_time $xexe_time(P4)]
set tP5 [calc_time $xexe_time(P5)]
# x axis components
set xP0 $xbegin
set xP1 [expr int($tP1 * $xlast / $tP5)]
set xP2 [expr int($tP2 * $xlast / $tP5)]
set xP3 [expr int($tP3 * $xlast / $tP5)]
set xP4 [expr int($tP4 * $xlast / $tP5)]
set xP5 $xlast
# y axis components
set yP0 [expr $ylast - $xexe_temp(P0)]
set yP1 [expr $ylast - $xexe_temp(P1)]
set yP2 [expr $ylast - $xexe_temp(P2)]
set yP3 [expr $ylast - $xexe_temp(P3)]
set yP4 [expr $ylast - $xexe_temp(P4)]
set yP5 [expr $ylast - $xexe_temp(P5)]
# draw
.cscreen create line $xP0 $yP0 $xP1 $yP1 $xP2 $yP2 $xP3 $yP3 $xP4 $yP4 $xP5 $yP5 -fill red
}
#*********************
# window area placing
#*********************
grid .lblTTemp -column 1 -row 0
grid .lblTTime -column 2 -row 0
grid .lblTTempUnit -column 1 -row 1
grid .lblTTimeUnit -column 2 -row 1
grid .lblP0 -column 0 -row 3
grid .lblP1 -column 0 -row 4
grid .lblP2 -column 0 -row 5
grid .lblP3 -column 0 -row 6
grid .lblP4 -column 0 -row 7
grid .lblP5 -column 0 -row 8
grid .lblHandling -column 3 -row 5
grid .lblPath -column 3 -row 6
grid .lblCTime -column 3 -row 7
grid .lblCTemp -column 3 -row 8
grid .lblCPathV -column 4 -row 6
grid .lblCTimeV -column 4 -row 7
grid .lblCTempV -column 4 -row 8
grid .edtP0Temp -column 1 -row 3
grid .edtP1Temp -column 1 -row 4
grid .edtP2Temp -column 1 -row 5
grid .edtP3Temp -column 1 -row 6
grid .edtP4Temp -column 1 -row 7
grid .edtP5Temp -column 1 -row 8
grid .edtP0Time -column 2 -row 3
grid .edtP1Time -column 2 -row 4
grid .edtP2Time -column 2 -row 5
grid .edtP3Time -column 2 -row 6
grid .edtP4Time -column 2 -row 7
grid .edtP5Time -column 2 -row 8
grid .lblFileName -column 3 -row 0
grid .edtFileName -column 3 -row 1
grid .btnLoad -column 4 -row 0
grid .btnSave -column 4 -row 1
grid .btnClear -column 0 -row 9
grid .btnExecute -column 0 -row 11
grid .btnCancel -column 0 -row 12
grid .btnDraw -column 2 -row 9
grid .btnErase -column 2 -row 11
grid .btnExit -column 4 -row 13
grid .cscreen -column 1 -row 10
目次
前