目次

全ソースコード(グラフ拡張版)

 グラフの機能を拡張したソースコードは、以下。

#!/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


目次

inserted by FC2 system